استخدم هذه الصفحة لتعرف من يفعل ماذا حين تنتقل تحويلة عبر Rand. الإثبات مكلف والتحقق رخيص، ولذلك يُقسَّم العمل على هذا الأساس. جانب المرسل يُنشئ الإثباتات. أما المدقّقون (validators) فيتحققون منها فقط، ويرتّبونها ويصوّتون عليها. والمجمِّع (aggregator)، متى فُعِّل، يدمج إثباتات كثيرة في إثبات واحد. يتتبع الشكل تحويلة واحدة من المحفظة إلى كتلة نهائية، وتتناول الأقسام التي تليه كل دور على حدة.
مسار تحويلة واحدة
- تبني المحفظة التحويلة. تختار ملاحظات المدخلات، وتجلب شواهد Merkle الخاصة بها، وتبني أربعة مخرجات وتختم كلاً منها في مغلّف ML-KEM-768. ثم تحسب ربط المعاملة (binding)، وهو تجزئة لكل شيء ما عدا الإثباتات (المعاملات).
- تُثبت المحفظة التفويض بنفسها. هذا إثبات من المستوى 10 على مفتاح الإنفاق وملح جديد، ويستغرق بضع ثوانٍ. وهو الإثبات الوحيد الذي يمسّ مفتاح الإنفاق، ويُنشأ دائماً على جهاز المحفظة نفسه.
- يُنشأ إثبات الحزمة حيث تتوافر الذاكرة اللازمة. يُظهر هذا الإثبات من المستوى 14 الملكية والعضوية والمُبطِلات (nullifiers) والرصيد، وتبلغ ذروة استهلاكه نحو 6 GB. يُنشئه تطبيق سطح المكتب وهاتف بذاكرة نحو 8 GB بنفسيهما. أما الأجهزة الأصغر فتُسند المهمة إلى مُثبِت (prover) مقترن بها: مُثبِت تشغّله بنفسك، أو مجموعة المُثبِتين التابعة للمدقّقين على
prover.randprotocol.org. يُرسَل إلى أيٍّ منهما مفتاح العرض والملح، ولا يُرسَل مفتاح الإنفاق أبداً (الإثباتات). - تفحصه عقدة RPC. تعيد أي عقدة تُرسل إليها المحفظة حساب خلاصة الحزمة، وتتحقق من الإثباتين مقابل الربط، وتفحص الرسوم، ثم تبثّ المعاملة إلى أقرانها (الإثباتات، مجمع المعاملات).
- يرتّبها المدقّقون ويُنهونها. يأخذ قائد العرض (view) المعاملات التي لا تزال صالحة، بدءاً بأعلى رسم لكل KiB، ويقترح كتلة. ويعيد كل مدقّق التحقق من كل إثبات فيها ثم يصوّت. وتُثبَّت الكتلة حين تتسلسل ثلاث شهادات نصاب (quorum certificates) عليها في ثلاثة عروض متتالية، وهذا يستلزم اتصال 18 من مدقّقي السلسلة 20 البالغ عددهم 26 (الإجماع).
- تصبح الكتلة نهائية، ويستطيع الجميع التحقق منها. تكون المعاملة نهائية حين تعيد
rand_getTransactionكتلة. والعقدة التي تتزامن لاحقاً تعيد التحقق من كل شهادة وكل إثبات بدلاً من الوثوق بالتواقيع.
الأدوار
| الدور | ما يفعله | هل يُثبِت؟ | ما يراه | ما يشغّله |
|---|---|---|---|---|
| المحفظة | تبني التحويلات والاستدعاءات وتفوّض بها وتُرسلها؛ وتمسح السلسلة بمفاتيحها الخاصة | إثبات التفويض دائماً؛ وإثبات الحزمة حين يتوافر للجهاز ما يكفي من الذاكرة | كل شيء عن ملاحظاتها الخاصة | التطبيقات المذكورة في صفحة العملاء، أو rand؛ وعلى السلسلة 20، Rand Wallet أو rand بالإصدار v0.6.8 أو أحدث |
| مُثبِت مفوَّض | يُنشئ إثبات الحزمة لمحفظة مقترنة به؛ وتفحص المحفظة كل رد قبل إرسال أي شيء | إثباتات الحزمة فقط | مفتاح العرض للمحفظة المقترنة: سجلّها كاملاً، الماضي والمستقبل؛ ولا يستطيع الإنفاق | rand-prover run، أو rand-node run --prover |
| مجموعة مُثبِتي المدقّقين | مُثبِت مفوَّض تشغّله أربعة مضيفين، مدقّقان وجهازان لا يقومان إلا بالإثبات، خلف اسم واحد ومفتاح واحد، للمحافظ التي لا مُثبِت لها؛ بلا رسوم | إثباتات الحزمة فقط | ما يراه أي مُثبِت مفوَّض، لكل محفظة تقترن به | prover.randprotocol.org، البصمة RGTF-7HKJ-XZFV-GQ1J |
| عقدة RPC (مراقِب) | تتزامن، وتعيد التحقق من كل إثبات، وتخدم JSON-RPC، وتبثّ المعاملات التي تحققت منها؛ بلا تصويت | لا | الحقول العامة فقط: الالتزامات والمُبطِلات والمغلّفات المختومة والإثباتات | rand-node run |
| مدقّق | كل ما يفعله المراقِب، إضافة إلى الاقتراح في عروضه والتصويت في HotStuff | لا | الحقول العامة فقط | rand-node run --validator |
| مجمِّع | يُنشئ إثباتاً تعاودياً واحداً على نافذة من إثباتات الحزم النهائية ويرسله ليختمه بكتلة | نعم، وهي أكبر الإثباتات في الشبكة | الحقول والإثباتات العامة فقط | rand-node aggregate --watch، على سلسلة فيها قسم aggregation |
الإثبات والتدقيق عملان منفصلان، ولا يحتاج المدقّق إلى عتاد إثبات. اثنان من أعضاء المجموعة الأربعة مدقّقان يشغّلان مُثبِتاً أيضاً، كخدمة؛ والآخران جهازا إثبات مخصصان لا يحملان أي مفتاح تدقيق. وتشغيل المجموعة ليس جزءاً من التدقيق. أحجام كل دور، وذاكرة الإثبات المقيسة لكل مستوى، في عتاد المدقّق والمجمِّع.
ما يستطيع كل دور أن يعرفه
تتوقف خصوصية التحويلة على من يحمل أي مفتاح، لا على الثقة بالشبكة:
- المدقّقون وعقد RPC والمستكشف يرون ما تراه كل عقدة: الالتزامات والمُبطِلات والمغلّفات المختومة والرسوم والإثباتات. لا المبلغ ولا الأصل ولا المرسل ولا المستلم.
- المُثبِت المفوَّض، ومنه المجموعة، يُرسَل إليه مفتاح العرض. وبه يستطيع قراءة السجل الكامل للمحفظة المقترنة. ولا يستطيع الإنفاق أبداً، لأن إثبات التفويض على مفتاح الإنفاق يُنشأ على جهاز المحفظة. فاقتران المحفظة بالمجموعة يعني اختيار أن يطّلع مشغّلوها على ذلك السجل. وإن أردته خاصاً، فأنشئ الإثبات على جهازك أو شغّل مُثبِتك الخاص.
- لا يستطيع المُثبِت المفوَّض خداع المحفظة. تقرأ المحفظة الخلاصة من كل إثبات يُعطى لها، وتفحص الحجم وتتحقق منه محلياً، فلا يصل إثبات خاطئ إلى أي عقدة.
التجميع: مبنيّ وغير مفعَّل
اليوم تحمل كل كتلة كل إثبات خام، أي نحو 2.85 MB للتحويلة الواحدة، فتتسع كتلة حجمها 20 MiB لنحو سبع تحويلات. وتجميع الكتل هو جواب العقدة الكاملة (fullnode). يأخذ المجمِّع إثباتات الحزم لنافذة من الكتل النهائية (rand_getUnsealed)، ويُنشئ إثباتاً تعاودياً واحداً يتحقق منها جميعاً، ويرسله. والكتلة التي تتضمنه تختم النافذة. عندها يتحقق المدقّقون من تجميع واحد بدلاً من N إثباتاً، ويمكن للعقد أن تُسقط الإثباتات الخام التي غطّاها. والمجمِّعون مرتبطون بوديعة (bonded) وبلا إذن، ويعملون على أجهزة بمستوى وحدات GPU، ويُدفع لهم نصيب إثبات الحزم المغطاة إضافة إلى إعانة كتلة من RAND جديد.
إنه مبنيّ ومدموج، لكنه غير فعّال. فهو يحتاج إلى قسم aggregation في كتلة التكوين (genesis)، وليس في السلسلة 20 قسم كهذا، ولذلك تُبلغ rand_status عن كل عدّادات التجميع بصفر. وقبل تفعيله يجب إعادة قياس شكل حزمته تحت مجموعة القيود الحالية، وإجراء تمرين تجميع مزوَّر على مُتحقِّق التعاود. وعلى سلسلة ذات تفويض مجزّأ فإنه سيختم كذلك إثباتات الحزم فقط، لا إثباتات التفويض (الإثباتات).