Rand Protocol
شارك

شغّل عقدة Rand

العقدة الكاملة المرجعية ومحفظتها مكتوبتان بلغة Rust وتُبنيان من المصدر. يخرج من البناء ملفان تنفيذيان: rand-node، وهو العقدة وأدوات المشغّل، وrand، وهو محفظة تحتفظ بمفتاح إنفاق محمي، وتتصل بأي عقدة عبر JSON-RPC، وتشغّل المُثبِت الخاص بـ zkVM محليًا لكل تحويل ولكل استدعاء سري. تعمل testnet تجريبية، السلسلة 21، على 26 مُصادِقًا موزعين على خوادم DigitalOcean. لم تُدقَّق ولا تحمل أي قيمة حقيقية. الملفان التنفيذيان لنظام Linux x86_64 مرفقان بإصدار v0.8.0، وهو البناء الذي نُقل إليه الأسطول.

البناء والتشغيل محليًا
bash
# 1. Rust (يلتقط rustup سلسلة الأدوات المثبّتة 1.98.1) واعتماديات بناء RocksDB
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install build-essential clang cmake pkg-config libssl-dev   # Linux

# 2. الاستنساخ والبناء (من 10 إلى 20 دقيقة في المرة الأولى)
git clone https://github.com/randprotocol/fullnode.git
cd fullnode
cargo build --release        # target/release/rand-node, target/release/rand

# 3. سلسلة من مُصادِقَين على هذا الجهاز (RPC على 8545 و8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status

# 4. الاختبارات؛ بنمط release لأن إثبات STARK بطيء في وضع debug (678 اختبارًا، نحو 43 دقيقة كما قيس في 2026-09-14)
cargo test --workspace --release
انضم إلى testnet العامة بصفة مراقب
السلسلة 21
# الإصدار v0.8.0 (c0878c3f) يشغّل chain 21، ولا يفعل ذلك أي إصدار سابق: تعمل chain 21 بمجموعة القيود 9، ومفاتيح المُتحقِّق وترميز الإثبات فيها لا يحملها أي إصدار أقدم. ابنِه من الوسم، أو على Linux x86_64
# خذ الملفات التنفيذية الجاهزة وتحقق منها مقابل SHA256SUMS المنشور مع الإصدار
git checkout v0.8.0 && cargo build --release
curl -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand-node -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand \
     -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/msauth-vk-production.bin# مفتاح المُتحقِّق للتوقيع المتعدد المثبَّت: يحمّله rand-node من جوار ملفه التنفيذي ويرفض البدء من دونه
sha256sum rand-node rand msauth-vk-production.bin   # يجب أن يطبع قيم الإصدار (SHA256SUMS، موقَّع باسم SHA256SUMS.sig):
# 324a4ab1029d39e67fc2de36b036341b0f88f13089997d7fe24c596363a58278  rand-node
# e3a38e74ee28743a960fc1c3eb1ac6c538e18dc259411e10afff7f54e268bbf4  rand
# 68facb06c7f321aaf1d4d541acf6b5c0e9d7f17788ed1c9add6c5a8a8f7acd30  msauth-vk-production.bin

# هوية عقدتك: مفتاح المُدقِّق Dilithium2 ومعرّف النظير p2p في ملف واحد. أنشئ مفتاحك الخاص
# واحتفظ به خارج نسخة الشيفرة؛ فالمستودع لا يتتبّع أي مفتاح بعد الآن
rand-node keygen --out node.key.json

# يأتي ملف التكوين الأول (genesis) ضمن المستودع؛ ويجب أن تحمل كل عقدة الملف نفسه تمامًا.
# يطبع init تجزئته، ويجب أن تطابق التجزئة الواردة أدناه
rand-node init --datadir ./data --genesis deploy/genesis-chain21.json

# اتصل بالمُدقِّقين العامين (احتفظت chain 21 بمفاتيح chain 14، ومن ثمّ بمعرّفات نظرائها وعناوين IP الخاصة بهم).
# احذف --validator: مفتاحك ليس ضمن مجموعة المُدقِّقين. ويحتاج المُدقِّق أيضًا إلى NTP
rand-node run --datadir ./data --key node.key.json \
    --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns \
    --bootstrap /ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe \
    --bootstrap /ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw \
    --bootstrap /ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ

