اقرأ هذه الصفحة لتقرر ما الذي ستبني عليه ومن أين تبدأ: نموذج السلسلة في بضع فقرات، ومعاملات شبكة testnet الحية، وكيفية الحصول على RAND تجريبي، وخريطة لبقية الوثائق.
ما هو Rand Protocol
Rand سلسلة محمية مقاومة للحوسبة الكمّية. عملتها الأصلية هي RAND، وتعيش RAND في مجمّع محمي بالكامل: لا حسابات ولا أرصدة على السلسلة، بل التزامات مذكرات ومُبطِلات فقط، والتحويل هو إثبات بمعرفة معدومة على أن أربع مذكرات أصبحت أربع مذكرات أخرى (تملأ مذكرات وهمية الخانات غير المستخدمة)، دون إظهار أي أصل جرى نقله. تشترك RAND وكل رمز من معيار السلسلة نفسها، RPL، في هذا المجمّع الواحد. وتدفع العملة نفسها كلفة البرامج السرّية: برامج RISC-V تُنفَّذ خارج السلسلة داخل آلة افتراضية بمعرفة معدومة، وتُسوَّى على السلسلة بإثبات بدلًا من مدخلاتها.
كل بدائية تشفيرية فيها مختارة لتصمد أمام خصم كمّي:
| الطبقة | ما الذي يعمل |
|---|---|
| التواقيع | Dilithium2 (قائم على الشبكات). يوقّع به المدقّقون الكتل والأصوات؛ ويوقّع به كذلك الصنبور وإجراءات الحصص وتسجيلات الجسر. لا توقّع المحفظة أي معاملة: تُخوِّل الحزمةُ نفسَها بإثباتها. |
| تشفير المذكرات | تغليف المفاتيح ML-KEM-768 مع ChaCha20-Poly1305. ترافق كل مذكرة على السلسلة مظروفٌ لا يفتحه إلا مالكها (ومرسلها). |
| التجزئة | BLAKE3 مع فصل النطاقات للعناوين ومعرّفات المعاملات وجذر الحالة وكل ما هو خارج نظام الإثبات؛ وPoseidon2 على حقل Goldilocks للمذكرات والمُبطِلات وشجرة الالتزامات وكل ما هو داخل الإثبات. |
| الإثباتات | إثبات STARK مجمَّع من Plonky3 مع FRI المخفي (80 استعلامًا، معامل توسيع 8، و20 بتًّا من إثبات العمل). شفاف: لا إعداد موثوقًا، ولا منحنى اقتران، والفرضية هي دالة تجزئة مقاومة للتصادم. |
| الحوسبة السرّية | zkVM الخاصة بـ Rand، وهي آلة RV32IM يُثبَت عملها بذلك STARK. يُعرَّف البرنامج بملخّص داخل الدارة، ولا يرى المتحقّق كلمة تعليمة واحدة. |
| الإجماع | HotStuff BFT المتسلسل: نصاب مرجَّح بالحصص يزيد على الثلثين، وقادة بالتناوب الدوري، وقاعدة اعتماد بثلاث دورات متتالية. |
| التخزين والشبكات | قاعدة RocksDB واحدة لكل عقدة مع اعتمادات مزامَنة بـ fsync وفحص سلامة عند الإقلاع؛ وlibp2p (TCP وNoise وYamux وgossipsub وKademlia وmDNS في الشبكات المحلية). |
التنفيذ المرجعي هو randprotocol/fullnode، بلغة Rust: الملف التنفيذي rand-node هو العقدة، والملف التنفيذي rand هو المحفظة، وتبدأ أسماء طرق JSON-RPC بالبادئة rand_. والمستكشف هو randscan.org.
شبكة testnet: السلسلة 20
يعمل الأسطول العام على السلسلة 20، الحية منذ 2026-10-01 06:17 UTC على fullnode v0.6.8. السلاسل من 15 إلى 19 متقاعدة. جرى إطلاق أربع سلاسل في أربعة أيام، كلٌّ منها لتغيير يمسّ كل إثبات أو صيغة المعاملة:
- السلسلة 16 (2026-09-28، fullnode v0.6.1) نقلت zkVM إلى مجموعة القيود 7، التي تُعمّي ما كان الإثبات يكشفه عن المدخلات الخاصة الصغيرة، وفعّلت قواعد
hardening_v6. - السلسلة 17 (2026-09-29، v0.6.3) فصلت تخويل التحويل عن إثباته: تحمل كل حزمة إثباتًا ثانيًا صغيرًا يُنشأ بمفتاح الإنفاق، بحيث يمكن لآلة لا تملك سوى مفتاح عرض أن تنشئ الإثبات الكبير.
- السلسلة 18 (2026-09-29، v0.6.7) تقيس الاستدعاءات السرّية بالغاز (مجموعة القيود 8) وتفعّل المذكرة المشفّرة في كل مظروف مذكرة.
- السلسلة 20 (2026-10-01، v0.6.8) تربط كل إثبات وكل رسالة موقّعة بتجزئة genesis، وتضيف حالة البرامج (RPL-2)، وتأخذ رسمًا على سكّ zUSD وحرقها عبر الجسر، وتفعّل قواعد audit-v6 المدرجة في الجدول أدناه.
كانت السلسلة 19 (2026-10-01 03:43 UTC، v0.6.7) إعادة genesis للسلسلة 18 على الإصدار نفسه ولم تغيّر أي قاعدة. أُوقفت السلسلة 18 عند الارتفاع 143,776، وأُنشئت السلسلة 19 من لقطة عند الارتفاع 141,935. ولم يختلف genesis الخاص بها عن genesis السلسلة 18 إلا في معرّف السلسلة والطابع الزمني والمذكرات المنقولة وقسم الجسر: مُصدِرون جدد لنقاط النهاية الخاصة بـ Ethereum وBinance Smart Chain وTron، مع ترحيل عدّادات التسلسل.
السلسلة 20 هي انقسام صلب من السلسلة 19: أُنشئ genesis الخاص بها من لقطة للسلسلة 19 عند الارتفاع 7,258، وأُوقفت السلسلة 19 عند الارتفاع 7,700، وأُعيد تشغيل المدقّقين الـ 26 جميعًا على السلسلة 20 معًا، بالمفاتيح نفسها ومعرّفات الأقران نفسها وعقد الإقلاع نفسها. السلسلة 19 والسلسلة 18 متقاعدتان. تحتاج المحفظة إلى v0.6.8 للإرسال على السلسلة 20: فإثباتات المحفظة الأقدم وتواقيعها لا تحمل الربط بـ genesis، وترفضها السلسلة.
كلٌّ منها سلسلة جديدة. نُقلت أرصدة RAND في محافظ المشغّل وzUSD المتداولة إلى genesis التالي، ولم يُنقل شيء غير ذلك: فالبرنامج المنشور على سلسلة لا وجود له على التي تليها. إنها برمجية تجريبية: غير مدقَّقة، ولا قيمة لـ RAND عليها.
البرامج على السلسلة 20 يمكنها الاحتفاظ بحالة: خلايا البرامج في RPL-2 وخزائن البرامج والإجراء Invoke كلها حية.
| معرّف السلسلة | 20 (rand_chainId) |
| كتلة التكوين (genesis hash) | 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 |
| ملف التكوين | deploy/genesis-chain20.json في مستودع العقدة الكاملة |
| الإصدار | العقدة الكاملة v0.6.8 (الوسم c9c9bd3c)؛ وتُبلّغ العقدة عن إصدارها في rand_getVersion. يرفض هذا الإصدار السلاسل من 14 إلى 17، ولا تستطيع محفظة أقدم من v0.6.8 الإرسال على السلسلة 20 |
| ربط التكوين | binding_domain 1: يتضمن ربط الإثبات في كل حزمة وكل رسالة إجراء موقّعة تجزئة التكوين (genesis hash)، فلا يصحّ على سلسلة أخرى أي شيء أُثبت أو وُقّع لسلسلة واحدة |
| علامة الشبكة التجريبية | testnet true: يعلن التكوين أنه شبكة اختبار، وهذا ما يتيح تشغيل صنبور (faucet) إلى جانب الجسر |
| المدقّقون (validators) | 26، لكل منهم رهان قدره 1,000 RAND، وهو الحد الأدنى للرهان |
| النصاب | 18 من 26: أكثر من ثلثي الحصة بدقة |
| الفاصل بين الكتل | القيمة الافتراضية --block-interval-ms 1000؛ أي كتلة واحدة تقريبًا في الثانية |
| زمن الكتلة | يكون الطابع الزمني الذي يتجاوز طابع الكتلة الأب بأكثر من 60 s غير صالح، ولا يصوّت المدقّق لكتلة تسبق ساعته بأكثر من 15 s، ولذلك تشغّل المدقّقات NTP |
| نافذة الإثبات | proof_window_blocks 1,024: يجب أن تكون نقطة ارتكاز الحزمة (anchor) واحدة من جذور نهايات الكتل الـ 1,024 الأخيرة، وألا يكون time فيها أقدم من ذلك (256 كتلة على السلسلتين 18 و19) |
| الحقب (epochs) | 1,000 كتلة؛ ولا يُحتسب الرهان الجديد إلا بعد انتظار حقبتين إضافيتين (bond_activation_epochs 2، ويُفعَّل في الحقبة e + 3)، ويُحرَّر الرهان المفكوك بعد حقبتين |
| الرهان (staking) | التسجيلات من الإصدار v2 (rand-node register --v2)، ولا يُسجَّل مفتاح جديد إلا بعد أن يصوّت لإدخاله مدقّقون يحوزون أكثر من ثلثي الوزن (admission_by_vote)؛ ويُحدّ وزن المدقّق الواحد بـ 33.33 %؛ ويُحدّ الرهان الجديد الداخل عند حدّ الحقبة بـ 25 % من الوزن الفعّال (max_stake_entry_bps_per_epoch 2,500)؛ ولا مصادرة (slashing) |
| zkVM | مجموعة القيود 8، وملف FRI الإنتاجي (80 استعلامًا) |
| برنامج الحزمة الضيف | hc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: حزمة الأصول المخفية بأربعة مدخلات وأربعة مخرجات، الإصدار 3، المستوى 14 |
| برنامج التفويض الضيف | hc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: تفويض الإنفاق الذي تحمله كل حزمة، المستوى 10 |
| الغاز | يعلن الاستدعاء حدًّا للغاز تفرضه الدائرة ويدفع مقابله gas_price: 100 وحدة لكل غاز و800 وحدة لكل KiB عند الحد الأدنى، وكلاهما يتحرك في كل كتلة نحو هدف قدره 262,144 غازًا و10,485,760 بايتًا، ولا يتجاوز أبدًا السقفين 10,000 لكل غاز و80,000 لكل KiB. لا يُحتسب في حمل البايتات إلا البايتات التي يُفرض عليها سعر البايت (إثبات الاستدعاء ومظروف مدخلاته) (byte_load: "paying")، فلا ترفعه كتلة من التحويلات. تعلن كل حزمة الحد المثبّت 20,479 وتدفع 0.001 RAND ثابتة |
| حالة البرنامج | RPL-2 مفعّل: خلايا البرنامج وخزائن البرنامج وInvoke (Action 33)؛ وتكلّف الخلية المُنشأة 0.01 RAND (cell_fee 10,000,000 وحدة)؛ ويقرأ الاستدعاء 8 خلايا على الأكثر، ويكتب 8 على الأكثر، ويجري 4 مدفوعات خارجة على الأكثر (rand_getLimits.program_state) |
| مظروف الـ note | envelope_bytes 1860: مظروف كل note حجمه 1,860 بايت ويحمل مذكرة مشفّرة |
| سقف البرنامج | max_program_words 65,535، لكن في ظل hardening_v6 يُرفض النشر الذي لا يستطيع أي استدعاء من المستوى 14 استيعابه (ProgramUncallable): 8,180 كلمة لبرنامج بلا مقطع عام |
| سقف الإثبات | max_proof_bytes 4,194,304 (4 MiB)؛ وكان 8 MiB على السلاسل من 13 إلى 16 |
| سقف الكتلة | max_block_bytes 20,971,520 (20 MiB) |
| سقف مظروف الاستدعاء | max_call_envelope_bytes 65,536 |
| المدخل العام لكل برنامج | max_program_public_words 32,768، يُثبَّت عند النشر |
| الصنبور (faucet) | مفعّل، لكن للمحافظ الـ 16 الواردة في قائمة السماح في التكوين فقط (staking.faucet_recipients)، ومن المدقّقين الـ 18 الذين يسمّيهم التكوين سُكّاكًا فقط (staking.faucet_minters): حتى 100 RAND في الاستدعاء الواحد، و10,000 RAND في الحقبة الواحدة إجمالًا |
| الحوسبة السرية | مفعّلة؛ ويُحدّ إثبات الاستدعاء بالمستوى 14. لا تنتقل البرامج عبر القطع؛ والبرامج النموذجية تبيّن السلسلة المنشورة عليها كل برنامج |
| الرموز (tokens) | سجل RPL مفعّل: رسم التسجيل 1 RAND، يُحرَق؛ وبحد أقصى 4,096 رمزًا؛ وكل قيمة note دون 2⁶³. zUSD مدرج في التكوين عند الفهرس 1 |
| الجسر | مفعّل: مجموعة الأوصياء 1 من ثمانية أوصياء، وثمانية أوصياء ما بعد كمّيين (PQ) بتوقيع Dilithium2، ومفتاح إيقاف مؤقت، وجهات إصدار لأربع سلاسل مصدر، وسقف سكّ يومي قدره 100,000 zUSD لكل غطاء، وسقف إجمالي قدره 4,000 zUSD لكل 24 ساعة متدحرجة عبر جميع الأغطية. لدى zUSD سبعة أغطية؛ وعرضه هو ما هو مقفل، ويُقرأ مباشرة من rand_getTokenSupply. ومنذ السلسلة 20 تُقتطع رسوم قدرها 10 bps من كل سكّ ومن كل حرق، بـ zUSD، في صورة note إلى عنوان الخزينة (bridge.fees): فيُقيَّد للإيداع المبلغ الإجمالي ناقصًا الرسوم، ويُفرج الحرق عن amount − fee على سلسلة المصدر. ويحمل تدوير الأوصياء ما بعد الكمّيين أو مفتاح الإيقاف المؤقت توقيع كل مفتاح جديد بنفسه، ويسري بعد 86,400 s من قبوله (bridge.rotation) |
| السجل التاريخي | تحتفظ 24 مدقّقًا بكتل 24 ساعة (--prune-history 24h) وتجيب بـ -32010 عمّا دون ذلك؛ وتحتفظ عقدتا أرشيف بكل كتلة، ويحيل نقطة RPC العامة https://rpc.randprotocol.org إلى عقدة أرشيف |
| تجميع الكتل | معطّل (لا قسم aggregation في التكوين؛ ويرفض الإصدار البدء على تكوين فيه هذا القسم) |
| قيمة التكوين | 26,000 RAND مرهونة في سجل المدقّقين، وسبع note إيداع مجموعها 5,184.243719258 RAND، منقولة من محافظ المشغّل على السلسلة 19: 31,184.243719258 RAND، قبل سكّ الصنبور (يُبلّغ rand_getSupply عن genesis_staked وgenesis_deposited)؛ إضافة إلى note تكوين اثنتين مجموعهما 99 zUSD، تطابقان 99 zUSD المقفلة على أغطيتها |
عقد الإقلاع (deploy/nodes.env):
/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
تعمل السلسلة 20 على مفاتيح المدقّقين التي استخدمتها السلاسل من 14 إلى 19، ولذلك لم تتغير معرّفات الأقران هذه منذ تدوير مفاتيح السلسلة 14.
يفهرس المستكشف randscan.org السلسلة 20 ويوفّر واجهة REST على https://randscan.org/api/v1 (واجهة المستكشف البرمجية). تربط واجهة JSON-RPC في العقدة الكاملة نفسها افتراضيًا بالعنوان 127.0.0.1:8545؛ شغّل عقدة (تشغيل عقدة)، أو استخدم عقدة تثق بها، أو استخدم نقطة النهاية العامة https://rpc.randprotocol.org (rand --rpc https://rpc.randprotocol.org …). تخدم نقطة النهاية العامة كل ما تحتاجه المحفظة، بما في ذلك أول مزامنة لها وإرسال المعاملات، ضمن حد قدره 1,200 قراءة و6 عمليات إرسال في الدقيقة لكل عنوان. ولا تخدم الصنبور.
الحصول على RAND من الصنبور
الصنبور نوع من المعاملات: يسكّ مدقّق note واحدة بمبلغ علني إلى عنوان محمي (shielded)، ولا يستطيع فتح الـ note إلا حائز العنوان. على السلسلة 20 لا يدفع الصنبور إلا إلى العناوين الـ 16 الواردة في قائمة السماح في التكوين: فيُرفض السكّ إلى أي عنوان آخر بالرسالة the faucet may not mint to this recipient (not in staking.faucet_recipients)، ولذلك تحصل المحفظة غير الواردة فيها على RAND الاختبارية بأن يُرسَل إليها منها. يطلب كل مسار من المسارات الثلاثة أدناه سكًّا من عقدة مدقّق؛ وترد العقد المراقِبة بالرسالة faucet mints are signed by validators; ask a validator node، ولا تحيل نقطة RPC العامة rand_mint أصلًا.
باستخدام محفظة rand، موجَّهة إلى RPC لدى مدقّق:
rand keygen # writes wallet.key.json; refuses to overwrite
rand address # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet # an allowlisted wallet: 100 RAND into a note only it can open
rand balance # scans the tree with this key; prints 100 RAND
يسكّ الأمر rand faucet [ADDRESS] --amount <RAND> إلى عنوان آخر أو بمبلغ أقل؛ والقيمة 100 RAND هي الافتراضية وهي السقف في الاستدعاء الواحد. وعبر JSON-RPC الطلب نفسه هو rand_mint:
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'
النتيجة هي تجزئة معاملة السكّ؛ استعلم عن rand_getTransaction حتى تعيد كتلة. المبالغ سلاسل من الوحدات، و1 RAND يساوي 10⁹ وحدة. وفي تطبيقات المحفظة الصنبور نفسه بنقرة واحدة؛ أرسل منها باستخدام Rand Wallet v0.6.8 أو أحدث، وهو أول إصدار للسلسلة 20. وتقبل صفحة الصنبور في هذا الموقع طلبات قائمة الانتظار لمنح devnet.
مبلغ السكّ علني على السلسلة: وهو الظهور بقفزة واحدة الذي يلازم أي إيداع من علني إلى محمي. أما ما تساويه الـ note لمن بعد ذلك فيبقى مخفيًا كأي note أخرى.
إلى أين بعد ذلك
- الحسابات والعناوين: نوعا المفاتيح، وما هو عنوان
rand1…، ولماذا جرى التراجع عن العنوان المؤلف من 54 حرفًا في السلسلة 11. - الـ notes وشجرة الالتزامات، المعاملات والإجراءات، الرسوم، الإجماع والنهائية، المعروض: النموذج.
- التشفير والإثباتات: اللبنات الأساسية، ومعاملات STARK، وكيف تُثبَت الحزمة ويجري التحقق منها.
- الرموز ونشر رمز RPL: معيار RPL، والرمز بوصفه مدخلًا في سجل بمعرّف
rpl1…، وإنشاء رمز من المحفظة. - البرامج: نشر برنامج سري واستدعاؤه، وما لا يمكن فعله حتى الآن.
- الجسر، السك والحرق، الإيداع بالحصص (Staking)، تشغيل عقدة.
- كتابة برنامج بلغة Rust أو C: الدليل الكامل، من تصميم مدخلات البرنامج ومخرجاته إلى مزاد بعطاءات مختومة مكتوب باللغتين، وميزانية الإثبات، ونشر البرنامج والتحقق من استدعائه.
- أربعة برامج نموذجية: تطبيقات كاملة، شُغّل كل منها على testnet: تصويت مجهول على قائمة سماح مبنية على Keccak، وإثبات الالتزامات على شجرة مجاميع SHA-256، ودفتر أستاذ خارج السلسلة تنتقل حالته بين الاستدعاءات، وقرار ائتماني خاص من نموذج منشور.
- مجموعة تعليمات RISC-V، نشر برنامج Rust، نشر برنامج RISC-V: بناء برامجك الخاصة ونشرها باستخدام سلسلة أدوات
rand-guest. - مترجم Solana ومترجم Ethereum: SPL Token وERC-20، مترجمان إلى RISC-V ومطابقان كلمةً بكلمة لنتائج المفسّرات.
- تشغيل مدقِّق ومجمِّع: الذاكرة والمعالج والقرص لكل دور، وحدود ذاكرة الإثبات المقيسة.
- المطورون: المستودعات، والمكدّس التقني، ومراحل zkVM، وما هو مواصفٌ لكنه غير مُصدَر، وكيفية البناء والاختبار والمساهمة.
- JSON-RPC، سطر الأوامر، واجهة Explorer البرمجية: المراجع.
مستودع fullnode يحتوي على دليل docs/ الخاص به، وهو المصدر الذي تُراجَع هذه الصفحات عليه، وتحمل الأوراق البحثية الخلفية التشفيرية.