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.

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. Keduanya juga harus diinisialisasi saat pembuatan.

Buat mint rahasia

CLI menetapkan kebijakan persetujuan dengan --enable-confidential-transfers auto atau manual; auto memungkinkan pemegang mana pun mengonfigurasi akun mereka sendiri, sementara manual membatasi hal tersebut di balik persetujuan dari otoritas transfer rahasia (yang secara default adalah otoritas mint). Jalur klien mengambil pengaturan yang sama melalui parameter ConfidentialTransferMint: sebuah otoritas, flag persetujuan otomatis, dan kunci auditor opsional. Baik kebijakan persetujuan maupun auditor dapat diubah nanti (lihat Konfigurasikan auditor); hanya keberadaan ekstensi itu sendiri yang ditetapkan saat pembuatan.

$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto

Konfigurasikan auditor

Auditor global adalah kunci publik ElGamal yang tersimpan pada mint. Ketika ditetapkan, setiap transfer rahasia juga mengenkripsi jumlahnya dengan kunci ini, sehingga siapa pun yang memegang kunci rahasia yang sesuai 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. Di CLI, kunci auditor adalah pengkodean 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 ke kunci auditor mana pun 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. Simpan kunci tersebut dengan tingkat keamanan yang sama seperti kunci penandatanganan, dan rencanakan rotasi. Menetapkan 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 sampai otoritas transfer rahasia menyetujuinya. Hal ini memberi penerbit gerbang untuk peserta yang masuk daftar izin 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 dipotong secara rahasia. Ekstensi ConfidentialTransferFeeConfig menangani hal ini, dan diinisialisasi saat pembuatan mint bersamaan dengan 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 prosesnya. Tidak ada hal ini yang diekspos 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 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,
};

Panen dan tarik biaya yang ditahan

Pemanenan memindahkan biaya yang ditahan secara 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?;

Di klien JS, menarik biaya yang telah dipanen keluar 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 rahasia.

Mint dan burn rahasia

Ekstensi ConfidentialMintBurn memungkinkan otoritas mint menerbitkan dan membakar pasokan langsung terhadap saldo rahasia, menjaga total pasokan tetap terenkripsi. Mint dengan ekstensi ini menonaktifkan jalur deposit dan penarikan publik, karena token hanya pernah ada secara rahasia. Lihat dokumentasi protokol untuk model lengkapnya.

Mint/burn rahasia paling mudah dilakukan melalui Rust spl-token-client, yang menghasilkan bukti yang diperlukan dan mengurutkan transaksi untuk Anda. Klien JS @solana-program/token-2022 menyertakan pembangun instruksi tingkat rendah (getConfidentialMintInstruction, getConfidentialBurnInstruction, dan sejenisnya) tetapi tidak ada pembantu tingkat tinggi yang membangun bukti, dan tidak ada perintah CLI, sehingga contoh di bawah ini hanya untuk Rust.

Inisialisasi ekstensi 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 antrian 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 (antrian 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 adalah kunci dekripsi bernilai tinggi. Simpan dan rotasi dengan hati-hati, dan tentukan siapa dalam organisasi Anda (atau regulator mana) yang memegangnya.
  • Postur kepatuhan. Pemindaian 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.