أحد التحديات التي تواجه إثيريوم هو أن ازدحام وتعقيد بروتوكول سلسلة الكتل الافتراضي يزداد مع مرور الوقت. يحدث هذا في مكانين:
لكي تحافظ Ethereum على نفسها على المدى الطويل ، نحتاج إلى ضغط مضاد قوي ضد كلا الاتجاهين ، مما يقلل من التعقيد والانتفاخ بمرور الوقت. ولكن في الوقت نفسه ، نحتاج إلى الحفاظ على إحدى الخصائص الرئيسية التي تجعل سلاسل الكتل رائعة: ديمومتها. يمكنك وضع NFT ، أو ملاحظة حب في بيانات مكالمات المعاملات ، أو عقد ذكي يحتوي على مليون دولار onchain ، أو الذهاب إلى كهف لمدة عشر سنوات ، والخروج والعثور عليه لا يزال هناك في انتظارك للقراءة والتفاعل معه. لكي تشعر dapps بالراحة في العمل اللامركزي بالكامل وإزالة مفاتيح الترقية الخاصة بها ، يجب أن تكون واثقة من أن تبعياتها لن تقوم بالترقية بطريقة تكسرها - خاصة L1 نفسها.
التطهير ، خريطة الطريق 2023.
معادلة بين هاتين الحاجتين، وتقليل أو عكس التورم والتعقيد والتدهور مع الحفاظ على الاستمرارية، هو أمر ممكن تمامًا إذا وجهنا عقولنا نحو ذلك. يمكن للكائنات الحية فعل ذلك: بينما يعمر معظمها مع مرور الوقت،بعض الأقلام الحظ. حتى النظم الاجتماعية يمكن أن تلديه طول عمر شديدفي بعض المناسبات، أظهر إثيريوم بالفعل نجاحات: اختفت دليل العمل، وأصبحت عملية SELFDESTRUCT شبه منعدمة، وتخزن مُعظم أجهزة سلسلة الشبكة الإشارية البيانات القديمة حتى ستة أشهر فقط. إيجاد هذا المسار لإثيريوم بطريقة أكثر تعميمًا، والانتقال نحو نتيجة نهائية مستقرة على المدى الطويل، هو التحدي النهائي لقابلية توسع إثيريوم على المدى الطويل، واستدامتها التقنية وحتى أمانها.
حتى وقت كتابة هذا، يتطلب الحصول على عقدة Ethereum متزامنة بالكامل حوالي 1.1 تيرابايتمن مساحة القرص الصلب لـعميل التنفيذ، بالإضافة إلى عدة مئات من غيغابايت إضافية لعميل الاتفاق. ويشكل الغالبية العظمى من هذا التاريخ: بيانات حول الكتل التاريخية والمعاملات والإيصالات، ومعظمها منذ سنوات عديدة. وهذا يعني أن حجم العقد يستمر في التزايد بمئات الغيغابايت كل عام، حتى لو لم يزد زيادة الغاز على الإطلاق.
الميزة الرئيسية المبسطة لمشكلة تخزين المحفوظات هي أنه نظرا لأن كل كتلة تشير إلى الكتلة السابقة عبر رابط تجزئة (و آخرهياكل، والحصول على اتفاق في الوقت الحاضر يكفي للحصول على اتفاق في التاريخ. طالما أن الشبكة لديها اتفاق على الكتلة الأخيرة، يمكن توفير أي كتلة أو معاملة أو حالة تاريخية (رصيد الحساب، رقم عشوائي، رمز، تخزين) من قبل أي فاعل واحد جنبًا إلى جنب مع دليل Merkle، ويسمح الدليل لأي شخص آخر بالتحقق من صحته. في حين أن الاتفاق هو نموذج ثقة N/2-of-N، فإن التاريخ هو نموذج الثقة 1 من N.
هذا يفتح الكثير من الخيارات لكيفية تخزين السجل. أحد الخيارات الطبيعية هو شبكة حيث تخزن كل عقدة نسبة صغيرة فقط من البيانات. هذه هي الطريقة التي عملت بها شبكات التورنت لعقود: بينما تقوم الشبكة بتخزين وتوزيع ملايين الملفات ، يقوم كل مشارك بتخزين وتوزيع عدد قليل منها فقط. ربما على عكس ما هو متوقع ، لا يقلل هذا النهج بالضرورة من قوة البيانات. إذا تمكنا ، من خلال جعل تشغيل العقدة أكثر بأسعار معقولة ، من الوصول إلى شبكة بها 100000 عقدة ، حيث تخزن كل عقدة 10٪ عشوائية من السجل ، نسخ كل جزء من البيانات 10000 مرة - بالضبط نفس عامل النسخ المتماثل مثل شبكة 10000 عقدة حيث تخزن كل عقدة كل شيء.
اليوم، بدأ إثيريوم بالفعل في التحرك بعيدًا عن نموذج تخزين جميع العقدات لجميع التاريخ إلى الأبد. تُخزن كتل الاتفاق (أي الأجزاء المتعلقة باتفاق الحصة) فقط لمدة ~6 أشهر. تُخزن الكتل السائلة فقط لمدة ~18 يومًا.EIP-4444تهدف إلى تقديم فترة تخزين لمدة عام للكتل التاريخية والإيصالات. الهدف الطويل الأجل هو أن يكون هناك فترة متناغمة (يمكن أن تكون حوالي 18 يومًا) خلالها يكون كل عقدة مسؤولة عن تخزين كل شيء، ثم يكون هناك شبكة ند لند مكونة من عقد Ethereum تخزن البيانات القديمة بطريقة موزعة.
يمكن استخدام رموز المحو لزيادة التحمل بينما يتم الحفاظ على نفس عامل التضاعف. في الواقع ، تأتي الكتل بالفعل برموز المحو من أجل دعم أخذ عينات من توافر البيانات. قد يكون الحل الأبسط هو إعادة استخدام هذا الترميز المحو ووضع بيانات تنفيذ وقرار الكتل في الكتل أيضًا.
العمل الرئيسي المتبقي يتضمن بناء ودمج حلاً موزعًا ملموسًا لتخزين التاريخ - على الأقل تاريخ التنفيذ، ولكن في نهاية المطاف أيضًا الاتفاق والكُتل. أسهل الحلول لهذا هي (i) ببساطة إدخال مكتبة تورنت موجودة، و (ii) حل متوافق مع إثيريوم يُسمىشبكة البوابة. بمجرد أن يتم تقديم أي من هذين ، يمكننا تشغيل EIP-4444. لا يتطلب EIP-4444 نفسه شوكة صعبة ، على الرغم من أنه يتطلب إصدارًا جديدًا لبروتوكول الشبكة. لهذا السبب ، هناك قيمة في تمكينه لجميع العملاء في نفس الوقت ، لأنه في حالة عدم ذلك ، هناك مخاطر عدم عمل العملاء بشكل صحيح من الاتصال بالعقد الآخرة المتوقع تنزيل السجل الكامل ولكن ليس الحصول عليه في الواقع.
تتضمن المقايضة الرئيسية مدى صعوبة محاولتنا إتاحة البيانات التاريخية "القديمة". الحل الأسهل هو ببساطة التوقف عن تخزين التاريخ القديم غدا ، والاعتماد على عقد الأرشيف الحالية والعديد من مقدمي الخدمات المركزية للنسخ المتماثل. هذا سهل ، لكن هذا يضعف مكانة Ethereum كمكان لعمل سجلات دائمة. المسار الأصعب ، ولكن الأكثر أمانا ، هو أولا إنشاء ودمج شبكة التورنت لتخزين السجل بطريقة موزعة. هنا ، هناك بعدان ل "مدى صعوبة المحاولة":
نهج قصوى للمريض الواهم (1) سيشملبرهان الحضانة: يتطلب في الواقع من كل محقق للحصول على دليل على المخزن لتخزين بعض نسبة من التاريخ، وفحصها بشكل تشفيري باستمرار للتأكد من أنهم يفعلون ذلك. يمكن اتباع نهج أكثر معتدل هو تحديد معيار طوعي لنسبة ما من التاريخ الذي يخزنه كل عميل.
بالنسبة إلى (2) ، يتضمن التنفيذ الأساسي مجرد أخذ العمل الذي تم إنجازه بالفعل اليوم: يقوم Portal بالفعل بتخزين ملفات ERA التي تحتوي على سجل Ethereum بالكامل. قد يتضمن التنفيذ الأكثر شمولا ربط هذا فعليا بعملية المزامنة ، بحيث إذا أراد شخص ما مزامنة عقدة تخزين كاملة للمحفوظات أو عقدة أرشيف ، فيمكنه القيام بذلك حتى في حالة عدم وجود عقد أرشيف أخرى عبر الإنترنت ، عن طريق المزامنة مباشرة من شبكة البوابة.
تقليل متطلبات تخزين التاريخ أهم حتى من عدم الحالة إذا كنا نريد جعل تشغيل العقدة أو تشغيلها سريعًا للغاية أمرًا سهلاً: من الـ 1.1 تيرابايت التي تحتاج العقدة إلى الحصول عليها، تعد الحالة بحوالي 300 جيجابايت، والـ 800 جيجابايت المتبقية هي التاريخ. رؤية عقدة إثيريوم تعمل على ساعة ذكية وتستغرق بضع دقائق فقط للإعداد يمكن تحقيقها فقط إذا تم تنفيذ عدم الحالة و EIP-4444.
تحديد تخزين التاريخ يجعل من الأفضل أيضًا لتنفيذات عقدة إثيريوم الحديثة أن تدعم فقط الإصدارات الأخيرة من البروتوكول، مما يتيح لها أن تكون أبسط بكثير. على سبيل المثال، يمكن إزالة العديد من سطور الكود بأمان الآن بعد أن تم إنشاء فتحات تخزين فارغة خلال هجمات DoS في عام 2016.تمت الإزالةالآن بعد أن أصبح التبديل إلى دليل الحصة تاريخًا قديمًا، يمكن للعملاء إزالة جميع رموز العمل الدليل المتعلقة بالعمل بأمان.
حتى لو تمت إزالة حاجة العملاء لتخزين التاريخ ، فإن متطلبات تخزين العميل ستستمر في النمو ، بمقدار 50 جيجابايت سنويًا ، بسبب النمو المستمر في الحالة: أرصدة الحسابات والأرقام المتسلسلة ، وشفرة العقد وتخزين العقد. يمكن للمستخدمين دفع تكلفة مرة واحدة لفرض عبء على عملاء إثيريوم الحاليين والمستقبليين إلى الأبد.
إن "انتهاء صلاحية" الحالة أصعب بكثير من التاريخ ، لأن EVM مصمم بشكل أساسي حول افتراض أنه بمجرد إنشاء كائن الحالة ، سيكون دائما موجودا ويمكن قراءته بواسطة أي معاملة في أي وقت. إذا أدخلنا انعدام الجنسية ، فهناك حجة مفادها أن هذه المشكلة ربما ليست بهذا السوء: فقط فئة متخصصة من بناة الكتل ستحتاج إلى تخزين الحالة فعليا ، وجميع العقد الأخرى (حتى قائمة الاشتراكالإنتاج!) يمكن أن يعمل بدون حالة. ومع ذلك، هناك حجة بأننا لا نريد الاعتماد على عدم وجود الحالة كثيرًا، وفي نهاية المطاف قد نرغب في انتهاء الحالة للحفاظ على إثيريوم متمركزة.
اليوم، عند إنشاء كائن حالة جديد (والذي يمكن أن يحدث بثلاث طرق: (أ) إرسال ETH إلى حساب جديد، (ب) إنشاء حساب جديد برمز، (ج) تعيين فتحة تخزين غير ملموسة سابقا)، هذا الكائن حالة سيكون في الحالة إلى الأبد. ما نريده بدلاً من ذلك، هو أن ينتهي الكائنات تلقائياً مع مرور الوقت. التحدي الرئيسي هو القيام بذلك بطريقة تحقق ثلاثة أهداف:
من السهل حل المشكلة دون تلبية هذه الأهداف. على سبيل المثال ، يمكن أن تجعل كل كائن حالة يخزن أيضا عدادا لتاريخ انتهاء صلاحيته (والذي يمكن تمديده عن طريق نسخ ETH ، والذي يمكن أن يحدث تلقائيا في أي وقت يتم قراءته أو كتابته) ، ولديك عملية تتكرر عبر الحالة لإزالة كائنات الحالة منتهية الصلاحية. ومع ذلك ، فإن هذا يقدم حسابا إضافيا (وحتى متطلبات التخزين) ، وهو بالتأكيد لا يفي بمتطلبات سهولة الاستخدام. سيواجه المطورون أيضا صعوبة في التفكير في حالات الحافة التي تتضمن إعادة تعيين قيم التخزين أحيانا إلى الصفر. إذا جعلت مؤقت انتهاء الصلاحية على مستوى العقد ، فإن هذا يجعل الحياة أسهل من الناحية الفنية للمطورين ، ولكنه يجعل الاقتصاد أكثر صعوبة: سيتعين على المطورين التفكير في كيفية "تمرير" التكاليف المستمرة للتخزين إلى مستخدميهم.
هذه المشاكل التي كانت تعاني منها مجتمع تطوير النواة الإثيريوم لسنوات عديدة، بما في ذلك مقترحات مثلإيجار سلسلة الكتل“ و “regenesisفي نهاية المطاف، جمعنا أفضل أجزاء الاقتراحات وتوصلنا إلى فئتين من "أسوأ الحلول المعروفة":
تعمل مقترحات انتهاء الحالة الجزئية جميعها على نفس المبدأ. نقسم الحالة إلى قطع. يقوم الجميع بتخزين "الخريطة على المستوى العلوي" للقطع الفارغة أو غير الفارغة بشكل دائم. يتم تخزين البيانات داخل كل قطعة فقط إذا تم الوصول إلى تلك البيانات مؤخرًا. هناك آلية "القيام بإحياء" حيث إذا لم يعد هناك تخزين لقطعة ما، يمكن لأي شخص إعادة تلك البيانات عن طريق تقديم دليل على ما كانت تلك البيانات.
أهم التمييزات بين هذه المقترحات هي: (أ) كيف نحدد "مؤخرًا"، و (ب) كيف نحدد "قطعة"؟ أحد المقترحات الملموسة هو EIP-7736، الذي يعتمد على تصميم "الساق والورقة" تم تقديمها لأشجار فيركل (على الرغم من توافقها مع أي شكل من أشكال انعدام الجنسية ، مثل الأشجار الثنائية). في هذا التصميم ، يتم تخزين فتحات الرأس والتعليمات البرمجية والتخزين المجاورة لبعضها البعض تحت نفس "الجذع". يمكن أن تكون البيانات المخزنة تحت جذع على الأكثر 256 * 31 = 7,936 بايت. في كثير من الحالات ، سيتم تخزين الرأس والرمز بالكامل ، والعديد من فتحات التخزين الرئيسية ، للحساب تحت نفس الجذع. إذا لم تتم قراءة البيانات الموجودة تحت جذع معين أو كتابتها لمدة 6 أشهر ، فلن يتم تخزين البيانات بعد ذلك ، وبدلا من ذلك يتم تخزين التزام 32 بايت فقط ("كعب روتين") بالبيانات. ستحتاج المعاملات المستقبلية التي تصل إلى تلك البيانات إلى "إحياء" البيانات ، مع دليل سيتم التحقق منه مقابل كعب الروتين.
هناك طرق أخرى لتنفيذ فكرة مماثلة. على سبيل المثال ، إذا لم يكن التفصيل على مستوى الحساب كافيًا ، يمكننا إنشاء نظام حيث يتم إدارة كل جزء (1/232) من الشجرة بواسطة آلية مماثلة للجذع والأوراق.
هذا أكثر صعوبة بسبب الحوافز: يمكن للمهاجم إجبار العملاء على تخزين كمية كبيرة جدا من الحالة بشكل دائم عن طريق وضع كمية كبيرة جدا من البيانات في شجرة فرعية واحدة وإرسال معاملة واحدة كل عام "لتجديد الشجرة". إذا جعلت تكلفة التجديد متناسبة (أو مدة التجديد متناسبة عكسيا) مع حجم الشجرة ، فقد يحزن شخص ما على مستخدم آخر عن طريق وضع كمية كبيرة جدا من البيانات في نفس الشجرة الفرعية مثله. يمكن للمرء أن يحاول الحد من كلتا المشكلتين عن طريق جعل الدقة ديناميكية بناء على حجم الشجرة الفرعية: على سبيل المثال ، يمكن التعامل مع كل كائنات حالة متتالية 216 = 65536 على أنها "مجموعة". ومع ذلك ، فإن هذه الأفكار أكثر تعقيدا. النهج القائم على العلوم والتكنولوجيا والهندسة والرياضيات بسيط ، وهو يوائم الحوافز ، لأن جميع البيانات الموجودة تحت STEM عادة ما تكون مرتبطة بنفس التطبيق أو المستخدم.
ماذا لو أردنا تجنب أي نمو دائم للحالة تمامًا، حتى 32 بايتا من القوالب؟ هذه مشكلة صعبة بسبب @vbuterin/ state_size_management # صراعات القيامة "> صراعات القيامة: ماذا لو تمت إزالة كائن حالة ، فإن تنفيذ EVM لاحقا يضع كائن حالة آخر في نفس الموضع بالضبط ، ولكن بعد ذلك يعود شخص يهتم بكائن الحالة الأصلي ويحاول استعادته؟ مع انتهاء صلاحية الحالة الجزئي ، يمنع "كعب الروتين" إنشاء بيانات جديدة. مع انتهاء صلاحية الدولة بالكامل ، لا يمكننا تخزين حتى كعب الروتين.
التصميم القائم على فترة العنوان هو أفضل فكرة معروفة لحل هذه المشكلة. بدلا من وجود شجرة ولاية واحدة تخزن الولاية بأكملها ، لدينا قائمة متزايدة باستمرار من أشجار الولاية ، وأي حالة تتم قراءتها أو كتابتها يتم حفظها في أحدث شجرة ولاية. تتم إضافة شجرة حالة فارغة جديدة مرة واحدة لكل فترة (فكر: 1 سنة). أشجار الدولة القديمة مجمدة صلبة. من المتوقع أن تخزن العقد الكاملة أحدث شجرتين فقط. إذا لم يتم لمس كائن الحالة لفترتين وبالتالي سقط في شجرة منتهية الصلاحية ، فلا يزال من الممكن قراءته أو الكتابة إليه ، لكن المعاملة ستحتاج إلى إثبات إثبات Merkle لذلك - وبمجرد القيام بذلك ، سيتم حفظ نسخة في أحدث شجرة مرة أخرى.
فكرة رئيسية لجعل كل هذا صديقًا للمستخدم والمطور هي مفهوم فترات العنوان. فترة العنوان هي عدد يشكل جزءًا من العنوان. قاعدة رئيسية هي أنه يمكن قراءة أو كتابة عنوان بفترة N فقط خلال فترة N أو بعد ذلك (أي عندما يصل طول قائمة شجرة الحالة إلى N). إذا كنت تقوم بحفظ كائن حالة جديد (على سبيل المثال، عقد جديد أو رصيد جديد لـ ERC20) ، إذا كنت تتأكد من وضع كائن الحالة في عقد فترة عنوانه إما N أو N-1 ، فيمكنك حفظه على الفور دون الحاجة إلى تقديم أدلة على عدم وجود شيء هناك من قبل. ومع ذلك ، يتطلب أي إضافات أو تعديلات على الحالة في فترات العنوان الأقدم إثباتًا.
يحافظ هذا التصميم على معظم خصائص Ethereum الحالية ، وهو خفيف جدا على الحساب الإضافي ، ويسمح بكتابة التطبيقات كما هي اليوم تقريبا (ستحتاج ERC20s إلى إعادة الكتابة ، لضمان تخزين أرصدة العناوين مع فترة العنوان N في عقد فرعي يحتوي في حد ذاته على فترة عنوان N) ، ويحل مشكلة "المستخدم يذهب إلى كهف لمدة خمس سنوات". ومع ذلك ، فإن لديها مشكلة واحدة كبيرة: يجب توسيع العناوين إلى ما بعد 20 بايت لتناسب فترات العناوين.
إحدى الاقتراحات هي إدخال تنسيق عنوان جديد بطول 32 بايتًا، يشمل رقم الإصدار ورقم فترة العنوان وتجزئة الهاش الموسعة.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
الأحمر هو رقم الإصدار. الأصفر الملون هنا هو عبارة عن مساحة فارغة، يمكن أن تحتوي على رقم قطعة في المستقبل. الأخضر هو رقم فترة العنوان. الأزرق هو تجزئة 26 بايت.
التحدي الرئيسي هنا هو التوافق مع الإصدارات السابقة. تم تصميم العقود الحالية حول عناوين 20 بايت، وغالبًا ما تستخدم تقنيات التعبئة الضيقة التي تفترض صراحة أن العناوين طولها بالضبط 20 بايتًا.@ipsilonفكرة واحدة لحل هذه المشكلة تتضمن خريطة ترجمة، حيث يرى العقود القديمة التي تتفاعل مع عناوين النمط الجديد تجزئة 20 بايت من عنوان النمط الجديد. ومع ذلك، هناك تعقيدات كبيرة في جعل هذا آمنًا.
يتبع نهج معاكس: نحظر على الفور بعض النطاق الفرعي بحجم 2128 عناوين (على سبيل المثال، جميع العناوين التي تبدأ ب 0xffffffff)، ثم نستخدم هذا النطاق لإدخال عناوين مع فترات عناوين وتجزئة بحجم 14 بايت.
0xfffffff000169125d5dFcb7B8C2659029395bdF
التضحية الرئيسية التي يقوم بها هذا النهج هي أنها يُدخِل مخاطر أمنية للعناوين المضادة التصورية: العناوين التي تحمل أصولًا أو أذونات، لكن لم يتم نشر كودها حتى الآن على السلسلة. ينطوي المخاطر على شخص ما يقوم بإنشاء عنوان يدعي أن لديه قطعة واحدة من الكود (الذي لم يتم نشره بعد)، ولكنه أيضًا يحتوي على قطعة أخرى صالحة من الكود التي تجعلها تؤشر إلى نفس العنوان. يتطلب حساب مثل هذا الاصطدام 280التجزئة اليومية؛ انكماش مساحة العنوان سيقلل هذا الرقم إلى 2 قابلة للوصول جداً56التجزئة.
منطقة المخاطر الرئيسية ، وهي عناوين متناقضة ليست محافظ تمتلكها مالك واحد ، هي حالة نادرة نسبيًا اليوم ، ولكن من المرجح أن تصبح أكثر شيوعًا مع دخولنا عالم متعدد الطبقات. الحل الوحيد هو قبول هذا الخطر ببساطة ، ولكن تحديد جميع الحالات الشائعة التي قد تكون مشكلة ، ووضع حلول بديلة فعالة.
أرى أربعة مسارات ممكنة للمستقبل:
نقطة مهمة واحدة هي أن المسائل الصعبة المتعلقة بتوسيع وانكماش مساحة العناوين ستحتاج في النهاية إلى أن تُعالج بغض النظر عما إذا تم تنفيذ برامج انتهاء الصلاحية الحالية التي تعتمد على تغييرات تنسيق العناوين أم لا. اليوم، يستغرق حوالي 280يتجانس لتوليد تصادم عنوان، حمولة حسابية يمكن تنفيذها بالفعل من قبل الجهات ذات الموارد الجيدة للغاية: يمكن لوحدة المعالجة الرسومية أن تقوم بحوالي 227الهاشات ، لذا يمكنها حساب 2 خلال عام واحد٥٢، لذلك جميع~2^30 بطاقة رسومات في العالميمكن أن يحسب اصطدامًا في ~ 1/4 من العام ، ويمكن لوحدات المعالجة المركزية المتجهة بالبرامج الثابتة والدوائر المتكاملة المسرعة تسريع هذا بشكل أكبر. في المستقبل ، ستصبح هذه الهجمات متاحة لعدد أكبر وأكبر من الأشخاص. وبالتالي ، قد لا يكون التكلفة الفعلية لتنفيذ انتهاء الحالة الكاملة كبيرة كما يبدو ، حيث يجب أن نحل هذه المشكلة العنوانية الصعبة جدًا بغض النظر عن ذلك.
قد يجعل انتهاء الحالة من الممكن أن تكون الانتقالات من تنسيق شجرة الحالة إلى تنسيق آخر أسهل، لأنه لن يكون هناك حاجة لإجراء انتقال: يمكنك ببساطة البدء في إنشاء أشجار جديدة باستخدام تنسيق جديد، ثم في وقت لاحق القيام بشوكة صلبة لتحويل الأشجار القديمة. وبالتالي، بينما انتهاء الحالة معقد، إلا أن له فوائد في تبسيط جوانب أخرى من خريطة الطريق.
أحد الشروط الأساسية للأمان والوصولية والحياد الموثوقالبساطة هي. إذا كان البروتوكول جميل وبسيط، فإنه يقلل من احتمالية وجود الأخطاء. فإنه يزيد من احتمالية أن يتمكن المطورون الجدد من الانضمام والعمل مع أي جزء منه. إنه من المرجح أن يكون أكثر عدلاً وأسهل في الدفاع ضد المصالح الخاصة. للأسف، البروتوكولات، مثل أي نظام اجتماعي، يصبح بشكل افتراضي أكثر تعقيدًا مع مرور الوقت. إذا لم نكن نريد أن يذهب إثيريوم إلى حفرة سوداء من التعقيد المتزايد باستمرار، فإننا بحاجة إلى القيام بإحدى الأمور الاثنتين: (أ) التوقف عن إجراء التغييرات وتصلب البروتوكول، (ب) القدرة على إزالة الميزات فعليًا وتقليل التعقيد. من الممكن أيضًا اللجوء إلى طريق وسط، وهو إجراء تغييرات أقل في البروتوكول، وكذلك إزالة على الأقل بعض التعقيد مع مرور الوقت. سيتحدث هذا القسم عن كيف يمكننا تقليل أو إزالة التعقيد.
لا يوجد حل واحد كبير يمكن أن يقلل من تعقيد البروتوكول؛ فالطبيعة الجوهرية للمشكلة هي وجود العديد من الإصلاحات الصغيرة.
مثال واحد تم انجازه بالفعل بشكل كبير، ويمكن أن يكون كدليل لكيفية التعامل مع الآخرين، هو@vbuterin/selfdestruct">إزالة تعليمات SELFDESTRUCT. كانت تعليمات SELFDESTRUCT الوحيدة التي يمكن أن تعدل عددًا غير محدود من فتحات التخزين داخل كتلة واحدة، مما يتطلب من العملاء تنفيذ مزيد من التعقيد لتجنب هجمات DoS. الغرض الأصلي من التعليمات كان تمكين تطهير الحالة بشكل طوعي، مما يسمح بتقليل حجم الحالة مع مرور الوقت. في الواقع، انتهى قليل جدًا من استخدامها.تم تخفيض كود العمليةللسماح فقط بحسابات النفاد الذاتي التي تم إنشاؤها في نفس العملية في الشوكة الصعبة لـ Dencun. يحل هذا المشكلة DoS ويسمح بتبسيط كبير في كود العميل. في المستقبل ، من المرجح أن يكون من المنطقي إزالة العملية البرمجية بشكل كامل.
تتضمن بعض الأمثلة الرئيسية لفرص تبسيط البروتوكول التي تم تحديدها حتى الآن ما يلي. أولا ، بعض الأمثلة التي تقع خارج EVM ؛ وهي غير جراحية نسبيا، وبالتالي يسهل الحصول على توافق في الآراء بشأنها وتنفيذها في إطار زمني أقصر.
الآن، بعض الأمثلة التي توجد داخل إثيريوم:
أكبر تضحية في القيام بنوع من تبسيط الميزات هو (i) مدى تبسيطنا وسرعتنا مقابل (ii) التوافق مع الإصدارات السابقة. يأتي قيمة إيثيريوم كسلسلة من أنها منصة يمكنك نشر تطبيق وتكون واثقًا من أنه سيعمل لسنوات عديدة في المستقبل. في الوقت نفسه، من الممكن أن نأخذ هذه الفكرة إلى حد بعيد جدًا.للتعبير بشكل مختصر عن وليام جينينغز برايان، "صلب Ethereum على صليب التوافق العكسي". إذا كانت هناك فقط تطبيقين في Ethereum يستخدمان ميزة معينة، واحد منهما لم يستخدمه أي مستخدم لسنوات والآخر تقريبًا غير مستخدم تمامًا ويضمن إجمالي قيمة 57 دولارًا، فعلينا فقط إزالة هذه الميزة، وإذا لزم الأمر دفع تعويضات قدرها 57 دولارًا من جيبنا.
المشكلة الاجتماعية الأوسع هي في إنشاء خط أنابيب موحد لجعل التغييرات التي لا تشكل طارئًا وتعمل بالاتجاه العكسي متوافقة مع الإصدارات السابقة. أحد الطرق للتعامل مع هذا هو فحص وتوسيع السابقات الموجودة ، مثل عملية SELFDESTRUCT. يبدو أن خط الأنابيب يبدو كما يلي:
يجب أن يكون هناك أنبوب متعدد السنوات بين الخطوة 1 والخطوة 4، مع معلومات واضحة حول العناصر الموجودة في كل خطوة. في ذلك الوقت، هناك تضاد بين كيفية قوية وسريعة خط الإزالة الميزات، مقابل أن تكون أكثر حذراً ووضع المزيد من الموارد في مجالات أخرى من تطوير البروتوكول، ولكننا لا نزال بعيدين عن الحد الأمثل.
مجموعة رئيسية من التغييرات التي تم اقتراحها على EVM هيتنسيق كائن EVM (EOF). يقدم EOF عددًا كبيرًا من التغييرات ، مثل حظر مراقبة الغاز ، ومراقبة الكود (أي CODECOPY غير موجود) ، والسماح بالقفزات الثابتة فقط. الهدف هو السماح بترقية EVM بشكل أكبر ، بطريقة تحتوي على خصائص أقوى ، مع الحفاظ على التوافق مع الإصدارات السابقة (بما أن EVM قبل EOF ستظل قائمة).
لديها ميزة في أنها تخلق مسارًا طبيعيًا لإضافة ميزات EVM جديدة وتشجيع الهجرة إلى EVM أكثر قيودًا مع ضمانات أقوى. لها عيب في أنها تزيد بشكل كبير من تعقيد البروتوكول، ما لم نتمكن من العثور على طريقة لإهمال الـ EVM القديم وإزالته في النهاية. إحدى الأسئلة الرئيسية هي: ما هو دور EOF في مقترحات تبسيط EVM، خاصة إذا كان الهدف هو تقليل تعقيد EVM ككل؟
العديد من اقتراحات "التحسين" في بقية الخريطة الطريقة هي أيضًا فرص لتبسيط الميزات القديمة. لتكرار بعض الأمثلة من أعلاه:
استراتيجية Vereinigung für eine radikalere Vereinfachung von Ethereum ist es, das Protokoll unverändert zu lassen, aber große Teile davon von Protokollfunktionen zu Vertragscode zu verlagern.
أقصى نسخة من ذلك ستكون جعل Ethereum L1 "فنيا" يكون فقط سلسلة البيكون، وإدخال آلة افتراضية بسيطة (مثل ريسك-V, القاهرة، أو شيء أكثر أصغر حتى تخصص لأنظمة الإثبات) الذي يسمح لأي شخص آخر بإنشاء لفهم الخاصة بهم. ثم سيتحول EVM إلى أول هذه اللفات. هذا هو بالضبط نفس النتيجة بشكل ساخر كما اقتراحات بيئة التنفيذ من 2019-20، على الرغم من أن SNARKs يجعل من الأكثر قابلية للتنفيذ بشكل كبير.
قد يكون النهج الأكثر اعتدالا هو الحفاظ على العلاقة بين سلسلة المنارة وبيئة تنفيذ Ethereum الحالية كما هي, ولكن قم بإجراء مبادلة موضعية ل EVM. يمكننا اختيار RISC-V أو Cairo أو VM آخر ليكون "Ethereum VM" الجديد ، ثم فرض تحويل جميع عقود EVM إلى رمز VM جديد يفسر منطق الكود الأصلي (عن طريق تجميعه أو تفسيره). من الناحية النظرية ، يمكن القيام بذلك حتى مع كون "الجهاز الظاهري المستهدف" إصدارا من EOF.
أحد التحديات التي تواجه إثيريوم هو أن ازدحام وتعقيد بروتوكول سلسلة الكتل الافتراضي يزداد مع مرور الوقت. يحدث هذا في مكانين:
لكي تحافظ Ethereum على نفسها على المدى الطويل ، نحتاج إلى ضغط مضاد قوي ضد كلا الاتجاهين ، مما يقلل من التعقيد والانتفاخ بمرور الوقت. ولكن في الوقت نفسه ، نحتاج إلى الحفاظ على إحدى الخصائص الرئيسية التي تجعل سلاسل الكتل رائعة: ديمومتها. يمكنك وضع NFT ، أو ملاحظة حب في بيانات مكالمات المعاملات ، أو عقد ذكي يحتوي على مليون دولار onchain ، أو الذهاب إلى كهف لمدة عشر سنوات ، والخروج والعثور عليه لا يزال هناك في انتظارك للقراءة والتفاعل معه. لكي تشعر dapps بالراحة في العمل اللامركزي بالكامل وإزالة مفاتيح الترقية الخاصة بها ، يجب أن تكون واثقة من أن تبعياتها لن تقوم بالترقية بطريقة تكسرها - خاصة L1 نفسها.
التطهير ، خريطة الطريق 2023.
معادلة بين هاتين الحاجتين، وتقليل أو عكس التورم والتعقيد والتدهور مع الحفاظ على الاستمرارية، هو أمر ممكن تمامًا إذا وجهنا عقولنا نحو ذلك. يمكن للكائنات الحية فعل ذلك: بينما يعمر معظمها مع مرور الوقت،بعض الأقلام الحظ. حتى النظم الاجتماعية يمكن أن تلديه طول عمر شديدفي بعض المناسبات، أظهر إثيريوم بالفعل نجاحات: اختفت دليل العمل، وأصبحت عملية SELFDESTRUCT شبه منعدمة، وتخزن مُعظم أجهزة سلسلة الشبكة الإشارية البيانات القديمة حتى ستة أشهر فقط. إيجاد هذا المسار لإثيريوم بطريقة أكثر تعميمًا، والانتقال نحو نتيجة نهائية مستقرة على المدى الطويل، هو التحدي النهائي لقابلية توسع إثيريوم على المدى الطويل، واستدامتها التقنية وحتى أمانها.
حتى وقت كتابة هذا، يتطلب الحصول على عقدة Ethereum متزامنة بالكامل حوالي 1.1 تيرابايتمن مساحة القرص الصلب لـعميل التنفيذ، بالإضافة إلى عدة مئات من غيغابايت إضافية لعميل الاتفاق. ويشكل الغالبية العظمى من هذا التاريخ: بيانات حول الكتل التاريخية والمعاملات والإيصالات، ومعظمها منذ سنوات عديدة. وهذا يعني أن حجم العقد يستمر في التزايد بمئات الغيغابايت كل عام، حتى لو لم يزد زيادة الغاز على الإطلاق.
الميزة الرئيسية المبسطة لمشكلة تخزين المحفوظات هي أنه نظرا لأن كل كتلة تشير إلى الكتلة السابقة عبر رابط تجزئة (و آخرهياكل، والحصول على اتفاق في الوقت الحاضر يكفي للحصول على اتفاق في التاريخ. طالما أن الشبكة لديها اتفاق على الكتلة الأخيرة، يمكن توفير أي كتلة أو معاملة أو حالة تاريخية (رصيد الحساب، رقم عشوائي، رمز، تخزين) من قبل أي فاعل واحد جنبًا إلى جنب مع دليل Merkle، ويسمح الدليل لأي شخص آخر بالتحقق من صحته. في حين أن الاتفاق هو نموذج ثقة N/2-of-N، فإن التاريخ هو نموذج الثقة 1 من N.
هذا يفتح الكثير من الخيارات لكيفية تخزين السجل. أحد الخيارات الطبيعية هو شبكة حيث تخزن كل عقدة نسبة صغيرة فقط من البيانات. هذه هي الطريقة التي عملت بها شبكات التورنت لعقود: بينما تقوم الشبكة بتخزين وتوزيع ملايين الملفات ، يقوم كل مشارك بتخزين وتوزيع عدد قليل منها فقط. ربما على عكس ما هو متوقع ، لا يقلل هذا النهج بالضرورة من قوة البيانات. إذا تمكنا ، من خلال جعل تشغيل العقدة أكثر بأسعار معقولة ، من الوصول إلى شبكة بها 100000 عقدة ، حيث تخزن كل عقدة 10٪ عشوائية من السجل ، نسخ كل جزء من البيانات 10000 مرة - بالضبط نفس عامل النسخ المتماثل مثل شبكة 10000 عقدة حيث تخزن كل عقدة كل شيء.
اليوم، بدأ إثيريوم بالفعل في التحرك بعيدًا عن نموذج تخزين جميع العقدات لجميع التاريخ إلى الأبد. تُخزن كتل الاتفاق (أي الأجزاء المتعلقة باتفاق الحصة) فقط لمدة ~6 أشهر. تُخزن الكتل السائلة فقط لمدة ~18 يومًا.EIP-4444تهدف إلى تقديم فترة تخزين لمدة عام للكتل التاريخية والإيصالات. الهدف الطويل الأجل هو أن يكون هناك فترة متناغمة (يمكن أن تكون حوالي 18 يومًا) خلالها يكون كل عقدة مسؤولة عن تخزين كل شيء، ثم يكون هناك شبكة ند لند مكونة من عقد Ethereum تخزن البيانات القديمة بطريقة موزعة.
يمكن استخدام رموز المحو لزيادة التحمل بينما يتم الحفاظ على نفس عامل التضاعف. في الواقع ، تأتي الكتل بالفعل برموز المحو من أجل دعم أخذ عينات من توافر البيانات. قد يكون الحل الأبسط هو إعادة استخدام هذا الترميز المحو ووضع بيانات تنفيذ وقرار الكتل في الكتل أيضًا.
العمل الرئيسي المتبقي يتضمن بناء ودمج حلاً موزعًا ملموسًا لتخزين التاريخ - على الأقل تاريخ التنفيذ، ولكن في نهاية المطاف أيضًا الاتفاق والكُتل. أسهل الحلول لهذا هي (i) ببساطة إدخال مكتبة تورنت موجودة، و (ii) حل متوافق مع إثيريوم يُسمىشبكة البوابة. بمجرد أن يتم تقديم أي من هذين ، يمكننا تشغيل EIP-4444. لا يتطلب EIP-4444 نفسه شوكة صعبة ، على الرغم من أنه يتطلب إصدارًا جديدًا لبروتوكول الشبكة. لهذا السبب ، هناك قيمة في تمكينه لجميع العملاء في نفس الوقت ، لأنه في حالة عدم ذلك ، هناك مخاطر عدم عمل العملاء بشكل صحيح من الاتصال بالعقد الآخرة المتوقع تنزيل السجل الكامل ولكن ليس الحصول عليه في الواقع.
تتضمن المقايضة الرئيسية مدى صعوبة محاولتنا إتاحة البيانات التاريخية "القديمة". الحل الأسهل هو ببساطة التوقف عن تخزين التاريخ القديم غدا ، والاعتماد على عقد الأرشيف الحالية والعديد من مقدمي الخدمات المركزية للنسخ المتماثل. هذا سهل ، لكن هذا يضعف مكانة Ethereum كمكان لعمل سجلات دائمة. المسار الأصعب ، ولكن الأكثر أمانا ، هو أولا إنشاء ودمج شبكة التورنت لتخزين السجل بطريقة موزعة. هنا ، هناك بعدان ل "مدى صعوبة المحاولة":
نهج قصوى للمريض الواهم (1) سيشملبرهان الحضانة: يتطلب في الواقع من كل محقق للحصول على دليل على المخزن لتخزين بعض نسبة من التاريخ، وفحصها بشكل تشفيري باستمرار للتأكد من أنهم يفعلون ذلك. يمكن اتباع نهج أكثر معتدل هو تحديد معيار طوعي لنسبة ما من التاريخ الذي يخزنه كل عميل.
بالنسبة إلى (2) ، يتضمن التنفيذ الأساسي مجرد أخذ العمل الذي تم إنجازه بالفعل اليوم: يقوم Portal بالفعل بتخزين ملفات ERA التي تحتوي على سجل Ethereum بالكامل. قد يتضمن التنفيذ الأكثر شمولا ربط هذا فعليا بعملية المزامنة ، بحيث إذا أراد شخص ما مزامنة عقدة تخزين كاملة للمحفوظات أو عقدة أرشيف ، فيمكنه القيام بذلك حتى في حالة عدم وجود عقد أرشيف أخرى عبر الإنترنت ، عن طريق المزامنة مباشرة من شبكة البوابة.
تقليل متطلبات تخزين التاريخ أهم حتى من عدم الحالة إذا كنا نريد جعل تشغيل العقدة أو تشغيلها سريعًا للغاية أمرًا سهلاً: من الـ 1.1 تيرابايت التي تحتاج العقدة إلى الحصول عليها، تعد الحالة بحوالي 300 جيجابايت، والـ 800 جيجابايت المتبقية هي التاريخ. رؤية عقدة إثيريوم تعمل على ساعة ذكية وتستغرق بضع دقائق فقط للإعداد يمكن تحقيقها فقط إذا تم تنفيذ عدم الحالة و EIP-4444.
تحديد تخزين التاريخ يجعل من الأفضل أيضًا لتنفيذات عقدة إثيريوم الحديثة أن تدعم فقط الإصدارات الأخيرة من البروتوكول، مما يتيح لها أن تكون أبسط بكثير. على سبيل المثال، يمكن إزالة العديد من سطور الكود بأمان الآن بعد أن تم إنشاء فتحات تخزين فارغة خلال هجمات DoS في عام 2016.تمت الإزالةالآن بعد أن أصبح التبديل إلى دليل الحصة تاريخًا قديمًا، يمكن للعملاء إزالة جميع رموز العمل الدليل المتعلقة بالعمل بأمان.
حتى لو تمت إزالة حاجة العملاء لتخزين التاريخ ، فإن متطلبات تخزين العميل ستستمر في النمو ، بمقدار 50 جيجابايت سنويًا ، بسبب النمو المستمر في الحالة: أرصدة الحسابات والأرقام المتسلسلة ، وشفرة العقد وتخزين العقد. يمكن للمستخدمين دفع تكلفة مرة واحدة لفرض عبء على عملاء إثيريوم الحاليين والمستقبليين إلى الأبد.
إن "انتهاء صلاحية" الحالة أصعب بكثير من التاريخ ، لأن EVM مصمم بشكل أساسي حول افتراض أنه بمجرد إنشاء كائن الحالة ، سيكون دائما موجودا ويمكن قراءته بواسطة أي معاملة في أي وقت. إذا أدخلنا انعدام الجنسية ، فهناك حجة مفادها أن هذه المشكلة ربما ليست بهذا السوء: فقط فئة متخصصة من بناة الكتل ستحتاج إلى تخزين الحالة فعليا ، وجميع العقد الأخرى (حتى قائمة الاشتراكالإنتاج!) يمكن أن يعمل بدون حالة. ومع ذلك، هناك حجة بأننا لا نريد الاعتماد على عدم وجود الحالة كثيرًا، وفي نهاية المطاف قد نرغب في انتهاء الحالة للحفاظ على إثيريوم متمركزة.
اليوم، عند إنشاء كائن حالة جديد (والذي يمكن أن يحدث بثلاث طرق: (أ) إرسال ETH إلى حساب جديد، (ب) إنشاء حساب جديد برمز، (ج) تعيين فتحة تخزين غير ملموسة سابقا)، هذا الكائن حالة سيكون في الحالة إلى الأبد. ما نريده بدلاً من ذلك، هو أن ينتهي الكائنات تلقائياً مع مرور الوقت. التحدي الرئيسي هو القيام بذلك بطريقة تحقق ثلاثة أهداف:
من السهل حل المشكلة دون تلبية هذه الأهداف. على سبيل المثال ، يمكن أن تجعل كل كائن حالة يخزن أيضا عدادا لتاريخ انتهاء صلاحيته (والذي يمكن تمديده عن طريق نسخ ETH ، والذي يمكن أن يحدث تلقائيا في أي وقت يتم قراءته أو كتابته) ، ولديك عملية تتكرر عبر الحالة لإزالة كائنات الحالة منتهية الصلاحية. ومع ذلك ، فإن هذا يقدم حسابا إضافيا (وحتى متطلبات التخزين) ، وهو بالتأكيد لا يفي بمتطلبات سهولة الاستخدام. سيواجه المطورون أيضا صعوبة في التفكير في حالات الحافة التي تتضمن إعادة تعيين قيم التخزين أحيانا إلى الصفر. إذا جعلت مؤقت انتهاء الصلاحية على مستوى العقد ، فإن هذا يجعل الحياة أسهل من الناحية الفنية للمطورين ، ولكنه يجعل الاقتصاد أكثر صعوبة: سيتعين على المطورين التفكير في كيفية "تمرير" التكاليف المستمرة للتخزين إلى مستخدميهم.
هذه المشاكل التي كانت تعاني منها مجتمع تطوير النواة الإثيريوم لسنوات عديدة، بما في ذلك مقترحات مثلإيجار سلسلة الكتل“ و “regenesisفي نهاية المطاف، جمعنا أفضل أجزاء الاقتراحات وتوصلنا إلى فئتين من "أسوأ الحلول المعروفة":
تعمل مقترحات انتهاء الحالة الجزئية جميعها على نفس المبدأ. نقسم الحالة إلى قطع. يقوم الجميع بتخزين "الخريطة على المستوى العلوي" للقطع الفارغة أو غير الفارغة بشكل دائم. يتم تخزين البيانات داخل كل قطعة فقط إذا تم الوصول إلى تلك البيانات مؤخرًا. هناك آلية "القيام بإحياء" حيث إذا لم يعد هناك تخزين لقطعة ما، يمكن لأي شخص إعادة تلك البيانات عن طريق تقديم دليل على ما كانت تلك البيانات.
أهم التمييزات بين هذه المقترحات هي: (أ) كيف نحدد "مؤخرًا"، و (ب) كيف نحدد "قطعة"؟ أحد المقترحات الملموسة هو EIP-7736، الذي يعتمد على تصميم "الساق والورقة" تم تقديمها لأشجار فيركل (على الرغم من توافقها مع أي شكل من أشكال انعدام الجنسية ، مثل الأشجار الثنائية). في هذا التصميم ، يتم تخزين فتحات الرأس والتعليمات البرمجية والتخزين المجاورة لبعضها البعض تحت نفس "الجذع". يمكن أن تكون البيانات المخزنة تحت جذع على الأكثر 256 * 31 = 7,936 بايت. في كثير من الحالات ، سيتم تخزين الرأس والرمز بالكامل ، والعديد من فتحات التخزين الرئيسية ، للحساب تحت نفس الجذع. إذا لم تتم قراءة البيانات الموجودة تحت جذع معين أو كتابتها لمدة 6 أشهر ، فلن يتم تخزين البيانات بعد ذلك ، وبدلا من ذلك يتم تخزين التزام 32 بايت فقط ("كعب روتين") بالبيانات. ستحتاج المعاملات المستقبلية التي تصل إلى تلك البيانات إلى "إحياء" البيانات ، مع دليل سيتم التحقق منه مقابل كعب الروتين.
هناك طرق أخرى لتنفيذ فكرة مماثلة. على سبيل المثال ، إذا لم يكن التفصيل على مستوى الحساب كافيًا ، يمكننا إنشاء نظام حيث يتم إدارة كل جزء (1/232) من الشجرة بواسطة آلية مماثلة للجذع والأوراق.
هذا أكثر صعوبة بسبب الحوافز: يمكن للمهاجم إجبار العملاء على تخزين كمية كبيرة جدا من الحالة بشكل دائم عن طريق وضع كمية كبيرة جدا من البيانات في شجرة فرعية واحدة وإرسال معاملة واحدة كل عام "لتجديد الشجرة". إذا جعلت تكلفة التجديد متناسبة (أو مدة التجديد متناسبة عكسيا) مع حجم الشجرة ، فقد يحزن شخص ما على مستخدم آخر عن طريق وضع كمية كبيرة جدا من البيانات في نفس الشجرة الفرعية مثله. يمكن للمرء أن يحاول الحد من كلتا المشكلتين عن طريق جعل الدقة ديناميكية بناء على حجم الشجرة الفرعية: على سبيل المثال ، يمكن التعامل مع كل كائنات حالة متتالية 216 = 65536 على أنها "مجموعة". ومع ذلك ، فإن هذه الأفكار أكثر تعقيدا. النهج القائم على العلوم والتكنولوجيا والهندسة والرياضيات بسيط ، وهو يوائم الحوافز ، لأن جميع البيانات الموجودة تحت STEM عادة ما تكون مرتبطة بنفس التطبيق أو المستخدم.
ماذا لو أردنا تجنب أي نمو دائم للحالة تمامًا، حتى 32 بايتا من القوالب؟ هذه مشكلة صعبة بسبب @vbuterin/ state_size_management # صراعات القيامة "> صراعات القيامة: ماذا لو تمت إزالة كائن حالة ، فإن تنفيذ EVM لاحقا يضع كائن حالة آخر في نفس الموضع بالضبط ، ولكن بعد ذلك يعود شخص يهتم بكائن الحالة الأصلي ويحاول استعادته؟ مع انتهاء صلاحية الحالة الجزئي ، يمنع "كعب الروتين" إنشاء بيانات جديدة. مع انتهاء صلاحية الدولة بالكامل ، لا يمكننا تخزين حتى كعب الروتين.
التصميم القائم على فترة العنوان هو أفضل فكرة معروفة لحل هذه المشكلة. بدلا من وجود شجرة ولاية واحدة تخزن الولاية بأكملها ، لدينا قائمة متزايدة باستمرار من أشجار الولاية ، وأي حالة تتم قراءتها أو كتابتها يتم حفظها في أحدث شجرة ولاية. تتم إضافة شجرة حالة فارغة جديدة مرة واحدة لكل فترة (فكر: 1 سنة). أشجار الدولة القديمة مجمدة صلبة. من المتوقع أن تخزن العقد الكاملة أحدث شجرتين فقط. إذا لم يتم لمس كائن الحالة لفترتين وبالتالي سقط في شجرة منتهية الصلاحية ، فلا يزال من الممكن قراءته أو الكتابة إليه ، لكن المعاملة ستحتاج إلى إثبات إثبات Merkle لذلك - وبمجرد القيام بذلك ، سيتم حفظ نسخة في أحدث شجرة مرة أخرى.
فكرة رئيسية لجعل كل هذا صديقًا للمستخدم والمطور هي مفهوم فترات العنوان. فترة العنوان هي عدد يشكل جزءًا من العنوان. قاعدة رئيسية هي أنه يمكن قراءة أو كتابة عنوان بفترة N فقط خلال فترة N أو بعد ذلك (أي عندما يصل طول قائمة شجرة الحالة إلى N). إذا كنت تقوم بحفظ كائن حالة جديد (على سبيل المثال، عقد جديد أو رصيد جديد لـ ERC20) ، إذا كنت تتأكد من وضع كائن الحالة في عقد فترة عنوانه إما N أو N-1 ، فيمكنك حفظه على الفور دون الحاجة إلى تقديم أدلة على عدم وجود شيء هناك من قبل. ومع ذلك ، يتطلب أي إضافات أو تعديلات على الحالة في فترات العنوان الأقدم إثباتًا.
يحافظ هذا التصميم على معظم خصائص Ethereum الحالية ، وهو خفيف جدا على الحساب الإضافي ، ويسمح بكتابة التطبيقات كما هي اليوم تقريبا (ستحتاج ERC20s إلى إعادة الكتابة ، لضمان تخزين أرصدة العناوين مع فترة العنوان N في عقد فرعي يحتوي في حد ذاته على فترة عنوان N) ، ويحل مشكلة "المستخدم يذهب إلى كهف لمدة خمس سنوات". ومع ذلك ، فإن لديها مشكلة واحدة كبيرة: يجب توسيع العناوين إلى ما بعد 20 بايت لتناسب فترات العناوين.
إحدى الاقتراحات هي إدخال تنسيق عنوان جديد بطول 32 بايتًا، يشمل رقم الإصدار ورقم فترة العنوان وتجزئة الهاش الموسعة.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
الأحمر هو رقم الإصدار. الأصفر الملون هنا هو عبارة عن مساحة فارغة، يمكن أن تحتوي على رقم قطعة في المستقبل. الأخضر هو رقم فترة العنوان. الأزرق هو تجزئة 26 بايت.
التحدي الرئيسي هنا هو التوافق مع الإصدارات السابقة. تم تصميم العقود الحالية حول عناوين 20 بايت، وغالبًا ما تستخدم تقنيات التعبئة الضيقة التي تفترض صراحة أن العناوين طولها بالضبط 20 بايتًا.@ipsilonفكرة واحدة لحل هذه المشكلة تتضمن خريطة ترجمة، حيث يرى العقود القديمة التي تتفاعل مع عناوين النمط الجديد تجزئة 20 بايت من عنوان النمط الجديد. ومع ذلك، هناك تعقيدات كبيرة في جعل هذا آمنًا.
يتبع نهج معاكس: نحظر على الفور بعض النطاق الفرعي بحجم 2128 عناوين (على سبيل المثال، جميع العناوين التي تبدأ ب 0xffffffff)، ثم نستخدم هذا النطاق لإدخال عناوين مع فترات عناوين وتجزئة بحجم 14 بايت.
0xfffffff000169125d5dFcb7B8C2659029395bdF
التضحية الرئيسية التي يقوم بها هذا النهج هي أنها يُدخِل مخاطر أمنية للعناوين المضادة التصورية: العناوين التي تحمل أصولًا أو أذونات، لكن لم يتم نشر كودها حتى الآن على السلسلة. ينطوي المخاطر على شخص ما يقوم بإنشاء عنوان يدعي أن لديه قطعة واحدة من الكود (الذي لم يتم نشره بعد)، ولكنه أيضًا يحتوي على قطعة أخرى صالحة من الكود التي تجعلها تؤشر إلى نفس العنوان. يتطلب حساب مثل هذا الاصطدام 280التجزئة اليومية؛ انكماش مساحة العنوان سيقلل هذا الرقم إلى 2 قابلة للوصول جداً56التجزئة.
منطقة المخاطر الرئيسية ، وهي عناوين متناقضة ليست محافظ تمتلكها مالك واحد ، هي حالة نادرة نسبيًا اليوم ، ولكن من المرجح أن تصبح أكثر شيوعًا مع دخولنا عالم متعدد الطبقات. الحل الوحيد هو قبول هذا الخطر ببساطة ، ولكن تحديد جميع الحالات الشائعة التي قد تكون مشكلة ، ووضع حلول بديلة فعالة.
أرى أربعة مسارات ممكنة للمستقبل:
نقطة مهمة واحدة هي أن المسائل الصعبة المتعلقة بتوسيع وانكماش مساحة العناوين ستحتاج في النهاية إلى أن تُعالج بغض النظر عما إذا تم تنفيذ برامج انتهاء الصلاحية الحالية التي تعتمد على تغييرات تنسيق العناوين أم لا. اليوم، يستغرق حوالي 280يتجانس لتوليد تصادم عنوان، حمولة حسابية يمكن تنفيذها بالفعل من قبل الجهات ذات الموارد الجيدة للغاية: يمكن لوحدة المعالجة الرسومية أن تقوم بحوالي 227الهاشات ، لذا يمكنها حساب 2 خلال عام واحد٥٢، لذلك جميع~2^30 بطاقة رسومات في العالميمكن أن يحسب اصطدامًا في ~ 1/4 من العام ، ويمكن لوحدات المعالجة المركزية المتجهة بالبرامج الثابتة والدوائر المتكاملة المسرعة تسريع هذا بشكل أكبر. في المستقبل ، ستصبح هذه الهجمات متاحة لعدد أكبر وأكبر من الأشخاص. وبالتالي ، قد لا يكون التكلفة الفعلية لتنفيذ انتهاء الحالة الكاملة كبيرة كما يبدو ، حيث يجب أن نحل هذه المشكلة العنوانية الصعبة جدًا بغض النظر عن ذلك.
قد يجعل انتهاء الحالة من الممكن أن تكون الانتقالات من تنسيق شجرة الحالة إلى تنسيق آخر أسهل، لأنه لن يكون هناك حاجة لإجراء انتقال: يمكنك ببساطة البدء في إنشاء أشجار جديدة باستخدام تنسيق جديد، ثم في وقت لاحق القيام بشوكة صلبة لتحويل الأشجار القديمة. وبالتالي، بينما انتهاء الحالة معقد، إلا أن له فوائد في تبسيط جوانب أخرى من خريطة الطريق.
أحد الشروط الأساسية للأمان والوصولية والحياد الموثوقالبساطة هي. إذا كان البروتوكول جميل وبسيط، فإنه يقلل من احتمالية وجود الأخطاء. فإنه يزيد من احتمالية أن يتمكن المطورون الجدد من الانضمام والعمل مع أي جزء منه. إنه من المرجح أن يكون أكثر عدلاً وأسهل في الدفاع ضد المصالح الخاصة. للأسف، البروتوكولات، مثل أي نظام اجتماعي، يصبح بشكل افتراضي أكثر تعقيدًا مع مرور الوقت. إذا لم نكن نريد أن يذهب إثيريوم إلى حفرة سوداء من التعقيد المتزايد باستمرار، فإننا بحاجة إلى القيام بإحدى الأمور الاثنتين: (أ) التوقف عن إجراء التغييرات وتصلب البروتوكول، (ب) القدرة على إزالة الميزات فعليًا وتقليل التعقيد. من الممكن أيضًا اللجوء إلى طريق وسط، وهو إجراء تغييرات أقل في البروتوكول، وكذلك إزالة على الأقل بعض التعقيد مع مرور الوقت. سيتحدث هذا القسم عن كيف يمكننا تقليل أو إزالة التعقيد.
لا يوجد حل واحد كبير يمكن أن يقلل من تعقيد البروتوكول؛ فالطبيعة الجوهرية للمشكلة هي وجود العديد من الإصلاحات الصغيرة.
مثال واحد تم انجازه بالفعل بشكل كبير، ويمكن أن يكون كدليل لكيفية التعامل مع الآخرين، هو@vbuterin/selfdestruct">إزالة تعليمات SELFDESTRUCT. كانت تعليمات SELFDESTRUCT الوحيدة التي يمكن أن تعدل عددًا غير محدود من فتحات التخزين داخل كتلة واحدة، مما يتطلب من العملاء تنفيذ مزيد من التعقيد لتجنب هجمات DoS. الغرض الأصلي من التعليمات كان تمكين تطهير الحالة بشكل طوعي، مما يسمح بتقليل حجم الحالة مع مرور الوقت. في الواقع، انتهى قليل جدًا من استخدامها.تم تخفيض كود العمليةللسماح فقط بحسابات النفاد الذاتي التي تم إنشاؤها في نفس العملية في الشوكة الصعبة لـ Dencun. يحل هذا المشكلة DoS ويسمح بتبسيط كبير في كود العميل. في المستقبل ، من المرجح أن يكون من المنطقي إزالة العملية البرمجية بشكل كامل.
تتضمن بعض الأمثلة الرئيسية لفرص تبسيط البروتوكول التي تم تحديدها حتى الآن ما يلي. أولا ، بعض الأمثلة التي تقع خارج EVM ؛ وهي غير جراحية نسبيا، وبالتالي يسهل الحصول على توافق في الآراء بشأنها وتنفيذها في إطار زمني أقصر.
الآن، بعض الأمثلة التي توجد داخل إثيريوم:
أكبر تضحية في القيام بنوع من تبسيط الميزات هو (i) مدى تبسيطنا وسرعتنا مقابل (ii) التوافق مع الإصدارات السابقة. يأتي قيمة إيثيريوم كسلسلة من أنها منصة يمكنك نشر تطبيق وتكون واثقًا من أنه سيعمل لسنوات عديدة في المستقبل. في الوقت نفسه، من الممكن أن نأخذ هذه الفكرة إلى حد بعيد جدًا.للتعبير بشكل مختصر عن وليام جينينغز برايان، "صلب Ethereum على صليب التوافق العكسي". إذا كانت هناك فقط تطبيقين في Ethereum يستخدمان ميزة معينة، واحد منهما لم يستخدمه أي مستخدم لسنوات والآخر تقريبًا غير مستخدم تمامًا ويضمن إجمالي قيمة 57 دولارًا، فعلينا فقط إزالة هذه الميزة، وإذا لزم الأمر دفع تعويضات قدرها 57 دولارًا من جيبنا.
المشكلة الاجتماعية الأوسع هي في إنشاء خط أنابيب موحد لجعل التغييرات التي لا تشكل طارئًا وتعمل بالاتجاه العكسي متوافقة مع الإصدارات السابقة. أحد الطرق للتعامل مع هذا هو فحص وتوسيع السابقات الموجودة ، مثل عملية SELFDESTRUCT. يبدو أن خط الأنابيب يبدو كما يلي:
يجب أن يكون هناك أنبوب متعدد السنوات بين الخطوة 1 والخطوة 4، مع معلومات واضحة حول العناصر الموجودة في كل خطوة. في ذلك الوقت، هناك تضاد بين كيفية قوية وسريعة خط الإزالة الميزات، مقابل أن تكون أكثر حذراً ووضع المزيد من الموارد في مجالات أخرى من تطوير البروتوكول، ولكننا لا نزال بعيدين عن الحد الأمثل.
مجموعة رئيسية من التغييرات التي تم اقتراحها على EVM هيتنسيق كائن EVM (EOF). يقدم EOF عددًا كبيرًا من التغييرات ، مثل حظر مراقبة الغاز ، ومراقبة الكود (أي CODECOPY غير موجود) ، والسماح بالقفزات الثابتة فقط. الهدف هو السماح بترقية EVM بشكل أكبر ، بطريقة تحتوي على خصائص أقوى ، مع الحفاظ على التوافق مع الإصدارات السابقة (بما أن EVM قبل EOF ستظل قائمة).
لديها ميزة في أنها تخلق مسارًا طبيعيًا لإضافة ميزات EVM جديدة وتشجيع الهجرة إلى EVM أكثر قيودًا مع ضمانات أقوى. لها عيب في أنها تزيد بشكل كبير من تعقيد البروتوكول، ما لم نتمكن من العثور على طريقة لإهمال الـ EVM القديم وإزالته في النهاية. إحدى الأسئلة الرئيسية هي: ما هو دور EOF في مقترحات تبسيط EVM، خاصة إذا كان الهدف هو تقليل تعقيد EVM ككل؟
العديد من اقتراحات "التحسين" في بقية الخريطة الطريقة هي أيضًا فرص لتبسيط الميزات القديمة. لتكرار بعض الأمثلة من أعلاه:
استراتيجية Vereinigung für eine radikalere Vereinfachung von Ethereum ist es, das Protokoll unverändert zu lassen, aber große Teile davon von Protokollfunktionen zu Vertragscode zu verlagern.
أقصى نسخة من ذلك ستكون جعل Ethereum L1 "فنيا" يكون فقط سلسلة البيكون، وإدخال آلة افتراضية بسيطة (مثل ريسك-V, القاهرة، أو شيء أكثر أصغر حتى تخصص لأنظمة الإثبات) الذي يسمح لأي شخص آخر بإنشاء لفهم الخاصة بهم. ثم سيتحول EVM إلى أول هذه اللفات. هذا هو بالضبط نفس النتيجة بشكل ساخر كما اقتراحات بيئة التنفيذ من 2019-20، على الرغم من أن SNARKs يجعل من الأكثر قابلية للتنفيذ بشكل كبير.
قد يكون النهج الأكثر اعتدالا هو الحفاظ على العلاقة بين سلسلة المنارة وبيئة تنفيذ Ethereum الحالية كما هي, ولكن قم بإجراء مبادلة موضعية ل EVM. يمكننا اختيار RISC-V أو Cairo أو VM آخر ليكون "Ethereum VM" الجديد ، ثم فرض تحويل جميع عقود EVM إلى رمز VM جديد يفسر منطق الكود الأصلي (عن طريق تجميعه أو تفسيره). من الناحية النظرية ، يمكن القيام بذلك حتى مع كون "الجهاز الظاهري المستهدف" إصدارا من EOF.