إيداع الرموز

كيفية إيداع الرموز في الرصيد المعلّق السري

قبل أن يمكن نقل الرموز بشكل سري، يجب تحويل رصيد الرموز العام إلى رصيد سري. يتم هذا التحويل على مرحلتين:

  1. الرصيد المعلّق السري: في البداية، يتم "إيداع" الرموز من الرصيد العام إلى رصيد سري "معلّق".
  2. الرصيد السري المتاح: يتم بعد ذلك "تطبيق" الرصيد المعلّق على الرصيد المتاح، مما يجعل الرموز متاحة للتحويلات السرية.

يشرح هذا القسم المرحلة الأولى: إيداع رصيد الرموز العام في الرصيد المعلّق السري.

يوضح المخطط التالي الخطوات المتبعة في إيداع الرموز من الرصيد العام إلى الرصيد المعلّق السري:

Deposit Tokens

التعليمة المطلوبة

لتحويل رصيد عام إلى رصيد معلّق سري، استدعِ تعليمة ConfidentialTransferInstruction::Deposit. الحد الأقصى للمبلغ لكل تعليمة إيداع مقيّد بـ 2^48.

توفر حزمة spl_token_client طريقة confidential_transfer_deposit التي تبني وترسل معاملة بتعليمة Deposit، كما هو موضح في المثال أدناه.

مثال على الكود

يوضح المثال التالي كيفية إيداع رصيد الرموز العام في الرصيد المعلّق السري.

تعتمد التحويلات السرية على برنامج ZK ElGamal Proof، والذي يكون مفعّلاً على الشبكة الرئيسية وشبكة devnet. لا يُفعّله validator المحلي الافتراضي solana-test-validator، لكن يفعله validator محلي يعمل بالتفرع من الشبكة الرئيسية مثل Surfpool. شغّل المثال على إحداهما (يستخدم الكود شبكة devnet) مع حساب ممول، واستبدل عناوين المصكوكات والحسابات النائبة بعناوينك الخاصة.

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?

جدول المحتويات

تعديل الصفحة