Rand Protocol
الوثائق
الأدلة

الإثباتات

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

استخدم هذه الصفحة لتحديد حجم آلة الإثبات، ولفهم سبب استغراق التحويل أكثر من دقيقة ولماذا تحدّ مساحة الكتلة، لا القدرة الحاسوبية، من الإنتاجية، ولمعرفة ما ينكسر عند تغيّر نظام الإثبات. كل ما يقبله المُصادِق مدعوم بإثبات تحقّق منه بنفسه.

ما الذي يقرّره الإثبات

علاقة واحدة، لكل برنامج تشغّله السلسلة:

هذا البرنامج RV32IM، الذي بدأ عند base_pc، وعمل على متجه مدخلات خاصة يلتزم به H_IN وعلى مقطع مدخلات عامة يلتزم به H_PUB، توقف خلال 2ᵗ − 1 دورة، وأنفق على الأكثر GAS_LIMIT من الغاز ونشر كلمات المخرجات الثماني هذه.

يُعرَّف البرنامج بملخّصه داخل الدائرة hc؛ ولا يرى المُتحقِّق أي كلمة تعليمات. والتحويل المحمي هو هذه العلاقة مطبّقةً على برنامج الضيف للحزمة ذات الأصول المخفية، وهو برنامج مجمَّع يدويًا بأربعة مدخلات وأربعة مخرجات، يُثبَّت hc الخاص به في ملف التكوين الأول تحت اسم hc_bundle. تثبّت السلسلة 20 الإصدار v3 من الضيف (guests::bundle_hidden_v3، 60af094a…6e3fce، منذ السلسلة 17). وثبّتت السلسلتان 14 و15 الإصدار v1 (83d3a370…cd0ef8)، وثبّتت السلسلة 16 الإصدار v2 الخالي من الفروع (651043e2…839b). ومنذ السلسلة 17 تحمل كل حزمة إثباتًا ثانيًا، هو إثبات ضيف التفويض (guests::auth، hc_auth في ملف التكوين الأول، 1e4e347f…5639c1): يأخذ إثبات الحزمة مفتاح العرض، ويبيّن إثبات التفويض أن المرسل يملك مفتاح الإنفاق الذي يقف خلفه. هذا هو التفويض المنقسم، وهو ما يتيح لمُثبِت مقترن لا يملك إلا مفتاح عرض أن يُنتج إثبات الحزمة. وقد حلّ ضيف الأصول المخفية محل ضيف bundle ذي المدخلين والمخرجين في السلاسل حتى 13، وهو لا يبقى في العقدة الكاملة إلا للاختبارات ولا تثبّته أي سلسلة. والاستدعاء السري هو العلاقة نفسها مطبّقةً على برنامج منشور (Programs).

كيف تُثبت المحفظة حزمة

