Menerbitkan Token Confidential Transfer di Solana
Panduan ini ditujukan untuk penerbit: tim yang membuat dan mengoperasikan mint Token-2022 yang menggunakan ekstensi Confidential Transfer. Panduan ini mencakup keputusan yang Anda buat saat pembuatan mint dan operasi yang Anda jalankan sepanjang masa pakai mint tersebut. Untuk alur dari sisi pemegang (deposit, terapkan, transfer, tarik) lihat halaman langkah demi langkah, dan untuk mendukung token ini dalam sebuah produk lihat Panduan Integrasi.
Transfer rahasia menjaga jumlah transfer dan saldo akun tetap terenkripsi sambil membiarkan alamat akun, mint, dan pemilik tetap publik. Mereka mengandalkan Program ZK ElGamal Proof untuk verifikasi bukti onchain, sehingga mint dapat digunakan pada kluster tempat program tersebut diaktifkan.
Ketersediaan
Transfer rahasia memerlukan Token-2022
program@v11.0.0
atau yang lebih baru. Saat ini tersedia di devnet dan dijadwalkan untuk
diaktifkan di mainnet pada Juni 2026. Token Extensions Program di-deploy
secara terpisah ke setiap kluster, jadi pastikan deployment pada kluster yang
Anda tuju.
Keputusan yang Anda buat saat pembuatan
Ekstensi Confidential Transfer harus diinisialisasi sebelum mint diinisialisasi dan tidak dapat ditambahkan setelahnya. Saat pembuatan, Anda memutuskan:
- Kebijakan persetujuan: apakah akun dapat memilih untuk ikut dalam transfer
rahasia secara tanpa izin (
auto) atau harus disetujui oleh otoritas transfer rahasia mint (manual). - Auditor: apakah akan menetapkan kunci publik ElGamal auditor global sehingga pihak yang ditunjuk dapat mendekripsi setiap jumlah transfer untuk mint tersebut. Opsional, dan dapat diubah nanti.
- Ekstensi pendamping opsional: biaya transfer rahasia (dipasangkan dengan ekstensi biaya transfer) dan mint/burn rahasia, keduanya dibahas di bawah. Ekstensi ini juga harus diinisialisasi saat pembuatan.
Buat mint rahasia
CLI menetapkan kebijakan persetujuan dengan
--enable-confidential-transfers auto atau manual; auto mengizinkan setiap
pemegang untuk mengonfigurasi akun mereka sendiri, sementara manual
mengharuskan persetujuan dari otoritas transfer rahasia (yang secara default
adalah otoritas mint). Jalur klien menggunakan pengaturan yang sama melalui
parameter ConfidentialTransferMint: sebuah otoritas, flag persetujuan
otomatis, dan kunci auditor opsional. Baik kebijakan persetujuan maupun auditor
dapat diubah nanti (lihat Konfigurasi auditor); hanya
keberadaan ekstensi itu sendiri yang ditetapkan saat pembuatan.
$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto
Konfigurasi auditor
Auditor global adalah pubkey ElGamal yang tersimpan pada mint. Jika diatur, setiap transfer rahasia juga mengenkripsi jumlahnya menggunakan kunci ini, sehingga siapa pun yang memiliki kunci rahasia terkait dapat mendekripsi semua jumlah transfer untuk mint tersebut. Inilah cara transfer rahasia tetap kompatibel dengan persyaratan audit dan kepatuhan: publik tidak melihat apa pun, auditor melihat segalanya.
Otoritas transfer rahasia dapat mengatur, merotasi, atau menghapus auditor kapan
saja. Operasi yang sama juga memperbarui kebijakan persetujuan. Pada CLI, kunci
auditor adalah enkode base64 dari pubkey ElGamal; berikan
--auditor-pubkey none untuk menghapusnya dan --approve-policy auto|manual
untuk mengubah kebijakan.
Rotasi hanya memengaruhi transfer di masa mendatang. Jumlah dalam transaksi yang sudah ada di onchain tetap terenkripsi menggunakan kunci auditor yang aktif saat transaksi dieksekusi, jadi simpan kunci auditor lama jika Anda perlu mendekripsi aktivitas historis.
$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>
Kunci rahasia auditor dapat mendekripsi setiap jumlah transfer untuk mint.
Jaga dengan tingkat keamanan yang sama seperti kunci penandatanganan, dan
rencanakan rotasi. Mengatur auditor ke None menonaktifkan visibilitas jumlah
bagi semua orang kecuali pemilik akun itu sendiri.
Menyetujui akun (kebijakan manual)
Dengan kebijakan persetujuan manual, akun yang dikonfigurasi untuk transfer rahasia tidak dapat bertransaksi secara rahasia hingga otoritas transfer rahasia menyetujuinya. Ini memberi penerbit gerbang untuk peserta yang masuk daftar putih atau telah melalui KYC. CLI tidak menyediakan perintah persetujuan, sehingga persetujuan dilakukan melalui klien.
token.confidential_transfer_approve_account(&token_account,&authority,&[&authority_keypair],).await?;
Biaya transfer rahasia
Jika mint Anda mengenakan
biaya transfer dan transfer bersifat
rahasia, biaya tersebut juga harus ditahan secara rahasia. Ekstensi
ConfidentialTransferFeeConfig menangani hal ini, dan diinisialisasi saat
pembuatan mint bersama ekstensi biaya transfer dan transfer rahasia.
Biaya yang ditahan terakumulasi dalam bentuk terenkripsi pada akun penerima, dipanen ke mint, lalu ditarik oleh otoritas penarikan yang ditahan. Setiap jumlah biaya tetap terenkripsi sepanjang proses. Tidak ada hal ini yang terekspos melalui CLI. Kunci rahasia ElGamal milik otoritas penarikan yang ditahan dapat mendekripsi jumlah biaya yang ditahan, yang dikombinasikan dengan parameter biaya publik dapat mengungkap informasi tentang jumlah transfer, sehingga perlakukan kunci tersebut sebagai data sensitif.
Inisialisasi konfigurasi biaya
Sertakan ini bersama ConfidentialTransferMint dan konfigurasi biaya transfer
dalam pembuatan mint yang sama.
use spl_token_client::token::ExtensionInitializationParams;ExtensionInitializationParams::ConfidentialTransferFeeConfig {authority: Some(authority.pubkey().into()),withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,};
Memanen dan menarik biaya yang ditahan
Pemanenan memindahkan biaya yang ditahan dalam bentuk terenkripsi dari akun ke dalam mint; penarikan memindahkannya keluar dari mint ke akun yang dipilih. Dua otoritas terlibat, dan keduanya dapat berbeda dari otoritas mint:
- Otoritas biaya transfer rahasia (
authorityyang ditetapkan padaConfidentialTransferFeeConfig) mengaktifkan atau menonaktifkan pemanenan. - Otoritas penarikan yang ditahan (dari
TransferFeeConfigekstensi biaya transfer) menarik biaya yang telah dipanen keluar dari mint.
Penarikan memerlukan bukti kesetaraan dan bukti rentang, yang disediakan secara inline atau diverifikasi ke dalam akun status konteks.
// Permissionless: move withheld fees from accounts into the mint.token.confidential_transfer_harvest_withheld_tokens_to_mint(&[&source_account]).await?;// Withdraw withheld fees from the mint (requires the withdraw withheld authority).token.confidential_transfer_withdraw_withheld_tokens_from_mint(&destination_account,&withdraw_withheld_authority,None, // proof context state account, supplied inline if NoneNone, // withheld tokens info, fetched if None&withdraw_withheld_elgamal_keypair,&destination_elgamal_pubkey,&new_decryptable_available_balance,&[&withdraw_withheld_authority_keypair],).await?;
Pada klien JS, penarikan biaya yang telah dipanen dari mint
(getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) juga
memerlukan bukti kesetaraan dan bukti rentang yang diverifikasi ke dalam akun
status konteks, sehingga mengikuti pola akun bukti yang sama seperti transfer
konfidensial.
Mint dan burn konfidensial
Ekstensi ConfidentialMintBurn memungkinkan otoritas mint menerbitkan dan
membakar pasokan langsung terhadap saldo konfidensial, menjaga total pasokan
tetap terenkripsi. Mint dengan ekstensi ini menonaktifkan jalur deposit dan
penarikan publik, karena token hanya ada secara konfidensial. Lihat
dokumentasi protokol
untuk model lengkapnya.
Mint/burn konfidensial paling mudah dilakukan melalui spl-token-client Rust,
yang menghasilkan bukti yang diperlukan dan mengurutkan transaksi untuk Anda.
Klien JS @solana-program/token-2022 menyertakan pembangun instruksi tingkat
rendah (getConfidentialMintInstruction, getConfidentialBurnInstruction,
dan lainnya) tetapi tidak ada pembantu tingkat tinggi yang membangun bukti,
dan tidak ada perintah CLI, sehingga contoh di bawah ini hanya untuk Rust.
Inisialisasi ekstensi pada saat pembuatan mint, lalu mint, burn, dan rekonsiliasi pasokan dari waktu ke waktu. Minting menerbitkan jumlah terenkripsi ke dalam saldo konfidensial penerima; burning menghapus jumlah terenkripsi ke dalam pending burn yang kemudian digabungkan ke dalam pasokan. Keduanya menghasilkan bukti seperti transfer konfidensial.
use spl_token_client::token::ExtensionInitializationParams;// 1. Initialize at creation (alongside ConfidentialTransferMint).ExtensionInitializationParams::ConfidentialMintBurn {supply_elgamal_pubkey, // encrypts the confidential supplydecryptable_supply, // AES ciphertext of the initial supply (zero)};// 2. Mint an encrypted amount into a recipient's confidential balance.token.confidential_transfer_mint(&mint_authority,&destination_account,None, // equality proof accountNone, // ciphertext validity proof accountNone, // range proof accountmint_amount,&supply_elgamal_keypair,&destination_elgamal_pubkey,auditor_elgamal_pubkey, // Option&supply_aes_key,None, // supply account info, fetched if None&[&mint_authority_keypair],).await?;// 3. Burn an encrypted amount from a holder's confidential balance into the// mint's pending burn. Generates proofs like a confidential transfer.token.confidential_transfer_burn(&owner,&source_account,None, // equality proof accountNone, // ciphertext validity proof accountNone, // range proof accountburn_amount,&source_elgamal_keypair,&supply_elgamal_pubkey,auditor_elgamal_pubkey, // Option&source_aes_key,None, // burn account info, fetched if None&[&owner_keypair],).await?;// 4. Fold the accumulated pending burn into the confidential supply.token.confidential_transfer_apply_pending_burn(&mint_authority, &[&mint_authority_keypair]).await?;
Rotasi kunci enkripsi pasokan dengan
confidential_transfer_rotate_supply_elgamal_pubkey (pending burn harus nol
terlebih dahulu), dan perbarui ciphertext pasokan yang dapat dibaca dengan
confidential_transfer_update_decrypt_supply.
Pertimbangan operasional dan kepatuhan
- Penyimpanan kunci auditor. Jika Anda menetapkan auditor, kunci rahasia auditor merupakan kunci dekripsi bernilai tinggi. Simpan dan rotasi dengan hati-hati, dan tentukan siapa di dalam organisasi Anda (atau regulator mana) yang memegangnya.
- Postur kepatuhan. Pemeriksaan alamat dan analisis grafik pihak lawan tetap berfungsi karena alamat tetap publik. Pemantauan berbasis jumlah bergantung pada kunci auditor atau pengungkapan selektif dari pemilik akun. Tentukan pendekatan Anda sebelum peluncuran.
- Orientasi pemegang. Mengonfigurasi akun konfidensial memerlukan tanda tangan pemilik. Untuk menyediakan akun bagi pengguna dengan lancar, minta mereka mendaftarkan kunci ElGamal sekali dan gunakan jalur registri, yang dijelaskan dalam Panduan Integrasi.
- Jumlah transaksi. Transfer konfidensial saat ini mencakup beberapa transaksi yang saling bergantung karena bukti melebihi batas ukuran transaksi saat ini. Format transaksi v1 (hadir bersama Agave v4.2) meningkatkan batas tersebut dan diharapkan memungkinkan satu transaksi onchain.
Is this page helpful?