Panduan Penerbit Confidential Transfer

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 (authority yang ditetapkan pada ConfidentialTransferFeeConfig) mengaktifkan atau menonaktifkan pemanenan.
  • Otoritas penarikan yang ditahan (dari TransferFeeConfig ekstensi 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 None
None, // 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.

confidential-mint-burn.rs
use spl_token_client::token::ExtensionInitializationParams;
// 1. Initialize at creation (alongside ConfidentialTransferMint).
ExtensionInitializationParams::ConfidentialMintBurn {
supply_elgamal_pubkey, // encrypts the confidential supply
decryptable_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 account
None, // ciphertext validity proof account
None, // range proof account
mint_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 account
None, // ciphertext validity proof account
None, // range proof account
burn_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?

© 2026 Yayasan Solana. Semua hak dilindungi.