يُنجز rand send <rand1…> <amount> العمل الخاص محليًا، ولا يصل إلى السلسلة سوى الإثباتات والالتزامات والمبطِلات (nullifiers) والأظرف المختومة:

  1. امسح الشجرة بمفتاح العرض واختر المدخلات: على الأكثر مذكرتان من RAND تغطيان المبلغ مع الرسوم في الخانتين 2–3، وفي تحويل رمز أو حرقه على الأكثر مذكرتان من الرمز في الخانتين 0–1 على أن تغطي مذكرات RAND الرسوم وحدها. وخانة المدخل غير المستخدمة وهمية: مبلغها 0، وتملكها المحفظة، ويُقنَّع فشل إثبات انتمائها داخل الدائرة، ويبقى مبطِلها منشورًا. ومنذ الإصدار v2 من الضيف يخلو الضيف من الفروع: يُجزَّأ مسار الخانة الوهمية عبر المستويات الـ32 كلها كما لو كانت مذكرة حقيقية.
  2. اجلب مرساة الرأس (rand_getAnchor) وشاهد ميركل ذا المستويات الـ32 لكل مدخل حقيقي (rand_getWitness(index))، مع التحقق من الجذر المُعاد مقابل المرساة.
  3. ابنِ أربعة مخرجات: مذكرة المستلم ومذكرة الباقي في المجموعة التي تنقل القيمة، حاضرتين حتى عند الصفر، ومخرجات وهمية صفرية المبلغ في ما عداهما، مختومة بمفتاح مؤقت.
  4. اختم كل مخرج في ظرف (ML-KEM-768 إلى المستلم، مع مفتاح المعاملة ملفوفًا تحت ovk الخاص بالمحفظة)، وركّب المعاملة كاملةً مع إجرائها، وخذ ربطها (binding): blake3("rand-tx-bind-1" || …) على المعاملة بعد تفريغ الإثباتات، ثماني كلمات (Transactions). وفي السلسلة 20، التي يضبط ملف تكوينها الأول binding_domain: 1، يكون الربط blake3("rand-tx-bind-2" || …) مع تجزئة ملف التكوين الأول أولًا ثم معرّف السلسلة، فلا يصحّ إثبات صُنع لسلسلة على أي سلسلة أخرى، حتى لو شاركتها معرّف السلسلة. وتأخذ المحفظة الأقدم من v0.6.8 الربط القديم، وترفض السلسلة 20 إثباتاتها.
  5. فوِّض: اسحب ملحًا جديدًا من 256 بت وأثبت ضيف التفويض على مدخله الخاص ذي الكلمات الـ16، أي مفتاح الإنفاق والملح، مع الربط بوصفه مقطع المدخلات العامة، عند المستوى 10. يشتق nk من مفتاح الإنفاق وينشر c = H(AUTH, nk ‖ salt)، وهو ما تحمله الحزمة بوصفه auth_commit.
  6. أثبت ضيف الحزمة على مدخله الخاص ذي الكلمات الـ1,212 (مفتاح العرض nk، وخانات المدخلات الأربع بمساراتها، والمرساة، والمخرجات الأربعة، وfee، وburn_a، وburn_r، والأصل الخاص A، وtime، والملح) مع الربط نفسه بوصفه مقطع المدخلات العامة، عند المستوى 14. يبيّن الإثبات الملكية، والانتماء، وأن كل مدخل حقيقي يحمل أصل خانته، والمبطِلات الأربعة، وc نفسه، والميزانين in₀ + in₁ = out₀ + out₁ + burn_a وin₂ + in₃ = out₂ + out₃ + fee + burn_r. وهذا هو الإثبات الذي يستطيع مُثبِت مقترن صنعه بدل المحفظة؛ أما إثبات التفويض فيُصنع على جهاز المحفظة نفسه.
  7. تحقّق من أن الملخّص المنشور في الإثبات يطابق المحسوب من النص الصريح، ثم أرسل Transaction { chain_id, bundle, action: None }.

الترتيب مهم منذ السلسلة 14: فالأظرف والإجراء موجودان قبل الإثباتات، لأن الإثباتات تلتزم بهما. وفي الاستدعاء يُصنع إثبات الاستدعاء أولًا ويدخل هو أيضًا في الربط. وفي سلسلة hardening_v6 يُصنع إثبات الاستدعاء نفسه على ربط استدعاء للمعاملة مع تفريغ الإثباتين معًا (rand-call-bind-1 في السلاسل 16 إلى 19، وrand-call-bind-2 مع تجزئة ملف التكوين الأول في السلسلة 20)، وهو يغطي مبطِلات حزمة الرسوم، فلا يمكن نسخه تحت حزمة أخرى.

proving bundle (tier 14; about a minute on a laptop)…
proved in 98.3s: tier 14, 1423170 bytes
submitted transfer 4f2c…  1.5 RAND out, 98.499 RAND change, fee 0.001 RAND, anchored at height 192

النص المعروض هو صيغة مخرجات المحفظة من دليل العقدة الكاملة حتى السلسلة 14؛ وعدد البايتات المعروض هو لإثبات حزمة بملف الإنتاج التزمت به السلسلة 14. أما المحفظة منذ السلسلة 17، ومنها v0.6.8 على السلسلة 20، فتطبع سطرين قبل هذين، هما proving the spend authorisation on this machine (tier 10; seconds)… وauthorisation proved in …: tier 10, … bytes، وتصوغ سطر الحزمة هكذا: proving the bundle (tier 14; about a minute and a half on a laptop)….

