Talleta tokeneita

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:

  1. Luottamuksellinen odottava saldo: Aluksi tokenit "talletetaan" julkisesta saldosta "odottavaan" luottamukselliseen saldoon.
  2. 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:

Deposit Tokens

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?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.