Rand Protocol
الوثائق
المراجع

سطر الأوامر

كل أمر من أوامر rand-node وrand مع معاملاته وقيمه الافتراضية: الملف التنفيذي للعقدة والمشغّل، والمحفظة المحجوبة، والمُثبِت المفوَّض.

تخرج ثلاثة ملفات تنفيذية من الأمر cargo build --release: rand-node (العقدة وأوامر المشغّل)، و**rand** (المحفظة المحمية)، و**rand-prover** (المُثبِت المفوَّض). يقبل كل أمر الخيار -h/--help. تصف هذه الصفحة إصدار v0.6.8 (c9c9bd3c)، وهو الإصدار الذي تعمل به السلسلة 20؛ وحيث كان سلوك v0.6.7 مختلفًا، تذكر الصفحة ذلك. لا تستطيع محفظة rand الأقدم من v0.6.8 الإرسال على السلسلة 20، لأن جينيسيس هذه السلسلة يربط كل إثبات وكل رسالة موقّعة بتجزئته. يحمل أول الملفين نوعين مختلفين من المفاتيح: مفتاح العقدة زوج مفاتيح Dilithium2 يوقّع الكتل؛ أما مفتاح المحفظة فهو مفتاح إنفاق محمي لا يوقّع شيئًا على السلسلة.

rand-node

rand-node <COMMAND>
  keygen      Generate a new Dilithium2 key file (refuses to overwrite an existing one)
  address     Print the address, public key, and libp2p peer id of a key file
  genesis     Write a genesis.json: every validator key is staked, each --alloc becomes a deposit note
  alloc-note  Print one genesis alloc note as JSON, RAND or a listed token, for splicing into a genesis
  init        Initialise a data directory from a genesis file
  run         Run the node
  verify      Verify the chain in a data directory without running the node
  db          Database maintenance on a stopped node's data directory
  safety      status | clear-halt | release-lock: a stopped validator's consensus safety state
  status      Show node status
  register    Print this node's Registration, for the wallet that bonds it in
  admit       sign | submit: the validator set's vote to admit a new key (admission by vote)
  unbond      Move bonded stake into unbonding
  withdraw    Pay released stake and rewards into a note at the payout address
  bridge-gov  rotate-pq | rotate-pause | cancel-rotation: the bridge's post-quantum rotations
  vesting     status | claim | revoke | bond | unbond: genesis vesting (chains with a vesting section)
  aggregator  register | unbond | withdraw — the aggregator role (aggregation chains only)
  aggregate   The aggregate daemon (aggregation chains only)

الأوامر safety وadmit وbridge-gov جديدة في v0.6.8. لا يوجد balance ولا transfer: فالتحويل يحتاج إلى مفتاح إنفاق محمي، ولا تملكه إلا المحفظة.

يتيح خيار عام واحد، --allow-test-fri-profile (أو RAND_ALLOW_TEST_FRI_PROFILE=1)، للأوامر init وrun وverify قبول جينيسيس يكون فيه fri_profile هو test. هذا الملف التعريفي يمنح نحو 17 بتًا من الأمان، ويستطيع أي شخص يكتب ملف جينيسيس أن يسمّيه، ولذلك ترفض العقدة منذ v0.6.8 مثل هذا الجينيسيس دون الخيار. تفعّله مجموعات الاختبار؛ ولا ينبغي لشيء آخر أن يفعل.

keygen وaddress

الأمرالمعاملالقيمة الافتراضية
keygen--out <OUT>node.key.json
address--key <KEY>مطلوب

يكتب keygen الملف { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } بالصلاحية 0600. الملف هو النسخة الوحيدة من البذرة. منذ v0.6.8 يرفض keygen قيمة --out الموجودة مسبقًا (… already exists or cannot be created; refusing to overwrite a key file) ويترك الملف دون مساس؛ ولا يوجد --force، فانقل الملف القديم جانبًا لاستبداله. أما v0.6.7 وما قبله فكانت تكتب فوقه دون سؤال. يطبع address القيم address وpublic_key (1,312 بايت بالست عشري) وpeer_id.

genesis