الآلية نفسها تدفع ثمن كل إجراء، وبحزمة واحدة بالضبط دائمًا: النشر أو الاستدعاء أو تسجيل رمز أو سكّه يركب على تحويل ذاتي صفري القيمة من RAND، والسند (bond) على حزمة تحرق الحصة عبر burn_r، وحرق الرمز أو الحرق عبر الجسر على حزمة واحدة تحرق الأصل من الخانتين 0–1 (burn_a، burn_asset) وتدفع رسوم RAND من الخانتين 2–3. أما الأصل الذي ينقله التحويل فكلمة شاهد (witness) ولا يظهر في أي حقل عام.

كلفته

مُقاسةً على حاسوب التطوير المحمول (Apple Silicon، بناء release)، هذه هي الأرقام التي تسجّلها وثائق العقدة الكاملة نفسها:

guestwordscyclestierproveproof size (production, 80 queries)
ضيف الحزمة v3 (السلاسل 17 إلى 20)—4,024 دورة و273 تبديلة Poseidon2 من الهامش في ميزانية المستوى 1414≈ 100 ث، ذروة 5.7 GB؛ وقيس 102.5 إلى 134.0 ث على السلسلة 18 (2026-09-30)≈ 1.50 MB؛ وقيس 1,494,151 إلى 1,504,260 بايت على السلسلة 18 (2026-09-30)
ضيف التفويض (السلاسل 17 إلى 20)—25010≈ 7 ث؛ وقيس 6.6 إلى 19.9 ث على السلسلة 18 (2026-09-30)≈ 1.37 MB؛ وقيس 1,364,940 إلى 1,375,371 بايت على السلسلة 18 (2026-09-30)
حزمة الأصول المخفية v1، أربعة مدخلات وأربعة مخرجات (السلسلتان 14 و15)—دون ميزانية المستوى 14 مع نحو 2,071 دورة (13%) فائضة14≈ 98–100 ث، ذروة 5.7 GB≈ 1.43 MB؛ وقيس 1,422,116 و1,423,170 بايت على السلسلة 14
bundle، مدخلان ومخرجان (متقاعد؛ السلاسل حتى 13)3,811≈ 9,16014≈ 100 ث (94.6–97.9 ث منفردًا؛ 114 ث لكل منهما عند تشغيل اثنين معًا)وقيس 1,321,773 بايت على السلسلة 8
private_payment (استدعاء)صغيرة< 1,00010≈ 7 ث≈ 1.37 MB (fib عند المستوى 10: 1,367,688 بايت تحت مجموعة القيود 7؛ و1,298,729 تحت المجموعة 6)
استدعاء بلا جدول تجزئة (off-chain ledger، السلسلة 18)773—14114.8 ث1,498,589 بايت
استدعاء بجدول SHA-256 (proof of liabilities، السلسلة 18)994—14122.9 ث1,911,152 بايت
استدعاء بجدول Keccak (anonymous vote، السلسلة 18)——1229.2 ث3,346,865 بايت

التحقق هو كلفة الإجماع، تدفعها كل عقدة: نحو 16 ms مع مفتاح مُتحقِّق دافئ، ونحو 230 ms في المرة الأولى التي يُبنى فيها مفتاح لشكل معيّن. ولا يعتمد مفتاح المُتحقِّق على محتوى البرنامج، بل يُفهرَس بـ(tier, program_log_height, input_log_height, keccak_log_height, sha256_log_height, public_log_height)، فتبني العقدة مفتاحًا واحدًا لكل شكل وتعيد استخدامه؛ وفي البرنامج المنشور يُحسب المفتاح مرة واحدة في الخلفية وقت النشر (نحو 2 ث على حاسوب محمول، و7 ث على خادم بمعالجين افتراضيين). وكانت حزمة المدخلين والمخرجين في السلسلة 13 وما قبلها تعلن الشكل program 12, input 10, keccak 0, sha256 0, public 2, mem 16؛ أما إثبات حزمة السلسلة 14 فيعلن public 4، وهو ارتفاع كلمات الربط الثماني، ولا يحمل أيًّا من جدولَي التجزئة، ويُرفض قبل بناء أي مفتاح مُتحقِّق إذا أعلن مستوى آخر أو أيًّا من الجدولين أو ارتفاعًا عامًا آخر. ومنذ مجموعة القيود 7 يضم كل جدول معلن 2⁷ صفًا على الأقل، فيعلن إثبات حزمة السلسلة 20 public 7.

