لا يتفاعل المستخدمون والمطورون مع SMT مباشرةً؛ إذ يتم احتساب براهين الاستثناء وتقديمها تلقائيًا بواسطة خدمة operator-private-channel. هذه الصفحة مرجع تقني للمشغّلين وكل من يبني أدوات تشغيل.
يجري نقل برنامج الضمان من تصميم شجرة ميركل المتفرقة هذا إلى خريطة بت nonce على السلسلة (يُتتبع تطورها في المستودع الرئيسي). هذه الصفحة دقيقة وفق برنامج الضمان الحالي وستُراجَع بمجرد إتمام ذلك التغيير.
الغرض
تستخدم القنوات الخاصة شجرة ميركل المتفرقة (SMT) لضمان تسوية كل nonce سحب مرة واحدة فقط. عندما يستدعي المشغّل ReleaseFunds، يجب عليه تقديم برهانين: برهان استثناء يُثبت أن الـ nonce غير موجود بعد في الجذر الحالي، وبرهان إدراج يُثبت أن الـ nonce موجود في الجذر الجديد الذي يوفره المستدعي. لا يخزّن البرنامج الجذر الجديد إلا بعد اجتياز كلا الفحصين، مما يجعل أي محاولة مستقبلية لإعادة استخدام الـ nonce غير صالحة بصورة قابلة للإثبات.
معاملات الشجرة
- ارتفاع الشجرة:
16 - الحد الأقصى للأوراق:
65,536(2^16) - دالة التجزئة: SHA-256
- قيمة الورقة الفارغة:
[0u8; 32](32 بايت صفري) - قيمة الورقة غير الفارغة:
SHA256([1u8; 32])، مخزّنة كثابت باسمNON_EMPTY_LEAF_HASH
Root Hash (32 bytes)/ \Hash(L, R) Hash(L, R)/ \ / \Hash(L, R) Hash(L, R) Hash(L, R) Hash(L, R)/ \ / \ / \ / \... ... ... ... ... ... ... .../ \ / \ / \ / \ / \ / \ / \ / \Leaf0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...(nonces recorded as leaf positions using their value modulo 65536)
بنية الورقة
يشغل كل سحب ورقةً واحدة بالضبط. يتحدد موضع الورقة من خلال:
leaf_position = transaction_nonce % 65536
تُعدّ الورقة غير فارغة حين تساوي قيمتها NON_EMPTY_LEAF_HASH (أي SHA256([1u8; 32])). أما الورقة الفارغة فهي كلها أصفار.
الـ Nonce وموضع الورقة
الـ transaction_nonce في ReleaseFunds من النوع u64. موضعه في الشجرة هو nonce % 65536، وepoch المتوقع له هو nonce / 65536. يتحقق البرنامج على السلسلة من أن هذا الـ epoch المحسوب يساوي Instance.current_tree_index؛ وأي تعارض يُلقي استثناء InvalidTransactionNonceForCurrentTreeIndex.
تدوير الشجرة
Tree Index 0 (nonces 0-65,535) Tree Index 1 (nonces 65,536-131,071)┌────────────────────────────┐ ┌────────────────────────────┐│ Root: 0x8fe6... │ │ Root: 0x8fe6... (reset) ││ Nonces Used: 65,536/65,536 │ Rotate │ Nonces Used: 0/65,536 ││ Status: FULL │ ──────> │ Status: ACTIVE │└────────────────────────────┘ └────────────────────────────┘(Tree exhausted) (Fresh tree)
تمتلك شجرة SMT سعة ثابتة تبلغ 65,536 ورقة. تكتشف خدمة المشغّل الحاجة إلى التدوير بالتحقق مما إذا كان nonce % 65536 == 0 (للحالات التي يكون فيها nonce > 0)؛ إذ تُشير تلك الحدود إلى بداية epoch جديدة. عند تلك النقطة، تستدعي operator-private-channel دالة ResetSmtRoot قبل تقديم ReleaseFunds التالية:
- يُزاد
Instance.current_tree_indexبمقدار واحد - يُعاد ضبط جذر السحب إلى الشجرة الفارغة
- تُلغى صلاحية الـ Nonces الخاصة بـ epoch الشجرة السابقة
تتحقق خدمة المشغّل أيضًا من أن جذر شجرة SMT المحلي لديها يطابق Instance.withdrawal_transactions_root على السلسلة قبل كل استدعاء لـ ReleaseFunds؛ وأي تعارض يُؤدي إلى إيقاف تشغيل احترازي بدلًا من تقديم برهان قد يكون غير صالح.
يُتتبع تدوير الشجرة عبر Instance.current_tree_index: u64، المخزّن على السلسلة.
التحقق في ReleaseFunds
وسيط sibling_proofs في ReleaseFunds هو بالضبط [u8; 512]: 16 تجزئة أخ × 32 بايت لكل منها، بما يتوافق مع ارتفاع الشجرة البالغ 16.
تُنفّذ عملية التحقق على السلسلة فحصين منفصلين بالتسلسل:
verify_smt_exclusion_proofيُثبت أن ورقة الـ nonce فارغة حاليًا مقارنةً بـInstance.withdrawal_transactions_rootالحاليverify_smt_inclusion_proofيُثبت أن ورقة الـ nonce موجودة في وسيطnew_withdrawal_rootالذي يوفره المستدعي- فقط في حال اجتياز كلا الفحصين يقوم البرنامج بتخزين
new_withdrawal_rootبوصفهInstance.withdrawal_transactions_rootالجديد ثم يُطلق الرموز المميزة
يُلقي فشل أي من الفحصين استثناء InvalidSmtProof. تحديث الجذر في الخطوة 3 يكون ذريًا مع كل استدعاء لـ ReleaseFunds.
Is this page helpful?