دليل مُصدر الأرصدة السرية

إصدار رموز الأرصدة السرية على سولانا

هذا الدليل موجَّه إلى المُصدِرين: الفِرق التي تنشئ وتشغّل نقطة سك Token-2022 تستخدم الأرصدة السرية. يغطي القرارات التي تتخذها عند إنشاء نقطة السك والعمليات التي تُجريها طوال دورة حياتها. للاطلاع على تدفق المالك (الإيداع، والتطبيق، والتحويل، والسحب) راجع الصفحات التفصيلية خطوة بخطوة، وللتعرف على دعم هذه الرموز في منتج ما راجع دليل التكامل.

تحافظ الأرصدة السرية على تشفير مبالغ التحويل وأرصدة الحسابات مع إبقاء عناوين الحسابات ونقطة السك والمالكين عامةً للجميع. يعتمد الامتداد على برنامج ZK ElGamal Proof للتحقق من البراهين على السلسلة، لذا يمكن aستخدام نقطة السك على المجموعات التي يكون هذا البرنامج مُفعَّلاً فيها.

القرارات التي تتخذها عند الإنشاء

يجب تهيئة امتداد الأرصدة السرية قبل تهيئة نقطة السك ولا يمكن إضافته لاحقاً. عند الإنشاء تحدد:

  • سياسة الموافقة: ما إذا كان بإمكان الحسابات الاشتراك في الأرصدة السرية بدون إذن مسبق (auto) أو يجب الحصول على موافقة سلطة الأرصدة السرية لنقطة السك (manual).
  • المدقق: ما إذا كان سيتم تعيين مفتاح عام ElGamal لمدقق عالمي بحيث يمكن لجهة محددة فك تشفير كل مبالغ النقل لـ mint. اختياري ويمكن تغييره لاحقاً.
  • امتدادات مصاحبة اختيارية: رسوم النقل السري (مقترنة مع امتداد رسوم النقل) وسك/حرق سري، كلاهما مُغطّى أدناه. يجب أيضاً تهيئة هذه الامتدادات عند الإنشاء.

إنشاء mint سري

تضبط واجهة سطر الأوامر سياسة الموافقة عبر --enable-confidential-transfers auto أو manual؛ يتيح auto لأي مالك تهيئة حسابه الخاص، بينما يضع manual ذلك خلف موافقة سلطة الأرصدة السرية (التي تكون بشكل افتراضي سلطة السك). تأخذ مسارات العميل الإعدادات ذاتها عبر معاملات ConfidentialTransferMint: وهي سلطة، وعلامة الموافقة التلقائية، ومفتاح مدقق اختياري. يمكن تغيير كلٍّ من سياسة الموافقة والمدقق لاحقاً (انظر تهيئة مدقق)؛ فقط وجود الامتداد ذاته هو الثابت عند الإنشاء.

$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto

تهيئة مدقق

المدقق العام هو مفتاح عام ElGamal مخزَّن في نقطة السك. عند تعيينه، يقوم كل تحويل سري بتشفير مبلغه إضافياً باستخدام هذا المفتاح، بحيث يستطيع من يحوز المفتاح السري المقابل فك تشفير جميع مبالغ التحويل الخاصة بنقطة السك. وهذه هي الطريقة التي تظل بها الأرصدة السرية متوافقة مع متطلبات التدقيق والامتثال: لا يرى العموم شيئاً، بينما يرى المدقق كل شيء.

يمكن لسلطة الأرصدة السرية تعيين المدقق أو تدويره أو إزالته في أي وقت. تُحدِّث العملية ذاتها سياسة الموافقة أيضاً. في واجهة سطر الأوامر، مفتاح المدقق هو ترميز base64 لمفتاح عام ElGamal؛ مرِّر --auditor-pubkey none لإزالته و--approve-policy auto|manual لتغيير السياسة.

لا يؤثر التدوير إلا على عمليات النقل المستقبلية. تبقى المبالغ الموجودة في المعاملات المسجَّلة بالفعل على السلسلة mمشفَّرة وفق مفتاح المدقق الذي كان نشطًا عند تنفيذها، لذا احتفظ بمفاتيح المدقق القديمة إذا كنت بحاجة إلى فك تشفير النشاط التاريخي.

$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>