المعاملالقيمة الافتراضيةالمعنى
--chain-id <CHAIN_ID>1معرّف السلسلة؛ ترتبط به المعاملات ومواضيع الانتشار (gossip)
--validator <KEY,STAKE,PAYOUT>مطلوب، قابل للتكرارمدخل واحد في السجل: مسار ملف مفتاح أو مفتاح عام بالست عشري، والحصة بوحدة RAND (1,000 على الأقل)، وعنوان الدفع rand1…
--epoch-blocks <N>1000عدد الكتل في كل حقبة
--alloc <ALLOCS>لا شيء، قابل للتكرارملاحظة إيداع: rand1<address>=<amount in RAND>
--out <OUT>genesis.jsonمسار الإخراج
--faucetمعطّلللشبكة التجريبية فقط: يفعّل Mint. وإلى جانب قسم bridge يحتاج إلى --testnet
--testnetمعطّلv0.6.8: يكتب "testnet": true، وهي العلامة التي تتيح وجود صنبور (faucet) إلى جانب قسم bridge. يدخل في تجزئة الجينيسيس عند تحديده
--no-confidentialمعطّليعطّل Deploy وCall
--fri-profile <production|test>productiontest غير آمن ومخصص لمجموعة الاختبار؛ وترفض init وrun وverify هذا الملف دون --allow-test-fri-profile
--max-program-words <N>لا شيء (4096)أكبر برنامج يجوز أن يحمله النشر، 1..=65535. يُكتب فقط عند تحديده؛ ويدخل في تجزئة الجينيسيس متى وُجد، ولذلك فإن --max-program-words 4096 سلسلة مختلفة عن إغفاله. تحتاج كل عقدة إلى ملف تنفيذي v0.4 قبل init على مثل هذا الملف
--max-proof-bytes <N>لا شيء (2,097,152)أكبر إثبات يجوز أن تحمله المعاملة، 1048576..=33554432. وتتبعه كل حدود الإثبات
--max-block-bytes <N>لا شيء (4,194,304)أكبر كتلة، وبالتالي أكبر معاملة، 4194304..=67108864، وبما لا يقل عن 2 × max_proof_bytes + 1 MiB، أو 3 × max_proof_bytes + 1 MiB مع --auth-guest، حيث يحمل الاستدعاء ثلاثة إثباتات (الحزمة، والمصادقة، والاستدعاء)
--max-call-envelope-bytes <N>لا شيء (18,432)أكبر مغلف لمدخلات الاستدعاء، 18432..=1048576
--max-program-public-words <N>لا شيء (0)أكبر مدخل عام يجوز أن يثبّته النشر، 0..=65535؛ والقيمة 0 لا تسمح بأي مدخل
--tokens <TOKENS.JSON>لا شيءقسم tokens الخاص بـ RPL، بوصفه ملف JSON على الصيغة {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. وإذا أُغفل، فلا يحتوي الملف على هذا القسم ويُجزَّأ كما كان من قبل. يحتاج قسم bridge إلى ملف فيه mint_cap_per_day غير صفري (لكل دعم، ولكل يوم UTC، بوحدات الرمز ذات الخانات الثماني)؛ ويحتاج الرمز المدرج إلى قسم bridge
--envelope-bytes <N>لا شيء (المغلف القديم بحجم 1,348 بايت)الحجم الدقيق لكل مغلف ملاحظة: مخرج حزمة، وسك من الصنبور، وسحب، وإيداع عبر الجسر، وتخصيص في الجينيسيس. المقبول هو 1860 فقط، وهو الحجم الذي يتيح لكل مغلف أن يحمل مذكّرة مشفّرة. يدخل في تجزئة الجينيسيس عند تحديده، ويُضبط قبل ختم ملاحظات --alloc الخاصة بهذا الأمر
--vesting <VESTING.JSON>لا شيءقسم vesting: التخصيصات المقيَّدة بمدة زمنية، {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. منذ v0.6.8 يسرد المدخل القابل للإلغاء revokers (من 1 إلى 5 مفاتيح)، وthreshold، وtreasury الذي يدفع إليه الإلغاء، ويُرفض الملف الذي يُغفل أيًّا منها
--staking <STAKING.JSON>لا شيءv0.6.8: قسم staking بوصفه ملف JSON (faucet_budget_per_epoch وbond_activation_epochs وmax_weight_bps وmax_stake_entry_per_epoch أو max_stake_entry_bps_per_epoch وregistration_v2 وfaucet_recipients وfaucet_minters وadmission_by_vote وslashing)، ويتحقق منه البناء
--consensus-domain <0|1>لا شيء (0)v0.6.8: القيمة 1 تربط كل تصويت وكل عرض جديد (new-view) وكل اقتراح بهذا الجينيسيس
--bundle-guest <v1|v2|v3>v1ضيف الحزمة المثبَّت بوصفه hc_bundle: v1 (ضيف الأصل المخفي الذي عملت به السلسلتان 14 و15)، وv2 (الضيف الخالي من التفرعات في السلسلة 16)، أو v3 (تفويض مقسَّم: يأخذ الضيف nk وملحًا بدلًا من مفتاح الإنفاق). يحتاج v3 إلى --auth-guest
--auth-guestمعطّليثبّت ضيف المصادقة في هذا البناء بوصفه hc_auth: فتحمل كل حزمة عندئذٍ إثبات مصادقة على مفتاح الإنفاق، مربوطًا بمعاملتها، ويساوي ناتجه auth_commit الخاص بالحزمة. مطلوب مع --bundle-guest v3 ومرفوض مع v1 أو v2، قبل كتابة أي ملف. وعند غيابه لا يحتوي الملف على الحقل hc_auth
--hardening-v6معطّليحوّل قواعد v0.6 إلى قواعد صلاحية (hardening_v6): نافذة pc، وعمليات النشر غير القابلة للاستدعاء، وأشكال الإثبات القانونية وكلمات إثبات العمل، وربط الاستدعاء، والحد الأدنى لجدول البرامج. وعند غيابه، تظل العقدة ترفض ذلك عند مجمّعها (pool) بوصفه سياسة
--gas-price <UNITS>لا شيء (لا قسم gas)الوحدات (10⁻⁹ RAND) لكل وحدة غاز تتقاضاها السلسلة نفسها على الاستدعاء. هذا الخيار هو ما يكتب قسم gas (metering: "circuit")؛ وتُرفض الخيارات الثلاثة التالية دونه. يدخل في تجزئة الجينيسيس
--byte-price <UNITS>800، فقط مع --gas-priceالوحدات لكل KiB، أو جزء منه، من إثبات الاستدعاء مع مغلف المدخلات، ابتداءً من البايت 0
--bundle-gas-limit <N>20479، فقط مع --gas-priceقيمة GAS_LIMIT الدقيقة التي يجب أن يعلنها كل إثبات حزمة؛ ويُرفض إثبات حزمة يعلن قيمة أخرى. لا يقبل الجينيسيس إلا 20479، أي gas_max(14, 0, 0) لضيف الحزمة من المستوى 14
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS>لا شيء (أسعار ثابتة)يفعّل متحكم السعر لكل كتلة، بحدٍّ أدنى هو gas_price وbyte_price الابتدائيان في القسم نفسه. مرفوض إلى جانب --aggregation
--max-gas-price <UNITS>، --max-byte-price <UNITS>لا شيء (لا سقف)v0.6.8: السقوف التي لا يرفع المتحكم أي سعر فوقها، ويكون كل منها مساويًا للسعر الابتدائي على الأقل. مرفوضان دون --gas-dynamic
--gas-byte-load payingلا شيء (بايتات كل معاملة)v0.6.8: لا يحرّك byte_price إلا إثبات الاستدعاء ومغلف مدخلاته، فكتلة من التحويلات لا تحرّكه. مرفوض دون --gas-dynamic؛ وpaying هي القيمة الوحيدة
--binding-domain <0|1>لا شيء (لا حقل)v0.6.8: القيمة 1 تربط تجزئة الجينيسيس بكل ربط معاملة وكل رسالة إجراء موقّعة (سكّ من الصنبور، وفك الارتباط، وسحب، ورسائل رموز RPL، وإجراءات المجمِّع (aggregator)، ورسائل حوكمة الجسر)، فلا يصلح إثبات أو توقيع لهذه السلسلة على أي سلسلة أخرى. وعند إغفاله يحذّر الأمر: فمحفظة v0.6.8 تُثبت الصيغة المرتبطة بالجينيسيس على كل معرّف سلسلة خارج النطاق 14 إلى 19، ولذلك تُقطع كل سلسلة من 20 فصاعدًا بالقيمة 1
--proof-window-blocks <N>لا شيء (256)v0.6.8: نافذة واحدة، من 256 إلى 4,096 كتلة، لمدى قِدَم مرساة الحزمة وtime الخاص بها. تُقدَّم بوصفها rand_getLimits.proof_window_blocks
--program-state-cell-fee <UNITS>لا شيء (لا قسم program_state)v0.6.8، RPL-2: يفعّل خلايا البرامج وخزائن البرامج والإجراء Invoke، برسم خلية بوحدات RAND (1,000 RAND على الأكثر) يُضاف إلى الحد الأدنى لرسم الاستدعاء عن كل خلية ينشئها. يحتاج إلى --tokens و--gas-price و--hardening-v6 و--auth-guest، ويُرفض كل منها بالاسم قبل كتابة أي ملف
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>، --admitted-shape <…>لا شيءقسم aggregation؛ ويرفض بناء v0.6.8 البدء على جينيسيس يحتوي عليه

يطبع الأمر سطر alloc واحدًا لكل --alloc، ثم تجزئة الجينيسيس، وعدد المدقّقين (validators) والملاحظات، وطول الحقبة، والحدود الخمسة، وhc_bundle وhc_auth (none دون --auth-guest)، ثم سطر الغاز: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying، أو gas: none دون --gas-price، ومع --program-state-cell-fee سطر program_state: cell fee N RAND. ويطبع init سطر الغاز نفسه. وتتصرف خيارات الحدود الخمسة على نحو متماثل: عند إغفالها لا يحتوي الملف على الحقل وتعمل السلسلة بالقيمة الافتراضية؛ وعند تحديدها يصبح الحقل جزءًا من تجزئة الجينيسيس حتى لو كان بقيمته الافتراضية. قُطعت السلسلة 20 بهذه الخيارات (deploy/cut-chain20-genesis.sh):

--max-program-words 65535 --max-proof-bytes 4194304 --max-block-bytes 20971520 \
--max-call-envelope-bytes 65536 --max-program-public-words 32768 \
--tokens tokens.json \
--bundle-guest v3 --auth-guest --hardening-v6 \
--gas-price 100 --byte-price 800 --bundle-gas-limit 20479 --gas-dynamic 10485760,262144,1250 \
--max-gas-price 10000 --max-byte-price 80000 --gas-byte-load paying \
--envelope-bytes 1860 \
--testnet --binding-domain 1 --proof-window-blocks 1024 --program-state-cell-fee 10000000 \
--epoch-blocks 1000 --faucet --fri-profile production

أُقِرّ بأن السلسلتين 18 و19 قُطعتا بالأعلام نفسها حتى --envelope-bytes 1860، ودون أي من أعلام v0.6.8. سقف الإثبات 4 MiB بعد أن كان 8 MiB في السلاسل من 13 إلى 16: فالمعاملة ذات التفويض المجزّأ تحمل حتى ثلاثة إثباتات، و3 × 4 MiB + 1 MiB تتسع في كتلة حجمها 20 MiB. يحتوي tokens.json على registration_fee قدره 1 RAND، وmint_cap_per_day قدره 10000000000000، وmax_tokens بقيمة 4096، وburn_registration_fee وbound_note_value، مع إدراج zUSD بدعاماته السبع. لا يوجد علم --bridge، ولا يزال سكربت القطع يدرج أقسام bridge وstaking وconsensus_domain في الملف لاحقًا (على السلسلة 20: الجسر عند مجموعة الحراس 1 مع ثمانية مفاتيح حراس ما بعد الكم، ومفتاح الإيقاف المؤقت، وrules_v2 وrotation وfees؛ وقسم staking مع قائمة السماح للصنبور وadmission_by_vote وميزانية دخول قدرها 2,500 bps؛ وconsensus_domain: 1؛ وملاحظات التكوين الأولي لـ zUSD، المنشأة بالأمر alloc-note --asset 1 --envelope-bytes 1860). التجزئة التكوينية المعتمدة هي التي يطبعها init على الملف النهائي.

كل --alloc يبني ملاحظة إيداع واحدة بعشوائية التزام جديدة، لذا فإن القطع مرتين يعطي تجزئتين مختلفتين. يكتب الأمر دائمًا فتح الملاحظة إلى جانب cm وamount، وهو ما تشترطه السلسلة التي لها قسم tokens:

"alloc": [
  { "cm": "<64 hex>",
    "envelope": { "kem_ct": "<hex>", "to_receiver": "<hex>", "to_sender": "<hex>", "body": "<hex>" },
    "amount": 1000000000000,
    "opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>" } }
]

وعليه فإن مالك ملاحظة التكوين الأولي ومبلغها علنيان بالتصميم بمجرد نشر الملف؛ وحده توقيت إنفاقها لاحقًا والوجهة التي تُنفق فيها يبقيان خاصين. اقطع تكوينًا أوليًا مرة واحدة واحتفظ بالملف.

alloc-note

--to <rand1…> (مطلوب)، --amount <N> (مطلوب)، --asset <INDEX> (الافتراضي 0)، --envelope-bytes <N> (الافتراضي: الصيغة القديمة). يطبع ملاحظة تخصيص واحدة بصيغة JSON، مختومة إلى --to كما يختم genesis --alloc ملاحظاته. التكوين الأولي الذي يضبط envelope_bytes يرفض أي ملاحظة خُتمت دون --envelope-bytes المطابق. قيمة --amount بوحدات كاملة من الأصل: تسع خانات عشرية لـ RAND، وثماني خانات للرمز المجسور (10 عند الأصل 1 تساوي 10 zUSD). الملاحظة من رمز مُدرج تتطلب أن تحمل دعامات ذلك الرمز مبالغ locked مجموعها يساوي ملاحظاته تمامًا.

init

الوسيطالمعنى
--datadir <DATADIR>مجلد البيانات المراد إنشاؤه
--genesis <GENESIS>ملف التكوين الأولي؛ يُنسخ إلى <datadir>/genesis.json

يطبع تجزئة التكوين الأولي وسطر gas: نفسه الذي يطبعه genesis.

run

الوسيطالافتراضيالمعنى
--datadir <DATADIR>مطلوبمجلد بيانات مُهيّأ
--key <KEY>مطلوبملف المفاتيح: هوية المدقِّق، وهوية p2p، ومستلم الرسوم
--listen <LISTEN>/ip4/0.0.0.0/tcp/30303عنوان استماع libp2p المتعدد، قابل للتكرار
--bootstrap <BOOTSTRAP>لا شيء، قابل للتكرار/ip4/<ip>/tcp/<port>/p2p/<peer-id>، يُتصل به عند البدء وكل 30 ثانية ما دام الاتصال مقطوعًا. منذ v0.6.8 يُحجز معرّف النظير الخاص به
--reserved-peer <PEER_ID>لا شيء، قابل للتكرارv0.6.8: نظير يُقبل متجاوزًا حدّ الاتصالات الواردة ويُخدَم من حصة المدقِّقين في ميزانية المزامنة. تُحجز المواقع الأولية (bootstraps) وكل مدقِّق رأت هذه العقدة ارتباط نظيره الموقَّع دون هذا العلم؛ اذكر مدقِّقي الأسطول هنا في سلسلة مقطوعة حديثًا، إذ لا يحتوي مخزنها على أي ارتباطات بعد
--strict-gossipمعطّلv0.6.8: التحقق الصارم في gossipsub، فلا يقبل إلا الرسائل ذات توقيع مؤلف وتسلسل ومصدر صالحة. تتعاون العقد الصارمة والمتساهلة، فيُطبَّق عقدة عقدة
--rpc <RPC>127.0.0.1:8545مستمع JSON-RPC الخاص بالمشغّل: كل الدوال، ويثق بحلقة الرجوع المحلية. أبقِه على حلقة الرجوع ولا تحوّل إليه أي نقطة نهاية عامة
--public-rpc <ADDR>معطّلv0.6.8: مستمع ثانٍ عام بمجموعة دوال ثابتة (دون دوال مفتاح العرض ولا rand_mint ولا rand_getPeers)، ودون دفعات ولا WebSocket، وبعدّاد واحد لكل المتصلين؛ وهو ما ينبغي أن يشير إليه وكيل عكسي أو تحويل SSH (JSON-RPC)
--rpc-viewing-token-file <PATH>معطّلv0.6.8: يشترط Authorization: Bearer <first line of the file> (32 حرفًا أو أكثر) على دوال مفتاح العرض في --rpc
--validatorمعطّلالمشاركة في الإجماع بهذا المفتاح
--no-mdnsمعطّلتعطيل الاكتشاف في الشبكة المحلية
--block-interval-ms <MS>1000الحد الأدنى للمدة الفاصلة بين المقترحات
--view-timeout-ms <MS>3000مهلة العرض الأساسية؛ تتضاعف مع كل مهلة متتالية حتى 8×
--verify-chain <MODE>quickoff أو quick أو full
--keep-raw-proofsمعطّلوضع الأرشيف على سلسلة تجميع
--prune-history <WINDOW>لا شيء (الاحتفاظ بكل شيء)الاحتفاظ بهذا القدر فقط من سجل الكتل، <n>m أو <n>h أو <n>d، وبحد أدنى 1h: الكتل الأقدم تفقد كتلتها وQC ومعاملاتها وإيصالاتها؛ ويبقى دفتر الأستاذ. على السلسلة 20، يشغّل 24 من المدقِّقين الـ 26 القيمة 24h وعقدتان أرشيفيتان؛ ولا تضبطه عقدة أرشيف ولا عقدة mainnet أبدًا. تعيد عمليات البحث عن الارتفاع دون الحد الأدنى الخطأ -32010 (JSON-RPC)
--min-free-disk-mb <MB>1024رفض البدء إذا كان المتاح أقل من ذلك في نظام ملفات مجلد البيانات؛ ويقول rand_getHealth disk_low عند أقل من أربعة أضعافه. القيمة 0 تعطّل هذه الحماية
--rpc-viewing-openمعطّلالسماح للمتصلين من غير حلقة الرجوع باستخدام دوال مفتاح العرض؛ ولا يكون ذلك إلا خلف ما يتحقق من الهوية
--gas-price <UNITS>100وحدات (10⁻⁹ RAND) لكل gas يطلبها مجمّع هذه العقدة من أي استدعاء، فوق gas_max في ترويسة إثباته. هذه سياسة قبول وليست قاعدة سلسلة: الكتلة التي تحمل استدعاءً أرخص تبقى صالحة. القيمة 0 مع --byte-price 0 لا تشغّل أي سياسة. وفي سلسلة يحتوي تكوينها الأولي على قسم gas، كما في السلسلة 20، تكون أسعار السلسلة نفسها هي قاعدة الصلاحية
--byte-price <UNITS>800وحدات لكل KiB، أو جزء منه، من إثبات الاستدعاء وغلاف مدخلاته، ابتداءً من البايت 0، بالسياسة نفسها
--prover <ADDR>معطّلاستضافة المُثبِت المفوَّض (دوال prover_* في JSON-RPC) على هذا العنوان: مستمع قائم بذاته، يجب أن يختلف عن --rpc. ترفض العقدة البدء دون <prover-home>/prover.key.json، الذي ينشئه rand-prover keygen
--prover-home <DIR><datadir>/proverملفا المُثبِت prover.key.json وpairings.json
--prover-accept-spend-keyمتقاعدمرفوض عند البدء منذ v0.6.8: run المعطى هذا العلم يخرج قبل قراءة مفتاح العقدة، مسمّيًا العلم. لا يقبل أي مُثبِت شاهد مفتاح إنفاق بعد الآن؛ أزِله من ملف الوحدة. في v0.6.7 كان يقبل شهود مفتاح الإنفاق في السلاسل ذات ضيف الحزمة v1 أو v2
--prover-max-parallel <N>1عدد الإثباتات التي يشغّلها المُثبِت المستضاف في آن واحد؛ يُرفض البدء ما لم يتوفر 5.74 GB × N + 1 GiB من الذاكرة
--prover-max-queue <N>8المهام المصطفّة فوق تلك الجارية
--prover-cudaمعطّلالإثبات على واجهة CUDA الخلفية (بناء بالخيار --features cuda)؛ دون بديل على المعالج
--prover-skip-memory-checkمعطّلتخطي بوابة الذاكرة الحرة
--prover-fee <RAND>, --prover-fee-address <rand1…>لا شيءالرسم الذي يجب أن تدفعه كل مهمة مرسلة إلى المُثبِت المستضاف، بوحدات RAND بحد أقصى تسع خانات عشرية: مخرج واحد بقيمة RAND إلى العنوان، داخل الحزمة المُثبَتة. كل علم يتطلب الآخر
--prover-allow-origin <ORIGIN>إضافات المتصفح والصفحات المحليةأصل متصفح يجوز لصفحاته قراءة ردود المُثبِت، قابل للتكرار؛ وإذا أُعطي مرة أو أكثر فإن القيم هي القائمة كاملة. القيمة * تسمح لكل موقع وتطبع تحذيرًا

البيئة: RUST_LOG (الافتراضي info,libp2p=warn,libp2p_mdns=off). يوقف Ctrl-C أو SIGTERM العقدة إيقافًا سليمًا.

نقطة النهاية العامة https://rpc.randprotocol.org وكيل بقائمة سماح أمام عقدة أرشيف؛ ومنذ 2026-10-01 صارت قائمة السماح فيه هي مجموعة دوال المستمع العام.

safety

حالة سلامة الإجماع لمدقِّق متوقف (v0.6.8). يفتح كل أمر مجلد البيانات بنفسه، فلا يعمل أي منها بجانب عقدة حية.

rand-node safety status       --datadir <dir>
rand-node safety clear-halt   --datadir <dir> --i-have-compared-this-node-with-the-fleet
rand-node safety release-lock --datadir <dir> --i-give-up-this-validators-lock

يطبع status الرأس المُلتزَم به، والعرض وآخر عرض جرى التصويت عليه، وأعلى QC، وهل المدقِّق مقفل فوق رأسه، وأي إيقاف سلامة مسجَّل. العقدة التي ترى سلسلة ثلاثية مصدَّقة تحاول الالتزام بكتلة لا تنحدر من رأسها الملتزَم به تتوقف وتسجّل ذلك (التدقيق v6، CON-5)؛ ثم يخرج run مع السجل إلى أن يُنفَّذ clear-halt. قارن رأس هذه العقدة برأسَي مدقِّقَين آخرَين، وأعد المزامنة من أرشيف إن اختلف قبل المسح. منذ v0.6.8 (CON-4) لم يعد أي نصاب من ردود “غير محتفَظ بها” يحرّر القفل: المدقِّق المقفل على كتلة لا يستطيع الحصول عليها يبقى صامتًا إلى أن يصل مقترح يتفوق justify فيه على القفل أو تُجلب الكتلة. يخفض release-lock القفل المحفوظ إلى شهادة الرأس الملتزَم به؛ استخدمه على مدقِّق واحد في كل مرة، ولا يكون ذلك إلا حين تضيع الكتلة نهائيًا. وبدون علم الإقرار الخاص به يطبع كل أمر كتابة ما كان سيفعله ولا يغيّر شيئًا.

verify

الوسيطالافتراضيالمعنى
--datadir <DATADIR>مطلوبيجب ألا تكون العقدة قيد التشغيل
--mode <MODE>fullquick أو full
--repairمعطّلبتر الذيل التالف؛ وتبقى حالة السلامة

رمز الخروج 0 إن كان متسقًا، و2 إن عُثر على مشكلة دون --repair.

db

db drop-receipts-index --datadir <DATADIR>، والعقدة متوقفة: يُسقط فهرس receipts_by_program قبل الرجوع إلى بناء أقدم من v0.3، لا يستطيع فتح قاعدة بيانات تحتوي عليه. ويعيد أي بدء لاحق بناء الفهرس من الإيصالات.

status

--rpc <URL> (الافتراضي http://127.0.0.1:8545). يطبع rand_status كما هو.

register, unbond, withdraw

الأمرالوسائطالمعنى
register--key, --payout <rand1…>, --rpc, --v2يطبع Registration سداسيًّا عشريًّا موقَّعًا بمفتاح هذه العقدة؛ يُقرأ RPC لمعرفة معرّف السلسلة، ومعه الهاش الأول (genesis) أيضًا عند استخدام --v2. الخيار --v2 مطلوب على أي سلسلة يضبط genesis فيها staking.registration_v2، كما في سلسلة 20؛ يُرفض التسجيل v1 هناك، ويُقبل التسجيل v2 في كل مكان آخر
unbond <amount RAND>--key, --rpc, --no-waitينقل الحصة إلى فك الارتباط؛ دون رسوم؛ ويمكن سحبها بعد دورتين (epochs)
withdraw <amount RAND>--key, --rpc, --no-waitيدفع الحصة المحرَّرة والمكافآت إلى ملاحظة عند عنوان الدفع، بعد خصم الرسم الأساسي البالغ 0.001 RAND

admit sign|submit

القبول بالتصويت (v0.6.8). على أي سلسلة يضبط genesis فيها staking.admission_by_vote، كما في سلسلة 20، لا يُسجَّل مفتاح مدقّق (validator) جديد إلا بعد أن يوقّع عليه مدقّقون يملكون أكثر من ثلثي ثقل التصويت بالتحديد.

الأمرالوسائطالمعنى
admit sign--candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex>يطبع صوت هذا المدقّق في سطر واحد، <voter key hex>:<signature hex>، على الهاش الأول وعنوان المرشّح، فيكون صالحًا على سلسلة واحدة بعينها. دون اتصال: لا يقرأ أي عقدة
admit submit--candidate …, --signature <line> (قابل للتكرار), --rpc, --no-waitيتحقق من كل صوت مقابل الهاش الأول للعقدة (يُذكر بالاسم أي صوت لهاش أول أو مرشّح آخر، أو ناخب مكرَّر)، ويرتّبها ويرسل AdmitValidator الخالي من الرسوم

المرشّح هو المفتاح الذي سيحمله التسجيل؛ يطبعه rand-node address --key، ويحويه السداسي العشري الذي طبعه register. بعد اعتماد القبول، يجري الربط كما سبق (rand bond … --registration) ويستهلكه. يسرد rand_getAdmitted ما قُبل وينتظر.

bridge-gov

عمليات تدوير الجسر المقاومة للحوسبة الكمومية (v0.6.8)، للحرّاس (guardians) وحامل مفتاح الإيقاف المؤقت. تقرأ كل خطوة معرّف السلسلة ونطاق الربط الخاص بها وrand_getBridgeState.rotation_nonce من --rpc (الافتراضي http://127.0.0.1:8545).

الأمروظيفته
rotate-pq message --new-key K…يطبع رسالة التدوير السداسية العشرية للـ nonce الحالي، لمقارنتها عند كل موقِّع
rotate-pq sign --new-key K… --key F --index I [--possession]يطبع I:signature: سطر النصاب لحارس PQ حالي (I فهرسه في المجموعة الحالية) أو، مع --possession، سطر حامل مفتاح جديد (I فهرسه في المجموعة الجديدة)؛ يرفض ملف مفتاح ليس هو المفتاح عند I
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait]يجمّع RotatePqGuardians، أو الإجراء V2 مع أسطر الحيازة، ويرسله؛ يرفض الحيازة على سلسلة لا تقبلها، ويرفض غيابها على سلسلة تشترطها، كما في سلسلة 20
rotate-pause message|sign|submit --new-key Kالأمر نفسه لمفتاح الإيقاف المؤقت (فهرس الحيازة 0)
cancel-rotation sign --kind pq|pause --key PAUSE_KEYيطبع 0:signature على رسالة الإلغاء، ويُتحقق منه مقابل مفتاح الإيقاف المؤقت الحالي للسلسلة
cancel-rotation submit --kind pq|pause --signature @Fيرسل CancelRotation، فيُسقط تدويرًا معلَّقًا قبل انتهاء مهلته

--new-key هو مفتاح Dilithium2 عام بصيغة سداسية عشرية، أو @file يحوي واحدًا، أو @key-file (مفتاحه العام). أسطر التوقيع بصيغة index:hex، تفصل بينها مسافات بيضاء أو أسطر جديدة، والتعليقات بـ # مسموحة.

vesting status|claim|revoke|bond|unbond

جانب الحامل وجانب المُلغي في تخصيص genesis المقيَّد زمنيًّا، على سلسلة يحمل genesis فيها قسم vesting. سلسلة 20 لا تحمل أيًّا منه. المفتاح ملف من rand-node keygen.

الأمرالوسائطالمعنى
vesting status <ENTRY>--rpcالإدخال كما يقدّمه rand_getVesting: شروطه، وما استُحق، وما يمكن المطالبة به الآن
vesting claim--entry <id>, --to <rand1…>, --amount <RAND> أو --all, --key, --rpc, --no-waitيدفع ما انفكّ قفله إلى ملاحظة عند --to، بعد خصم الرسم الأساسي البالغ 0.001 RAND؛ موقَّع بمفتاح المستفيد
vesting revoke prepare--entry, --margin-secs (الافتراضي 600), --out (الافتراضي revoke.json), --rpcv0.6.8، دون مفتاح: يكتب أمر الإلغاء الذي يوقّعه كل مُلغٍ، وهو ملاحظة بالجزء الذي لم يُستحق بعد بمقدار --margin-secs بعد رأس السلسلة، تُدفع إلى treasury الخاصة بالإدخال في genesis (لا يوجد --to)
vesting revoke sign--proposal <file>, --key, --index?مفتاح مُلغٍ واحد، دون اتصال: يطبع <index>:<signature hex>
vesting revoke submit--proposal <file>, --signature <index:hex> (قابل للتكرار), --rpc, --no-waitيرسل الإلغاء بعدد من التواقيع لا يقل عن threshold الخاص بالإدخال، خلال 256 كتلة من prepare. أمر v0.6.7 ذو المفتاح الواحد vesting revoke --to أُزيل
vesting bond <amount RAND>--entry, --validator <address>, --registration <hex>, --key, --rpc, --no-waitللإدخالات غير القابلة للإلغاء: يربط RAND المقفلة بوصفها حصة ذلك المدقّق؛ المدقّق غير المدرج بعد في السجل يحتاج إلى ما طبعه register
vesting unbond <amount RAND>--entry, --key, --rpc, --no-waitيعيد RAND المربوطة إلى القفل؛ وتصبح قابلة للمطالبة مجددًا بعد دورات فك الارتباط

aggregator register|unbond|withdraw, aggregate

أوامر دور المجمِّع (aggregator) لسلسلة فيها قسم aggregation: يطبع aggregator register --key --bond <RAND> --payout <rand1…> --rpc الأمر AggregatorRegistration موقَّعًا؛ ويعكس aggregator unbond وaggregator withdraw زوج المدقّق. أما aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] فهو الخدمة الدائمة التي تستطلع rand_getUnsealed، وتولّد إثباتًا لتجميع واحد وترسله. خامل على سلسلة 20، إذ لا يحوي genesis فيها قسم aggregation.

rand (wallet)

الخيارات العامة، قبل الأمر الفرعي أو بعده:

الخيارمتغير البيئةالافتراضي
--rpc <RPC>RAND_RPChttp://127.0.0.1:8545؛ http أو https (نقطة النهاية العامة هي https://rpc.randprotocol.org). يُرفض أي رد يتجاوز 64 MiB
--key <KEY>RAND_KEYwallet.key.json؛ ويقع مخزن الملاحظات بجانبه في <key>.notes.json. المخزن مرتبط بالسلسلة التي فُحص مقابلها (rand_getGenesisHash للعقدة): إذا وُجّه إلى سلسلة أخرى، كمحفظة أُبقيت عبر الانتقال من سلسلة 19 إلى 20، فإنه يُفرَّغ ويُعاد فحصه من الورقة 0 مع تحذير. منذ v0.6.8 يرفض كل أمر ملف مفتاح تستطيع المجموعة أو الآخرون قراءته، ويسمّي الحل (chmod 600 <key>)
--proverمعطّل. يُولَّد إثبات الحزمة على المُثبِت (prover) المقترن بهذه المحفظة (rand prover pair) بدلًا من هذا الجهاز؛ ويُتحقق من الإثبات هنا (ملخّصه وحجمه وتحقق محلي) قبل أن يدخل في معاملة. ينطبق على كل أمر يولّد إثبات حزمة؛ أما في call وprogram invoke فلا تذهب إلى المُثبِت إلا حزمة الدفع، ويبقى إثبات الاستدعاء محليًّا. يُرفض دون اقتران، ومع --cuda إلا في call. على سلسلة ذات تفويض مجزَّأ مثل سلسلة 20 يُرسَل إلى المُثبِت مفتاح العرض nk وملح، ولا يُرسَل مفتاح الإنفاق أبدًا: يستطيع قراءة تاريخ هذه المحفظة كله ولا يستطيع الإنفاق. يُولَّد إثبات التفويض دائمًا على هذا الجهاز. على سلسلة يكون guest الحزمة فيها v1 أو v2، يرفض v0.6.8 الخيار --prover قبل أن يُسأل المُثبِت عن أي شيء
--max-prover-fee <RAND>1. أقصى ما يجوز أن يتقاضاه مُثبِت مقترن عن كل حزمة. يُرفض أي عرض يتجاوزه قبل بناء أي حزمة؛ و0 يرفض أي رسم. الرسم مخرَج RAND إضافي في الحزمة نفسها، يظهر بصيغة prover fee: <amount> RAND to <fingerprint>

المبالغ RAND عشرية بما يصل إلى تسع خانات عشرية (1، 1.5، .25، 0.000000001). مبلغ الرمز في send وtoken mint وtoken burn، وفي رابط randpay:، يكون بوحدات عرض الرمز، بحسب decimals الخاصة بصفّه في السجل (10 من zUSD تعني 10 zUSD). يأخذ bridge-burn وtoken create --fixed-supply و--initial أعدادًا صحيحة عادية بأصغر وحدة للرمز، ويطبعها asset-balance. وحيثما يأخذ أمر رمزًا، فإنه يقبل فهرس السجل أو المعرّف rpl1… أو المعرّف ذا 64 خانة سداسية عشرية؛ ويُحوَّل المعرّف إلى فهرسه من قائمة سجل العقدة الكاملة (rand_getTokens، كل الصفحات)، لا بالبحث عن كل رمز على حدة، إذ سيُعلم ذلك العقدة بالرمز الذي توشك على تحريكه. أما الفهرس الرقمي فلا يصل إلى العقدة إطلاقًا.

الأمرالمعاملاتالسلوك
keygenيكتب ملف مفتاح إنفاق جديدًا في المسار --key بالصلاحية 0600؛ ويرفض الكتابة فوق ملف موجود
address--uri [--amount A] [--asset X] [--memo M]، --qr، --qr-png <FILE>يطبع عنوان rand1… لهذه المحفظة على stdout، العنوان وحده وسطرًا جديدًا، فيعمل $(rand address) داخل النصوص البرمجية، ويطبع على stderr بصمته fingerprint XXXX-XXXX-XXXX-XXXX: 16 حرفًا بترميز Crockford base32، وهي فحص بشري للعنوان لا يُرسل أبدًا عبر الشبكة. يطبع --uri أيضًا رابط randpay: (العنوان مع مبلغ وأصل وملاحظة نصية اختيارية). يعرض --qr هذا الرابط رمز QR في الطرفية؛ ويكتبه --qr-png بصيغة PNG
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME>--yes (add)عناوين مسمّاة تستطيع هذه المحفظة الإرسال إليها بالاسم. TO هو عنوان rand1… أو رابط randpay:، ولا يُحفظ منه سوى العنوان. يطبع add البصمة ويسأل add? [y/N] ما لم يُمرَّر --yes؛ ويُرفض الدخل القياسي الذي ليس طرفية بدونه. يُخزَّن في <key>.contacts.json بالصلاحية 0600. الاسم من 1 إلى 64 حرفًا، ولا يبدأ أبدًا بـ rand1 أو randpay:، وهو فريد
prover pair <LINK> / prover pair --trusted / show / forget--name <NAME>، --yes (pair)يقرن هذه المحفظة بمُثبِت (prover) مفوَّض واحد. يأخذ pair رابط randprover: الذي طبعه rand-prover pair، ويرفض أي URL ليس https:// (وhttp:// العادي فقط مع localhost أو 127.0.0.1 أو [::1])، ثم يذكر ما سيستلمه المُثبِت (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) ويسأل pair? [y/N]؛ ويتخطى --yes السؤال، ويُرفض الدخل القياسي الذي ليس طرفية بدونه. ثم يستعلم من المُثبِت عن prover_info، ويرفض ما لم تكن بصمة مفتاحه هي التي سمّاها الرابط، ويكتب <key>.prover.json بالصلاحية 0600 مستبدلًا أي اقتران سابق. لا يأخذ --trusted (v0.6.8) رابطًا: فهو يقرن المحفظة بمجمّع المُثبِتات التابع للمدقّقين (validators)، https://prover.randprotocol.org، من الرابط الذي يحمله البناء؛ ويستطيع مشغّلوه قراءة سجل هذه المحفظة ولا يستطيعون الإنفاق. يطبع show الاسم وURL والبصمة وown ومفتاح المُثبِت، ولا يطبع الرمز المميز أبدًا؛ ويحذف forget الملف. لم يكن v0.6.7 يسأل قبل الاقتران
viewing-keyيطبع مفتاح العرض nk لهذه المحفظة، 64 رمزًا سداسي عشريًا: وهو المعامل الذي يأخذه rand_importViewingKey. يقرأ كل ملاحظة أرسلتها المحفظة أو استلمتها ولا ينفق أيًّا منها
balanceيمسح الشجرة، ويحفظ المخزن، ويطبع القيمة القابلة للإنفاق وعدد الملاحظات غير المنفقة
sync--rescanيمسح دون طباعة رصيد. تقرأ أول مزامنة كل ترويسات الكتل (1,024 في كل استدعاء) قبل الأوراق. يُنسي --rescan كل ملاحظة وكل علامة إنفاق وكل مؤشر (مع إبقاء ربط السلسلة) ويعيد المسح من الورقة 0: وهو طريق العودة حين أبلغت عقدة خطأً أن ملاحظات هذه المحفظة منفقة. الأفضل تشغيله مقابل عقدة تثق بها
notes--memoكل ملاحظة فتحتها هذه المحفظة: الفهرس، والأصل، والمبلغ، والارتفاع، وspent، وpending، والمذكرة النصية (memo) مقتطعة إلى 24 حرفًا، أو كاملة مع --memo
asset-balance [INDEX]يمسح، ثم يطبع ما تحتفظ به هذه المحفظة من أصل واحد، أو صفًّا لكل أصل محتفَظ به؛ والمبالغ بأصغر وحدة للأصل نفسه
history--memoكل ملاحظة أنشأتها هذه المحفظة لشخص آخر، مع عمود المذكرة النصية نفسه كما في notes
send <TO> [AMOUNT]--asset <INDEX|rand|rpl1…|hex> (الافتراضي 0، أي RAND)، --memo <M>، --fee <RAND> (الافتراضي 0.001)، --no-wait، --yes، --cudaTO هو عنوان rand1… أو رابط randpay: أو اسم جهة اتصال محفوظة، ويُجرَّب بهذا الترتيب. يملأ مبلغُ الرابط وأصله ومذكرته ما يتركه سطر الأوامر؛ وAMOUNT اختياري فقط حين يحمل الرابط مبلغًا، وتُرفض القيمة المعطاة بالطريقتين إن تعارضتا. يطبع الأمر التأكيد، to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset>، وحين توجد مذكرة نصية يطبع سطرًا مستقلًّا memo: "<text>"، ثم يسأل قبل الإثبات ما لم يُمرَّر --yes. يجب على النص البرمجي تمرير --yes: يُرفض الدخل القياسي الذي ليس طرفية مع الرسالة stdin is not a terminal: pass --yes to send without confirmation. ثم يختار على الأكثر ملاحظتين من الأصل وعلى الأكثر ملاحظتين من RAND للرسوم، ويختم المذكرة النصية في مخرج الدفع وحده، ويُثبِت محليًّا حزمة واحدة من أربع خانات بأصل مخفي، وعلى سلسلة ذات تفويض إنفاق مجزّأ يُثبِت تفويض الإنفاق أيضًا، ثم يرسل وينتظر الإيداع. تُرفض المذكرة النصية غير الفارغة قبل الإثبات على سلسلة لا يحتوي genesis فيها على envelope_bytes. وAMOUNT بوحدات العرض للأصل: RAND عشري لـ RAND، والرمز المميز بقيمة decimals الخاصة بصف سجله؛ ولا يُقرأ RAND إلا مع 0 أو rand، أيًّا كان الفهرس الذي أجابت به العقدة. يُفك معرّف الرمز المميز قبل سؤال العقدة، ويُرفض أي صف في القائمة يجيب عنه بالفهرس 0 أو بحقول معرّف متعارضة. يعرض التأكيد مبلغ الرمز المميز بوحدات العرض وبالوحدات الأساسية، 10.00000000 zUSD (1000000000 units)، فيظهر أي كذب من عقدة بشأن decimals رمز مميز قبل إرسال أي شيء. يُطبع فهرس الأصل والرسوم قبل الإثبات. على السلسلة يكون تحويل الرمز المميز حزمة عادية، لا يمكن تمييزها عن دفعة RAND؛ ورسومه بـ RAND، وتُرفض المحفظة التي لا تملك RAND قابلًا للإنفاق قبل الإثبات
bond <VALIDATOR> <AMOUNT>--registration <hex>، --fee، --no-wait، --cudaيودع حصة لدى مدقّق (validator): تحرق الحزمة المبلغ
faucet [ADDRESS]--amount <RAND> (الافتراضي والأقصى 100)على testnet فقط: يطلب من عقدة مدقّق أن تسك. على السلسلة 20 لا تدفع الصنبور (faucet) إلا للمحافظ الـ 16 الواردة في قائمة genesis المسموح بها
program build--guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>، --arg N (قابل للتكرار)، --out <file> (الافتراضي program.json)يجمّع برنامج ضيف مدمجًا؛ ويطبع معرّف البرنامج. rpl2_counter (v0.6.8) هو برنامج العرض التوضيحي لـ RPL-2
program deploy <FILE>.json، أو .bin خام، أو حاوية الصورة التي يكتبها rand-guest build؛ --public <FILE>، --input <u32> (قابل للتكرار) أو --check-call، --cudaيطبع معرّف البرنامج وhc وعدد الكلمات؛ ويرفض برنامجًا يتجاوز حد السلسلة (عبر rand_estimateFee) قبل الإثبات؛ ويدفع الحد الأدنى للنشر عبر حزمة، وينتظر. يخزّن --public مدخلًا عامًّا مع البرنامج (كلمات u32 مفصولة بمسافات، أو ELF بصيغة .so)، ضمن max_program_public_words للسلسلة؛ ويربطه معرّف البرنامج عندئذٍ. ومع --input أو --check-call تجري المحفظة أولًا تشغيلًا تجريبيًّا لاستدعاء على تلك المدخلات الخاصة في المحاكي وترفض ما لم يلائم حد طبقة الاستدعاء (14)؛ ولا يُثبَت شيء لهذا الفحص
program show <ID>البيانات الوصفية للبرنامج المنشور
program invoke <PROGRAM-ID>--transition <FILE.json> (مطلوب)، --input N (قابل للتكرار، خاص)، --inputs-file <FILE.json> (مصفوفة JSON من u32، تُلحق)، --fee <RAND>، --gas-limit <N|max>، --tier T، --no-waitv0.6.8، RPL-2: يصرّح بانتقال حالة للبرنامج ويجعل السلسلة تطبّقه. قبل إثبات أي شيء يتحقق من أن للسلسلة قسم program_state، وأن البرنامج موجود، وأن سياق الانتقال يلائم قاعدة المقطع، وأن كل مدخل في reads يطابق الخلية الحية (rand_getProgramCell؛ وعدم التطابق يسمّي الخلية القديمة ويخرج بالرمز 3)، وأن الخزنة تستطيع دفع كل مدخل في pays مع ما يودعه هذا الانتقال، وأن هذه المحفظة تملك الرمز المميز وRAND اللذين يحتاجهما الإيداع والرسوم. يحسب الخلايا التي تنشئها الكتابات، ويجري تشغيلًا تجريبيًّا للبرنامج على كلمات السياق الفعلية، ويُثبِت الاستدعاء مربوطًا بالمعاملة، ثم الحزمة (الرسوم، مع deposit.rand المحروق عبر burn_r وdeposit.amount من deposit.asset عبر burn_a) وإثبات التفويض. الرسوم الافتراضية هي الحد الأدنى للاستدعاء للغاز المصرَّح به مع رسم الخلية لكل خلية منشأة، وبهامش الخطوتين السعريتين نفسه كما في call. يطبع كل دفعة صادرة، وما لم يُمرَّر --no-wait يطبع مخرجات الإيصال الثمانية outputs. وتؤدي القراءة القديمة عند الإدراج أيضًا إلى الخروج بالرمز 3، فتعيد أداة الاستدعاء القراءة وتحاول من جديد. لا ينشر نص المدخلات. ملف الانتقال، وكل حقل فيه اختياري: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}؛ والمفاتيح والقيم هي Word8 من 64 رمزًا سداسي عشريًا، والمبالغ سلاسل عشرية بوحدات الأصل نفسه، وto افتراضيًّا هذه المحفظة
program state <ID>--cell <64 hex>v0.6.8: كل خلية للبرنامج بترتيب المفاتيح (rand_getProgramCells، صفحة بعد صفحة حتى النهاية)، أو خلية واحدة مع --cell، و64 صفرًا عند غيابها. يُرفض على سلسلة بلا قسم program_state
program vault <ID>v0.6.8: خزنة البرنامج (rand_getProgramVault)، صف لكل أصل يحتفظ به، والمبالغ بالوحدات. يُرفض على سلسلة بلا هذا القسم
call <PROGRAM-ID>--input N (قابل للتكرار)، --expect-public <FILE>، --tier T، --gas-limit <N|max>، --fee، --auditor <rand1…>، --no-envelope، --print-call-key، --cudaيشغّل الاستدعاء في المحاكي أولًا ويطبع gas: <exact> (declaring <limit>, tier <t>): الغاز الدقيق شاهد (witness) ولا يغادر المحفظة أبدًا، أما الحد المصرَّح به فهو GAS_LIMIT العام للإثبات. على سلسلة ذات قسم للغاز يكون الحد الافتراضي هو الغاز الدقيق مقرَّبًا إلى الأعلى لأقرب مضاعف لـ 2^(t−2)؛ ويصرّح max بسقف الترويسة gas_max، وهو لا يسرّب ما لا تسرّبه الطبقة؛ ويُرفض N إن كان دون الغاز الدقيق أو فوق السقف. وبلا قسم، أو مع --cuda، يكون الافتراضي max. ثم يُثبِت الاستدعاء محليًّا على المدخل العام للبرنامج، ويختم نص مدخلاته، ويدفع عبر حزمة، ويطبع الإيصال. الرسوم الافتراضية هي الحد الأدنى للحد المصرَّح به، BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB بالأسعار التي يقدّمها rand_getLimits، مع خطوتين سعريتين من الهامش حيث تتحرك الأسعار، وتُطبع بالصيغة fee … RAND (incl. two price steps of headroom). على سلسلة hardening_v6 تُحدَّد الرسوم قبل وجود الإثبات، فيسعّر الافتراضي سقف الإثبات في السلسلة مكان الإثبات، وهذا لا يمكن إلا أن يزيد في الدفع؛ ويدفع --fee مبلغًا بعينه. يرفض --expect-public قبل الإثبات ما لم يكن المدخل العام للبرنامج هو كلمات ذلك الملف
open-call <TXHASH>--call-key <hex>، --as-auditorيفتح نص استدعاء، ويفحصه مقابل H_IN، ويعيد تشغيل البرنامج؛ ويخرج برمز غير صفري عند عدم التطابق
receipt <TX>إيصال استدعاء مودَع
bridge-mint <ATTESTATION>hex أو @path، --pq <JSON or @path> (مطلوب)، --to <rand1…> (الافتراضي: هذه المحفظة)، --fee (الافتراضي: الحد الأدنى للإجراء)، --no-wait، --cudaيودع شهادة موقَّعة من الأوصياء (guardians) على هيئة ملاحظة. --pq هو نصاب التوقيعات المشتركة Dilithium2 للأوصياء، [{"index":0,"signature":"<4840 hex>"},…]. قبل أي إثبات: يفك الشهادة، ويفحص النصاب مقابل pq_guardians للعقدة ومعرّف السلسلة، ويفحص المستلم ومعرّف الأصل، ويقرأ الفهرس المدرج (rand_getAssets). يُشتق تعمية (blinding) ملاحظة الإيداع من ملخص الشهادة، r = blake3("rand-deposit-r-1" || mu)، وهو الـ r الوحيد الذي تقبله السلسلة. تُثبَت حزمة الرسوم مقابل المعاملة كلها، بما فيها النصاب. يطبع owner وtime وr للملاحظة
bridge-rotate <ROTATION>hex أو @path، --pq <JSON or @path> (مطلوب)، --fee (الافتراضي: الحد الأدنى للإجراء)، --no-wait، --cudaيرسل تدويرًا لمجموعة الأوصياء مع نصاب التوقيعات المشتركة لمجموعة PQ الحالية، على هيئة BridgeAttest لا يودع شيئًا. يرفض، قبل الإثبات، كل ما ليس تدويرًا ينقل مجموعة Rand خطوة واحدة. يطبع guardian_set_index بعد ذلك
bridge-pause--sig <HEX or @path> (مطلوب)، --no-waitيوقف السك عبر الجسر: PauseMints بلا حزمة وبلا رسوم، فلا حاجة إلى ملف مفتاح ولا إلى RAND. الملف هو مخرج rand-bridge-gov pause، أي توقيع مفتاح الإيقاف البالغ 2,420 بايتًا بصيغة سداسية عشرية، المعدّ لقيمة pause_nonce الحالية للجسر؛ ويُفحص مقابل pause_key للعقدة ومعرّف السلسلة قبل إرساله. تبقى عمليات الحرق والتدوير مفتوحة أثناء الإيقاف
bridge-unpause--pq <JSON or @path> (مطلوب)، --no-waitيرفع الإيقاف بنصاب أوصياء PQ (ملف rand-bridge-gov pq-unpause) المعدّ لقيمة pause_nonce الحالية. بلا حزمة وبلا رسوم؛ ولا يستطيع مفتاح الإيقاف وحده رفع الإيقاف أبدًا
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO>--relayer-fee N، --fee (الافتراضي 0.01)، --no-wait، --cuda، --yesيحرق أصلًا مجسَّرًا إلى الخارج: يتحقق من أن العملة TOKEN على TO_CHAIN تدعم ASSET وأن فيها مقفلًا ما لا يقل عن AMOUNT، وأن AMOUNT ورسم المُرحِّل (relayer) وحدات إطلاق كاملة؛ ثم يُثبِت حزمة واحدة تنفق الأصل في الخانتين 0–1، وتحرق منه AMOUNT بالضبط (burn_a، burn_asset)، وتدفع رسم RAND من الخانتين 2–3. و--relayer-fee جزء من AMOUNT، وليس رسمًا إضافيًّا. على سلسلة ذات رسم جسر (rand_getBridgeState.fees)، كما هي السلسلة 20، يطبع v0.6.8 أولًا الرسم الذي تحتفظ به السلسلة (من الأصل) والمبلغ الذي سيُطلَق، ويطلب التأكيد؛ ويتخطى --yes السؤال، ويُرفض الدخل القياسي الذي ليس طرفية بدونه. وتُجرى فحوص المقفل ورسم المُرحِّل عندئذٍ على المبلغ المُطلَق
token create--name، --symbol، --decimals <0..=9>، --salt <hex32> (عشوائي إن لم يُعطَ)، ثم إما --fixed-supply <N> --to <rand1…>، أو --authority-key-out <FILE> [--initial <N> --to <rand1…>]، أو (v0.6.8) --program <PROGRAM-ID>، وهو رمز مميز سلطة سكّه ذلك البرنامج، لا يسكّه أو يحرقه إلا استدعاءاته، ويبدأ بإمداد صفر ويحتاج إلى قسم program_state في السلسلة، --fee (الافتراضي: أساس الحزمة مع registration_fee للسجل؛ ويُرفض حين تبلّغ العقدة عن رسم تسجيل فوق 10 RAND، فمرّر --fee لدفع رسم أكبر عن قصد)، --no-wait، --cudaيسجّل رمزًا مميزًا عند الفهرس التالي في السجل: إمداد ثابت (يُسك مرة واحدة، والسلطة none) أو مخوَّل بمفتاح Key (ملف مفتاح Dilithium2 جديد، يُكتب بالصلاحية 0600، ويرفض الكتابة فوق ملف موجود). يبقى مفتاح السلطة في <FILE>.pending إلى أن تقبل السلسلة التسجيل. إن سبقه تسجيل آخر إلى الفهرس يطبع another token took index N first — re-run to register at N+1؛ وعند النجاح يطبع الفهرس والمعرّف، بصيغة hex وبصيغة rpl1…
token mint--asset، --to <rand1…>، --amount <N> (بوحدات عرض الرمز المميز)، --authority-key <FILE>، --fee (الافتراضي 0.001)، --no-wait، --cudaيسك المزيد من رمز مميز مخوَّل بمفتاح Key؛ ويُرفض قبل أي إثبات إن لم يكن الرمز المميز مخوَّلًا بمفتاح Key أو لم يكن المفتاح هو سلطته
token set-authority--asset، --authority-key <FILE>، ثم إما --new-key <FILE> أو --renounce، --fee (الافتراضي 0.001)، --no-wait، --cudaيسلّم رمزًا مميزًا مخوَّلًا بمفتاح Key إلى مفتاح آخر، أو يتنازل عن السك نهائيًّا
token burn <ASSET> <AMOUNT>--fee (الافتراضي 0.001)، --no-wait، --cudaيُتلف AMOUNT، بوحدات عرض الرمز المميز، من رمز RPL تحتفظ به هذه المحفظة؛ وينخفض إمداده العام بهذا القدر بالضبط. يُرفض الرمز المجسَّر قبل الإثبات: فهو يخرج عبر bridge-burn
token info <INDEX|rpl1…|hex>صف rand_getTokens الكامل لرمز مميز واحد: الاسم، الرمز، decimals، السلطة، mint_nonce، الإمداد الكلي، registered_at، المعرّف (hex وid_text) وكل دعم إن كان مجسَّرًا (locked، mint_cap_per_day، minted_today، mint_day)
token list--from <index> (الافتراضي 0)، --limit <N> (الافتراضي 1000)صفحة واحدة من rand_getTokens: enabled، registration_fee، next_index، tokens
token register-bridged--name، --symbol، --salt <hex32>، --chain، --token <hex32>، --decimals (منازل المصدر للدعم الأول)، --pq <JSON or @path> (مطلوب)، --fee (الافتراضي: أساس الحزمة مع registration_fee للعقدة، مع رفض الـ 10 RAND نفسه كما في token create)، --no-wait، --cudaيسجّل رمزًا مميزًا مجسَّرًا بعد genesis مع دعمه الأول، بتفويض من نصاب أوصياء PQ (ملف rand-bridge-gov pq-register) المعدّ لقيمة list_nonce للعقدة. الإدراج على Rand أولًا، ثم setToken على نقطة النهاية ثانيًا
token list-backing--asset <index>، --chain، --token <hex32>، --decimals، --pq <JSON or @path> (مطلوب)، --fee (الافتراضي: أساس الحزمة)، --no-wait، --cudaيضيف دعمًا إلى رمز مميز مجسَّر، بتفويض من نصاب أوصياء PQ (ملف rand-bridge-gov pq-list) عند list_nonce للعقدة
bridgeالحالة العامة للجسر: الأوصياء، والمُصدِرون (emitters)، وسجل الأصول، وتسلسل الحرق
bridge-message <SEQUENCE>رسالة حرق صادرة واحدة، حرفيًّا
fee bundle / fee deploy <words> / fee call <tier>--public-words M (deploy)؛ --gas N، --bytes B، --keccak-log-height K، --sha256-log-height S (call)الحد الأدنى للرسوم من جدول العقدة. على سلسلة ذات قسم للغاز، يسعّر fee call <tier> --gas N الحد المصرَّح به الذي يطبعه rand call، بأسعار رأس السلسلة وبلا هامش: أي الحد الأدنى نفسه. وبلا --gas يسعّر السقف gas_max(tier, K, S)، وهو أقصى ما يمكن أن يكلّفه استدعاء كهذا. و--bytes هو بايتات إثبات الاستدعاء مع مغلف المدخلات
tx <HASH>المعاملة المودَعة مع ارتفاعها وفهرسها
tx-key <HASH>صف لكل مخرج من مخرجات تلك المعاملة أرسلته هذه المحفظة أو استلمته أو احتفظت به كباقٍ: output (bundle:0 … bundle:3، وهي الخانات الأربع للحزمة الواحدة، أو mint:0)، والدور، والمبلغ (بـ RAND، أو N (asset I) للرمز المميز)، والمذكرة النصية التي حملها (- إن لم تكن) والمفتاح الخاص بالمعاملة الذي خُتم به. سلّم مفتاح صف sent إلى المستفيد أو المدقّق فيكشف rand_checkTransaction <HASH> <KEY> ذلك المخرج وحده، بمذكرته النصية. الخانة الوهمية تُفتح لأحد ولا صف لها
block <ID>كتلة بالارتفاع أو بالتجزئة
head{ height, hash, view }
statusrand_status
peersالأقران المتصلون
validatorsسجل المدقّقين