ينقل ما يقارب 2.87 MB من البراهين في معاملة التحويل على السلسلة 20: إثبات الحزمة وإثبات التفويض، ويضيف الاستدعاء إثباتًا ثالثًا فوقهما. ويجب أن يتسع كل إثبات لقيمة max_proof_bytes في الجينيسيس، وهي 4,194,304 (4 MiB) على السلسلة 20 كما على السلاسل من 17 إلى 19، بعد أن كانت 8 MiB على السلاسل من 13 إلى 16.

لا يتسع حارس (guest) الأصل المخفي للمستوى 14 إلا لأنه يقرأ مدخلاته الخاصة في حلقة ويدمج قراءات الأشقاء في فحص Merkle. أما لو كُتب بالأسلوب القديم المفكوك فتقع العلاقة نفسها في المستوى 16، بزمن نحو 400 s وذاكرة 21–22 GB، وهذا يستبعد المحافظ ذات 16 GB.

الإثبات مقيَّد بالمعالج، وتستخدم المحفظة اليوم واجهة CPU الخلفية على كل المنصات. وفي تشغيلات المستويات الكبيرة كان المُثبِت يعمل بخيط واحد: فقد عمل خادم droplet بـ 16 vCPU بنسبة 99% من نواة واحدة، وكانت الذاكرة لا الأنوية هي ما يحدد اكتمال الإثبات (ذاكرة الإثبات). يختار الخيار --cuda في الأوامر send وbond وcall وdeploy وbridge-mint وbridge-burn واجهة NVIDIA خلفية تتطلب بناءً بالخيار --features cuda. وقد عملت نواتها (kernels) لأول مرة على عتاد حقيقي، هو NVIDIA H100، في 2026-09-28 وطابقت المرجع على CPU. لكن لا يوجد PTX مودَع في نسخة circuits التي يضمّنها الإصدار، فيفشل البناء بالرسالة no PTX for the GPU kernels إلى أن تُترجَم النوى. ولم يُقَس أي إثبات إنتاجي على عقدة GPU ضمن الأسطول. وعدم الرجوع إلى CPU متعمَّد. كذلك لا يستطيع استدعاء CUDA ختم غلاف المدخلات، لأن الملح لا يغادر المُثبِت أبدًا. الذاكرة القصوى لإثبات حزمة أصل مخفي في المستوى 14 نحو 5.7 GB (Production FRI، CPU). أما فئات الذاكرة الأكبر فتخص إثباتات المفسِّر والإثباتات التراجعية أدناه (≥ 64 GB فأكثر).

كيف تتحقق العقدة