يمكن للمفتاح السري للمدقق فك تشفير كل مبلغ نقل خاص بالـ mint. احتفظ به بنفس الصرامة التي تتعامل بها مع مفتاح التوقيع، وضع خطة للتدوير. يؤدي تعيين المدقق على None إلى تعطيل رؤية المبالغ للجميع باستثناء أصحاب الحسابات أنفسهم.

الموافقة على الحسابات (السياسة اليدوية)

مع سياسة الموافقة اليدوية، لا يستطيع الحساب المهيَّأ للأرصدة السرية إجراء معاملات سرية حتى توافق عليه سلطة الأرصدة السرية. يمنح هذا المُصدِرين بوابةً للمشاركين المدرجين في القائمة البيضاء أو الخاضعين لإجراءات التحقق من الهوية (KYC). لا تتيح واجهة سطر الأوامر أمر موافقة، لذا تتم الموافقة عبر عميل.

token
.confidential_transfer_approve_account(
&token_account,
&authority,
&[&authority_keypair],
)
.await?;

رسوم النقل السري

إذا كانت نقطة السك تفرض رسوم تحويل و كانت التحويلات سرية، فيجب حجب الرسوم بصورة سرية أيضاً. يتولى امتداد ConfidentialTransferFeeConfig هذا الأمر، ويُهيَّأ عند إنشاء نقطة السك إلى جانب كلٍّ من امتدادَي رسوم التحويل والأرصدة السرية.

تتراكم الرسوم المحجوبة مُشفَّرةً على حسابات المستلمين، ثم تُجمَع إلى الـ mint، وتُسحَب بعد ذلك بواسطة سلطة سحب المحجوب. تبقى جميع مبالغ الرسوم مُشفَّرة طوال العملية. لا شيء من هذا متاح عبر واجهة سطر الأوامر (CLI). يستطيع المفتاح السري ElGamal الخاص بسلطة سحب المحجوب فك تشفير مبالغ الرسوم المحجوبة، مما قد يكشف—مجتمعًا مع معاملات الرسوم العامة—معلومات عن مبالغ النقل، لذا تعامل مع هذا المفتاح باعتباره بيانات حساسة.

تهيئة إعداد الرسوم

أدرج هذا جنبًا إلى جنب مع ConfidentialTransferMint وإعداد رسوم التحويل في إنشاء نفس العملة.

use spl_token_client::token::ExtensionInitializationParams;
ExtensionInitializationParams::ConfidentialTransferFeeConfig {
authority: Some(authority.pubkey().into()),
withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,
};

جمع الرسوم المحتجزة وسحبها

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

  • تُمكّن سلطة رسوم التحويل السرية (authority المُعيَّنة على ConfidentialTransferFeeConfig) عملية الجمع أو تُعطّلها.
  • تسحب سلطة سحب الرسوم المحتجزة (من TransferFeeConfig الخاصة بامتداد رسوم التحويل) الرسوم المجمّعة خارج العملة.

تستلزم عمليات السحب دليل تساوٍ ودليل نطاق، يُقدَّمان مضمّنَين أو يُتحقق منهما في حسابات حالة السياق.

// Permissionless: move withheld fees from accounts into the mint.
token
.confidential_transfer_harvest_withheld_tokens_to_mint(&[&source_account])
.await?;
// Withdraw withheld fees from the mint (requires the withdraw withheld authority).
token
.confidential_transfer_withdraw_withheld_tokens_from_mint(
&destination_account,
&withdraw_withheld_authority,
None, // proof context state account, supplied inline if None
None, // withheld tokens info, fetched if None
&withdraw_withheld_elgamal_keypair,
&destination_elgamal_pubkey,
&new_decryptable_available_balance,
&[&withdraw_withheld_authority_keypair],
)
.await?;

في عميل JS، يستلزم سحب الرسوم المجمّعة من العملة (getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) أيضًا دليل تساوٍ ودليل نطاق يُتحقق منهما في حسابات حالة السياق، لذا يتبع نفس نمط حساب الإثبات كما في التحويل السري.

الإصدار والحرق السري

يتيح امتداد ConfidentialMintBurn لسلطة الإصدار طرح العرض وحرقه مباشرةً مقابل الأرصدة السرية، مما يُبقي إجمالي العرض مشفرًا. تُعطّل العملة التي تستخدم هذا الامتداد مسار الإيداع والسحب العام، إذ لا توجد الرموز المميزة إلا بصورة سرية. راجع توثيق البروتوكول للاطلاع على النموذج الكامل.

