تعتبر رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة معقدة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، يضطر المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة جداً. لذلك، فإن تحسين تكلفة الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يساهم تحسين استهلاك الغاز فقط في تقليل تكاليف المعاملات بشكل فعال، بل يعزز أيضًا من كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصاداً وفعالية في البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في نظام blockchain البيئي.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM ، تشير "Gas" إلى وحدة قياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
تتكون هيكلية EVM من ثلاث أجزاء لاستهلاك الغاز: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل صفقة يحتاج إلى موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تعرف الرسوم المطلوبة لإكمال معاملة باسم "رسوم الغاز".
منذ تفعيل الانقسام الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
ستتم إزالة الرسوم الأساسية، بينما ستعتبر الرسوم ذات الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم ذات أولوية أعلى عند إرسال المعاملة، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. هذا يشبه "إكرامية" يدفعها المستخدمون للمدققين.
فهم تحسينات الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة معترف بها من الغاز، وهذه التكاليف مسجلة في وثيقة إيثريوم البيضاء.
بعد عدة تعديلات على EIP، تم تعديل تكاليف الغاز لبعض الرموز التشغيلية، وقد تختلف عن تلك المذكورة في الكتاب الأصفر.
مفهوم غاز تحسين الأساسيات
المبدأ الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات التي تكون تكاليف الغاز فيها باهظة.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغير calldata، مثل مصفوفة calldata والهياكل
استدعاء الدالة الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
عمليات التكرار
أفضل الممارسات لتحسين رسوم الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بإعداد قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وودية للمستخدم.
1. حاول تقليل استخدام التخزين
في Solidity، تعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز فيها أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، تتكبد تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload وmstore 3 وحدات غاز، بينما تحتاج عمليات التخزين مثل sload وsstore حتى في أفضل الحالات إلى تكلفة لا تقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد عمليات تعديل التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وبعد الانتهاء من جميع العمليات الحسابية، يتم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
سيؤثر عدد مواقع التخزين ( المستخدمة في العقود الذكية وطرق عرض البيانات من المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم وحدة التخزين الأساسية المكونة من 32 بايت كفترة تخزين للمتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل معقول، بحيث يمكن لعدة متغيرات التكيف داخل فترة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(
) 3. تحسين نوع البيانات
يمكن تمثيل المتغير بأنواع بيانات متعددة، ولكن تكلفة العمليات المرتبطة بأنواع البيانات المختلفة تختلف أيضًا. يساعد اختيار نوع البيانات المناسب في تحسين استخدام الغاز.
على سبيل المثال، في Solidity، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، إلخ. نظرًا لأن EVM تنفذ العمليات بوحدات 256 بت، فإن استخدام uint8 يعني أن EVM يجب أن تقوم أولاً بتحويله إلى uint256، وهذه التحويلات ستستهلك غازًا إضافيًا.
عند النظر إليها بشكل منفصل، فإن استخدام uint256 هنا أرخص من uint8. ومع ذلك، إذا تم استخدام تحسين تعبئة المتغيرات الذي اقترحناه سابقًا، فسيكون الأمر مختلفًا. إذا كان بإمكان المطور تعبئة أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن التكلفة الإجمالية لتكرارها ستكون أقل من أربعة متغيرات uint256. بهذه الطريقة، يمكن للعقود الذكية قراءة وكتابة فتحة تخزين واحدة، ووضع أربعة متغيرات uint8 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 4. استخدام متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، ينبغي اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ###Arrays ( والتعيينات )Mappings (، لكن نحويتهما وبنيتهما مختلفتان تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، ولكن المصفوفات تتميز بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من memory
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بينهما هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب تفضيل استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنةً بالتخزين، ويوصى باستخدام الكلمات الرئيسية Constant أو Immutable كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 8. عند التأكد من عدم حدوث تجاوز/تحت التجاوز استخدم Unchecked
عندما يتمكن المطورون من التأكد من أن العمليات الرياضية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة الرئيسية unchecked التي تم تقديمها في Solidity v0.8.0، لتجنب الفحوصات الزائدة للتجاوز أو النقص، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في إصدارات 0.8.0 وما فوق، حيث أن المترجم نفسه يحتوي على ميزات حماية من الفيضانات والانخفاضات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. مُعدّل تحسين
تم تضمين كود المعدل في الدالة المعدلة، وعند استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدل، مما يمكن أن يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغل || و &&، تحدث عمليات المنطق تقييمًا قصيرًا، أي إذا كانت الحالة الأولى قادرة بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الحالة الثانية.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات باهظة التكلفة.
![إثيريوم العقود الذكية من أفضل 10 ممارسات لتحسين الغاز]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
فيما يلي بعض النصائح المفيدة:
استخدام أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب التخلص من هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم تعد هناك حاجة إلى متغير معين، ينبغي استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، وإخراج العمليات الحسابية المتكررة من جسم الحلقة.
2. استخدام العقود الذكية المسبقة التكوين
تقدم العقود الذكية المكتبات المعقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشفرة لا تعمل على EVM، بل تعمل محليًا على العقد العميل، فإن الغاز المطلوب يكون أقل. يمكن أن يساعد استخدام العقود الذكية في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية التوقيع الرقمي المنحني البيضاوي ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع المضمن
البرمجة المضمنة ### in-line assembly ( تسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذها مباشرة بواسطة EVM، دون الحاجة لاستخدام أوامر Solidity المكلفة. كما تتيح البرمجة المضمنة السيطرة بشكل أكثر دقة على استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع المدمج قد يجلب أيضًا مخاطر ويسهل الخروج
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 11
أعجبني
11
3
مشاركة
تعليق
0/400
SchrodingerWallet
· منذ 22 س
بالفعل أصبح رخيصًا ولكن لا يوجد مال للتداول
شاهد النسخة الأصليةرد0
BearMarketMonk
· منذ 22 س
تكاليف الغاز باهظة، لقد أصبحت فقيراً
شاهد النسخة الأصليةرد0
ApeWithAPlan
· منذ 22 س
متى يمكن أن تكون الأسعار أرخص؟ أسرع في L2 من فضلك.
دليل تحسين رسوم الغاز للعقود الذكية في إثيريوم: اسقاط التكاليف وزيادة الكفاءة
دليل تحسين رسوم الغاز للعقود الذكية إثيريوم
تعتبر رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة معقدة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، يضطر المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة جداً. لذلك، فإن تحسين تكلفة الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يساهم تحسين استهلاك الغاز فقط في تقليل تكاليف المعاملات بشكل فعال، بل يعزز أيضًا من كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصاداً وفعالية في البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في نظام blockchain البيئي.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM ، تشير "Gas" إلى وحدة قياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
تتكون هيكلية EVM من ثلاث أجزاء لاستهلاك الغاز: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل صفقة يحتاج إلى موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تعرف الرسوم المطلوبة لإكمال معاملة باسم "رسوم الغاز".
منذ تفعيل الانقسام الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
ستتم إزالة الرسوم الأساسية، بينما ستعتبر الرسوم ذات الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم ذات أولوية أعلى عند إرسال المعاملة، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. هذا يشبه "إكرامية" يدفعها المستخدمون للمدققين.
فهم تحسينات الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة معترف بها من الغاز، وهذه التكاليف مسجلة في وثيقة إيثريوم البيضاء.
بعد عدة تعديلات على EIP، تم تعديل تكاليف الغاز لبعض الرموز التشغيلية، وقد تختلف عن تلك المذكورة في الكتاب الأصفر.
مفهوم غاز تحسين الأساسيات
المبدأ الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات التي تكون تكاليف الغاز فيها باهظة.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين رسوم الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بإعداد قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وودية للمستخدم.
1. حاول تقليل استخدام التخزين
في Solidity، تعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز فيها أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، تتكبد تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload وmstore 3 وحدات غاز، بينما تحتاج عمليات التخزين مثل sload وsstore حتى في أفضل الحالات إلى تكلفة لا تقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
2. تعبئة المتغيرات
سيؤثر عدد مواقع التخزين ( المستخدمة في العقود الذكية وطرق عرض البيانات من المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم وحدة التخزين الأساسية المكونة من 32 بايت كفترة تخزين للمتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل معقول، بحيث يمكن لعدة متغيرات التكيف داخل فترة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(
) 3. تحسين نوع البيانات
يمكن تمثيل المتغير بأنواع بيانات متعددة، ولكن تكلفة العمليات المرتبطة بأنواع البيانات المختلفة تختلف أيضًا. يساعد اختيار نوع البيانات المناسب في تحسين استخدام الغاز.
على سبيل المثال، في Solidity، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، إلخ. نظرًا لأن EVM تنفذ العمليات بوحدات 256 بت، فإن استخدام uint8 يعني أن EVM يجب أن تقوم أولاً بتحويله إلى uint256، وهذه التحويلات ستستهلك غازًا إضافيًا.
عند النظر إليها بشكل منفصل، فإن استخدام uint256 هنا أرخص من uint8. ومع ذلك، إذا تم استخدام تحسين تعبئة المتغيرات الذي اقترحناه سابقًا، فسيكون الأمر مختلفًا. إذا كان بإمكان المطور تعبئة أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن التكلفة الإجمالية لتكرارها ستكون أقل من أربعة متغيرات uint256. بهذه الطريقة، يمكن للعقود الذكية قراءة وكتابة فتحة تخزين واحدة، ووضع أربعة متغيرات uint8 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 4. استخدام متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، ينبغي اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ###Arrays ( والتعيينات )Mappings (، لكن نحويتهما وبنيتهما مختلفتان تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، ولكن المصفوفات تتميز بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من memory
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بينهما هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب تفضيل استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنةً بالتخزين، ويوصى باستخدام الكلمات الرئيسية Constant أو Immutable كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 8. عند التأكد من عدم حدوث تجاوز/تحت التجاوز استخدم Unchecked
عندما يتمكن المطورون من التأكد من أن العمليات الرياضية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة الرئيسية unchecked التي تم تقديمها في Solidity v0.8.0، لتجنب الفحوصات الزائدة للتجاوز أو النقص، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في إصدارات 0.8.0 وما فوق، حيث أن المترجم نفسه يحتوي على ميزات حماية من الفيضانات والانخفاضات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. مُعدّل تحسين
تم تضمين كود المعدل في الدالة المعدلة، وعند استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدل، مما يمكن أن يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغل || و &&، تحدث عمليات المنطق تقييمًا قصيرًا، أي إذا كانت الحالة الأولى قادرة بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الحالة الثانية.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات باهظة التكلفة.
![إثيريوم العقود الذكية من أفضل 10 ممارسات لتحسين الغاز]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
فيما يلي بعض النصائح المفيدة:
استخدام أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب التخلص من هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم تعد هناك حاجة إلى متغير معين، ينبغي استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، وإخراج العمليات الحسابية المتكررة من جسم الحلقة.
2. استخدام العقود الذكية المسبقة التكوين
تقدم العقود الذكية المكتبات المعقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشفرة لا تعمل على EVM، بل تعمل محليًا على العقد العميل، فإن الغاز المطلوب يكون أقل. يمكن أن يساعد استخدام العقود الذكية في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية التوقيع الرقمي المنحني البيضاوي ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع المضمن
البرمجة المضمنة ### in-line assembly ( تسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذها مباشرة بواسطة EVM، دون الحاجة لاستخدام أوامر Solidity المكلفة. كما تتيح البرمجة المضمنة السيطرة بشكل أكثر دقة على استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع المدمج قد يجلب أيضًا مخاطر ويسهل الخروج