يجري القبول الفحوص الرخيصة أولًا (المعاملات)، ثم:

  • يعيد حساب ملخص الحزمة من النص الصريح المنشور (المرساة، أربعة مُبطِلات، أربعة التزامات، fee، burn_a، burn_r، burn_asset، time، auth_commit الخاص بالحزمة، وكلمة تلوّث ثابتة عند الصفر) ويشترط أن يساوي ما نشره الإثبات. فالإثبات الذي كسر شاهده العلاقة ينشر ملخصًا ملوَّثًا لا يطابق أي نص صريح. وبعض الفحوص بنيوية بدلًا من ذلك (إذ يورِّد الحارس بنفسه مُرسِل المخرج وأصله ووقته، فلا يستطيع المُثبِت اختيارها)، والأصل الخاص ليس في الملخص؛
  • يفكّ ترميز الإثبات ويفحص ارتفاعاته المعلنة مقابل المستوى (check_declared_heights)، فيكون حدّ السلسلة على شكل الإثبات هو حدّ المُتحقِّق. وقبل فحص أي توقيع أو إثبات، تجري على كل معاملة مقدَّمة أو متداولة بين العقد غربلة للإثبات القانوني (وتجري كذلك في التحقق من الكتل ضمن hardening_v6). ومنذ fullnode v0.6.8 (التدقيق v6، ZKV-4) تقيّد هذه الغربلة أولًا كل درجة معلنة بـ 25 بتًا (MAX_HONEST_DEGREE_BITS، أي سقف جدول الذاكرة زائد واحد)، فلم يعد ترويس بدرجة ضخمة يشغل العقدة بينما يُعاد اشتقاق جدول الطي النزيه له، وصار الذعر (panic) داخل الغربلة يرفض تلك المعاملة بدلًا من إيقاف العقدة؛
  • يحسب ربط المعاملة (binding) ويشغّل Machine::verify_public(hc_bundle, &binding, proof)، أي المُتحقِّق الدفعي مضافًا إليه فحص أن H_PUB هو ملخص تلك الكلمات الثماني. فالإثبات المنسوخ على معاملة بإجراء آخر أو غلاف آخر أو معرّف سلسلة آخر، أو، على السلسلة 20، على جينيسيس سلسلة أخرى، لا يتحقق (وحتى السلسلة 13 كان المقطع فارغًا ولم يكن شيء يربط الإثبات بمعاملته)؛
  • يتحقق من إثبات التفويض مقابل hc_auth والربط نفسه، ويشترط أن يساوي الـ c الذي ينشره قيمة auth_commit. وتُرفض الحزمة بلا إثبات تفويض (AuthMissing)، وكذلك التي يختلف c فيها (AuthMismatch)؛
  • يشترط أن يساوي GAS_LIMIT في إثبات الحزمة قيمة bundle_gas_limit في الجينيسيس، وهي 20,479، وأن يساوي في إثبات التفويض 1,279، وهما سقفا ترويس الحارسين (BundleGasLimit، AuthGasLimit)؛
  • وفي الاستدعاء، يجري الأمر نفسه مقابل code_hash المخزَّن للبرنامج، ويتبع الكلمات العامة للبرنامج ربطُ الاستدعاء بوصفه المقطع (ويلحق Invoke في RPL-2 انتقاله ككلمات سياق، البرامج)، ثم يفحص الرسم مقابل حد الغاز الذي يعلنه الإثبات وحجمه بالبايت (الرسوم).

تُتحقَّق المعاملة المقدَّمة عبر RPC أو المتداولة بين العقد على أحد أربعة عمال خلف طابور بعمق 64، خارج حلقة الإجماع، ولا تُنقل إلى الأقران إلا بعد أن تتحقق. وتحدّ دلو رموز (token bucket) لكل قرين ما يستطيع القرين إجبار العقدة على التحقق منه (دفعة 16، وتعبئة 4 في الثانية)، وتجيب ذاكرة تخزين مؤقت من 8,192 مدخلًا عن تكرار معاملة مرفوضة رفضًا دائمًا بلا كلفة. أما التحقق من الإثباتات داخل الكتلة المقترحة فيجري على حلقة الإجماع عند تطبيق الكتلة. والعقدة التي تتزامن تعيد التحقق من كل شهادة ومن كل إثبات في كل كتلة قبل قبولها، فلا شيء موثوق لمجرد أن نصاب (quorum) وقّع عليه.

المستويات

المستوىميزانية الدورات (2ᵗ − 1)صفوف cpuيستخدمه
101,0232¹⁰حارس التفويض؛ private_payment، fib
124,0952¹²
1416,3832¹⁴حارس حزمة الأصل المخفي (وحارس bundle المتقاعد)؛ أكبر استدعاء
1665,5352¹⁶إثبات استدعاء EVM في مجموعة الاختبارات؛ approve الخاص بـ ERC-20 المترجَم (استُدعي على السلسلة 13)
18262,1432¹⁸transfer وtransferFrom في ERC-20، مترجَمين أو مفسَّرين
201,048,5752²⁰SPL Token، مترجَمًا أو على حارس مفسِّر sBPF

منذ fullnode v0.5.6 (2026-09-25) يُرفض إثبات استدعاء فوق المستوى 14 (CallTierTooHigh) قبل بناء مفتاح المُتحقِّق، وتكون الكتلة التي تحمل واحدًا منها غير صالحة. ولا يجوز أن يحمل الاستدعاء أكثر من 128 تبديلة Keccak-f و128 ضغطة SHA-256. ما زالت المستويات من 16 إلى 20 تُثبِت، لكن خارج السلسلة فقط: فلا يمكن استدعاء أي من الصفوف التي فوقها على السلسلة 20، وترفض السلسلة 20 نشر برنامج أكبر من أن يتسع لأي استدعاء في المستوى 14، أي أكثر من 8,180 كلمة بلا مدخل عام (ProgramUncallable) (الميزانية).

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

