في الوقت الحالي ، يختار أكثر محركي ألعاب سلسلة كاملة ، وهما Curio و Argus ، تحسين أداء الاستعلام لحالة اللعبة وزيادة القدرة على التكيف مع ألعاب محددة كاملة السلسلة من خلال عقود مجمعة مسبقًا للعقد المخصصة. إذن ما هو مسبقًا - التجميع؟ العقود ، ولماذا يمكن للعقود المجمعة مسبقًا تحسين الأداء؟ في الختام ، يرجى قراءة هذا المقال العلمي الشهير: العقود المجمعة مسبقًا لألعاب السلسلة الكاملة 101.
** ما هو العقد المجمع مسبقًا؟ **
تعد العقود المجمعة مسبقًا طريقة حل وسط مستخدمة في EVM لتوفير وظائف مكتبة أكثر تعقيدًا (تستخدم عادةً للعمليات المعقدة مثل التشفير والتجزئة) ، ويمكن أيضًا فهمها على أنها عقد خاص ، وهذه الوظائف ليست مناسبة لكتابة أكواد التشغيل. إنها مناسبة للعقود البسيطة ولكن يتم استدعاؤها بشكل متكرر ، أو العقود الثابتة منطقيًا ولكنها مكثفة من الناحية الحسابية. يتم تنفيذ العقود المجمعة مسبقًا باستخدام كود عميل العقدة ، ولأنها لا تتطلب أداة EVM ، فإنها تعمل بسرعة. كما أنها أقل تكلفة للمطور من استخدام الوظائف التي تعمل مباشرة في EVM.
كما يتضح من الكود التالي ، فإن وظيفة التشغيل في عقد evm.go لها فرعين: الفرع الأول هو إنشاء مثيل معلمة الفهرس من خلال الفهرس المترجم مسبقًا لتحديد العقد المترجم مسبقًا ، والفرع الثاني هو تحديد المترجم مسبقًا العقد إذا لم يكن عقدًا مترجمًا مسبقًا ، فسيتم استدعاء EVM.
// run يدير العقد المحدد ويهتم بتشغيل المجمعات المسبقة مع الرجوع لمترجم كود البايت.
func run (evm * EVM، contract * Contract، input [] byte، readOnly bool) ([] بايت ، خطأ) {
إذا كان Contract.CodeAddr! = لا شيء {
ما قبل التحويل البرمجي: = مترجم مُسبق
إذا كانت evm.ChainConfig (). IsByzantium (evm.BlockNumber) {
تجميعات مسبقة = compompiledContractsByzantium
}
إذا كان p: = تجميعات مسبقة [* contract.CodeAddr] ؛ ع! = لا شيء {
إرجاع RunPrecompiledContract (ع ، إدخال ، عقد)
}
}
بالنسبة إلى _ ، مترجم: = مجموعة evm. مترجمون فوريون {
إذا مترجم. CanRun (contract.Code) {
إذا كان evm.interpreter! = مترجم {
// تأكد من تراجع مؤشر المترجم الفوري
// لقيمته الحالية عند العودة.
تأجيل func (i Interpreter) {
evm.interpreter = أنا
} (evm.interpreter)
evm.interpreter = مترجم
}
عودة المترجم. تشغيل (عقد ، إدخال ، للقراءة فقط)
}
}
إرجاع لا شيء ، ErrNoComp CompatibleInterpreter
}
إذا تم التعبير عنه بيانياً ، يكون المنطق المحدد كما يلي:
ECRecover - استرداد العنوان المقابل من خلال التوقيع
SHA256 - حساب تجزئة SHA256
RIPEMD160 - حساب تجزئة RIPEMD160
الهوية - إرجاع القيمة الأصلية لبيانات الإدخال
ModExp - ينفذ طريقة الأسي
ECAdd - إضافة نقطة منحنى إهليلجي
ECMul - ضرب نقطة المنحنى الإهليلجي
ECPairing - عملية الاقتران ، التحقق من نقاط المنحنى الإهليلجي
يمكنك أن ترى أن العقود المترجمة مسبقًا من الأول إلى الرابع توفر التوقيع الأساسي والتجزئة ووظائف التشفير الأخرى ، والعقد الخامس إلى الثامن يوفر عمليات منحنى ناقص ، والتي تتعلق بـ zk-snark.
لذا فإن السؤال هو ، لماذا لا يدعم التجميع المسبق لـ Ethereum سوى ثمانية عقود مترجمة مسبقًا؟ ألا تقلل العقود المجمعة مسبقًا من استهلاك الغاز؟ ولماذا لا يتم زرع ECS (إطار عمل لعبة السلسلة بأكملها) مباشرةً في عقد Ethereum المُجمع مسبقًا؟
في الواقع ، هناك ثلاثة أسباب رئيسية:
سيؤدي الاعتماد المفرط على العقود المجمعة مسبقًا إلى تقليل درجة اللامركزية في النظام الأساسي بأكمله:
بادئ ذي بدء ، يجب دمج رمز العقد المترجم مسبقًا في رمز عقدة العميل ، مما يزيد من تعقيد العميل. ثانيًا ، قد تقوم عقد التحقق بتصفية حساب العقود المجمعة مسبقًا لأسباب أمنية ، لذلك يتم إكمال معظم طلبات العقود المجمعة مسبقًا بواسطة العقد الكاملة. حاليًا ، لا يوجد سوى 4000-6000 عقد إيثيريوم كاملة في العالم ، وهناك 500000 عملية تحقق العقد ، والتي هي في الواقع أكثر مركزية بكثير من العقود غير المجمعة مسبقًا.
تتطلب إضافة وتعديل العقود المجمعة مسبقًا ترقيات هارد فورك ، والتي ليس من السهل تطويرها بمرونة.
يتطلب دعم العقود المترجمة مسبقًا عملية EIP ، على سبيل المثال: يضيف EIP-196 عقدين تم تجميعهما مسبقًا ، ECADD () و ECMUL () ، على منحنى alt \ _bn128. يضيف EIP-197 وظيفة الاقتران على منحنى alt \ _bn128. في الأساس ، هو إتاحة الخصوصية على Ethereum للحصول على الدعم ، وعملية EIP بأكملها طويلة وأنيقة ، ولا يعد انتظار مرور EIP مشكلة واقعية.
من الصعب التفاعل والجمع بين العقود المجمعة مسبقًا ، وقابلية التوسع ضعيفة.
هذا ليس بالكثير لتفسيره ، إنه بديهي للغاية.
ما هو الدور الذي يلعبه العقد المترجم مسبقًا في لعبة السلسلة بأكملها؟
تتخطى العقود المجمعة مسبقًا EVM ويتم تنفيذها مباشرة من خلال العقد ، مما قد يؤدي إلى تحسين كفاءة الحوسبة ، ولكن في نفس الوقت تقلل من درجة اللامركزية في السلسلة بأكملها. يمكن أن يؤدي التجميع المسبق للمنطق الأساسي للألعاب المستخدمة بشكل متكرر إلى تحسين أداء هذه الألعاب. أنواع الألعاب المختلفة لها منطق رئيسي مختلف. لذلك ، بالنسبة للسلسلة المخصصة لنوع معين من الألعاب ، يمكن أن يؤدي تصميمها المجمع مسبقًا إلى تحسين احتياجات هذا النوع من الألعاب. أثناء عملية تكرار اللعبة ، سيتم تحسين مجموعة العقود المجمعة مسبقًا الأكثر كفاءة تدريجيًا.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
سلسلة كاملة لعبة 101: العقود المجمعة مسبقا
المصدر: Gametaverse
في الوقت الحالي ، يختار أكثر محركي ألعاب سلسلة كاملة ، وهما Curio و Argus ، تحسين أداء الاستعلام لحالة اللعبة وزيادة القدرة على التكيف مع ألعاب محددة كاملة السلسلة من خلال عقود مجمعة مسبقًا للعقد المخصصة. إذن ما هو مسبقًا - التجميع؟ العقود ، ولماذا يمكن للعقود المجمعة مسبقًا تحسين الأداء؟ في الختام ، يرجى قراءة هذا المقال العلمي الشهير: العقود المجمعة مسبقًا لألعاب السلسلة الكاملة 101.
** ما هو العقد المجمع مسبقًا؟ **
تعد العقود المجمعة مسبقًا طريقة حل وسط مستخدمة في EVM لتوفير وظائف مكتبة أكثر تعقيدًا (تستخدم عادةً للعمليات المعقدة مثل التشفير والتجزئة) ، ويمكن أيضًا فهمها على أنها عقد خاص ، وهذه الوظائف ليست مناسبة لكتابة أكواد التشغيل. إنها مناسبة للعقود البسيطة ولكن يتم استدعاؤها بشكل متكرر ، أو العقود الثابتة منطقيًا ولكنها مكثفة من الناحية الحسابية. يتم تنفيذ العقود المجمعة مسبقًا باستخدام كود عميل العقدة ، ولأنها لا تتطلب أداة EVM ، فإنها تعمل بسرعة. كما أنها أقل تكلفة للمطور من استخدام الوظائف التي تعمل مباشرة في EVM.
كما يتضح من الكود التالي ، فإن وظيفة التشغيل في عقد evm.go لها فرعين: الفرع الأول هو إنشاء مثيل معلمة الفهرس من خلال الفهرس المترجم مسبقًا لتحديد العقد المترجم مسبقًا ، والفرع الثاني هو تحديد المترجم مسبقًا العقد إذا لم يكن عقدًا مترجمًا مسبقًا ، فسيتم استدعاء EVM.
// run يدير العقد المحدد ويهتم بتشغيل المجمعات المسبقة مع الرجوع لمترجم كود البايت. func run (evm * EVM، contract * Contract، input [] byte، readOnly bool) ([] بايت ، خطأ) { إذا كان Contract.CodeAddr! = لا شيء { ما قبل التحويل البرمجي: = مترجم مُسبق إذا كانت evm.ChainConfig (). IsByzantium (evm.BlockNumber) { تجميعات مسبقة = compompiledContractsByzantium } إذا كان p: = تجميعات مسبقة [* contract.CodeAddr] ؛ ع! = لا شيء { إرجاع RunPrecompiledContract (ع ، إدخال ، عقد) } } بالنسبة إلى _ ، مترجم: = مجموعة evm. مترجمون فوريون { إذا مترجم. CanRun (contract.Code) { إذا كان evm.interpreter! = مترجم { // تأكد من تراجع مؤشر المترجم الفوري // لقيمته الحالية عند العودة. تأجيل func (i Interpreter) { evm.interpreter = أنا } (evm.interpreter) evm.interpreter = مترجم } عودة المترجم. تشغيل (عقد ، إدخال ، للقراءة فقط) } } إرجاع لا شيء ، ErrNoComp CompatibleInterpreter }
إذا تم التعبير عنه بيانياً ، يكون المنطق المحدد كما يلي:
! [qywWWb5gt8l7VZJQbIvoAyoVlqiSjncPOnWk7feQ.png] (https://img-cdn.gateio.im/resized-social/moments-40baef27dd-dc1987129a-dd1a6f-1c6801) "7082594"
إذن أين عنق الزجاجة في العقد المجمع مسبقًا؟
لدى Ethereum حاليًا ثمانية عقود مجمعة مسبقًا:
يمكنك أن ترى أن العقود المترجمة مسبقًا من الأول إلى الرابع توفر التوقيع الأساسي والتجزئة ووظائف التشفير الأخرى ، والعقد الخامس إلى الثامن يوفر عمليات منحنى ناقص ، والتي تتعلق بـ zk-snark.
لذا فإن السؤال هو ، لماذا لا يدعم التجميع المسبق لـ Ethereum سوى ثمانية عقود مترجمة مسبقًا؟ ألا تقلل العقود المجمعة مسبقًا من استهلاك الغاز؟ ولماذا لا يتم زرع ECS (إطار عمل لعبة السلسلة بأكملها) مباشرةً في عقد Ethereum المُجمع مسبقًا؟
في الواقع ، هناك ثلاثة أسباب رئيسية:
بادئ ذي بدء ، يجب دمج رمز العقد المترجم مسبقًا في رمز عقدة العميل ، مما يزيد من تعقيد العميل. ثانيًا ، قد تقوم عقد التحقق بتصفية حساب العقود المجمعة مسبقًا لأسباب أمنية ، لذلك يتم إكمال معظم طلبات العقود المجمعة مسبقًا بواسطة العقد الكاملة. حاليًا ، لا يوجد سوى 4000-6000 عقد إيثيريوم كاملة في العالم ، وهناك 500000 عملية تحقق العقد ، والتي هي في الواقع أكثر مركزية بكثير من العقود غير المجمعة مسبقًا.
يتطلب دعم العقود المترجمة مسبقًا عملية EIP ، على سبيل المثال: يضيف EIP-196 عقدين تم تجميعهما مسبقًا ، ECADD () و ECMUL () ، على منحنى alt \ _bn128. يضيف EIP-197 وظيفة الاقتران على منحنى alt \ _bn128. في الأساس ، هو إتاحة الخصوصية على Ethereum للحصول على الدعم ، وعملية EIP بأكملها طويلة وأنيقة ، ولا يعد انتظار مرور EIP مشكلة واقعية.
هذا ليس بالكثير لتفسيره ، إنه بديهي للغاية.
ما هو الدور الذي يلعبه العقد المترجم مسبقًا في لعبة السلسلة بأكملها؟
تتخطى العقود المجمعة مسبقًا EVM ويتم تنفيذها مباشرة من خلال العقد ، مما قد يؤدي إلى تحسين كفاءة الحوسبة ، ولكن في نفس الوقت تقلل من درجة اللامركزية في السلسلة بأكملها. يمكن أن يؤدي التجميع المسبق للمنطق الأساسي للألعاب المستخدمة بشكل متكرر إلى تحسين أداء هذه الألعاب. أنواع الألعاب المختلفة لها منطق رئيسي مختلف. لذلك ، بالنسبة للسلسلة المخصصة لنوع معين من الألعاب ، يمكن أن يؤدي تصميمها المجمع مسبقًا إلى تحسين احتياجات هذا النوع من الألعاب. أثناء عملية تكرار اللعبة ، سيتم تحسين مجموعة العقود المجمعة مسبقًا الأكثر كفاءة تدريجيًا.