--cuda يتطلب بناءً بالخيار --features cuda وليس له بديل احتياطي؛ ولم يُبنَ أي PTX حتى الآن. ولا يستطيع ختم غلاف مدخلات الاستدعاء: فالأمر rand call --cuda يحتاج إلى --no-envelope. وهو يعلن سقف الغاز فقط، ويرفض --gas-limit N.

كل مذكرة واسم جهة اتصال تطبعها واجهة سطر الأوامر (تأكيد send، وnotes، وhistory، وtx-key) تمر أولًا بقاعدة عرض واحدة: تُعرض محارف التحكم، ومحارف التنسيق في Unicode (محارف التحكم ثنائية الاتجاه، والمحارف عديمة العرض، والواصلة اللينة)، وU+2028/U+2029 على هيئة U+FFFD، وتُعرض سلسلة محارف الفصل المتتالية مسافةً واحدة.

أول تحويل محمي

rand keygen                                   # wallet.key.json
rand address                                  # rand1… on stdout, its fingerprint XXXX-XXXX-XXXX-XXXX on stderr
rand faucet                                   # testnet, allowlisted wallets only: 100 RAND into a note only you can open
rand balance                                  # balance: 100 RAND
rand send rand1q9f… 1.5                       # asks to confirm, then a minute and a half to two minutes of local proving, then the commit
rand notes                                    # the spent note, and the change note