مجموعات القيود والتفرعات الصلبة

مجموعة القيود هي المجموعة الدقيقة من الجداول والأعمدة والحافلات (buses) والقيم العامة ومعاملات FRI التي يفحصها المُتحقِّق. والإثبات المصنوع تحت مجموعة لا يتحقق تحت أخرى، في الاتجاهين، وتعيد إعادة التشغيل عند إقلاع العقدة التحقق من كل إثبات في سلسلتها، فالعقدة المبنية من مجموعة مختلفة تفشل عند أول إثبات وتبتر سلسلتها. ولهذا يُقطع كل تغيير في المجموعة بوصفه معرّف سلسلة جديدًا مع كل العقد على بناء واحد، ولهذا يُبلغ rand_status عن hc_bundle وhc_auth، وترفض العقدة التي يخالف بناؤها الجينيسيس أن تبدأ.

المجموعةالتاريخما تغيّر
22026-09-10خمسة إصلاحات للسلامة (soundness) بعد المراجعة الأولى
32026-09-11شريحة Poseidon2، وhc داخل الدائرة، وجدول البرنامج بوصفه شاهدًا، وذاكرة دون الكلمة، وRV32M، وإعادة ضبط FRI على 27 استعلامًا
42026-09-11التزام المدخلات المملَّح H_IN بجدول خاص به؛ ومحمِّل الملفات الثنائية المسطحة
52026-09-12جدول keccak الاختياري؛ وارتفاع الذاكرة المعلن في الإثبات؛ وإصلاحان حرجان من تدقيق المعرفة الصفرية؛ وعودة FRI إلى 80 استعلامًا؛ وMAX_PROOF_BYTES إلى 2 MiB
62026-09-14جدول public الإلزامي وH_PUB؛ وجدول sha256 الاختياري؛ وحارسا المفسِّر EVM وsBPF بوصفهما مكتبتين؛ و34 قيمة عامة. وهي ما شغّلته السلاسل من 12 إلى 15.
72026-09-28إعماء كل طرف LogUp عبر حافلة BLIND؛ وتحديد حد أدنى 2⁷ صفوف لكل جدول معلن؛ وفحوص نطاق 32 بتًا على كلمات المدخلات والكلمات العامة والملح؛ واستدعاء النظام POSEIDON2_LEN (7)؛ وتصفير JALR للبت 0 من هدفه واشتراطه funct3 = 0؛ ومفاتيح مُتحقِّق مملَّحة من key_derivation_v2. وهي ما شغّلته السلسلتان 16 و17.
82026-09-29عدّاد الغاز: العمود GAS في جدول cpu والقيمة العامة GAS_LIMIT؛ و35 قيمة عامة. وهي ما تشغّله السلاسل من 18 إلى 20.

لم تغيّر السلسلتان 14 و15 أي قيد. تحتفظ عقدة السلسلة 15 بثوابت جولات Poseidon2 الستة والثمانين جدولًا حرفيًا بدلًا من سحب مبذور (التدقيق ZKV-2)، وهي القيم نفسها، فلم يتحرك أي تجزئة أو ملخص أو إثبات. أما السلسلة 14: فحزمة الأصل المخفي حارس جديد (hc_bundle جديد)، ويستخدم ربط المعاملة المقطع العام الذي تربطه المجموعة 6 أصلًا داخل الدائرة. ومع ذلك فهي تفرّع صلب: فقد تغيّر صيغة الحزمة على السلك، والحارس المثبَّت، وكل معرّف معاملة، وترفض النسخة الجديدة معاملة من السلسلة 13 تحمل حزمة، وتنتج المحفظة المبنية قبل التفرع إثباتات بمقطع فارغ ترفضها السلسلة.

