Deposit Token

Cara menyetor token ke saldo tertunda yang bersifat rahasia

Sebelum token dapat ditransfer secara rahasia, saldo token publik harus dikonversi menjadi saldo rahasia. Konversi ini terjadi dalam dua tahap:

  1. Saldo Tertunda yang Bersifat Rahasia: Awalnya, token "disetor" dari saldo publik ke saldo rahasia yang bersifat "tertunda".
  2. Saldo Tersedia yang Bersifat Rahasia: Saldo tertunda kemudian "diterapkan" ke saldo tersedia, sehingga token siap digunakan untuk transfer rahasia.

Bagian ini menjelaskan tahap pertama: menyetor saldo token publik ke saldo tertunda yang bersifat rahasia.

Diagram berikut menunjukkan langkah-langkah yang terlibat dalam menyetor token dari saldo publik ke saldo tertunda yang bersifat rahasia:

Deposit Tokens

Instruksi yang Diperlukan

Untuk mengonversi saldo publik menjadi saldo tertunda yang bersifat rahasia, panggil instruksi ConfidentialTransferInstruction::Deposit. Jumlah maksimum per instruksi deposit dibatasi hingga 2^48.

Crate spl_token_client menyediakan metode confidential_transfer_deposit yang membangun dan mengirimkan transaksi dengan instruksi Deposit, sebagaimana didemonstrasikan dalam contoh di bawah ini.

Contoh Kode

Contoh berikut menunjukkan cara menyetor saldo token publik ke saldo tertunda yang bersifat rahasia.

Transfer rahasia bergantung pada program ZK ElGamal Proof, yang diaktifkan di mainnet dan devnet. Sebuah solana-test-validator standar tidak mengaktifkannya, tetapi validator lokal yang melakukan fork mainnet seperti Surfpool mendukungnya. Jalankan contoh ini pada salah satu dari keduanya (kode menggunakan devnet) dengan payer yang memiliki dana, dan ganti placeholder alamat mint dan akun dengan milik Anda sendiri.

Rust

const ZK_PROOF_PROGRAM_ID: Pubkey =
solana_pubkey::pubkey!("ZkE1Gama1Proof11111111111111111111111111111");
fn main() -> Result<()> {
let rpc_client = RpcClient::new_with_commitment(
String::from("https://api.devnet.solana.com"),
CommitmentConfig::confirmed(),
);
// Owner = fee payer = token account owner. The setup below configures the
// account for confidential transfers (see "Create a Token Account").
let owner = load_keypair()?;
let amount: u64 = 100;
let decimals: u8 = 2;
// Setup: create a confidential token account with public tokens.
let (mint, token_account) = setup_deposit_account(&rpc_client, &owner, amount, decimals)?;
// Deposit moves tokens from the public balance into the pending confidential
// balance. No proof is required. The tokens land in the pending balance and
// must be applied (see "Apply Pending Balance") before they can be spent.
let deposit_ix = deposit(
&spl_token_2022::id(),
&token_account,
&mint,
amount,
decimals,
&owner.pubkey(),
&[&owner.pubkey()],
)?;
let blockhash = rpc_client.get_latest_blockhash()?;
let transaction =
Transaction::new_signed_with_payer(&[deposit_ix], Some(&owner.pubkey()), &[&owner], blockhash);
let signature = rpc_client.send_and_confirm_transaction(&transaction)?;
println!("Deposited {amount} tokens to the pending confidential balance: {signature}");
Ok(())
}

Typescript

const client = await createClient()
.use(signerFromFile(join(homedir(), ".config/solana/id.json")))
.use(
solanaRpc({
rpcUrl: "https://api.devnet.solana.com"
})
);
// The Solana CLI default keypair, used as fee payer, mint authority, and
// token account owner.
const owner = client.payer;
const amount = 100n;
const decimals = 2;
// Setup: create a confidential mint and token account with public tokens.
const mint = await createConfidentialMint(client, owner, decimals);
const token = await createConfidentialTokenAccount(client, owner, mint);
await mintPublicTokens(client, owner, mint, token, amount);
// Deposit moves public tokens into the pending confidential balance. No proof
// is required; the tokens must then be applied before they can be spent.
const depositInstruction = getConfidentialDepositInstruction({
token,
mint,
authority: owner,
amount,
decimals
});
const result = await client.sendTransaction([depositInstruction]);
console.log(
`Deposited ${amount} tokens to the pending confidential balance: ${result.context.signature}`
);

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.