Kuinka tallettaa tokeneita luottamukselliseen odottavaan saldoon
Ennen kuin tokeneita voidaan siirtää luottamuksellisesti, julkinen tokenisaldo täytyy muuntaa luottamukselliseksi saldoksi. Tämä muunnos tapahtuu kahdessa vaiheessa:
- Luottamuksellinen odottava saldo: Aluksi tokenit "talletetaan" julkisesta saldosta "odottavaan" luottamukselliseen saldoon.
- Luottamuksellinen käytettävissä oleva saldo: Odottava saldo "kohdistetaan" sitten käytettävissä olevaan saldoon, jolloin tokenit ovat käytettävissä luottamuksellisiin siirtoihin.
Tässä osiossa selitetään ensimmäinen vaihe: julkisen tokenisaldon tallettaminen luottamukselliseen odottavaan saldoon.
Seuraava kaavio näyttää vaiheet, jotka liittyvät tokeneiden tallettamiseen julkisesta saldosta luottamukselliseen odottavaan saldoon:
Vaadittu ohje
Julkisen saldon muuntamiseksi luottamukselliseksi odottavaksi saldoksi, kutsu ConfidentialTransferInstruction::Deposit -ohjetta. Talletus-ohjeen enimmäismäärä on rajoitettu 2^48:aan.
spl_token_client-kirjasto tarjoaa confidential_transfer_deposit-metodin,
joka rakentaa ja lähettää transaktion Deposit-ohjeen kanssa, kuten alla
olevassa esimerkissä on havainnollistettu.
Esimerkkikoodi
Seuraava esimerkki havainnollistaa, kuinka julkinen tokenisaldo talletetaan luottamukselliseen odottavaan saldoon.
Luottamukselliset siirrot riippuvat ZK ElGamal Proof -ohjelmasta, joka on
käytössä mainnetissä ja devnetissä. Tavallinen solana-test-validator ei ota
sitä käyttöön, mutta mainnettia haarukoiva paikallinen validator, kuten
Surfpool, ottaa. Aja esimerkki jompaakumpaa vastaan
(koodi käyttää devnetiä) rahoitetulla maksajalla ja korvaa paikkamerkin mint- ja
tiliosoitteet omillasi.
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?