Κατάθεση Tokens

Πώς να καταθέσετε tokens στο εμπιστευτικό εκκρεμές υπόλοιπο

Πριν μπορέσουν να μεταφερθούν τα tokens εμπιστευτικά, το δημόσιο υπόλοιπο tokens πρέπει να μετατραπεί σε εμπιστευτικό υπόλοιπο. Αυτή η μετατροπή γίνεται σε δύο στάδια:

  1. Εμπιστευτικό Εκκρεμές Υπόλοιπο: Αρχικά, τα tokens «κατατίθενται» από το δημόσιο υπόλοιπο σε ένα «εκκρεμές» εμπιστευτικό υπόλοιπο.
  2. Εμπιστευτικό Διαθέσιμο Υπόλοιπο: Το εκκρεμές υπόλοιπο στη συνέχεια «εφαρμόζεται» στο διαθέσιμο υπόλοιπο, καθιστώντας τα tokens διαθέσιμα για εμπιστευτικές μεταφορές.

Αυτή η ενότητα εξηγεί το πρώτο στάδιο: κατάθεση δημόσιου υπολοίπου tokens στο εμπιστευτικό εκκρεμές υπόλοιπο.

Το παρακάτω διάγραμμα δείχνει τα βήματα που απαιτούνται για την κατάθεση tokens από το δημόσιο υπόλοιπο στο εμπιστευτικό εκκρεμές υπόλοιπο:

Deposit Tokens

Απαιτούμενη Εντολή

Για να μετατρέψετε ένα δημόσιο υπόλοιπο σε εμπιστευτικό εκκρεμές υπόλοιπο, καλέστε την εντολή ConfidentialTransferInstruction::Deposit. Το μέγιστο ποσό ανά εντολή κατάθεσης περιορίζεται στο 2^48.

Το crate spl_token_client παρέχει μια μέθοδο confidential_transfer_deposit που δημιουργεί και αποστέλλει μια συναλλαγή με την εντολή Deposit, όπως φαίνεται στο παρακάτω παράδειγμα.

Παράδειγμα Κώδικα

Το παρακάτω παράδειγμα δείχνει πώς να καταθέσετε δημόσιο υπόλοιπο tokens στο εμπιστευτικό εκκρεμές υπόλοιπο.

Οι εμπιστευτικές μεταφορές εξαρτώνται από το πρόγραμμα ZK ElGamal Proof, το οποίο είναι ενεργοποιημένο στο mainnet και στο devnet. Ένα τυπικό solana-test-validator δεν το ενεργοποιεί, αλλά ένας topικός validator με forking του mainnet όπως το Surfpool το κάνει. Εκτελέστε το παράδειγμα σε έναν από αυτούς (ο κώδικας χρησιμοποιεί το devnet) με έναν χρηματοδοτημένο payer, και αντικαταστήστε τις placeholder διευθύνσεις mint και λογαριασμού με τις δικές σας.

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?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.