أُضيفت إلى السلاسل الثلاث اللاحقة تغييرات غيّرت كل منها معنى الإثبات. انتقلت السلسلة 16 (fullnode v0.6.1، 2026-09-28) إلى مجموعة القيود 7، وثبّتت دليل الحزمة الخالي من التفرعات v2، وفعّلت hardening_v6، بعد أن بيّنت مراجعة 2026-09-27 أن الجداول القصيرة وحدود LogUp غير المعمّاة تسرّب بيانات خاصة (كيف يعمل zkVM). وتغيّرت كل مفاتيح المتحقق. أما السلسلة 17 (v0.6.3، 2026-09-29) فأبقت مجموعة القيود 7 وأضافت التفويض المنفصل: دليل الحزمة v3، ودليل التفويض، وحقلين جديدين في تمثيل الحزمة على الشبكة، ونطاق معرّف المعاملة rand-txid-3. وانتقلت السلسلة 18 (v0.6.7-rc1، 2026-09-29) إلى مجموعة القيود 8 من أجل عدّاد الغاز، وتقلّ كلفتها المقيسة في حجم الإثبات عن 1%. والسلسلة 19 (2026-10-01) هي إعادة تكوين (re-genesis) للسلسلة 18 على بناء v0.6.7 نفسه، ولم تغيّر شيئًا في الإثباتات. أما السلسلة 20 (fullnode v0.6.8، 2026-10-01) فتُبقي مجموعة القيود 8 والأدلة ومفاتيح المتحقق نفسها، وتغيّر ما يرتبط به الإثبات: إذ تحمل روابط المعاملة والاستدعاء تجزئة التكوين (binding_domain: 1)، وهي مُدخل عام تحسبه المحفظة ودفتر الأستاذ، فلم تتغيّر أي دارة. ومع ذلك فهي انقسام صلب (hard fork)، لأن إثباتات محفظة v0.6.7 لا تُقبل عليها. ويرفض كل بناء السلاسل التي سبقته بحسب تجزئة التكوين.

ثمة ملاحظتا تدقيق مضمّنتان في الشيفرة وجديرتان بالمعرفة: القيمة العامة TIER يتحقق منها المتحقق مقابل ترويسة الإثبات وبتّات الدرجة (degree bits) للدفعة، لكن الدارة نفسها لا تقيّدها (تدقيق ZL1، وقد أُشير إليه للمجموعة التالية ولم يُصلَح، لأن إزالته تزيح تخطيط القيم العامة)؛ أما H_IN فهو التزام مرئي للدليل لا يقارنه المتحقق بقيمة يقدّمها المستدعي، وذلك بحكم التصميم.

قريبًا: تجميع الكتل

بنحو 1.43 MB لكل إثبات حزمة أصول مخفية على السلسلتين 14 و15، كانت الكتلة البالغة 4 MiB (وهي الافتراضية، وهي كتلة السلسلة 12) تتسع لتحويلين محميين (shielded)؛ وكانت تتسع لثلاثة عند حزمة 2-in-2-out البالغة نحو 1.3 MB. ورفعت السلاسل 13 و14 و15 سقف الكتلة إلى 20 MiB (max_block_bytes)، أي متسعًا لأربعة عشر. وتُبقي السلسلة 20 على 20 MiB، ويحمل التحويل فيها نحو 2.87 MB من الإثبات، فتتسع الكتلة لنحو سبعة. والعلاج الذي اختارته fullnode (2026-09-12) بدل التقليم (pruning) وبدل الكتلة الأكبر هو التجميع على مستوى الكتلة: إثبات تعاودي واحد لكل نافذة مختومة يتحقق من N من إثباتات الحزم، فيبقى التاريخ حاملًا للإثبات من طرفه إلى طرفه، بينما يمكن التخلص من الإثباتات الخام. وهو مبنيّ ومدموج لكنه غير مفعّل، ومنذ السلسلة 14 يجب إعادة قياسه قبل تفعيله: فقد قيس شكل الحزمة المقبول فيه مع المقطع العام الفارغ (public 2)، بينما تعلن الحزمة المرتبطة بالمعاملة public 4، ولذلك لا يطابقه أي إثبات حزمة جرى توليده على السلسلة 14. وقد غيّرت مجموعتا القيود 7 و8 الشكل مرة أخرى: فإثبات الحزمة يعلن الآن public 7 وينشر 35 قيمة، فتكون واجهة الإثبات المجمَّع 35 كلمة لكل إثبات. ويرفض بناء العقدة الإقلاع على أي تكوين (genesis) يحمل قسم aggregation، وقد قُطعت السلاسل 14 إلى 20 من دونه. ويُرفض كذلك تكوين ذو أسعار غاز ديناميكية، كتكوين السلسلة 20، إلى جانب قسم aggregation. ومنذ fullnode v0.5.8 يربط الإثبات المجمَّع أيضًا مجمِّعه (تدقيق AGG-2: يمتصّ البرنامج aggregate_binding(chain_id, aggregator, nonce))، ولذلك يجب قياس بصمة برنامج الشكل المقبول على بناء يحمل هذا التغيير. ولا يزال التفعيل ينتظر كذلك تمرينًا شاملًا لتزوير إثبات مجمَّع ضد متحقق التعاود المُصلَح، لم يُجرَ بعد، وقرارًا بشأن إثبات التفويض: فبرنامج التجميع يتحقق من إثباتات الحزم وحدها، ولذلك فإن ختم نافذة على سلسلة ذات تفويض منفصل يقلّص التحويل من نحو 2.87 MB إلى نحو 1.37 MB، لا إلى لا شيء.

