نظرة متعمقة على لعبة النزاع ودورها في اكتشاف الأخطاء ضمن أول نظام لإثبات الأخطاء في OP Stack.

ليس من قبيل المصادفة أن أحد أكثر مكونات نظام إثبات الأخطاء في OP Stack إثارة للاهتمام (FPS) هو لعبة النزاع. أوضحت المقالة السابقة عن FPS كيف تفصل نمطية OP Stack برنامج إثبات الخطأ (FPP) عن الآلة الافتراضية لإثبات الخطأ (FPVM)، مما يتيح مستوى جديدًا من القابلية للتركيب والترقيات المتوازية الفعالة للمكونين. ولا مبالغة في القول إن الأمر نفسه ينطبق على ألعاب النزاع.
تستكشف هذه المقالة دور ألعاب النزاع في اكتشاف الأخطاء اللامركزي ضمن منظومة السلسلة الفائقة، وكيفية بناء ألعاب نزاع لإثبات الأخطاء فوق اتفاقيات النزاع، وإمكانية ظهور مثل هذه الألعاب بفضل قابلية اتفاقيات النزاع للتوسع.
تُعد ألعاب النزاع الركائز الأساسية لاتفاقيات النزاع. فهي تحاكي آلة حالات بسيطة، وتُهيَّأ كل معلومة تكون صحتها محل نزاع بتعهد من 32 بايت. وتتضمن هذه المعلومة دالةً لحسم صحة هذا التعهد أو زيفه، ويُترك تعريفها لتنفيذ العنصر الأساسي. كان أول تنفيذ للعبة النزاع في OP Stack، FaultDefenteGame، لا يتطلب إذنًا لأن دالة حسمه كانت تُحدد وفق نتائج برنامج لإثبات الأخطاء يُنفذ فوق آلة افتراضية محاكاة.
تعتمد ألعاب النزاع على خاصيتين أساسيتين:
في اتفاقيات النزاع، يمكن إنشاء أنواع مختلفة من ألعاب النزاع وإدارتها وترقيتها عبر DisputeGameFactory. ويفتح ذلك الباب أمام ميزات مبتكرة، مثل أنظمة الإثبات المجمعة والبروتوكولات الموسعة لاستيعاب المسائل الخلافية خارج حالة بروتوكول الطبقة الثانية، مثل FaultDefenteGame الذي يستهدف التحقق الثنائي على البلوكشين.
هي لعبة نزاع مخصصة لنوع معين، وأول لعبة تُبنى على اتفاقية النزاع في OP Stack. في هذه اللعبة، يقسم اللاعب مسار التنفيذ ذهابًا وإيابًا حتى الوصول إلى كل خطوة. بعد أن ينتج عن التقسيم الثنائي تعهد بالحالة عند كل تعليمة تتبع، FaultDefenteGame تُستخدم آلة افتراضية عامة لتنفيذ خطوة تعليمة واحدة على السلسلة. يمكن أن تكون دالة انتقال حالة الآلة الافتراضية (لنسمِّها هي**T ) أي دالة، ما دامت تتبع الصيغة _T (s, i) - > s' _، حيث إن s = الحالة السابقة المتفق عليها و _i _ = مُدخل تحويل الحالة، s' ** = الحالة بعد التحويل.
بالنسبة إلى أول تنفيذ كامل لآلة افتراضية عامة ضمن لعبة ثنائية، نفذنا سياق خيط MIPS واحدًا فوق EVM لتنفيذ تعليمة واحدة ضمن مسار التنفيذ المُنشأ by`` Cannon وبرنامج op-program.
يشير الادعاء إلى التزام بحالة الآلة الافتراضية الخلفية عند تعليمة محددة. وقد يكون حقيقيًا أو زائفًا، وتُحدد صحته بعد مرحلة الحسم. وإذا لم يوجد طعن مضاد، يُعتبر الادعاء صحيحًا. ،
يعلن عن الموضع الموجود في الشجرة الثنائية. ويشير هذا الموضع إلى التعليمة التي يرتبط بها الادعاء. Position is a generalized index, which can be defined as 2^ {depth} + index_at_depth.
تكون إجراءات اللاعب محدودة زمنيًا. لا تتطلب هذه اللعبة إذنًا ويمكن لأي شخص الانضمام إليها. يبدأ كل طرف بـ 3.5 أيام من اللعب، بإجمالي 7 أيام من وقت اللعب. إذا أنشأت مسارًا جديدًا أو قدمت ادعاءً في موضع تلقيت فيه ادعاءً بالفعل، فهذه ساعة شطرنج بمستوى الخطوة-الجد.
يقسم اللاعبون المسار إلى قسمين حتى تصبح حالة الادعاء مرتبطة بتعليمة واحدة فقط للآلة الافتراضية. ثم ينفذون تلك التعليمة على السلسلة للتحقق من الادعاء أو دحضه. يمكن أن تكون الإجراءات هجومًا (للطعن في الادعاء الأب) أو دفاعًا (للموافقة على الادعاء الأب). كلما اتفق اللاعبون على تجزئة الادعاءات التي رصدوها (أي إن كلا الطرفين في الحالة نفسها عند أمر معين)، لكنهما يختلفان بشأن النتيجة النهائية التي يحاولان الوصول إليها بناءً على الاتفاق النسبي للادعاء المرصود، يُستخدم الادعاء الأساسي للدفاع.
عند العقدة الورقية لشجرة المواضع، يقدّم كل ادعاء الحالة عند تعليمة واحدة فقط للآلة الافتراضية. والخطوة الوحيدة المتبقية هي تنفيذ تعليمات الآلة الافتراضية لإثبات الادعاء الأب أو دحضه.
إذا أكدت خطوة الأمر الحالة اللاحقة المتوقعة، فإن الادعاء لا يصح. وإذا وُجدت حالة إصدار أو رمز خروج غير متوقع، فسيُدحض الادعاء الأب.
من المحتمل أن يُحل هذا النوع من الألعاب بعد استنفاد جميع ساعات الشطرنج المذكورة، بمدة لا تقل عن 3.5 أيام. كل ادعاء في اللعبة هو جذر لعبته الفرعية الخاصة (**لعبة فرعية) **. اللعبة الفرعية هي رسم بياني لا دوري موجه بعمق 1. جميع الألعاب الفرعية التي تشير إلى الجذر (والتي هي نفسها جذور ألعاب فرعية) تمثل طعونًا مضادة له، ولا يمكن حل اللعبة الفرعية إلا إذا حُلّت جميع ألعابها الفرعية التابعة أيضًا. ولا يمكن اعتبار جذر اللعبة الفرعية قد تعرض لطعن مضاد إلا إذا حُلّت لعبة فرعية واحدة أو أكثر من ألعاب جذر اللعبة الفرعية ولم تتعرض لطعن مضاد، وتستمر هذه الخاصية بالانتشار حتى الادعاء الجذري للعبة.
كما أن وجود لاعبين صادقين (بمجرد استنفاد جميع إجراءاتهم) يؤدي دائمًا إلى حل اللعبة بسلاسة وفق منظور مسارها، بغض النظر عما إذا كان الادعاء الأساسي صادقًا أم غير صادق. ويمكن لأي طرف دائمًا دحض الادعاء غير الصادق، رغم أنه لا يوجد سوى ادعاء صحيح واحد يمكن تقديمه، إذ لا يُسمح بتكرار تجزئات الادعاءات في الموضع نفسه ضمن اللعبة الفرعية نفسها.
0:00
1×
للمهتمين، تتوفر أيضًا أداة تصوّر لـ FaultDefenteGame، تستهدف مسار تنفيذ محاكى بطول 16 تعليمة فقط. تستخدم هذه المحاكاة آلة افتراضية منفصلة بسياق مختلف عن خيط MIPS، تُسمى AlphabetVM، ولا تعرض سوى الحرف التالي في الأبجدية عند إدخال حرف معين.
إذا كنت مهتمًا باستكشاف قواعد اللعبة باستخدام خلفية أخف، فإليك طريقة اللعب:
استنسخ مستودع Optimism الأحادي، وثبّت التبعيات، وأنشئ توزيعة devnet وملفات /cannon/op-program الثنائية.
التبعيات المطلوبة:
Foundry
سلسلة أدوات Golang
Docker
git clone git@github.com: ethereum-optimism/optimism.git & cd optimism & pnpm i & cd packages/contracts-bedrock & & forge install) & Make up cannon-prestate & Make up devnet-allocs
شغّل لعبة الأبجدية:
CD OP-CHALLENCHER & & MAKE ALPHABET
انتقل إلى https://disputify.optimism.io/ أو عبر الاستنساخ https://github.com/clabby/dispute-viz شغّل الواجهة الأمامية المرئية محليًا وأدخل عنوان وكيل FaultDefenteGame المنشور على شبكة التطوير المحلية أعلاه.
في لعبة ثنائية، تعمل جميع الآليات المذكورة أعلاه معًا لإنشاء نظام يكافئ السلوك الصادق ويتصدى بفعالية للادعاءات غير الصادقة.
هناك طرق كثيرة لبناء ألعاب نزاع تحقق الأهداف نفسها. نأمل أنه عند نشر FPS الخاص بـ OP Stack على OP Goerli، سيستمتع المطورون في منظومتنا ويبدعون في بناء ألعاب النزاع الخاصة بهم. ويمكن لكل لعبة نزاع تُنشأ أن تؤدي دورًا في اللامركزية الاجتماعية لـ OP Stack، وأن توفر للمشاركين في المنظومة خيارات بشأن كيفية حل النزاعات حول أي ادعاء يتعلق بمعلومة معينة.





