أفضل الممارسات لتحسين الغاز في العقود الذكية إثيريوم
تعتبر رسوم الغاز على الشبكة الرئيسية لإثيريوم مشكلة معقدة، خاصة عندما تكون الشبكة مزدحمة. يحتاج المستخدمون خلال أوقات الذروة إلى دفع رسوم交易 مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقلل تحسين استهلاك الغاز من تكاليف المعاملات فحسب، بل يعزز أيضًا كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكتشين أكثر اقتصادية وفعالية.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، كما تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوكتشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، ينقسم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، سيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال عملية بأنها "رسوم الغاز".
منذ سريان الانقسام الصعب في لندن EIP-1559( رقم )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير الرسوم الأساسية، بينما ستستخدم الرسوم ذات الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى البلوكشين. عند إرسال المعاملة، يمكن أن تؤدي إعداد رسوم أولية أعلى إلى زيادة احتمال تضمين المعاملة في البلوك التالي. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي سلسلة من التعليمات البرمجية ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) لها تكلفة استهلاك غاز معترف بها، يتم تسجيل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض رموز التشغيل، وقد تكون هناك اختلافات عن الكتاب الأصفر.
مفهوم تحسين الغاز الأساسي
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية في التكلفة على بلوكتشين EVM، وتجنب العمليات ذات تكلفة الغاز المرتفعة.
في EVM، تكون تكلفة العمليات التالية منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغير calldata، مثل مصفوفة calldata والهياكل
استدعاء الدوال الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
عملية التكرار
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وخفض تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.حاول تقليل استخدام التخزين
في سوليديتي، التخزين( هو مورد محدود، واستهلاك الغاز له أعلى بكثير من الذاكرة). في كل مرة يقرأ فيها العقد الذكي أو يكتب بيانات من التخزين، يتكبد تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تتطلب تعليمات OPcodesmload وmstore فقط 3 وحدات غاز، بينما تتطلب عمليات التخزين مثل sload وsstore، حتى في أفضل الحالات، تكلفة لا تقل عن 100 وحدة.
تشمل طرق تقييد استخدام التخزين:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد تعديلات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وانتظار إتمام جميع الحسابات، ثم تخصيص النتائج لمتغيرات التخزين.
( 2.تغليف المتغيرات
عدد Storage slot) المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك Gas.
سيقوم مترجم Solidity بتجميع المتغيرات التخزينية المتتالية أثناء عملية الترجمة، ويستخدم وحدة التخزين الأساسية للمتغيرات كفتحة تخزين بحجم 32 بايت. يشير تجميع المتغيرات إلى تنظيم المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات التكيف في فتحة تخزين واحدة.
من خلال تعديل هذه التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز ### تخزين فتحة تخزين غير مستخدمة تتطلب 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك غازًا، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 3.تحسين نوع البيانات
يمكن تمثيل المتغير بأنواع بيانات متعددة، لكن تكلفة العمليات المرتبطة بأنواع البيانات المختلفة تختلف أيضًا. يساعد اختيار نوع البيانات المناسب في تحسين استخدام الغاز.
على سبيل المثال، في Solidity، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، وما إلى ذلك. نظرًا لأن EVM ينفذ العمليات بوحدات 256 بت، فإن استخدام uint8 يعني أنه يجب على EVM أولاً تحويله إلى uint256، وهذه التحويلة ستستهلك الغاز بشكل إضافي.
عند النظر بشكل منفصل، فإن استخدام uint256 أرخص من uint8. ومع ذلك، إذا تم استخدام تحسين حزم المتغيرات الذي اقترحناه سابقًا، فإن الأمر يختلف. إذا تمكن المطورون من حزم أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن التكلفة الإجمالية لتكرارها ستكون أقل من تكلفة أربعة متغيرات uint256. بهذه الطريقة، يمكن للعقود الذكية قراءة وكتابة فتحة تخزين واحدة، ووضع أربعة متغيرات uint8 في الذاكرة/التخزين في عملية واحدة.
4.استخدام متغيرات ذات حجم ثابت بدلاً من المتغيرات الديناميكية
إذا كان بإمكان البيانات أن تظل ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان من الممكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
( 5.الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ) Arrays ### و الخرائط ### Mappings (، لكن بناء الجملة والهياكل الخاصة بها مختلفة تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم تكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية من أفضل 10 ممارسات لتحسين الغاز])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6.استخدم calldata بدلاً من memory
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
( 7.استخدم كلمات مفتاحية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات المفتاحية Constant أو Immutable كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp###
8.استخدام Unchecked عند التأكد من عدم حدوث تجاوز/تحت التجاوز
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب الفحوصات الزائدة عن الحاجة للتجاوز أو النقص، وبالتالي توفير تكاليف الغاز.
علاوة على ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في إصدارات 0.8.0 وما فوق، لأن المترجم نفسه قد تضمن ميزات حماية من الفائض والنقص.
( 9.محسن التعديل
تم تضمين كود المُعدّل في الدالة المُعدّلة، في كل مرة يتم فيها استخدام المُعدّل، يتم نسخ كوده. هذا سيزيد من حجم بايت كود ويزيد من استهلاك الغاز.
من خلال إعادة بناء المنطق إلى دالة داخلية _checkOwner)###، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10.تحسين الدائرة القصيرة
بالنسبة لمشغل || و &&، تحدث عمليات المنطق تقييم قصير، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات عالية التكلفة.
نصائح عامة إضافية
1. حذف الكود غير المفيد
إذا كان هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغير.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. في الجوهر، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لمتغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية عالية التكلفة، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2.استخدام العقود الذكية
تقدم العقود المسبقة التجميع دوال مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل على العقدة المحلية للعميل، فإن الغاز المطلوب يكون أقل. يمكن استخدام العقود المسبقة التجميع لتوفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقمي المنحني البيضاوي (ECDSA) وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
3.استخدام كود التجميع المضمن
البرمجة المدمجة ( in-line assembly ) يسمح للمطورين بكتابة كود منخفض المستوى لكن فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام رموز تشغيل Solidity باهظة الثمن. كما يسمح البرمجة المدمجة بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المضمن إلى مخاطر وسهولة في الخطأ. لذلك، يجب استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
![إثيريوم العقود الذكية Gas الأمثل أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 14
أعجبني
14
7
إعادة النشر
مشاركة
تعليق
0/400
SandwichTrader
· منذ 23 س
غاز طِر إلى السماء لقد أنقذت
شاهد النسخة الأصليةرد0
MEVictim
· 08-10 14:16
مرة أخرى، تتحدث عن هذه النظريات عديمة الفائدة، من الأفضل أن تعلمني كيفية انتهاز المراجحة.
شاهد النسخة الأصليةرد0
UnluckyValidator
· 08-10 11:27
هذا الغاز حقًا مزعج، لم أحصل على شيء بعد استخراج الكتلة.
شاهد النسخة الأصليةرد0
GasFeeCryer
· 08-10 11:15
كيف ارتفعت رسوم الغاز مرة أخرى، أوه أوه
شاهد النسخة الأصليةرد0
AlwaysAnon
· 08-10 11:14
أنقذني، متى سينخفض هذا الغاز؟
شاهد النسخة الأصليةرد0
0xSoulless
· 08-10 11:13
تم خداع الناس لتحقيق الربح حتى أصبح الكراث أصلع، وما زالوا يتحدثون عن هذا الوهم.
شاهد النسخة الأصليةرد0
SleepyValidator
· 08-10 11:09
أصبحت رسوم الغاز مرتفعة لدرجة أنني لا أستطيع تحمل تكاليف الطعام
إثيريوم العقود الذكية Gas تحسين التفاصيل: 10 نصائح عملية
أفضل الممارسات لتحسين الغاز في العقود الذكية إثيريوم
تعتبر رسوم الغاز على الشبكة الرئيسية لإثيريوم مشكلة معقدة، خاصة عندما تكون الشبكة مزدحمة. يحتاج المستخدمون خلال أوقات الذروة إلى دفع رسوم交易 مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقلل تحسين استهلاك الغاز من تكاليف المعاملات فحسب، بل يعزز أيضًا كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكتشين أكثر اقتصادية وفعالية.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، كما تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوكتشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، ينقسم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، سيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال عملية بأنها "رسوم الغاز".
منذ سريان الانقسام الصعب في لندن EIP-1559( رقم )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير الرسوم الأساسية، بينما ستستخدم الرسوم ذات الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى البلوكشين. عند إرسال المعاملة، يمكن أن تؤدي إعداد رسوم أولية أعلى إلى زيادة احتمال تضمين المعاملة في البلوك التالي. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي سلسلة من التعليمات البرمجية ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) لها تكلفة استهلاك غاز معترف بها، يتم تسجيل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض رموز التشغيل، وقد تكون هناك اختلافات عن الكتاب الأصفر.
مفهوم تحسين الغاز الأساسي
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية في التكلفة على بلوكتشين EVM، وتجنب العمليات ذات تكلفة الغاز المرتفعة.
في EVM، تكون تكلفة العمليات التالية منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وخفض تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.حاول تقليل استخدام التخزين
في سوليديتي، التخزين( هو مورد محدود، واستهلاك الغاز له أعلى بكثير من الذاكرة). في كل مرة يقرأ فيها العقد الذكي أو يكتب بيانات من التخزين، يتكبد تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تتطلب تعليمات OPcodesmload وmstore فقط 3 وحدات غاز، بينما تتطلب عمليات التخزين مثل sload وsstore، حتى في أفضل الحالات، تكلفة لا تقل عن 100 وحدة.
تشمل طرق تقييد استخدام التخزين:
( 2.تغليف المتغيرات
عدد Storage slot) المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك Gas.
سيقوم مترجم Solidity بتجميع المتغيرات التخزينية المتتالية أثناء عملية الترجمة، ويستخدم وحدة التخزين الأساسية للمتغيرات كفتحة تخزين بحجم 32 بايت. يشير تجميع المتغيرات إلى تنظيم المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات التكيف في فتحة تخزين واحدة.
من خلال تعديل هذه التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز ### تخزين فتحة تخزين غير مستخدمة تتطلب 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك غازًا، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(
) 3.تحسين نوع البيانات
يمكن تمثيل المتغير بأنواع بيانات متعددة، لكن تكلفة العمليات المرتبطة بأنواع البيانات المختلفة تختلف أيضًا. يساعد اختيار نوع البيانات المناسب في تحسين استخدام الغاز.
على سبيل المثال، في Solidity، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، وما إلى ذلك. نظرًا لأن EVM ينفذ العمليات بوحدات 256 بت، فإن استخدام uint8 يعني أنه يجب على EVM أولاً تحويله إلى uint256، وهذه التحويلة ستستهلك الغاز بشكل إضافي.
عند النظر بشكل منفصل، فإن استخدام uint256 أرخص من uint8. ومع ذلك، إذا تم استخدام تحسين حزم المتغيرات الذي اقترحناه سابقًا، فإن الأمر يختلف. إذا تمكن المطورون من حزم أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن التكلفة الإجمالية لتكرارها ستكون أقل من تكلفة أربعة متغيرات uint256. بهذه الطريقة، يمكن للعقود الذكية قراءة وكتابة فتحة تخزين واحدة، ووضع أربعة متغيرات uint8 في الذاكرة/التخزين في عملية واحدة.
4.استخدام متغيرات ذات حجم ثابت بدلاً من المتغيرات الديناميكية
إذا كان بإمكان البيانات أن تظل ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان من الممكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
( 5.الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ) Arrays ### و الخرائط ### Mappings (، لكن بناء الجملة والهياكل الخاصة بها مختلفة تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم تكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية من أفضل 10 ممارسات لتحسين الغاز])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6.استخدم calldata بدلاً من memory
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
( 7.استخدم كلمات مفتاحية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات المفتاحية Constant أو Immutable كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp###
8.استخدام Unchecked عند التأكد من عدم حدوث تجاوز/تحت التجاوز
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب الفحوصات الزائدة عن الحاجة للتجاوز أو النقص، وبالتالي توفير تكاليف الغاز.
علاوة على ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في إصدارات 0.8.0 وما فوق، لأن المترجم نفسه قد تضمن ميزات حماية من الفائض والنقص.
( 9.محسن التعديل
تم تضمين كود المُعدّل في الدالة المُعدّلة، في كل مرة يتم فيها استخدام المُعدّل، يتم نسخ كوده. هذا سيزيد من حجم بايت كود ويزيد من استهلاك الغاز.
من خلال إعادة بناء المنطق إلى دالة داخلية _checkOwner)###، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10.تحسين الدائرة القصيرة
بالنسبة لمشغل || و &&، تحدث عمليات المنطق تقييم قصير، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات عالية التكلفة.
نصائح عامة إضافية
1. حذف الكود غير المفيد
إذا كان هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغير.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. في الجوهر، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لمتغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية عالية التكلفة، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2.استخدام العقود الذكية
تقدم العقود المسبقة التجميع دوال مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل على العقدة المحلية للعميل، فإن الغاز المطلوب يكون أقل. يمكن استخدام العقود المسبقة التجميع لتوفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقمي المنحني البيضاوي (ECDSA) وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
3.استخدام كود التجميع المضمن
البرمجة المدمجة ( in-line assembly ) يسمح للمطورين بكتابة كود منخفض المستوى لكن فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام رموز تشغيل Solidity باهظة الثمن. كما يسمح البرمجة المدمجة بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المضمن إلى مخاطر وسهولة في الخطأ. لذلك، يجب استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
![إثيريوم العقود الذكية Gas الأمثل أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
) 4.