استخدم هذه الصفحة لتشغيل faucet على سلسلة اختبار، ولفهم ما تكونه معاملة Mint على مستوى الشبكة، ولترى بالضبط كيف يُخرج السند (bond) أو حرقُ الجسر (bridge burn) القيمةَ من الحوض. كل دخول وكل خروج علني؛ وكل ما بينهما ملاحظات (notes).
سكّ الـ faucet
Mint هو الطريقة الوحيدة التي يُنشأ بها RAND بعد التكوين الأول (genesis) على السلسلة 20، ولا يوجد إلا على السلاسل التي ينص genesis فيها على "faucet": true. وهي معاملة يوقّعها مُصادِق (validator) ولا تحمل حزمة (bundle):
Action::Mint { cm: Word8, pk: Word8, time: u32, r: Word8, envelope: Envelope, amount: u64,
minter: PublicKey, signature: Signature }
تبني rand_mint(address[, amount]) على عقدة مُصادِق ملاحظةً بقيمة amount إلى عنوان rand1… المعطى، وتختم غلافها بمفتاح مرسل مؤقت، وتوقّع عملية السك بمفتاح Dilithium2 الخاص بالعقدة، وتقدّمها عبر mempool العادي، فتمر عملية السك بالإجماع وتطبّقها كل عقدة. الحد الأقصى هو 100000000000 وحدة، أي 100 RAND، لكل استدعاء، والقيمة الافتراضية هي الحد الأقصى. منذ السلسلة 14 تحمل عملية السك فتحَ الملاحظة (opening) — pk وtime وr — ويشمله التوقيع: يعيد القبول حساب التزام (pk, no sender, amount, asset 0, time, r) ويرفض أي cm لا يطابقه برسالة the mint's commitment does not open to its published note and amount، ويقيّد time بنافذة الحزمة. أما معاملات rand_mint فلم تتغير. الرسالة الموقَّعة هي blake3("rand-mint-2" ‖ bincode(chain_id, cm, pk, time, r, envelope, amount)) على السلاسل من 14 إلى 19؛ وعلى السلسلة 20، التي يضبط genesis فيها binding_domain: 1، تكون rand-mint-3 على hash الـ genesis متبوعًا بالحقول نفسها، فتُرفض عملية سك موقَّعة لسلسلة على أي سلسلة أخرى، حتى لو شاركتها معرّف السلسلة ومفاتيح المُصادِقين. ولا يملك المراقب (observer) مفتاح مُصادِق، فيجيب faucet mints are signed by validators; ask a validator node؛ وتجيب السلسلة التي لا تحمل العلم faucet is disabled on this chain.
الـ faucet على السلسلة 20 مفعّل لكنه مقيَّد بقسم staking في genesis، بالقيم نفسها الموجودة في السلسلة 19:
| القاعدة | السلسلة 20 | سبب الرفض |
|---|---|---|
| المستلمون | قائمة سماح من 16 محفظة (staking.faucet_recipients)؛ ويجب أن يكون pk المنشور في عملية السك فيها | the faucet may not mint to this recipient (not in staking.faucet_recipients)، رفض دائم |
| الميزانية | 10,000 RAND لكل حقبة (epoch) من 1,000 كتلة (staking.faucet_budget_per_epoch)، عبر جميع المُصادِقين | the faucet budget of … for this epoch is exhausted (… minted)؛ وتقبلها الحقبة التالية |
| السَّاكّون | 18 من أصل 26 مُصادِقًا (staking.faucet_minters، مدرجون منذ السلسلة 16)؛ ويجب أن يوقّع عملية السك أحدهم | minter … is not a faucet minter on this chain |
لذلك لا يعمل rand faucet على السلسلة 20 إلا لمحفظة واردة في القائمة، ويُطلب من عقدة مُصادِق مفتاحها أحد السّاكّين المدرجين؛ وأي عنوان آخر يجب أن يدفع له شخص يملك RAND.
rand faucet # 100 RAND to this wallet's address, waits for the commit
rand faucet rand1… --amount 25 # to another address, less than the cap
→ {"method":"rand_mint","params":["rand1…", "100000000000"]}
← "9ab1c0…4f"
العلني هو: التزام الملاحظة الجديدة، وغلافها، والمبلغ بوضوح، والمفتاح العام للمُصادِق الساكّ (معروضًا كعنوانه) وتوقيعه. ويكشف الفتح أيضًا مفتاح مالك الملاحظة pk، فمالك ملاحظة الـ faucet علني، كما أن مدفوعات السحب (withdraw) علنية؛ أما ما يبقى مخفيًا فهو متى تُنفق تلك الملاحظة لاحقًا وأين. والصلة المباشرة بين «سُكّ 100 RAND» و«توجد ملاحظة قيمتها 100 RAND» هي نفسها درجة الظهور التي يتيحها أي إيداع من شفاف إلى محمي في أي مكان. ويتحقق القبول من أن الـ faucet مفعّل، وأن المبلغ دون الحد الأقصى، وأن في ميزانية الحقبة متسعًا، وأن المستلم في قائمة السماح حيث يحدد genesis قائمة، وأن الالتزام ينفتح على الملاحظة المنشورة، وأن الساكّ مُصادِق، وهو في قائمة الساكّين حيث يحدد genesis قائمة، وأن التوقيع صحيح؛ ولا تدفع عملية السك رسومًا.
تعرض rand_getTransaction واحدة منها على هيئة { "kind": "mint", "cm": "…", "amount": "100000000000", "minter": "<validator base58>" } مع "bundle": null — المبلغ سلسلة عشرية، كما في كل مبلغ u64 تقدّمه RPC منذ السلسلة 14؛ ويسردها المستكشف تحت kind=mint، وهي من الأنواع القليلة التي لها amount علني.
إيداعات genesis
الطريقة الأخرى لدخول القيمة هي ملف genesis: كل --alloc rand1<address>=<RAND> يُمرَّر إلى rand-node genesis يصبح ملاحظة إيداع واحدة { cm, envelope, amount, opening } بعشوائية التزام جديدة، وهي أولى أوراق الشجرة. تضم السلسلة 20 تسع ملاحظات genesis: سبع ملاحظات RAND مجموعها 5,184.243719258 RAND (genesis_deposited)، وهي أرصدة المشغّلين المنقولة من لقطة للسلسلة 19، وملاحظتا zUSD بقيمة 10 و89 zUSD، أي 99 zUSD من حضانة الجسر منقولة من السلسلة 19 (Bridge)، وهي ليست RAND ولا تدخل في genesis_deposited. ولم يُنقل RAND الموجود على السلسلة 19 في محافظ لا يملكها المشغّل، نحو 520 RAND، ولا رسوم المُصادِقين غير المسحوبة. التاريخ: كان في السلسلة 19 ثماني ملاحظات، سبع ملاحظات RAND مجموعها 5,294.644359629 RAND وملاحظة بقيمة 10 zUSD؛ وكان في السلسلة 18 ست ملاحظات RAND، خمس منها بقيمة 1,000 RAND وواحدة بقيمة 300 RAND؛ وفي السلسلتين 14 و15 خمس ملاحظات بقيمة 1,000 RAND. المبلغ علني ليتمكن الجميع من جمع العرض الأولي، ومنذ السلسلة 14 تحمل الملاحظة فتحها أيضًا، فمالك ملاحظة genesis علني بحكم التصميم. وإعادة إنشاء التخصيصات نفسها تعطي ملاحظات مختلفة وhash genesis مختلفًا، عن قصد.
الحرق
تحمل كل معاملة حزمة أصول مخفية واحدة بأربع خانات، ولها كلمتا حرق: burn_r هي RAND الخارج من الحوض إلى مكان علني، وburn_a هي مقدار الرمز المسمّى في burn_asset. ويوازن مثبِّت الحزمة (bundle guest) المجموعتين في إثبات واحد، ويشترط القبول أن تكون القيم الثلاث كلها صفرًا إلا في هذه الإجراءات:
| الحرق | القاعدة | وجهة القيمة |
|---|---|---|
حزمة Bond | burn_r == amount | stake العلني للمُصادِق في السجل |
حزمة BridgeBurn | burn_asset == asset، burn_a == amount، burn_r == 0، asset != 0 | تُتلَف على Rand؛ ويفرج العقد في السلسلة المصدر عن amount من العملة المسمّاة مقابل رسالة الحرق الموقَّعة من الحراس. وعلى السلسلة 20 تحتفظ السلسلة برسم قدره 10 bps على هيئة ملاحظة zUSD للخزينة، ويكون الإفراج amount − fee |
حزمة TokenBurn | الشكل نفسه كما في حرق الجسر | تُتلَف؛ وينخفض total_supply العلني لرمز RPL بالمقدار نفسه تمامًا |
حزمة Invoke (RPL-2، السلسلة 20) | burn_r، وburn_a من burn_asset، كما يعلنه انتقال البرنامج | يُودَع RAND والرموز في خزنة البرنامج العلنية، أو يُتلَف رمز البرنامج نفسه؛ ولا تدفع الخزنة مجددًا إلا ملاحظات تحسبها السلسلة (Programs) |
(وتحرق حزمة register_aggregator أيضًا سندها في genesis عبر burn_r؛ والتجميع (aggregation) معطّل على السلسلة 20.)
الحرق ليس رسومًا. حرق السند هو انتقال RAND من الحوض إلى السجل، ويُحتسب في burned ضمن تدقيق العرض (ويظهر ثانية في register_total). وحرق الجسر حزمة واحدة منذ السلسلة 14 (كان حزمتين قبلها): تحرق الخانتان 0–1 الأصل المُجسَّر وتدفع الخانتان 2–3 الرسم، فلا يمس عرض RAND إلا عبر هذا الرسم، BRIDGE_BURN_FEE، وقدره 0.01 RAND. ويجب أن يسمّي عملة تدعم الأصل، وأن يفرج عن عدد صحيح من وحدات تلك العملة، وأن يتسع له ما أقفله ذلك الدعم (Bridge). وعلى السلسلة 20 يأخذ bridge.fees في genesis أيضًا 10 bps من كل سك وحرق مُجسَّر بـ zUSD: يقيّد الإيداع المبلغ الإجمالي ناقصًا الرسم ويفرج الحرق عن amount − fee، وكل رسم ملاحظة zUSD محمية إلى الخزينة. وتبقى ملاحظة الرسم مُصدَرة ومدعومة، فيظل total_supply == Σ locked الخاص بـ zUSD صحيحًا؛ وهي ليست حركة RAND ولا تدخل في تدقيق عرض RAND. ويدفع TokenBurn أساس الحزمة البالغ 0.001 RAND؛ ويُرفض فيه الرمز المُجسَّر ويخرج عبر bridge-burn.
وثمة رسم واحد هو حرق أيضًا على السلسلة 20، كما على كل سلسلة منذ 15: يضبط genesis فيها tokens.burn_registration_fee، فيُتلَف registration_fee البالغ 1 RAND لعملية RegisterToken أو RegisterBridgedToken بدل دفعه إلى المقترِح، الذي لا يحتفظ إلا بأساس الحزمة. ويُحتسب في burned، وبصورة منفصلة في registration_fees_burned (RPL tokens).
rand bond <validator> 1000 [--registration <hex>] # burns 1000 RAND out of this wallet's notes
rand bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> # burns AMOUNT of a bridged asset, released as TOKEN on TO_CHAIN
rand token burn <ASSET> <AMOUNT> # destroys AMOUNT of an RPL token this wallet holds
الرسوم هي الخروج الآخر
يخرج fee كل حزمة من الحوض إلى rewards الخاصة بمقترِح الكتلة، وهو حقل علني في السجل، ولا يعود إلى الحوض إلا حين يسحبه المُصادِق على هيئة ملاحظة (Staking). ويدفع Withdraw الأساس البالغ 0.001 RAND من المبلغ المسحوب إلى مقترِح الكتلة التي تطبّقه؛ وذلك الأساس لا يغادر السجل أبدًا، فليس عبورًا.
كيف يتحرك العرض
in: genesis_deposited, faucet_minted, withdraw_deposited, program_rand_out
out: fees_paid, burned
pool_value = in − out
total_supply = pool_value + Σ register (stake + pending + rewards) + program_rand_held
== genesis_deposited + genesis_staked + faucet_minted − slashed − registration_fees_burned
program_rand_held وprogram_rand_out جديدان في السلسلة 20 (RPL-2): فالـ RAND الذي يحرقه Invoke في خزنة برنامج عبر burn_r يُحتسب في burned من جهة الحوض ويُحتفظ به في الخزنة، وما تدفعه الخزنة على هيئة ملاحظات يعود إلى الحوض. وتقدّم rand_getSupply كليهما، مع invariant_holds.
وحده سكّ الـ faucet يزيد ما أصدرته السلسلة، وفي السلسلة 20 لا يُنقص منه إلا رسم تسجيل محروق: فالعدّاد slashed سيحتسب سندَ aggregator مخصومًا بالعقوبة، أو، في ظل قسم staking.slashing في genesis، حصةَ validator مخصومة بالعقوبة، وليس في السلسلة 20 أيٌّ منهما (التجميع معطَّل وslashing قيمته null). أما السند والرسم والسحب وإيداع الخزنة فتنقل القيمة بين المجمّع والسجل والخزائن، ولا تنشئ شيئًا. يتضمن Supply العدّادات ومثالًا تطبيقيًا. أما إعانة تجميع الكتل — أي RAND جديدة عن كل كتلة مختومة وفق جدول تناصف، تُدفع إلى aggregator في صورة note إيداع — فستكون أول إصدار مجدول، وهي غير مفعّلة في السلسلة 20.