الإصدار/الحرق السري أيسر تنفيذًا عبر spl-token-client في Rust، الذي يُنشئ الأدلة المطلوبة ويُرتّب المعاملات نيابةً عنك. يُضمّن عميل @solana-program/token-2022 في JS منشئات تعليمات المستوى المنخفض (getConfidentialMintInstruction، وgetConfidentialBurnInstruction، وما شابهها) دون أي مساعد رفيع المستوى لبناء الأدلة، ولا تتوفر أوامر CLI، لذا فإن الأمثلة أدناه مخصصة لـ Rust فقط.

قم بتهيئة الامتداد عند إنشاء العملة، ثم قم بسك العملات وحرقها وتسوية المعروض بمرور الوقت. يُصدر السك مبلغاً مشفراً في الرصيد السري للمستلم؛ أما الحرق فيزيل مبلغاً مشفراً في عملية حرق معلقة يتم دمجها لاحقاً في المعروض. يولّد كلاهما إثباتات مشابهة للتحويل السري.

confidential-mint-burn.rs
use spl_token_client::token::ExtensionInitializationParams;
// 1. Initialize at creation (alongside ConfidentialTransferMint).
ExtensionInitializationParams::ConfidentialMintBurn {
supply_elgamal_pubkey, // encrypts the confidential supply
decryptable_supply, // AES ciphertext of the initial supply (zero)
};
// 2. Mint an encrypted amount into a recipient's confidential balance.
token
.confidential_transfer_mint(
&mint_authority,
&destination_account,
None, // equality proof account
None, // ciphertext validity proof account
None, // range proof account
mint_amount,
&supply_elgamal_keypair,
&destination_elgamal_pubkey,
auditor_elgamal_pubkey, // Option
&supply_aes_key,
None, // supply account info, fetched if None
&[&mint_authority_keypair],
)
.await?;
// 3. Burn an encrypted amount from a holder's confidential balance into the
// mint's pending burn. Generates proofs like a confidential transfer.
token
.confidential_transfer_burn(
&owner,
&source_account,
None, // equality proof account
None, // ciphertext validity proof account
None, // range proof account
burn_amount,
&source_elgamal_keypair,
&supply_elgamal_pubkey,
auditor_elgamal_pubkey, // Option
&source_aes_key,
None, // burn account info, fetched if None
&[&owner_keypair],
)
.await?;
// 4. Fold the accumulated pending burn into the confidential supply.
token
.confidential_transfer_apply_pending_burn(&mint_authority, &[&mint_authority_keypair])
.await?;

قم بتدوير مفتاح تشفير المعروض باستخدام confidential_transfer_rotate_supply_elgamal_pubkey (يجب أن يكون الحرق المعلق صفراً أولاً)، وقم بتحديث نص التشفير المقروء للمعروض باستخدام confidential_transfer_update_decrypt_supply.

اعتبارات التشغيل والامتثال

  • حضانة مفتاح المدقق. إذا قمت بتعيين مدقق، فإن المفتاح السري للمدقق يُعدّ مفتاح فك تشفير عالي القيمة. قم بتخزينه وتدويره بعناية، وحدد من داخل مؤسستك (أو أي جهة تنظيمية) من يحتفظ به.
  • موقف الامتثال. يظل فحص العناوين وتحليل شبكة الأطراف المقابلة فعّالَين لأن العناوين تبقى عامة. يعتمد الرصد القائم على المبالغ على مفتاح المدقق أو على الإفصاح الانتقائي من أصحاب الحسابات. حدد نهجك قبل الإطلاق.
  • تأهيل المستخدمين. يتطلب تكوين حساب سري توقيع المالك. لتوفير الحسابات للمستخدمين بسلاسة، اطلب منهم تسجيل مفتاح ElGamal مرة واحدة واستخدام مسار السجل، الموضح في دليل التكامل.
  • عدد المعاملات. يمتد التحويل السري حالياً عبر بضع معاملات مترابطة نظراً لأن الإثباتات تتجاوز حد حجم المعاملة الحالي. يرفع صيغة المعاملة v1 (القادمة مع Agave v4.2) ذلك الحد ومن المتوقع أن تتيح معاملة واحدة على السلسلة.

Is this page helpful?