تم إصدار أحدث إصدار من مترجم Solidity v0.8.22. يتضمن برنامج التحويل البرمجي 0.8.22 عددا من تحسينات اللغة والمترجم ، مثل تعريفات الأحداث على مستوى الملف ، والتحسين التدريجي للحلقات غير المحددة ، ودعم استيراد تجميع EVM JSON ، والمزيد.
هام
يقلل هذا الإصدار من دعم EVMs أسفل القسطنطينية (القسطنطينية) ، والتي أصبح من الصعب الحفاظ عليها بشكل متزايد. لطالما عفا الزمن على شبكة Ethereum الرئيسية وشبكة الاختبار ، ونشك في أنها لم تعد ذات صلة بالشبكات الأخرى أيضا. تعمل مسارات وحلول التعليمات البرمجية المعقدة على إبطاء تطوير الميزات واختبارها للإصدارات الجديدة ، لذلك نتوقع التوقف عن دعمها في إصدارات المحول البرمجي المستقبلية. إذا كنت تعتمد على دعم إصدارات EVM هذه ، فيرجى الاتصال بنا[6] 。
يسلط الضوء على ميزة جديدة
زيادة الحلقة غير المحددة
استخدام الحساب غير المحدد عند زيادة عداد الحلقة هو لتحسين الغاز[7] ممارسة شائعة. دعنا نوضح بالمثال التالي للحلقة والعداد i:
ل (uint i = 0; i < array.length ؛ ++ i) {
ACC += صفيف[i] ; لم يتم تعديله بواسطة جسم الحلقة
}
في كثير من الحالات (انظر الشروط الدقيقة أدناه) ، ستضمن عملية المقارنة عدم وصولي أبدا إلى الحد الأقصى لقيمة نوعها ، لذلك من الآمن افتراض أن الحلقة ستتوقف قبل الوصول إلى القيمة القصوى. في هذه الحالة ، سيكون فحص السلامة للعداد زائدا عن الحاجة ومضيعة للغاز. يشجع هذا المستخدم على استخدام النمط الطويل غير المحدد ، والذي يلف العداد بشكل تدريجي في كتلة حسابية غير محددة داخل الحلقة ، متجاوزا الشيك:
ل (uint i = 0; i < array.length ؛) {
ACC += صفيف[i] ;
غير محدد { i ++ ; } // يتم زيادة عدد مرات عدم وجود فحوصات تجاوز - يتم استخدام غاز أقل
}
تقدم Solidity 0.8.22 تحسينا لفحص الفائض يقوم تلقائيا بإنشاء زيادة حسابية غير محددة لعداد الحلقة. يلغي هذا التحسين الجديد الحاجة إلى استخدام نمط دلتا طويل لم يتم التحقق منه في أجسام الحلقة مثل تلك الموجودة في المثال السابق.
في المقابل ، تمكن التحسينات الجديدة المستخدمين من العودة إلى التعليمات البرمجية الخام الأكثر قابلية للقراءة دون التضحية بكفاءة الغاز.
الشروط الدقيقة لفحص تجنب الانسكاب المحسن حديثا هي كما يلي:
ظروف الدورة على شكل < ... حيث i متغير محلي (من الآن فصاعدا يسمى "عداد الحلقة").
يجب إجراء هذه المقارنة على نفس نوع عداد الحلقة ، أي يجب تحويل النوع الموجود على اليمين ضمنيا إلى نوع عداد الحلقة بحيث لا يتم تمديد عداد الحلقة ضمنيا قبل المقارنة.
يجب أن يكون عداد الحلقة متغيرا محليا من نوع العدد الصحيح المدمج.
يجب أن يكون تعبير الحلقة بادئة أو زيادة لاحقة لعداد الحلقة ، i ++ أو ++ i.
لا يمكن تعديل عداد الدورة في حالة دورة أو في جسم دورة.
لتوضيح الشرط الثاني ، ضع في اعتبارك مقتطف الشفرة التالي:
ل (uint8 i = 0; في < UINT16(1000); ++ I) {
حلقة الجسم
}
في هذه الحالة ، يتم تحويل i إلى uint16 قبل المقارنة ، ولا يكون الشرط خاطئا أبدا ، لذلك لا يمكن إزالة فحص التجاوز المتزايد.
لاحظ أيضا أن < هو عامل المقارنة الوحيد الذي يقوم بتشغيل التحسين. يتم استبعاد المشغل < = والمشغلين الآخرين عمدا. بالإضافة إلى ذلك ، يجب أن يكون المشغل مدمجا - < المعرفة من قبل المستخدم غير مؤهلة.
التحسين واضح ومباشر ومفيد دائما ، لذلك سيتم تمكينه حتى إذا تم تعطيل بقية المحسن باستخدام إعدادات الإعداد الشائعة.optimizer.enabled. يمكنك إيقاف تشغيله بشكل صريح عن طريق تعيين settings.optimizer.details.simpleCounterForLoopUncheckedIncrement إلى false في إدخال JSON القياسي. لا يمكن تعطيله باستخدام واجهة سطر الأوامر.
اضبط محسن Yul لتجديد صفر حرفي
يعتمد الإصدار الجديد على دعم رمز التشغيل PUSH0 الذي تم تقديمه في الإصدار 0.8.20 عن طريق إضافة Rematerialiser[8] [9] يتم تمديد خطوة التحسين لتجديد الصفر الحرفي دائما بدلا من تخزينه كمرجع متغير ، مما يسمح باستخدام PUSH0 بدلا من DUP لتقليل تكاليف الغاز. لضمان القيام بذلك بشكل فعال ، تتم إضافة Rematerialiser و UnusedPruner تتم إضافة الخطوات إلى تسلسل التنظيف الافتراضي لمحسن Yul.
إضافة دعم لاستيراد تجميع EVM JSON (تجريبي)
يضيف هذا الإصدار الجديد دعما تجريبيا لاستيراد تجميعات EVM ، مما يفتح إمكانية الأدوات الخارجية لإجراء تحسينات فائقة قبل إنشاء رمز البايتوكود. الغرض الرئيسي من هذه الميزة هو تحديد تنسيق تسلسل لتجميعات EVM منخفضة المستوى بحيث يمكن تصدير التجميعات التي ينشئها المترجم وتعديلها وإعادة استيرادها ، وبالتالي استئناف عملية التجميع العادية.
ملاحظة مهمة: هذه ميزة تجريبية وغير متوفرة حاليا قيد الإنتاج. نحن نقدم هذه الميزة في هذا الإصدار حتى تتمكن من تجربتها وتقديم ملاحظات.
يسمح بتعريف الأحداث على مستوى الملف
الصلابة 0.8.22 يسمح لك بتحديد الأحداث على مستوى الملف. يمكن الآن وضع تعريفات الأحداث خارج نطاق العقد. يوفر هذا خيارا آخر لتنظيم التعليمات البرمجية دون الحاجة إلى التفاف الأحداث بشكل مصطنع في مكتبة.
بالإضافة إلى ذلك، يعمل هذا الإصدار على إصلاح خطأ تسبب في حدوث خطأ عند إنشاء NatSpec عند إصدار حدث محدد في عقد خارجي أو واجهة للتعليمات البرمجية. في الإصدار السابق (0.8.21) ، أضاف مترجم Solidity دعما للوصول المقيد إلى الأحداث المحددة في العقود والواجهات غير الموروثة من العقد الحالي ، لكن الخطأ منع الاستخدام الكامل للميزة.
من خلال إصلاح الأخطاء هذا والسماح بتعريفات الأحداث على مستوى الملف ، يتيح أحدث إصدار من Solidity للمستخدمين تجميع الأمثلة التالية دون أي أخطاء:
واجهة I {
حدث أجنبي ();
}
العقد جيم {
حدث أجنبي ();
}
الحدث E();
العقد د {
الدالة f() العامة {
قد يؤدي إصدار حدث أجنبي إلى حدوث خطأ داخلي في 0.8.21
تنبعث منها I.ForeignEvent ();
تنبعث منها C.ForeignEvent ();
إصدار حدث على مستوى الملف. ميزة جديدة.
تنبعث منها E ();
}
}
سجل التغيير الكامل
ميزات اللغة
يسمح بتعريف الأحداث على مستوى الملف.
ميزات المترجم
مولد التعليمات البرمجية: قم بإزالة عمليات التحقق من تجاوز السعة الزائدة عن الحاجة لبعض الحلقات عندما لا يتجاوز متغير العد.
واجهة سطر الأوامر: تمت إضافة خيار --no-import-callback لمنع المترجم من تحميل ملفات المصدر التي لم يتم تقديمها صراحة في CLI أو إدخال JSON القياسي.
واجهة سطر الأوامر: تمت إضافة خيار تجريبي --import-asm-json لاستيراد تجميعات EVM بالتنسيق المستخدم بواسطة --asm-json.
واجهة سطر الأوامر: استخدم الخطورة والتلوين المناسبين لرسائل الخطأ التي تم إنشاؤها خارج خط الأنابيب المترجم.
EVM: دعم مهمل لإصدارات EVM "homestead" و "tangerineWhistle" و "spuriousDragon" و "byzantium".
محلل : إزالة وضع استرداد الخطأ التجريبي (--error-recovery/settings.parserErrorRecovery).
SMTChecker: يدعم المشغلين المعرفة من قبل المستخدم.
محسن Yul: إذا كان PUSH0 مدعوما ، يفضل استخدام صفر حرفي بدلا من تخزين قيم صفرية في المتغيرات.
Yul Optimizer: يقوم بتشغيل خطوات Rematerializer و UnusedPruner في نهاية تسلسل التنظيف الافتراضي.
إصلاحات الأخطاء
مولد الكود: تم إصلاح مشكلة حيث يعتمد الإخراج عبر مولد كود VIA-IR على الملفات الموجودة في عمليات الاسترجاعات الخاصة بالاستيراد. في بعض الحالات ، يمكن أن تؤدي تعيينات AST ID المختلفة إلى تغيير ترتيب الوظائف في الجدولة الداخلية ، مما يؤدي إلى رموز بايت مختلفة على ما يبدو ولكنها مكافئة لغويا.
NatSpec: تم إصلاح خطأ داخلي عند طلب وثائق المستخدم أو وثائق التطوير لعقد ينبعث منه حدث محدد في عقد أو واجهة خارجية.
SMTChecker: تم إصلاح خطأ الترميز الذي تسبب في توسيع الحلقة بعد الانتهاء.
SMTChecker: التناقضات الثابتة في فحوصات الحالة الثابتة عندما يتم فك الجرح لفترة من الوقت أو للحلقة قبل فحص الحالة.
Yul Optimizer: تم إصلاح مشكلة تأثير أسماء متغيرات Yul التي تم إنشاؤها بواسطة المترجم أثناء CSE على قرارات الاستبدال ، مما أدى إلى اختلاف (ولكن مكافئ) في بعض الحالات.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تم إصدار نسخة جديدة من Solidity ، لغة تطوير العقود الذكية الأكثر شيوعا في Ethereum ،
التجميع: خطة الترجمة؛ المصدر: soliditylang.org
تم إصدار أحدث إصدار من مترجم Solidity v0.8.22. يتضمن برنامج التحويل البرمجي 0.8.22 عددا من تحسينات اللغة والمترجم ، مثل تعريفات الأحداث على مستوى الملف ، والتحسين التدريجي للحلقات غير المحددة ، ودعم استيراد تجميع EVM JSON ، والمزيد.
هام
يقلل هذا الإصدار من دعم EVMs أسفل القسطنطينية (القسطنطينية) ، والتي أصبح من الصعب الحفاظ عليها بشكل متزايد. لطالما عفا الزمن على شبكة Ethereum الرئيسية وشبكة الاختبار ، ونشك في أنها لم تعد ذات صلة بالشبكات الأخرى أيضا. تعمل مسارات وحلول التعليمات البرمجية المعقدة على إبطاء تطوير الميزات واختبارها للإصدارات الجديدة ، لذلك نتوقع التوقف عن دعمها في إصدارات المحول البرمجي المستقبلية. إذا كنت تعتمد على دعم إصدارات EVM هذه ، فيرجى الاتصال بنا[6] 。
يسلط الضوء على ميزة جديدة
زيادة الحلقة غير المحددة
استخدام الحساب غير المحدد عند زيادة عداد الحلقة هو لتحسين الغاز[7] ممارسة شائعة. دعنا نوضح بالمثال التالي للحلقة والعداد i:
ل (uint i = 0; i < array.length ؛ ++ i) {
ACC += صفيف[i] ; لم يتم تعديله بواسطة جسم الحلقة
}
في كثير من الحالات (انظر الشروط الدقيقة أدناه) ، ستضمن عملية المقارنة عدم وصولي أبدا إلى الحد الأقصى لقيمة نوعها ، لذلك من الآمن افتراض أن الحلقة ستتوقف قبل الوصول إلى القيمة القصوى. في هذه الحالة ، سيكون فحص السلامة للعداد زائدا عن الحاجة ومضيعة للغاز. يشجع هذا المستخدم على استخدام النمط الطويل غير المحدد ، والذي يلف العداد بشكل تدريجي في كتلة حسابية غير محددة داخل الحلقة ، متجاوزا الشيك:
ل (uint i = 0; i < array.length ؛) {
ACC += صفيف[i] ;
غير محدد { i ++ ; } // يتم زيادة عدد مرات عدم وجود فحوصات تجاوز - يتم استخدام غاز أقل
}
تقدم Solidity 0.8.22 تحسينا لفحص الفائض يقوم تلقائيا بإنشاء زيادة حسابية غير محددة لعداد الحلقة. يلغي هذا التحسين الجديد الحاجة إلى استخدام نمط دلتا طويل لم يتم التحقق منه في أجسام الحلقة مثل تلك الموجودة في المثال السابق.
في المقابل ، تمكن التحسينات الجديدة المستخدمين من العودة إلى التعليمات البرمجية الخام الأكثر قابلية للقراءة دون التضحية بكفاءة الغاز.
الشروط الدقيقة لفحص تجنب الانسكاب المحسن حديثا هي كما يلي:
لتوضيح الشرط الثاني ، ضع في اعتبارك مقتطف الشفرة التالي:
ل (uint8 i = 0; في < UINT16(1000); ++ I) {
حلقة الجسم
}
في هذه الحالة ، يتم تحويل i إلى uint16 قبل المقارنة ، ولا يكون الشرط خاطئا أبدا ، لذلك لا يمكن إزالة فحص التجاوز المتزايد.
لاحظ أيضا أن < هو عامل المقارنة الوحيد الذي يقوم بتشغيل التحسين. يتم استبعاد المشغل < = والمشغلين الآخرين عمدا. بالإضافة إلى ذلك ، يجب أن يكون المشغل مدمجا - < المعرفة من قبل المستخدم غير مؤهلة.
التحسين واضح ومباشر ومفيد دائما ، لذلك سيتم تمكينه حتى إذا تم تعطيل بقية المحسن باستخدام إعدادات الإعداد الشائعة.optimizer.enabled. يمكنك إيقاف تشغيله بشكل صريح عن طريق تعيين settings.optimizer.details.simpleCounterForLoopUncheckedIncrement إلى false في إدخال JSON القياسي. لا يمكن تعطيله باستخدام واجهة سطر الأوامر.
اضبط محسن Yul لتجديد صفر حرفي
يعتمد الإصدار الجديد على دعم رمز التشغيل PUSH0 الذي تم تقديمه في الإصدار 0.8.20 عن طريق إضافة Rematerialiser[8] [9] يتم تمديد خطوة التحسين لتجديد الصفر الحرفي دائما بدلا من تخزينه كمرجع متغير ، مما يسمح باستخدام PUSH0 بدلا من DUP لتقليل تكاليف الغاز. لضمان القيام بذلك بشكل فعال ، تتم إضافة Rematerialiser و UnusedPruner تتم إضافة الخطوات إلى تسلسل التنظيف الافتراضي لمحسن Yul.
إضافة دعم لاستيراد تجميع EVM JSON (تجريبي)
يضيف هذا الإصدار الجديد دعما تجريبيا لاستيراد تجميعات EVM ، مما يفتح إمكانية الأدوات الخارجية لإجراء تحسينات فائقة قبل إنشاء رمز البايتوكود. الغرض الرئيسي من هذه الميزة هو تحديد تنسيق تسلسل لتجميعات EVM منخفضة المستوى بحيث يمكن تصدير التجميعات التي ينشئها المترجم وتعديلها وإعادة استيرادها ، وبالتالي استئناف عملية التجميع العادية.
ملاحظة مهمة: هذه ميزة تجريبية وغير متوفرة حاليا قيد الإنتاج. نحن نقدم هذه الميزة في هذا الإصدار حتى تتمكن من تجربتها وتقديم ملاحظات.
يسمح بتعريف الأحداث على مستوى الملف
الصلابة 0.8.22 يسمح لك بتحديد الأحداث على مستوى الملف. يمكن الآن وضع تعريفات الأحداث خارج نطاق العقد. يوفر هذا خيارا آخر لتنظيم التعليمات البرمجية دون الحاجة إلى التفاف الأحداث بشكل مصطنع في مكتبة.
بالإضافة إلى ذلك، يعمل هذا الإصدار على إصلاح خطأ تسبب في حدوث خطأ عند إنشاء NatSpec عند إصدار حدث محدد في عقد خارجي أو واجهة للتعليمات البرمجية. في الإصدار السابق (0.8.21) ، أضاف مترجم Solidity دعما للوصول المقيد إلى الأحداث المحددة في العقود والواجهات غير الموروثة من العقد الحالي ، لكن الخطأ منع الاستخدام الكامل للميزة.
من خلال إصلاح الأخطاء هذا والسماح بتعريفات الأحداث على مستوى الملف ، يتيح أحدث إصدار من Solidity للمستخدمين تجميع الأمثلة التالية دون أي أخطاء:
واجهة I {
حدث أجنبي ();
}
العقد جيم {
حدث أجنبي ();
}
الحدث E();
العقد د {
الدالة f() العامة {
قد يؤدي إصدار حدث أجنبي إلى حدوث خطأ داخلي في 0.8.21
تنبعث منها I.ForeignEvent ();
تنبعث منها C.ForeignEvent ();
إصدار حدث على مستوى الملف. ميزة جديدة.
تنبعث منها E ();
}
}
سجل التغيير الكامل
ميزات اللغة
ميزات المترجم
إصلاحات الأخطاء