# المحفظة مفتاح منفصل ومحمي (shielded). وعنوانها rand1… نص بحجم نحو 1.6 KB
rand keygen && rand address

# يُوقَّع السكّ من الصنبور بواسطة مُدقِّق، لذا يحتاج إلى RPC لمُدقِّق: يعمل كما هو على
# السلسلة المحلية ذات المُدقِّقَين؛ أما العقدة المراقِبة فتجيب "ask a validator node". وعلى chain 21
# لا يسكّ الصنبور إلا إلى المحافظ الـ16 التي تدرجها قائمة genesis المسموحة، ولا يسكّ إلا من المُدقِّقين الذين يسمّيهم
rand faucet                                  # 100 RAND في ملاحظة لا يستطيع فتحها سواك
rand balance                                 # يمسح الشجرة بمفتاحك؛ ولا يستطيع أحد غيرك ذلك
rand send <rand1 address> 1.5              # يطلب التأكيد، ثم يُنشئ الإثبات (~2 min)، وينتظر الالتزام
المُصادِقون
26
النصاب
18 of 26
التكوين
ca76c2766ed6090ac6ba5dad86b724dd5d2b80c0edfaed287cd8b129e663ca9a
نفّذ استدعاءً سريًا
rand
# جمّع برنامج ضيف مدمجًا: ادفع الفائض عن 1000 إذا غطّته أربعة أرصدة خاصة
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json                  # يطبع معرّف البرنامج (تجزئة محتواه)

# أثبِت محليًا؛ لا يُرسل إلى السلسلة إلا الإثبات وثماني كلمات ناتجة ونص مدخلات مختوم
rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx>                            # المخرجات [1, 0, 25, 0, ...]: الفائض، منشورًا بوصفه بيانات

# لاحقًا، افتح النص وقارنه بقيمة H_IN التي نشرها الإثبات
rand open-call <tx>                          # المدخلات: [400, 250, 300, 75] — الحكم: faithful
ترى السلسلة معرّف البرنامج وفئة الغاز والكلمات الثماني الناتجة. ولا ترى الأرصدة أبدًا، ولأن الرسوم تُدفع بحزمة محمية فهي لا تعرف هوية المستدعي أيضًا؛ المخرجات بيانات، وأي دفعة هي حزمة ينشئها المستدعي. القياسات على Apple Silicon: الإثبات نحو 7 s عند الفئة 10، وحجم الإثبات نحو 1.2 MB بملف FRI ذي 80 استعلامًا، والتحقق نحو 16 ms بمفتاح مُتحقِّق دافئ، تحسبه العقدة مرة واحدة لكل فئة وتعيد استخدامه عبر البرامج.

المتطلبات

نظام التشغيل
Linux x86_64 أو macOS arm64
Rust
1.98.1، مثبّت بواسطة rust-toolchain.toml؛ ويثبّته rustup
اعتماديات البناء
مُصرِّف C++ وcmake وpkg-config وترويسات OpenSSL (لـ RocksDB)
البناء الأول
من 10 إلى 20 دقيقة: RocksDB وPlonky3 من المصدر
المنافذ
TCP 30303 وارد على العقد العامة؛ وRPC على 127.0.0.1:8545
الخادم
يكفي خادم سحابي بمعالج افتراضي إلى معالجين لتشغيل مُصادِق testnet
الساعة
NTP (chrony) على المُصادِق: فهو يمتنع عن التصويت على كتلة تتقدم ساعته بأكثر من 15 s، فتؤدي الساعة المتأخرة إلى توقف التصويت بصمت
الإثبات
على المعالج فقط حاليًا: يستغرق التحويل المحمي نحو دقيقتين على حاسوب محمول (إثبات تفويض مدته 7 s وإثبات حزمة نحو 110 s) ونحو 6 GB من الذاكرة؛ ويضيف الاستدعاء الصغير نحو 30 s

