شكر خاص ليوآف فايس، ودان فينلي، ومارتن كوبلمان، وفرق Arbitrum، وOptimism، وPolygon، وScroll، وSoulWallet على التعليقات والمراجعة.
في هذا المنشور حول التحولات الثلاثة ، أوضحت بعض الأسباب الرئيسية التي تجعل من المفيد البدء في التفكير بشكل صريح حول دعم L1 + عبر L2، وأمن المحفظة، والخصوصية كميزات أساسية ضرورية لمكدس النظام البيئي، بدلاً من بناء كل من هذه الأشياء كـ الإضافات التي يمكن تصميمها بشكل منفصل بواسطة محافظ فردية.
ستركز هذه المقالة بشكل مباشر أكثر على الجوانب الفنية لمشكلة فرعية محددة: كيفية تسهيل قراءة اللغة الأولى من اللغة الثانية، أو اللغة الثانية من اللغة الأولى، أو اللغة الثانية من لغة ثانية أخرى. يعد حل هذه المشكلة أمرًا بالغ الأهمية لتنفيذ بنية فصل الأصول/مخزن المفاتيح، ولكنه يحتوي أيضًا على حالات استخدام قيمة في مجالات أخرى، أبرزها تحسين المكالمات الموثوقة عبر L2، بما في ذلك حالات الاستخدام مثل نقل الأصول بين L1 وL2s.
بمجرد أن تصبح لغات L2 أكثر انتشارًا، سيكون لدى المستخدمين أصول عبر لغات L2 متعددة، وربما L1 أيضًا. بمجرد أن تصبح محافظ العقود الذكية (multisig أو التعافي الاجتماعي أو غير ذلك) سائدة، ستتغير المفاتيح اللازمة للوصول إلى بعض الحسابات بمرور الوقت، ولن يلزم أن تكون المفاتيح القديمة صالحة بعد الآن. بمجرد حدوث هذين الأمرين، سيحتاج المستخدم إلى طريقة لتغيير المفاتيح التي تتمتع بسلطة الوصول إلى العديد من الحسابات الموجودة في العديد من الأماكن المختلفة، دون إجراء عدد كبير للغاية من المعاملات.
على وجه الخصوص، نحتاج إلى طريقة للتعامل مع العناوين المغايرة للواقع: العناوين التي لم يتم "تسجيلها" بعد بأي شكل من الأشكال على السلسلة، ولكنها مع ذلك تحتاج إلى تلقي الأموال والاحتفاظ بها بشكل آمن. نحن جميعًا نعتمد على عناوين غير حقيقية: عندما تستخدم Ethereum لأول مرة، يمكنك إنشاء عنوان ETH يمكن لشخص ما استخدامه للدفع لك، دون "تسجيل" العنوان على السلسلة (الأمر الذي قد يتطلب دفع رسوم tx، وبالتالي يمتلك بالفعل بعض ETH).
مع EOAs ، تبدأ جميع العناوين كعناوين مضادة. مع محافظ العقود الذكية، لا تزال العناوين المضادة ممكنة، ويرجع الفضل في ذلك إلى حد كبير إلى CREATE2 ، والذي يسمح لك بالحصول على عنوان ETH لا يمكن ملؤه إلا من خلال عقد ذكي يحتوي على رمز يطابق تجزئة معينة.
خوارزمية حساب عنوان EIP-1014 (CREATE2) .
ومع ذلك، فإن محافظ العقود الذكية تقدم تحديًا جديدًا: إمكانية تغيير مفاتيح الوصول. يمكن أن يحتوي العنوان، وهو عبارة عن تجزئة للرمز initcode، على مفتاح التحقق الأولي للمحفظة فقط. سيتم تخزين مفتاح التحقق الحالي في مساحة تخزين المحفظة، لكن سجل التخزين هذا لا ينتشر بطريقة سحرية إلى L2s الأخرى.
إذا كان لدى المستخدم العديد من العناوين على العديد من L2s، بما في ذلك العناوين التي (لأنها غير حقيقية) لا يعرفها L2 الموجود عليها، فيبدو أن هناك طريقة واحدة فقط للسماح للمستخدمين بتغيير مفاتيحهم: الأصل / مخزن المفاتيح هندسة الانفصال. كل مستخدم لديه (1) "عقد تخزين المفاتيح" (على المستوى 1 أو على مستوى واحد محدد من المستوى 2)، والذي يخزن مفتاح التحقق لجميع المحافظ جنبًا إلى جنب مع قواعد تغيير المفتاح، و (2) "عقود المحفظة" على المستوى 1 والعديد من المحافظ. L2s، التي تقرأ السلسلة المتقاطعة للحصول على مفتاح التحقق.
هناك طريقتان لتنفيذ ذلك:
لإظهار التعقيد الكامل، سنستكشف الحالة الأكثر صعوبة: حيث يكون مخزن المفاتيح على مستوى L2 واحد، والمحفظة على مستوى L2 مختلف. إذا كان مخزن المفاتيح أو المحفظة على L1، فستكون هناك حاجة إلى نصف هذا التصميم فقط.
لنفترض أن مخزن المفاتيح موجود على Linea ، والمحفظة موجودة على Kakarot. الإثبات الكامل لمفاتيح المحفظة يتكون من:
هناك سؤالان أساسيان صعبان بشأن التنفيذ هنا:
هناك خمسة خيارات رئيسية:
فيما يتعلق بأعمال البنية التحتية المطلوبة والتكلفة بالنسبة للمستخدمين، أصنفهم تقريبًا على النحو التالي:
يشير "التجميع" إلى فكرة تجميع كل البراهين المقدمة من قبل المستخدمين داخل كل كتلة في دليل وصفي كبير يجمعهم جميعًا. هذا ممكن بالنسبة إلى SNARKs وKZG، ولكن ليس لفروع Merkle (يمكنك دمج فروع Merkle قليلاً ، ولكنه يوفر لك فقط السجل (txs لكل كتلة) / السجل (إجمالي عدد مخازن المفاتيح)، ربما 15-30٪ من الناحية العملية، لذلك ربما لا يستحق الأمر التكلفة).
يصبح التجميع يستحق العناء فقط عندما يكون لدى المخطط عدد كبير من المستخدمين، لذلك من الناحية الواقعية، من المقبول أن يترك تطبيق الإصدار 1 التجميع خارجًا، وينفذ ذلك للإصدار 2.
هذا بسيط: اتبع الرسم البياني في القسم السابق مباشرة. وبشكل أكثر دقة، فإن كل "دليل" (بافتراض حالة الصعوبة القصوى لإثبات L2 في L2 آخر) سيحتوي على:
لسوء الحظ، تعد إثباتات حالة Ethereum معقدة، ولكن توجد مكتبات للتحقق منها ، وإذا كنت تستخدم هذه المكتبات، فلن يكون تنفيذ هذه الآلية معقدًا للغاية.
المشكلة الأكبر هي التكلفة. تعد براهين Merkle طويلة، ولسوء الحظ فإن أشجار باتريشيا أطول بمقدار 3.9 مرة تقريبًا من اللازم (على وجه التحديد: يبلغ طول إثبات Merkle المثالي في شجرة تحتوي على كائنات N 32 log2(N) بايت، ولأن أشجار باتريشيا في Ethereum تحتوي على 16 ورقة لكل طفل، فإن البراهين لهذه الأشجار 32 15 log16(N) ~= 125 log2(N) بايت طويلة). في حالة بها ما يقرب من 250 مليون (~2²⁸) حساب ، هذا يجعل كل إثبات 125 * 28 = 3500 بايت، أو حوالي 56000 غاز، بالإضافة إلى تكاليف إضافية لفك التشفير والتحقق من التجزئة.
سينتهي الأمر بتكلفة اثنين من الأدلة معًا بحوالي 100.000 إلى 150.000 غاز (لا يشمل التحقق من التوقيع إذا تم استخدام ذلك لكل معاملة) - وهو أكثر بكثير من القاعدة الحالية البالغة 21.000 غاز لكل معاملة. لكن التفاوت يزداد سوءًا إذا تم التحقق من الدليل على L2. تعتبر العمليات الحسابية داخل L2 رخيصة، لأن العمليات الحسابية تتم خارج السلسلة وفي نظام بيئي به عقد أقل بكثير من L1. ومن ناحية أخرى، يجب نشر البيانات إلى L1. وبالتالي فإن المقارنة ليست 21000 غاز مقابل 150000 غاز؛ إنه 21000 لتر غاز مقابل 100000 لتر غاز.
يمكننا حساب ما يعنيه هذا من خلال النظر في المقارنات بين تكاليف الغاز L1 وتكاليف الغاز L2:
يعد L1 حاليًا أغلى بحوالي 15-25 مرة من L2 لعمليات الإرسال البسيطة، وأكثر تكلفة بمقدار 20-50 مرة لمقايضة الرمز المميز. تعتبر عمليات الإرسال البسيطة كثيفة البيانات نسبيًا، لكن المقايضات تكون أكثر ثقلًا من الناحية الحسابية. وبالتالي، تعتبر المقايضة معيارا أفضل للتكلفة التقريبية لحساب L1 مقابل حساب L2. مع أخذ كل هذا في الاعتبار، إذا افترضنا أن نسبة التكلفة 30x بين تكلفة حساب L1 وتكلفة حساب L2، يبدو أن هذا يعني ضمناً أن وضع دليل Merkle على L2 سيكلف ما يعادل ربما خمسين معاملة عادية.
بالطبع، يمكن أن يؤدي استخدام شجرة Merkle الثنائية إلى خفض التكاليف بمقدار 4 أضعاف تقريبًا، ولكن حتى مع ذلك، ستكون التكلفة في معظم الحالات مرتفعة للغاية - وإذا كنا على استعداد للتضحية بعدم التوافق مع النظام السداسي الحالي لـ Ethereum شجرة الولاية، ربما علينا أيضًا أن نبحث عن خيارات أفضل.
من الناحية النظرية، من السهل أيضًا فهم استخدام ZK-SNARK: ما عليك سوى استبدال أدلة Merkle في الرسم البياني أعلاه بـ ZK-SNARK تثبت وجود أدلة Merkle تلك. تبلغ تكلفة ZK-SNARK حوالي 400000 غاز للحساب، وحوالي 400 بايت (قارن: 21000 غاز و100 بايت للمعاملة الأساسية، يمكن تخفيضها في المستقبل إلى ~ 25 بايت بالضغط). ومن ثم، من منظور حسابي، تبلغ تكلفة ZK-SNARK 19 ضعف تكلفة المعاملة الأساسية اليوم، ومن منظور البيانات، تبلغ تكلفة ZK-SNARK 4 أضعاف تكلفة المعاملة الأساسية اليوم، و16 ضعف تكلفة المعاملة الأساسية في العالم. المستقبل.
تمثل هذه الأرقام تحسينًا هائلاً مقارنةً بإثباتات ميركل، لكنها لا تزال باهظة الثمن. هناك طريقتان لتحسين هذا: (1) براهين KZG ذات الأغراض الخاصة، أو (2) التجميع، على غرار تجميع ERC-4337 ولكن باستخدام رياضيات أكثر روعة. يمكننا أن ننظر في كليهما.
تحذير، هذا القسم رياضي أكثر بكثير من الأقسام الأخرى. وذلك لأننا نتجاوز الأدوات ذات الأغراض العامة ونبني شيئًا ذو أغراض خاصة ليكون أرخص، لذا علينا أن نذهب إلى "تحت الغطاء" أكثر بكثير. إذا كنت لا تحب الرياضيات العميقة، فانتقل مباشرة إلى القسم التالي.
أولاً، ملخص لكيفية عمل التزامات KZG:
بعض الخصائص الرئيسية التي من المهم فهمها هي:
ومن ثم، لدينا هيكل يمكننا من خلاله الاستمرار في إضافة القيم إلى نهاية القائمة المتزايدة باستمرار، على الرغم من وجود حد معين للحجم (من الناحية الواقعية، يمكن أن يكون مئات الملايين قابلاً للتطبيق). نستخدم بعد ذلك ذلك كبنية بيانات لدينا لإدارة (1) الالتزام بقائمة المفاتيح في كل لغة L2، المخزنة على ذلك المستوى الثاني والمنعكسة في اللغة الأولى، و(2) الالتزام بقائمة التزامات مفاتيح اللغة الثانية، المخزنة على Ethereum L1 وتعكس كل L2.
يمكن أن يصبح الحفاظ على تحديث الالتزامات جزءًا من منطق اللغة الثانية الأساسي، أو يمكن تنفيذه دون تغييرات بروتوكول اللغة الثانية الأساسي من خلال جسور الإيداع والسحب.
وبالتالي فإن الدليل الكامل يتطلب ما يلي:
من الممكن في الواقع دمج برهان KZG في دليل واحد، بحيث نحصل على حجم إجمالي يبلغ 100 بايت فقط.
لاحظ دقة واحدة: نظرًا لأن قائمة المفاتيح عبارة عن قائمة، وليست خريطة مفاتيح/قيمة مثل الحالة، فيجب على قائمة المفاتيح تعيين المواضع بشكل تسلسلي. سيحتوي عقد التزام المفتاح على سجل داخلي خاص به يقوم بتعيين كل مخزن مفاتيح إلى معرف، ولكل مفتاح سيتم تخزين التجزئة (المفتاح، عنوان مخزن المفاتيح) بدلاً من المفتاح فقط، للتواصل بشكل لا لبس فيه مع L2s الأخرى التي يتم تخزين المفاتيح فيها إدخال معين الحديث عنه.
الجانب الإيجابي لهذه التقنية هو أنها تؤدي أداءً جيدًا للغاية على المستوى الثاني. يبلغ حجم البيانات 100 بايت، وهي أقصر بحوالي 4 مرات من ZK-SNARK وأقصر بكثير من إثبات Merkle. تكلفة الحساب هي إلى حد كبير فحص اقتران مقاس واحد، أو حوالي 119000 غاز. في L1، البيانات أقل أهمية من الحساب، ولسوء الحظ فإن KZG أغلى إلى حد ما من إثباتات Merkle.
تتضمن أشجار Verkle بشكل أساسي تكديس التزامات KZG (أو التزامات IPA ، والتي يمكن أن تكون أكثر كفاءة وتستخدم تشفيرًا أبسط) فوق بعضها البعض: لتخزين قيمتين، يمكنك الالتزام KZG بقائمة مكونة من قيمتين²⁴، كل واحدة منها بحد ذاتها هو التزام KZG بقيم 2²⁴. يتم استخدام أشجار Verkle<a href="https://notes.ethereum.org/ @vbuterin /verkle_tree_eip">بقوة تم اعتبارها مناسبة لشجرة حالة Ethereum، نظرًا لأنه يمكن استخدام أشجار Verkle للاحتفاظ بخرائط القيمة الرئيسية وليس القوائم فقط (في الأساس، يمكنك إنشاء شجرة بحجم 2²⁵⁶ لكن ابدأها فارغة، ولا تملأ سوى أجزاء محددة من الشجرة بمجرد بحاجة لملئها).
كيف تبدو شجرة فيركلي. من الناحية العملية، يمكنك إعطاء كل عقدة عرضًا قدره 256 == 2⁸ للأشجار المستندة إلى IPA، أو 2²⁴ للأشجار المستندة إلى KZG.
البراهين في أشجار Verkle أطول إلى حد ما من KZG؛ قد يصل طولها إلى بضع مئات من البايتات. كما أنه من الصعب التحقق منها، خاصة إذا حاولت تجميع العديد من الأدلة في دليل واحد.
من الناحية الواقعية، ينبغي اعتبار أشجار Verkle مثل أشجار Merkle، ولكنها أكثر قابلية للحياة بدون SNARKing (بسبب انخفاض تكاليف البيانات)، وأرخص مع SNARKing (بسبب انخفاض تكاليف الإثبات).
أكبر ميزة لأشجار Verkle هي إمكانية تنسيق هياكل البيانات: يمكن استخدام بروفات Verkle مباشرة عبر حالة L1 أو L2، بدون هياكل متراكبة، وباستخدام نفس الآلية بالضبط لـ L1 وL2. بمجرد أن تصبح أجهزة الكمبيوتر الكمومية مشكلة، أو بمجرد إثبات أن فروع Merkle أصبحت فعالة بما فيه الكفاية، يمكن استبدال أشجار Verkle في مكانها بشجرة تجزئة ثنائية مع وظيفة تجزئة مناسبة لـ SNARK.
إذا أجرى مستخدمون N معاملات N (أو بشكل أكثر واقعية، N ERC-4337 UserOperations) التي تحتاج إلى إثبات مطالبات N عبر السلسلة، فيمكننا توفير الكثير من الطاقة من خلال تجميع تلك الأدلة: المنشئ الذي سيجمع تلك المعاملات في كتلة أو الحزمة التي تدخل في كتلة يمكنها إنشاء دليل واحد يثبت كل هذه الادعاءات في وقت واحد.
هذا يمكن أن يعني:
في جميع الحالات الثلاث، لن تكلف البراهين سوى بضع مئات الآلاف من الغاز لكل منها. سيحتاج المنشئ إلى إنشاء واحدة منها في كل L2 للمستخدمين في ذلك L2؛ ومن ثم، لكي يكون هذا مفيدًا في البناء، يحتاج المخطط ككل إلى استخدام كافٍ بحيث يكون هناك في كثير من الأحيان عدد قليل من المعاملات على الأقل داخل نفس الكتلة على لغات L2 رئيسية متعددة.
إذا تم استخدام ZK-SNARKs، فإن التكلفة الحدية الرئيسية هي ببساطة "منطق العمل" المتمثل في تمرير الأرقام بين العقود، لذلك ربما بضعة آلاف من غاز L2 لكل مستخدم. إذا تم استخدام البراهين المتعددة KZG، فسيحتاج المُثبت إلى إضافة 48 غازًا لكل L2 يحتوي على مفتاح تخزين المفاتيح والذي يتم استخدامه داخل تلك الكتلة، وبالتالي فإن التكلفة الحدية للمخطط لكل مستخدم ستضيف ~ 800 L1 غازًا آخر لكل L2 (وليس لكل المستخدم) في الأعلى. لكن هذه التكاليف أقل بكثير من تكاليف عدم التجميع، والتي تتضمن حتماً أكثر من 10000 غاز L1 ومئات الآلاف من غاز L2 لكل مستخدم. بالنسبة لأشجار Verkle، يمكنك إما استخدام Verkle multi-proofs مباشرة، مع إضافة حوالي 100-200 بايت لكل مستخدم، أو يمكنك إنشاء ZK-SNARK من Verkle multi-proof، والتي لها تكاليف مماثلة لـ ZK-SNARKs لفروع Merkle ولكن أرخص بكثير لإثباته.
من منظور التنفيذ، ربما يكون من الأفضل أن تقوم أدوات التجميع بتجميع البراهين عبر السلسلة من خلال معيار تجريد حساب ERC-4337 . لدى ERC-4337 بالفعل آلية للمنشئين لتجميع أجزاء من عمليات المستخدم بطرق مخصصة. يوجد أيضًا <a href="https://hackmd.io/@voltrevo/BJ0QBy3zi"> تنفيذ لهذا لتجميع التوقيع BLS، والذي يمكن أن يقلل تكاليف الغاز على L2 بمقدار 1.5x إلى 3x اعتمادًا على أشكال الضغط الأخرى يتم تضمينها.
رسم تخطيطي من <a href="https://hackmd.io/@voltrevo/BJ0QBy3zi"> منشور تنفيذ محفظة BLS يوضح سير عمل التوقيعات المجمعة لـ BLS ضمن إصدار سابق من ERC-4337. من المرجح أن يبدو سير العمل لتجميع البراهين عبر السلسلة متشابهًا جدًا.
الاحتمال الأخير، وهو واحد يمكن استخدامه فقط لقراءة L2 L1 (وليس قراءة L1 L2)، هو تعديل L2s للسماح لهم بإجراء استدعاءات ثابتة للعقود على L1 مباشرةً.
يمكن القيام بذلك باستخدام كود تشغيل أو ترجمة مسبقة، مما يسمح بالمكالمات إلى L1 حيث تقوم بتوفير عنوان الوجهة والغاز وبيانات الاتصال، وتقوم بإرجاع الإخراج، على الرغم من أن هذه الاستدعاءات هي مكالمات ثابتة، فلا يمكنها فعليًا تغيير أي حالة L1. يجب أن يكون L2s على دراية بالمستوى 1 بالفعل لمعالجة الودائع، لذلك لا يوجد شيء أساسي يمنع تنفيذ مثل هذا الشيء؛ إنه في الأساس تحدي تنفيذ تقني (راجع: طلب تقديم العروض هذا من Optimism لدعم الاستدعاءات الثابتة إلى L1).
لاحظ أنه إذا كان مخزن المفاتيح موجودًا على L1، وكانت L2s تدمج وظيفة الاتصال الثابت L1، فلن تكون هناك حاجة إلى أي إثباتات على الإطلاق! ومع ذلك، إذا لم تدمج L2s مكالمات L1 الثابتة، أو إذا كان مخزن المفاتيح موجودًا على L2 (وهو ما قد يجب أن يكون كذلك في النهاية، بمجرد أن يصبح L1 مكلفًا للغاية بحيث لا يتمكن المستخدمون من استخدامه ولو قليلاً)، فستكون البراهين مطلوبة.
تتطلب كافة المخططات المذكورة أعلاه أن يتمكن L2 من الوصول إما إلى جذر حالة L1 الأخير، أو إلى حالة L1 الأخيرة بأكملها. لحسن الحظ، تتمتع جميع مستويات L2 ببعض الوظائف للوصول إلى حالة L1 الأخيرة بالفعل. وذلك لأنهم بحاجة إلى مثل هذه الوظيفة لمعالجة الرسائل الواردة من L1 إلى L2، وأبرزها الودائع.
وبالفعل، إذا كان L2 يحتوي على ميزة إيداع، فيمكنك استخدام L2 كما هو لنقل جذور حالة L1 إلى عقد على L2: ما عليك سوى الحصول على عقد على L1 واستدعاء كود التشغيل BLOCKHASH، وتمريره إلى L2 باعتباره رسالة الإيداع. يمكن استلام رأس الكتلة بالكامل واستخراج جذر حالتها على الجانب L2. ومع ذلك، سيكون من الأفضل بكثير أن يكون لكل لغة L2 طريقة واضحة للوصول إلى حالة L1 الحديثة الكاملة، أو جذور حالة L1 الحديثة، مباشرةً.
يتمثل التحدي الرئيسي في تحسين كيفية تلقي L2s لجذور حالة L1 الحديثة في تحقيق الأمان وزمن الوصول المنخفض في نفس الوقت:
بالإضافة إلى ذلك، في الاتجاه المعاكس (قراءة L1 L2):
بعض هذه السرعات للعمليات عبر السلاسل غير الموثوقة تكون بطيئة بشكل غير مقبول في العديد من حالات استخدام التحدي؛ وفي هذه الحالات، أنت بحاجة إلى جسور أسرع مع نماذج أمنية غير كاملة. ومع ذلك، بالنسبة لحالة استخدام تحديث مفاتيح المحفظة، فإن التأخيرات الأطول تكون أكثر قبولًا: فأنت لا تؤخر المعاملات بالساعات، بل تؤخر تغييرات المفاتيح. سيكون عليك فقط الاحتفاظ بالمفاتيح القديمة لفترة أطول. إذا كنت تقوم بتغيير المفاتيح بسبب سرقة المفاتيح، فستكون لديك فترة كبيرة من الضعف، ولكن يمكن تخفيف ذلك، على سبيل المثال. عن طريق المحافظ التي لها وظيفة التجميد.
في النهاية، أفضل حل لتقليل زمن الوصول هو أن تقوم L2s بتنفيذ القراءة المباشرة لجذور حالة L1 بالطريقة المثلى، حيث تحتوي كل كتلة L2 (أو سجل حساب جذر الحالة) على مؤشر إلى أحدث كتلة L1، لذلك إذا عادت L1 ، يمكن أن يعود L2 أيضًا. يجب وضع عقود Keystore إما على الشبكة الرئيسية، أو على L2s التي تمثل ZK-rollups وبالتالي يمكنها الالتزام بسرعة بالـ L1.
يمكن أن تحتوي كتل سلسلة L2 على تبعيات ليس فقط على كتل L2 السابقة، ولكن أيضًا على كتلة L1. إذا عاد L1 إلى ما بعد هذا الرابط، فسيعود L2 أيضًا. تجدر الإشارة إلى أن هذه هي الطريقة التي تم بها تصور إصدار سابق (ما قبل Dank) من التقسيم للعمل؛ انظر هنا للحصول على التعليمات البرمجية.
والمثير للدهشة، ليس كثيرا. في الواقع، لا تحتاج حتى إلى أن تكون مجموعة تراكمية: إذا كانت L3، أو validium، فلا بأس بالاحتفاظ بالمحافظ هناك، طالما أنك تحتفظ بملفات تخزين المفاتيح إما على L1 أو على مجموعة ZK. الشيء الذي تحتاجه هو أن تتمتع السلسلة بإمكانية الوصول المباشر إلى جذور حالة Ethereum، والتزام فني واجتماعي لتكون على استعداد لإعادة التنظيم في حالة إعادة تنظيم Ethereum، والشوكة الصلبة في حالة حدوث شوكة صلبة لـ Ethereum.
إحدى مشكلات البحث المثيرة للاهتمام هي تحديد إلى أي مدى يمكن أن يكون للسلسلة هذا النوع من الاتصال بسلاسل أخرى متعددة (على سبيل المثال. إيثريوم وزي كاش). من الممكن القيام بذلك بسذاجة: يمكن أن توافق سلسلتك على إعادة التنظيم في حالة إعادة تنظيم Ethereum أو Zcash (والشوكة الصلبة في حالة الانقسام الصلب لـ Ethereum أو Zcash)، ولكن بعد ذلك يكون لدى مشغلي العقد ومجتمعك بشكل عام ضعف التبعيات الفنية والسياسية. ومن ثم يمكن استخدام مثل هذه التقنية للاتصال ببعض السلاسل الأخرى، ولكن بتكلفة متزايدة. تتمتع المخططات القائمة على جسور ZK بخصائص تقنية جذابة، ولكنها تعاني من نقطة ضعف رئيسية تتمثل في أنها ليست قوية في مواجهة الهجمات بنسبة 51% أو الهارد فورك. قد تكون هناك حلول أكثر ذكاءً.
ومن الناحية المثالية، نريد أيضًا الحفاظ على الخصوصية. إذا كان لديك العديد من المحافظ التي تتم إدارتها بواسطة نفس مخزن المفاتيح، فنحن نريد التأكد مما يلي:
وهذا يخلق بعض القضايا:
مع SNARKs، تكون الحلول سهلة من الناحية المفاهيمية: البراهين تقوم بإخفاء المعلومات بشكل افتراضي، ويحتاج المجمع إلى إنتاج SNARK متكرر لإثبات SNARKs.
التحدي الرئيسي لهذا النهج اليوم هو أن التجميع يتطلب من المجمّع إنشاء SNARK متكرر، وهو بطيء جدًا حاليًا.
مع KZG، يمكننا استخدام<a href="https://notes.ethereum.org/ @vbuterin /non_index_revealing_proof">هذا العمل على براهين KZG غير الكاشفة للمؤشر (انظر أيضًا: نسخة أكثر رسمية من هذا العمل في ورقة Caulk ) كنقطة بداية. ومع ذلك، فإن تجميع البراهين العمياء يمثل مشكلة مفتوحة تتطلب المزيد من الاهتمام.
لسوء الحظ، فإن قراءة L1 مباشرة من داخل L2 لا تحافظ على الخصوصية، على الرغم من أن تنفيذ وظيفة القراءة المباشرة لا يزال مفيدًا للغاية، سواء لتقليل زمن الوصول أو بسبب فائدته للتطبيقات الأخرى.
شكر خاص ليوآف فايس، ودان فينلي، ومارتن كوبلمان، وفرق Arbitrum، وOptimism، وPolygon، وScroll، وSoulWallet على التعليقات والمراجعة.
في هذا المنشور حول التحولات الثلاثة ، أوضحت بعض الأسباب الرئيسية التي تجعل من المفيد البدء في التفكير بشكل صريح حول دعم L1 + عبر L2، وأمن المحفظة، والخصوصية كميزات أساسية ضرورية لمكدس النظام البيئي، بدلاً من بناء كل من هذه الأشياء كـ الإضافات التي يمكن تصميمها بشكل منفصل بواسطة محافظ فردية.
ستركز هذه المقالة بشكل مباشر أكثر على الجوانب الفنية لمشكلة فرعية محددة: كيفية تسهيل قراءة اللغة الأولى من اللغة الثانية، أو اللغة الثانية من اللغة الأولى، أو اللغة الثانية من لغة ثانية أخرى. يعد حل هذه المشكلة أمرًا بالغ الأهمية لتنفيذ بنية فصل الأصول/مخزن المفاتيح، ولكنه يحتوي أيضًا على حالات استخدام قيمة في مجالات أخرى، أبرزها تحسين المكالمات الموثوقة عبر L2، بما في ذلك حالات الاستخدام مثل نقل الأصول بين L1 وL2s.
بمجرد أن تصبح لغات L2 أكثر انتشارًا، سيكون لدى المستخدمين أصول عبر لغات L2 متعددة، وربما L1 أيضًا. بمجرد أن تصبح محافظ العقود الذكية (multisig أو التعافي الاجتماعي أو غير ذلك) سائدة، ستتغير المفاتيح اللازمة للوصول إلى بعض الحسابات بمرور الوقت، ولن يلزم أن تكون المفاتيح القديمة صالحة بعد الآن. بمجرد حدوث هذين الأمرين، سيحتاج المستخدم إلى طريقة لتغيير المفاتيح التي تتمتع بسلطة الوصول إلى العديد من الحسابات الموجودة في العديد من الأماكن المختلفة، دون إجراء عدد كبير للغاية من المعاملات.
على وجه الخصوص، نحتاج إلى طريقة للتعامل مع العناوين المغايرة للواقع: العناوين التي لم يتم "تسجيلها" بعد بأي شكل من الأشكال على السلسلة، ولكنها مع ذلك تحتاج إلى تلقي الأموال والاحتفاظ بها بشكل آمن. نحن جميعًا نعتمد على عناوين غير حقيقية: عندما تستخدم Ethereum لأول مرة، يمكنك إنشاء عنوان ETH يمكن لشخص ما استخدامه للدفع لك، دون "تسجيل" العنوان على السلسلة (الأمر الذي قد يتطلب دفع رسوم tx، وبالتالي يمتلك بالفعل بعض ETH).
مع EOAs ، تبدأ جميع العناوين كعناوين مضادة. مع محافظ العقود الذكية، لا تزال العناوين المضادة ممكنة، ويرجع الفضل في ذلك إلى حد كبير إلى CREATE2 ، والذي يسمح لك بالحصول على عنوان ETH لا يمكن ملؤه إلا من خلال عقد ذكي يحتوي على رمز يطابق تجزئة معينة.
خوارزمية حساب عنوان EIP-1014 (CREATE2) .
ومع ذلك، فإن محافظ العقود الذكية تقدم تحديًا جديدًا: إمكانية تغيير مفاتيح الوصول. يمكن أن يحتوي العنوان، وهو عبارة عن تجزئة للرمز initcode، على مفتاح التحقق الأولي للمحفظة فقط. سيتم تخزين مفتاح التحقق الحالي في مساحة تخزين المحفظة، لكن سجل التخزين هذا لا ينتشر بطريقة سحرية إلى L2s الأخرى.
إذا كان لدى المستخدم العديد من العناوين على العديد من L2s، بما في ذلك العناوين التي (لأنها غير حقيقية) لا يعرفها L2 الموجود عليها، فيبدو أن هناك طريقة واحدة فقط للسماح للمستخدمين بتغيير مفاتيحهم: الأصل / مخزن المفاتيح هندسة الانفصال. كل مستخدم لديه (1) "عقد تخزين المفاتيح" (على المستوى 1 أو على مستوى واحد محدد من المستوى 2)، والذي يخزن مفتاح التحقق لجميع المحافظ جنبًا إلى جنب مع قواعد تغيير المفتاح، و (2) "عقود المحفظة" على المستوى 1 والعديد من المحافظ. L2s، التي تقرأ السلسلة المتقاطعة للحصول على مفتاح التحقق.
هناك طريقتان لتنفيذ ذلك:
لإظهار التعقيد الكامل، سنستكشف الحالة الأكثر صعوبة: حيث يكون مخزن المفاتيح على مستوى L2 واحد، والمحفظة على مستوى L2 مختلف. إذا كان مخزن المفاتيح أو المحفظة على L1، فستكون هناك حاجة إلى نصف هذا التصميم فقط.
لنفترض أن مخزن المفاتيح موجود على Linea ، والمحفظة موجودة على Kakarot. الإثبات الكامل لمفاتيح المحفظة يتكون من:
هناك سؤالان أساسيان صعبان بشأن التنفيذ هنا:
هناك خمسة خيارات رئيسية:
فيما يتعلق بأعمال البنية التحتية المطلوبة والتكلفة بالنسبة للمستخدمين، أصنفهم تقريبًا على النحو التالي:
يشير "التجميع" إلى فكرة تجميع كل البراهين المقدمة من قبل المستخدمين داخل كل كتلة في دليل وصفي كبير يجمعهم جميعًا. هذا ممكن بالنسبة إلى SNARKs وKZG، ولكن ليس لفروع Merkle (يمكنك دمج فروع Merkle قليلاً ، ولكنه يوفر لك فقط السجل (txs لكل كتلة) / السجل (إجمالي عدد مخازن المفاتيح)، ربما 15-30٪ من الناحية العملية، لذلك ربما لا يستحق الأمر التكلفة).
يصبح التجميع يستحق العناء فقط عندما يكون لدى المخطط عدد كبير من المستخدمين، لذلك من الناحية الواقعية، من المقبول أن يترك تطبيق الإصدار 1 التجميع خارجًا، وينفذ ذلك للإصدار 2.
هذا بسيط: اتبع الرسم البياني في القسم السابق مباشرة. وبشكل أكثر دقة، فإن كل "دليل" (بافتراض حالة الصعوبة القصوى لإثبات L2 في L2 آخر) سيحتوي على:
لسوء الحظ، تعد إثباتات حالة Ethereum معقدة، ولكن توجد مكتبات للتحقق منها ، وإذا كنت تستخدم هذه المكتبات، فلن يكون تنفيذ هذه الآلية معقدًا للغاية.
المشكلة الأكبر هي التكلفة. تعد براهين Merkle طويلة، ولسوء الحظ فإن أشجار باتريشيا أطول بمقدار 3.9 مرة تقريبًا من اللازم (على وجه التحديد: يبلغ طول إثبات Merkle المثالي في شجرة تحتوي على كائنات N 32 log2(N) بايت، ولأن أشجار باتريشيا في Ethereum تحتوي على 16 ورقة لكل طفل، فإن البراهين لهذه الأشجار 32 15 log16(N) ~= 125 log2(N) بايت طويلة). في حالة بها ما يقرب من 250 مليون (~2²⁸) حساب ، هذا يجعل كل إثبات 125 * 28 = 3500 بايت، أو حوالي 56000 غاز، بالإضافة إلى تكاليف إضافية لفك التشفير والتحقق من التجزئة.
سينتهي الأمر بتكلفة اثنين من الأدلة معًا بحوالي 100.000 إلى 150.000 غاز (لا يشمل التحقق من التوقيع إذا تم استخدام ذلك لكل معاملة) - وهو أكثر بكثير من القاعدة الحالية البالغة 21.000 غاز لكل معاملة. لكن التفاوت يزداد سوءًا إذا تم التحقق من الدليل على L2. تعتبر العمليات الحسابية داخل L2 رخيصة، لأن العمليات الحسابية تتم خارج السلسلة وفي نظام بيئي به عقد أقل بكثير من L1. ومن ناحية أخرى، يجب نشر البيانات إلى L1. وبالتالي فإن المقارنة ليست 21000 غاز مقابل 150000 غاز؛ إنه 21000 لتر غاز مقابل 100000 لتر غاز.
يمكننا حساب ما يعنيه هذا من خلال النظر في المقارنات بين تكاليف الغاز L1 وتكاليف الغاز L2:
يعد L1 حاليًا أغلى بحوالي 15-25 مرة من L2 لعمليات الإرسال البسيطة، وأكثر تكلفة بمقدار 20-50 مرة لمقايضة الرمز المميز. تعتبر عمليات الإرسال البسيطة كثيفة البيانات نسبيًا، لكن المقايضات تكون أكثر ثقلًا من الناحية الحسابية. وبالتالي، تعتبر المقايضة معيارا أفضل للتكلفة التقريبية لحساب L1 مقابل حساب L2. مع أخذ كل هذا في الاعتبار، إذا افترضنا أن نسبة التكلفة 30x بين تكلفة حساب L1 وتكلفة حساب L2، يبدو أن هذا يعني ضمناً أن وضع دليل Merkle على L2 سيكلف ما يعادل ربما خمسين معاملة عادية.
بالطبع، يمكن أن يؤدي استخدام شجرة Merkle الثنائية إلى خفض التكاليف بمقدار 4 أضعاف تقريبًا، ولكن حتى مع ذلك، ستكون التكلفة في معظم الحالات مرتفعة للغاية - وإذا كنا على استعداد للتضحية بعدم التوافق مع النظام السداسي الحالي لـ Ethereum شجرة الولاية، ربما علينا أيضًا أن نبحث عن خيارات أفضل.
من الناحية النظرية، من السهل أيضًا فهم استخدام ZK-SNARK: ما عليك سوى استبدال أدلة Merkle في الرسم البياني أعلاه بـ ZK-SNARK تثبت وجود أدلة Merkle تلك. تبلغ تكلفة ZK-SNARK حوالي 400000 غاز للحساب، وحوالي 400 بايت (قارن: 21000 غاز و100 بايت للمعاملة الأساسية، يمكن تخفيضها في المستقبل إلى ~ 25 بايت بالضغط). ومن ثم، من منظور حسابي، تبلغ تكلفة ZK-SNARK 19 ضعف تكلفة المعاملة الأساسية اليوم، ومن منظور البيانات، تبلغ تكلفة ZK-SNARK 4 أضعاف تكلفة المعاملة الأساسية اليوم، و16 ضعف تكلفة المعاملة الأساسية في العالم. المستقبل.
تمثل هذه الأرقام تحسينًا هائلاً مقارنةً بإثباتات ميركل، لكنها لا تزال باهظة الثمن. هناك طريقتان لتحسين هذا: (1) براهين KZG ذات الأغراض الخاصة، أو (2) التجميع، على غرار تجميع ERC-4337 ولكن باستخدام رياضيات أكثر روعة. يمكننا أن ننظر في كليهما.
تحذير، هذا القسم رياضي أكثر بكثير من الأقسام الأخرى. وذلك لأننا نتجاوز الأدوات ذات الأغراض العامة ونبني شيئًا ذو أغراض خاصة ليكون أرخص، لذا علينا أن نذهب إلى "تحت الغطاء" أكثر بكثير. إذا كنت لا تحب الرياضيات العميقة، فانتقل مباشرة إلى القسم التالي.
أولاً، ملخص لكيفية عمل التزامات KZG:
بعض الخصائص الرئيسية التي من المهم فهمها هي:
ومن ثم، لدينا هيكل يمكننا من خلاله الاستمرار في إضافة القيم إلى نهاية القائمة المتزايدة باستمرار، على الرغم من وجود حد معين للحجم (من الناحية الواقعية، يمكن أن يكون مئات الملايين قابلاً للتطبيق). نستخدم بعد ذلك ذلك كبنية بيانات لدينا لإدارة (1) الالتزام بقائمة المفاتيح في كل لغة L2، المخزنة على ذلك المستوى الثاني والمنعكسة في اللغة الأولى، و(2) الالتزام بقائمة التزامات مفاتيح اللغة الثانية، المخزنة على Ethereum L1 وتعكس كل L2.
يمكن أن يصبح الحفاظ على تحديث الالتزامات جزءًا من منطق اللغة الثانية الأساسي، أو يمكن تنفيذه دون تغييرات بروتوكول اللغة الثانية الأساسي من خلال جسور الإيداع والسحب.
وبالتالي فإن الدليل الكامل يتطلب ما يلي:
من الممكن في الواقع دمج برهان KZG في دليل واحد، بحيث نحصل على حجم إجمالي يبلغ 100 بايت فقط.
لاحظ دقة واحدة: نظرًا لأن قائمة المفاتيح عبارة عن قائمة، وليست خريطة مفاتيح/قيمة مثل الحالة، فيجب على قائمة المفاتيح تعيين المواضع بشكل تسلسلي. سيحتوي عقد التزام المفتاح على سجل داخلي خاص به يقوم بتعيين كل مخزن مفاتيح إلى معرف، ولكل مفتاح سيتم تخزين التجزئة (المفتاح، عنوان مخزن المفاتيح) بدلاً من المفتاح فقط، للتواصل بشكل لا لبس فيه مع L2s الأخرى التي يتم تخزين المفاتيح فيها إدخال معين الحديث عنه.
الجانب الإيجابي لهذه التقنية هو أنها تؤدي أداءً جيدًا للغاية على المستوى الثاني. يبلغ حجم البيانات 100 بايت، وهي أقصر بحوالي 4 مرات من ZK-SNARK وأقصر بكثير من إثبات Merkle. تكلفة الحساب هي إلى حد كبير فحص اقتران مقاس واحد، أو حوالي 119000 غاز. في L1، البيانات أقل أهمية من الحساب، ولسوء الحظ فإن KZG أغلى إلى حد ما من إثباتات Merkle.
تتضمن أشجار Verkle بشكل أساسي تكديس التزامات KZG (أو التزامات IPA ، والتي يمكن أن تكون أكثر كفاءة وتستخدم تشفيرًا أبسط) فوق بعضها البعض: لتخزين قيمتين، يمكنك الالتزام KZG بقائمة مكونة من قيمتين²⁴، كل واحدة منها بحد ذاتها هو التزام KZG بقيم 2²⁴. يتم استخدام أشجار Verkle<a href="https://notes.ethereum.org/ @vbuterin /verkle_tree_eip">بقوة تم اعتبارها مناسبة لشجرة حالة Ethereum، نظرًا لأنه يمكن استخدام أشجار Verkle للاحتفاظ بخرائط القيمة الرئيسية وليس القوائم فقط (في الأساس، يمكنك إنشاء شجرة بحجم 2²⁵⁶ لكن ابدأها فارغة، ولا تملأ سوى أجزاء محددة من الشجرة بمجرد بحاجة لملئها).
كيف تبدو شجرة فيركلي. من الناحية العملية، يمكنك إعطاء كل عقدة عرضًا قدره 256 == 2⁸ للأشجار المستندة إلى IPA، أو 2²⁴ للأشجار المستندة إلى KZG.
البراهين في أشجار Verkle أطول إلى حد ما من KZG؛ قد يصل طولها إلى بضع مئات من البايتات. كما أنه من الصعب التحقق منها، خاصة إذا حاولت تجميع العديد من الأدلة في دليل واحد.
من الناحية الواقعية، ينبغي اعتبار أشجار Verkle مثل أشجار Merkle، ولكنها أكثر قابلية للحياة بدون SNARKing (بسبب انخفاض تكاليف البيانات)، وأرخص مع SNARKing (بسبب انخفاض تكاليف الإثبات).
أكبر ميزة لأشجار Verkle هي إمكانية تنسيق هياكل البيانات: يمكن استخدام بروفات Verkle مباشرة عبر حالة L1 أو L2، بدون هياكل متراكبة، وباستخدام نفس الآلية بالضبط لـ L1 وL2. بمجرد أن تصبح أجهزة الكمبيوتر الكمومية مشكلة، أو بمجرد إثبات أن فروع Merkle أصبحت فعالة بما فيه الكفاية، يمكن استبدال أشجار Verkle في مكانها بشجرة تجزئة ثنائية مع وظيفة تجزئة مناسبة لـ SNARK.
إذا أجرى مستخدمون N معاملات N (أو بشكل أكثر واقعية، N ERC-4337 UserOperations) التي تحتاج إلى إثبات مطالبات N عبر السلسلة، فيمكننا توفير الكثير من الطاقة من خلال تجميع تلك الأدلة: المنشئ الذي سيجمع تلك المعاملات في كتلة أو الحزمة التي تدخل في كتلة يمكنها إنشاء دليل واحد يثبت كل هذه الادعاءات في وقت واحد.
هذا يمكن أن يعني:
في جميع الحالات الثلاث، لن تكلف البراهين سوى بضع مئات الآلاف من الغاز لكل منها. سيحتاج المنشئ إلى إنشاء واحدة منها في كل L2 للمستخدمين في ذلك L2؛ ومن ثم، لكي يكون هذا مفيدًا في البناء، يحتاج المخطط ككل إلى استخدام كافٍ بحيث يكون هناك في كثير من الأحيان عدد قليل من المعاملات على الأقل داخل نفس الكتلة على لغات L2 رئيسية متعددة.
إذا تم استخدام ZK-SNARKs، فإن التكلفة الحدية الرئيسية هي ببساطة "منطق العمل" المتمثل في تمرير الأرقام بين العقود، لذلك ربما بضعة آلاف من غاز L2 لكل مستخدم. إذا تم استخدام البراهين المتعددة KZG، فسيحتاج المُثبت إلى إضافة 48 غازًا لكل L2 يحتوي على مفتاح تخزين المفاتيح والذي يتم استخدامه داخل تلك الكتلة، وبالتالي فإن التكلفة الحدية للمخطط لكل مستخدم ستضيف ~ 800 L1 غازًا آخر لكل L2 (وليس لكل المستخدم) في الأعلى. لكن هذه التكاليف أقل بكثير من تكاليف عدم التجميع، والتي تتضمن حتماً أكثر من 10000 غاز L1 ومئات الآلاف من غاز L2 لكل مستخدم. بالنسبة لأشجار Verkle، يمكنك إما استخدام Verkle multi-proofs مباشرة، مع إضافة حوالي 100-200 بايت لكل مستخدم، أو يمكنك إنشاء ZK-SNARK من Verkle multi-proof، والتي لها تكاليف مماثلة لـ ZK-SNARKs لفروع Merkle ولكن أرخص بكثير لإثباته.
من منظور التنفيذ، ربما يكون من الأفضل أن تقوم أدوات التجميع بتجميع البراهين عبر السلسلة من خلال معيار تجريد حساب ERC-4337 . لدى ERC-4337 بالفعل آلية للمنشئين لتجميع أجزاء من عمليات المستخدم بطرق مخصصة. يوجد أيضًا <a href="https://hackmd.io/@voltrevo/BJ0QBy3zi"> تنفيذ لهذا لتجميع التوقيع BLS، والذي يمكن أن يقلل تكاليف الغاز على L2 بمقدار 1.5x إلى 3x اعتمادًا على أشكال الضغط الأخرى يتم تضمينها.
رسم تخطيطي من <a href="https://hackmd.io/@voltrevo/BJ0QBy3zi"> منشور تنفيذ محفظة BLS يوضح سير عمل التوقيعات المجمعة لـ BLS ضمن إصدار سابق من ERC-4337. من المرجح أن يبدو سير العمل لتجميع البراهين عبر السلسلة متشابهًا جدًا.
الاحتمال الأخير، وهو واحد يمكن استخدامه فقط لقراءة L2 L1 (وليس قراءة L1 L2)، هو تعديل L2s للسماح لهم بإجراء استدعاءات ثابتة للعقود على L1 مباشرةً.
يمكن القيام بذلك باستخدام كود تشغيل أو ترجمة مسبقة، مما يسمح بالمكالمات إلى L1 حيث تقوم بتوفير عنوان الوجهة والغاز وبيانات الاتصال، وتقوم بإرجاع الإخراج، على الرغم من أن هذه الاستدعاءات هي مكالمات ثابتة، فلا يمكنها فعليًا تغيير أي حالة L1. يجب أن يكون L2s على دراية بالمستوى 1 بالفعل لمعالجة الودائع، لذلك لا يوجد شيء أساسي يمنع تنفيذ مثل هذا الشيء؛ إنه في الأساس تحدي تنفيذ تقني (راجع: طلب تقديم العروض هذا من Optimism لدعم الاستدعاءات الثابتة إلى L1).
لاحظ أنه إذا كان مخزن المفاتيح موجودًا على L1، وكانت L2s تدمج وظيفة الاتصال الثابت L1، فلن تكون هناك حاجة إلى أي إثباتات على الإطلاق! ومع ذلك، إذا لم تدمج L2s مكالمات L1 الثابتة، أو إذا كان مخزن المفاتيح موجودًا على L2 (وهو ما قد يجب أن يكون كذلك في النهاية، بمجرد أن يصبح L1 مكلفًا للغاية بحيث لا يتمكن المستخدمون من استخدامه ولو قليلاً)، فستكون البراهين مطلوبة.
تتطلب كافة المخططات المذكورة أعلاه أن يتمكن L2 من الوصول إما إلى جذر حالة L1 الأخير، أو إلى حالة L1 الأخيرة بأكملها. لحسن الحظ، تتمتع جميع مستويات L2 ببعض الوظائف للوصول إلى حالة L1 الأخيرة بالفعل. وذلك لأنهم بحاجة إلى مثل هذه الوظيفة لمعالجة الرسائل الواردة من L1 إلى L2، وأبرزها الودائع.
وبالفعل، إذا كان L2 يحتوي على ميزة إيداع، فيمكنك استخدام L2 كما هو لنقل جذور حالة L1 إلى عقد على L2: ما عليك سوى الحصول على عقد على L1 واستدعاء كود التشغيل BLOCKHASH، وتمريره إلى L2 باعتباره رسالة الإيداع. يمكن استلام رأس الكتلة بالكامل واستخراج جذر حالتها على الجانب L2. ومع ذلك، سيكون من الأفضل بكثير أن يكون لكل لغة L2 طريقة واضحة للوصول إلى حالة L1 الحديثة الكاملة، أو جذور حالة L1 الحديثة، مباشرةً.
يتمثل التحدي الرئيسي في تحسين كيفية تلقي L2s لجذور حالة L1 الحديثة في تحقيق الأمان وزمن الوصول المنخفض في نفس الوقت:
بالإضافة إلى ذلك، في الاتجاه المعاكس (قراءة L1 L2):
بعض هذه السرعات للعمليات عبر السلاسل غير الموثوقة تكون بطيئة بشكل غير مقبول في العديد من حالات استخدام التحدي؛ وفي هذه الحالات، أنت بحاجة إلى جسور أسرع مع نماذج أمنية غير كاملة. ومع ذلك، بالنسبة لحالة استخدام تحديث مفاتيح المحفظة، فإن التأخيرات الأطول تكون أكثر قبولًا: فأنت لا تؤخر المعاملات بالساعات، بل تؤخر تغييرات المفاتيح. سيكون عليك فقط الاحتفاظ بالمفاتيح القديمة لفترة أطول. إذا كنت تقوم بتغيير المفاتيح بسبب سرقة المفاتيح، فستكون لديك فترة كبيرة من الضعف، ولكن يمكن تخفيف ذلك، على سبيل المثال. عن طريق المحافظ التي لها وظيفة التجميد.
في النهاية، أفضل حل لتقليل زمن الوصول هو أن تقوم L2s بتنفيذ القراءة المباشرة لجذور حالة L1 بالطريقة المثلى، حيث تحتوي كل كتلة L2 (أو سجل حساب جذر الحالة) على مؤشر إلى أحدث كتلة L1، لذلك إذا عادت L1 ، يمكن أن يعود L2 أيضًا. يجب وضع عقود Keystore إما على الشبكة الرئيسية، أو على L2s التي تمثل ZK-rollups وبالتالي يمكنها الالتزام بسرعة بالـ L1.
يمكن أن تحتوي كتل سلسلة L2 على تبعيات ليس فقط على كتل L2 السابقة، ولكن أيضًا على كتلة L1. إذا عاد L1 إلى ما بعد هذا الرابط، فسيعود L2 أيضًا. تجدر الإشارة إلى أن هذه هي الطريقة التي تم بها تصور إصدار سابق (ما قبل Dank) من التقسيم للعمل؛ انظر هنا للحصول على التعليمات البرمجية.
والمثير للدهشة، ليس كثيرا. في الواقع، لا تحتاج حتى إلى أن تكون مجموعة تراكمية: إذا كانت L3، أو validium، فلا بأس بالاحتفاظ بالمحافظ هناك، طالما أنك تحتفظ بملفات تخزين المفاتيح إما على L1 أو على مجموعة ZK. الشيء الذي تحتاجه هو أن تتمتع السلسلة بإمكانية الوصول المباشر إلى جذور حالة Ethereum، والتزام فني واجتماعي لتكون على استعداد لإعادة التنظيم في حالة إعادة تنظيم Ethereum، والشوكة الصلبة في حالة حدوث شوكة صلبة لـ Ethereum.
إحدى مشكلات البحث المثيرة للاهتمام هي تحديد إلى أي مدى يمكن أن يكون للسلسلة هذا النوع من الاتصال بسلاسل أخرى متعددة (على سبيل المثال. إيثريوم وزي كاش). من الممكن القيام بذلك بسذاجة: يمكن أن توافق سلسلتك على إعادة التنظيم في حالة إعادة تنظيم Ethereum أو Zcash (والشوكة الصلبة في حالة الانقسام الصلب لـ Ethereum أو Zcash)، ولكن بعد ذلك يكون لدى مشغلي العقد ومجتمعك بشكل عام ضعف التبعيات الفنية والسياسية. ومن ثم يمكن استخدام مثل هذه التقنية للاتصال ببعض السلاسل الأخرى، ولكن بتكلفة متزايدة. تتمتع المخططات القائمة على جسور ZK بخصائص تقنية جذابة، ولكنها تعاني من نقطة ضعف رئيسية تتمثل في أنها ليست قوية في مواجهة الهجمات بنسبة 51% أو الهارد فورك. قد تكون هناك حلول أكثر ذكاءً.
ومن الناحية المثالية، نريد أيضًا الحفاظ على الخصوصية. إذا كان لديك العديد من المحافظ التي تتم إدارتها بواسطة نفس مخزن المفاتيح، فنحن نريد التأكد مما يلي:
وهذا يخلق بعض القضايا:
مع SNARKs، تكون الحلول سهلة من الناحية المفاهيمية: البراهين تقوم بإخفاء المعلومات بشكل افتراضي، ويحتاج المجمع إلى إنتاج SNARK متكرر لإثبات SNARKs.
التحدي الرئيسي لهذا النهج اليوم هو أن التجميع يتطلب من المجمّع إنشاء SNARK متكرر، وهو بطيء جدًا حاليًا.
مع KZG، يمكننا استخدام<a href="https://notes.ethereum.org/ @vbuterin /non_index_revealing_proof">هذا العمل على براهين KZG غير الكاشفة للمؤشر (انظر أيضًا: نسخة أكثر رسمية من هذا العمل في ورقة Caulk ) كنقطة بداية. ومع ذلك، فإن تجميع البراهين العمياء يمثل مشكلة مفتوحة تتطلب المزيد من الاهتمام.
لسوء الحظ، فإن قراءة L1 مباشرة من داخل L2 لا تحافظ على الخصوصية، على الرغم من أن تنفيذ وظيفة القراءة المباشرة لا يزال مفيدًا للغاية، سواء لتقليل زمن الوصول أو بسبب فائدته للتطبيقات الأخرى.