تكاليف الغاز على شبكة إثيريوم الرئيسية كانت دائمًا مشكلة مزعجة، خاصةً عند ازدحام الشبكة. خلال أوقات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين تكاليف الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. تحسين استهلاك الغاز لا يمكن أن يقلل فقط من تكاليف المعاملات بشكل فعال، بل يمكن أن يعزز أيضًا كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وفعالية على البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم الإلهام والمساعدة العملية للمطورين، كما نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوك تشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال معاملة ما باسم "رسوم الغاز".
منذ سريان تقسيم لندن الصارم EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * ( رسوم أساسية + رسوم الأولوية )
ستتم إتلاف الرسوم الأساسية، بينما ستستخدم الرسوم ذات الأولوية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال المعاملات، فإن تعيين رسوم ذات أولوية أعلى يمكن أن يزيد من احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا "إكرامية" يدفعها المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب الإيثريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض الرموز التشغيلية، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
2.المفاهيم الأساسية لتحسين الغاز
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة التكلفة العالية على سلسلة الكتل EVM، وتجنب العمليات التي تكلف غازًا باهظًا.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغير calldata، مثل مصفوفة calldata والهياكل
استدعاء الدوال الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء دالة خارجية
عمليات الحلقة
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.حاول تقليل استخدام التخزين
في Solidity، Storage( هو مورد محدود، حيث أن استهلاك الغاز له أعلى بكثير من Memory). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، يتم تكبد تكلفة غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، فإن تعليمات OPcodesmload وmstore تستهلك فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload وsstore حتى في أفضل الحالات، تحتاج إلى ما لا يقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد تعديلات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، بعد الانتهاء من جميع الحسابات، يتم توزيع النتائج على متغيرات التخزين.
( 2. تعبئة المتغيرات
تؤثر كمية Storage slot) المستخدمة في العقود الذكية وطريقة عرض البيانات من قبل المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع المتغيرات المخزنة المتتالية أثناء عملية التجميع، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى تنظيم المتغيرات بشكل معقول، بحيث يمكن لعدة متغيرات التكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20000 وحدة غاز ### لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية 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(، لكن بناء الجملة والبنية الخاصة بهما مختلفتان تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من الذاكرة
المتغيرات المعلنة في معلمات الدالة يمكن تخزينها في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory بشكل أساسي. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
( 7. حاول استخدام مفاتيح Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp###
8. استخدم Unchecked مع التأكد من عدم حدوث تجاوز/تحت التجاوز
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص ، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب عمليات الفحص الزائدة عن الحاجة للتجاوز أو النقص ، مما يوفر تكاليف الغاز.
علاوة على ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، حيث إن المترجم نفسه يحتوي على ميزات حماية من الفيضانات والانخفاضات.
( 9. مُحسّن التعديلات
تم دمج كود المعدل في الدالة المعدلة، وعند استخدام المعدل في كل مرة، يتم نسخ كوده. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كوظيفة داخلية، يسمح بإعادة استخدام هذه الوظيفة الداخلية في المعدلات، مما يقلل من حجم الشفرة البايتية ويقلل من تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###
10. تحسين الدائرة القصيرة
بالنسبة لعمليتي || و &&، يحدث تقييم قصير للعمليات المنطقية، أي إذا كان الشرط الأول قادراً على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات باهظة التكلفة.
نصائح عامة إضافية
1. حذف الشفرة غير المفيدة
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيرًا.
فيما يلي بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
( 2. استخدام العقود الذكية المسبقة التجميع
تقدم العقود المسبقة التجميع وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإنها تحتاج إلى غاز أقل. يمكن أن يساعد استخدام العقود المسبقة التجميع في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقمي المنحني البيضاوي )ECDSA### وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام تعليمات التجميع المضمنة
البرمجة المضمنة ( in-line assembly ) تسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما تسمح البرمجة المضمنة بالتحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن أن تنفذ البرمجة المضمنة بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع المضمن قد ينطوي أيضًا على مخاطر وسهولة الخطأ. لذلك، ينبغي استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
4. استخدام حلول Layer 2
استخدام حلول الطبقة الثانية يمكن أن يقلل من الحاجة إلى تخزين وحساب على شبكة إثيريوم الرئيسية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 18
أعجبني
18
7
مشاركة
تعليق
0/400
PrivacyMaximalist
· منذ 19 س
الغاز باهظ الثمن ، دعنا نذهب إلى L2
شاهد النسخة الأصليةرد0
0xSherlock
· 07-30 09:26
متى ستصبح رسوم الغاز رخيصة مثل L2
شاهد النسخة الأصليةرد0
SnapshotBot
· 07-30 04:26
ليس أفضل من اللعب على L2
شاهد النسخة الأصليةرد0
MetaverseLandlord
· 07-30 04:18
فقط آمل أن أتمكن من بيع الغاز بأسعار أغلى لتحقيق المزيد من الأرباح.
شاهد النسخة الأصليةرد0
BearMarketBuyer
· 07-30 04:17
غاز太贵吃人啊
شاهد النسخة الأصليةرد0
LiquidityHunter
· 07-30 04:08
تحسين الغاز 0.7 ضعف مساحة المراجحة لقد حصلت للتو على ثلاث صفقات انزلاق
إثيريوم العقود الذكية Gas تحسين دليل الممارسات: اسقاط التكاليف تحسين الكفاءة
دليل ممارسات تحسين الغاز للعقود الذكية إثيريوم
تكاليف الغاز على شبكة إثيريوم الرئيسية كانت دائمًا مشكلة مزعجة، خاصةً عند ازدحام الشبكة. خلال أوقات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين تكاليف الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. تحسين استهلاك الغاز لا يمكن أن يقلل فقط من تكاليف المعاملات بشكل فعال، بل يمكن أن يعزز أيضًا كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وفعالية على البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم الإلهام والمساعدة العملية للمطورين، كما نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوك تشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال معاملة ما باسم "رسوم الغاز".
منذ سريان تقسيم لندن الصارم EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * ( رسوم أساسية + رسوم الأولوية )
ستتم إتلاف الرسوم الأساسية، بينما ستستخدم الرسوم ذات الأولوية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال المعاملات، فإن تعيين رسوم ذات أولوية أعلى يمكن أن يزيد من احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا "إكرامية" يدفعها المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب الإيثريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض الرموز التشغيلية، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
2.المفاهيم الأساسية لتحسين الغاز
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة التكلفة العالية على سلسلة الكتل EVM، وتجنب العمليات التي تكلف غازًا باهظًا.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.حاول تقليل استخدام التخزين
في Solidity، Storage( هو مورد محدود، حيث أن استهلاك الغاز له أعلى بكثير من Memory). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، يتم تكبد تكلفة غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، فإن تعليمات OPcodesmload وmstore تستهلك فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload وsstore حتى في أفضل الحالات، تحتاج إلى ما لا يقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
( 2. تعبئة المتغيرات
تؤثر كمية Storage slot) المستخدمة في العقود الذكية وطريقة عرض البيانات من قبل المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع المتغيرات المخزنة المتتالية أثناء عملية التجميع، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى تنظيم المتغيرات بشكل معقول، بحيث يمكن لعدة متغيرات التكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20000 وحدة غاز ### لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية 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(، لكن بناء الجملة والبنية الخاصة بهما مختلفتان تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بالقدرة على التكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من الذاكرة
المتغيرات المعلنة في معلمات الدالة يمكن تخزينها في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory بشكل أساسي. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
( 7. حاول استخدام مفاتيح Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp###
8. استخدم Unchecked مع التأكد من عدم حدوث تجاوز/تحت التجاوز
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص ، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب عمليات الفحص الزائدة عن الحاجة للتجاوز أو النقص ، مما يوفر تكاليف الغاز.
علاوة على ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، حيث إن المترجم نفسه يحتوي على ميزات حماية من الفيضانات والانخفاضات.
( 9. مُحسّن التعديلات
تم دمج كود المعدل في الدالة المعدلة، وعند استخدام المعدل في كل مرة، يتم نسخ كوده. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كوظيفة داخلية، يسمح بإعادة استخدام هذه الوظيفة الداخلية في المعدلات، مما يقلل من حجم الشفرة البايتية ويقلل من تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###
10. تحسين الدائرة القصيرة
بالنسبة لعمليتي || و &&، يحدث تقييم قصير للعمليات المنطقية، أي إذا كان الشرط الأول قادراً على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات باهظة التكلفة.
نصائح عامة إضافية
1. حذف الشفرة غير المفيدة
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيرًا.
فيما يلي بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
( 2. استخدام العقود الذكية المسبقة التجميع
تقدم العقود المسبقة التجميع وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإنها تحتاج إلى غاز أقل. يمكن أن يساعد استخدام العقود المسبقة التجميع في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقمي المنحني البيضاوي )ECDSA### وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام تعليمات التجميع المضمنة
البرمجة المضمنة ( in-line assembly ) تسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما تسمح البرمجة المضمنة بالتحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن أن تنفذ البرمجة المضمنة بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع المضمن قد ينطوي أيضًا على مخاطر وسهولة الخطأ. لذلك، ينبغي استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
4. استخدام حلول Layer 2
استخدام حلول الطبقة الثانية يمكن أن يقلل من الحاجة إلى تخزين وحساب على شبكة إثيريوم الرئيسية