اختر دورًا

  • مراقب مفتوح للجميع

    الملف التنفيذي نفسه بلا --validator. يزامن السلسلة، ويتحقق من كل شهادة ومن كل إثبات حزمة واستدعاء، ويعيد تنفيذ كل كتلة، ويقارن الإيصالات، ويخدم JSON-RPC. هذا ما يشغّله أي مفتاح جديد على testnet العامة.

  • مُصادِق بحصة مربوطة

    يصوّت ويقترح وفق HotStuff المتسلسل. وفي chain 21، كما في chain 20، يُقبل المُدقِّق الجديد أولًا بالتصويت: يوقّع المُدقِّقون الذين يملكون أكثر من ثلثي الحصة إجراء AdmitValidator لمفتاحه. ثم يسجّل مفتاح العقدة (rand-node register --v2)، ويربط ما لا يقل عن 1,000 RAND من محفظة، ويدخل المجموعة عند الحدّ الثالث للحقبة البالغة 1,000 كتلة بعد الربط (تأخير الربط بحقبتين في chain 18). بدأت chain 18 بـ 26 مُدقِّقًا بواقع 1,000 RAND لكلٍّ منهم؛ ويجب أن يكون أكثر من ثلثي الحصة، أي 18 من 26، متصلًا ومصوّتًا لكي يُعتمد الإجراء. أنشئ مفتاحك الخاص: لم يعد أي مفتاح مُدقِّق محفوظًا في المستودع، وملفات المفاتيح المودعة للسلاسل السابقة بذور منشورة.

  • المحفظة والمُثبِت محلي

    يحتفظ عميل rand بمفتاح إنفاق من 256 بتًا ولا يوقّع شيئًا: يتمثل التفويض في إثباتين، أحدهما صغير يُنشأ بمفتاح الإنفاق، والآخر إثبات الحزمة بأربعة مدخلات وأربعة مخرجات. يفحص الشجرة بحثًا عن ملاحظاته، ويُثبِت الاثنين على جهازك، بالشكل نفسه لـ RAND ولأي رمز RPL، وفي الاستدعاء السري يُثبِت البرنامج أيضًا. لا يصل إلى السلسلة إلا الإثباتات والالتزامات وعلامات الإبطال (nullifiers) والأظرف المختومة.

لا تشغّل عقدة؟ تتوفر المحفظة نفسها تطبيقًا لأنظمة iOS وAndroid ومتصفحي Chrome وFirefox: المحافظ.

المصدر
randprotocol/fullnode
GPL-3.0-only · تشغّل testnet الإصدار v0.8.0، وهو الأحدث
تحقق

كل عقدة تتحقق من كل شيء

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

# العقدة متوقفة: التجزئات وQCs والتوقيعات والإثباتات وإعادة التنفيذ
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair

تُجرى اختبارات الأعطال على testnet الحية

  • ›أوقف واحدًا من أربعة مُصادِقين: تواصل السلسلة الالتزام، وتلحق العقدة بالركب في ثوانٍ عند عودتها.
  • ›أوقف اثنين من أربعة: تتوقف السلسلة لغياب النصاب، وتستأنف دون تفرّع عند عودتهما.
  • ›أفسد قاعدة بيانات عقدة: يُكتشف ذلك عند البدء، ثم تُقتطع وتُعاد مزامنتها من النظراء، وتتطابق بايتًا ببايت بعد ذلك.
  • ›تحويلات عبر عقد مختلفة: كلها التُزمت، والأرصدة متطابقة في كل مكان، والعرض لم يتغير.
  • ›يعيد منطق إعادة الاتصال إنشاء رابط نظير مفقود خلال نحو 30 ثانية.

لم يُنفَّذ بعد

مدرجة ليكون الفرق بين الورقة والعقدة مقروءًا لا مستنتجًا.

  • ›حالة دائمة لكل برنامج واستدعاءات بين البرامج
  • ›مُصرِّف داخل المحفظة نفسها: البرنامج إما guest مُجمَّع مدمج، أو صورة تُبنى بسلسلة الأدوات المنفصلة rand-guest
  • ›المعاقبة بالخصم (slashing) والحبس (jailing)، ومكافآت الكتل، وأسواق الرسوم، ومنارة اختيار القائد بالفرز العشوائي القائم على التجزئة
  • ›مُراكِم للمُبطِلات (nullifiers)، وتقليم البراهين بعد الحسم النهائي، وتجميع البراهين في دفعات
  • ›إثبات من المستوى 20 لتحويل SPL Token، وسوق مُثبِتي GPU الوارد في الورقة