مشاركة عنوان، ومذكرة

rand address --uri --amount 1.5 --memo "invoice #42" --qr   # a randpay: link, as a terminal QR
rand contacts add alice rand1q9f…                           # shows the fingerprint, asks add? [y/N]
rand send alice 1.5 --memo "coffee"                         # the memo is sealed into the payment output
rand history --memo                                         # alice's row shows the whole memo
rand tx-key <hash>                                          # hand the sent row's key to alice or an auditor

تقع المذكرة داخل الجسم المختوم نفسه الذي توجد فيه الملاحظة، فمن يستطيع فتح أحدهما يستطيع فتح الآخر: المستفيد عبر notes، وكل من يملك المفتاح الخاص بالمعاملة لذلك الخرج عبر rand_checkTransaction <hash> <key>. السلسلة 18 هي أول سلسلة يضبط genesis فيها envelope_bytes؛ أما في السلاسل من 14 إلى 17 فقد كان --memo يُرفض قبل أن يُثبت أي شيء.

استدعاء سري يمكنك فتحه لاحقًا

rand program build --guest balance_check --arg 1000 --out bc.json
rand program deploy bc.json                   # prints the program id
rand call <id> --input 100 --input 200 --input 300 --input 400
rand open-call <txhash>                       # inputs: [100, 200, 300, 400] — verdict: faithful (exit 0)