ما بُني:

  • آلة ثانية أصلية في Goldilocks (آلة التعاود، randprotocol-rvm) يتحقق برنامج المتحقق فيها من إثبات RV32 في نحو 1.97 مليون صف عند المستوى 21 (2,044,506 تحت مجموعة القيود 7)، وبرنامج تجميع عام في N على نافذة من إثباتات الحزم؛
  • دوران: المدقّقون (validators) يبقون رخيصي الكلفة على المعالج ويتحققون من إثبات مجمَّع واحد لكل كتلة مختومة؛ والمجمِّعون (aggregators) (سجل مفتوح لكل من يشاء، مكفول بضمان، وله عنوان دفع محمي) يثبتون الإثباتات المجمَّعة على أجهزة بمستوى وحدات GPU، ويُدفع لهم نصيب الإثبات من الحزم المغطاة، إضافةً إلى إعانة كتلة من RAND جديد وفق جدول تنصيف؛
  • خمسة إجراءات (RegisterAggregator وUnbondAggregator وWithdrawAggregator وSlashAggregator وAggregate؛ ويبقى SlashAggregator في تمثيل الشبكة لكنه مرفوض، لأن الإثبات المجمَّع المعاد محاولته يعيد توقيع الـ nonce نفسه وليس ازدواجًا في التوقيع)، وقبول من تسع خطوات، وختم الحزم المغطاة وتقليمها إلى نحو 3 KB من الحقول العامة لكل منها، ومزامنة بالصيغة المختومة تكلّف العقدة الجديدة تحققًا تعاوديًا واحدًا لكل نافذة، وطرائق RPC التالية rand_getAggregate وrand_getAggregators وrand_getUnsealed وrand_getRawTransaction، والخدمة الخلفية rand-node aggregate --watch.

القياس على ملف FRI التجريبي: أُثبت تجميع واحد بـ N=1 في نحو 26 دقيقة على حاسوب محمول محمَّل (327,035 بايت)؛ وطبّقت عقدة جديدة دفعة مختومة من سبع كتل في أقل من ثانية بتحقق تعاودي واحد. وفئات الأجهزة كما حُدّدت أولًا: N=1 يحتاج ≥ 64 GB من ذاكرة المضيف، وN=2 ≥ 128 GB، وN=3 ≥ 160 GB؛ أما الإنتاج بـ N ≥ 2 فيعود إلى الواجهة الخلفية CUDA، التي تحتاج إلى عقدة GPU لا وجود لها بعد. وقيس على جهاز بذاكرة 256 GB تحت مجموعة القيود 7 (2026-09-28 و29) أن تجميع N=2 استهلك 133 GB، وN=3 استهلك 221 GB، وأن إثبات الخروج للإنتاج (برنامج المتحقق على إثبات داخلي واحد) تجاوز 256 GB. ولم يُعَد قياس شيء من ذلك تحت مجموعة القيود 8. وإلى أن يُفعَّل التجميع، لا يقوم أي إثبات مجمَّع مقام إثبات على السلسلة 20: فعقدتا الأرشيف فيها تحتفظان بكل إثبات خام، ويقلّم مدقّقوها التاريخ الأقدم من 24 ساعة.

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