Token Yatırma

Gizli bekleyen bakiyeye token yatırma

Tokenlar gizli olarak transfer edilmeden önce, genel token bakiyesinin gizli bir bakiyeye dönüştürülmesi gerekir. Bu dönüşüm iki aşamada gerçekleşir:

  1. Gizli Bekleyen Bakiye: Başlangıçta tokenlar, genel bakiyeden "bekleyen" gizli bakiyeye "yatırılır".
  2. Gizli Kullanılabilir Bakiye: Bekleyen bakiye daha sonra kullanılabilir bakiyeye "uygulanarak" tokenlar gizli transferler için kullanılabilir hale getirilir.

Bu bölüm, birinci aşamayı açıklar: genel token bakiyesinin gizli bekleyen bakiyeye yatırılması.

Aşağıdaki diyagram, genel bakiyeden gizli bekleyen bakiyeye token yatırma işlemindeki adımları göstermektedir:

Deposit Tokens

Gerekli Talimat

Genel bakiyeyi gizli bekleyen bakiyeye dönüştürmek için ConfidentialTransferInstruction::Deposit talimatını çağırın. Yatırma talimatı başına maksimum miktar 2^48 ile sınırlıdır.

spl_token_client crate'i, aşağıdaki örnekte gösterildiği gibi Deposit talimatını içeren bir işlem oluşturup gönderen bir confidential_transfer_deposit yöntemi sağlar.

Örnek Kod

Aşağıdaki örnek, genel token bakiyesinin gizli bekleyen bakiyeye nasıl yatırılacağını göstermektedir.

Gizli transferler, mainnet ve devnet üzerinde etkin olan ZK ElGamal Proof programına bağlıdır. Standart bir solana-test-validator bunu etkinleştirmez; ancak Surfpool gibi mainnet-forking yerel validator'lar etkinleştirir. Örneği, finanse edilmiş bir ödeyici ile bu ortamlardan birinde (kod devnet kullanır) çalıştırın ve yer tutucu mint ile hesap adreslerini kendi adreslerinizle değiştirin.

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?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.