برنامج ذو حالة: عدّاد RPL-2

على سلسلة فيها قسم program_state، كما هي حال السلسلة 20. يقبل العدّاد بالضبط الانتقالات التي تقرأ خلية واحدة وتكتبها من جديد وقد زادت كلمتها الأولى بمقدار واحد؛ أما كل ما عدا ذلك في الانتقال (ما تودعه الحزمة، وما تدفعه الخزنة، وما يسكّه البرنامج) فيمرّ دون فحص، وهذا يجعله عرضًا توضيحيًا لا برنامجًا تُوضع خلفه قيمة.

rand program build --guest rpl2_counter --out counter.json
rand program deploy counter.json                          # prints the program id
rand token create --name "Counter Share" --symbol CTR --decimals 0 --program <id>   # say index 2
rand program state <id> --cell 0100000000000000000000000000000000000000000000000000000000000000   # 64 zeros: absent
cat > step.json <<'JSON'
{ "reads":  [{ "key": "0100…00", "value": "0000…00" }],
  "writes": [{ "key": "0100…00", "value": "0100…00" }],
  "deposit": { "rand": "500000000", "kind": "none" },
  "pays":   [{ "asset": 0, "amount": "200000000", "to": "rand1…" }],
  "mints":  [{ "asset": 2, "amount": "1" }] }
JSON
rand program invoke <id> --transition step.json           # exit 3 if the cell moved since; re-read and retry
rand program vault <id>                                   # asset 0: 300000000 units (0.5 RAND in, 0.2 out)

تمثّل … في الملف الأحرف الستة عشرية الأربعة والستين كاملةً، وهي ما تشترطه المحفظة.

ما يطبعه النشر والاستدعاء

على سلسلة ذات تفويض منفصل، تتكوّن كل حزمة من إثباتين يُنشآن على هذا الجهاز: تفويض الإنفاق من المستوى 10 وحزمة المستوى 14. أمر program deploy باستخدام rand v0.6.7 على السلسلة 18، بتاريخ 2026-09-30:

proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1368908 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 116.7s: tier 14, 1500710 bytes
submitted deploy <hash>
  0 RAND out, 59.8545 RAND change, fee 0.1007 RAND, anchored at height 97831, proved in 116.7s (bundle) + 6.8s (auth)

يطبع الأمر call غازه ورسمه قبل إثبات الاستدعاء، ثم يُثبت الحزمة الدافعة بالطريقة نفسها:

proving the call locally (90 inputs stay private, over the program's 11-word public input)…
gas: 5636 (declaring 6144, tier 12)
fee 0.006191437 RAND (incl. two price steps of headroom)
proved in 29.2s: tier 12, 3346865 bytes, outputs [...]

هنا 6,144 هو 5,636 مقرّبًا إلى الأعلى إلى مضاعف للعدد 2^10، والأمر rand fee call 12 --gas 6144 --bytes <B> يسعّر ذلك السقف بأسعار رأس السلسلة دون أي هامش إضافي.

rand-prover

المُثبِت المفوَّض في ملف تنفيذي مستقل: ينشئ إثبات حزمة المستوى 14 الخاصة بمحفظة على جهاز آخر. ويستضيف rand-node run --prover الخدمة نفسها داخل عقدة. يقبل كل أمر فرعي الخيار --home <DIR> (متغير البيئة RAND_PROVER_HOME، والافتراضي ~/.rand-prover)، وهو الدليل الذي يضم prover.key.json وpairings.json.

الأمرالوسائطالسلوك
keygenيكتب prover.key.json بالصلاحية 0600 ويطبع بصمة المفتاح؛ ويرفض الكتابة فوق ملف موجود
pair--name <LABEL> (مطلوب)، --url <URL> (الافتراضي http://127.0.0.1:8600)، --own، --qrيُنشئ رمزًا مميّزًا ويخزّن تجزئته فقط تحت التسمية ويطبع رابط الاقتران randprover: الذي يقبله rand prover pair. يظهر الرمز المميّز مرة واحدة داخل الرابط. --url هو العنوان الذي تصل به المحفظة إلى هذا المُثبِت؛ ويضيف --own القيمة own=1؛ ويطبع --qr الرابط أيضًا على هيئة رمز QR في الطرفية
unpair--name <LABEL>يزيل اقترانًا؛ والمُثبِت العامل يقرأ الملف عند بدء التشغيل، فلا يسري ذلك إلا بعد إعادة التشغيل
pairingsسطر لكل اقتران: التسمية، وown أو -، وتاريخ الإنشاء
run--listen <ADDR> (الافتراضي 127.0.0.1:8600)، --max-parallel <N> (1)، --max-queue <N> (8)، --per-token <N> (2)، --cuda، --skip-memory-check، --allow-origin <ORIGIN> (قابل للتكرار)، --fee <RAND> مع --fee-address <rand1…>، --accept-spend-keyيخدم JSON-RPC الخاص بـ prover_* حتى Ctrl-C أو SIGTERM. يُرفض بدء التشغيل ما لم تتوفر ذاكرة قدرها 5.74 GB × --max-parallel + 1 GiB. --per-token هو عدد المهام التي يجوز لاقتران واحد أن يضعها في الطابور أو قيد الإثبات في وقت واحد. --accept-spend-key أُلغي في v0.6.8: يرفض run البدء به، ولا يقبل المُثبِت إلا شواهد مفتاح العرض. وفي v0.6.7 كان يقبل شواهد مفتاح الإنفاق، وهي لا ترسلها إلا سلسلة على الإصدار v1 أو v2 من حارس الحزمة

يتلقى المُثبِت على السلسلة 20 مفتاح العرض nk الخاص بالمحفظة وملحًا جديدًا. لا يستطيع الإنفاق، لكنه يستطيع قراءة كل ما استلمته تلك المحفظة أو أرسلته: اقترن بمُثبِت تقبل أن تُطلعه على سجلّك. وتتحقق المحفظة من كل إثبات يعود إليها.

صيغ ملفات المفاتيح

مفتاح العقدة:

{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }

مفتاح المحفظة، الإصدار 2:

{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }

يكتبه rand keygen بالصلاحية 0600، ومنذ v0.6.8 يرفض كل أمر rand ملف مفتاح محفظة يستطيع المجموعة أو الآخرون قراءته: ويجب إعادة المفتاح المنسوخ أو المستعاد يدويًا إلى 0600 (chmod 600 <key>). وضياع مفتاح المحفظة يُضيع كل ملاحظة كان بإمكانه فتحها؛ ولا توجد عبارة استرداد في هذا الإصدار.

آخر تحقق مقابل الإيداع c0878c3f في fullnode (السلسلة 21) بتاريخ 2026-10-12. إذا اختلف الكود عن هذه الصفحة فالكود هو الصحيح؛ أبلغونا بذلك.