دليل ممارسات تحسين رسوم الغاز للعقود الذكية إثيريوم
تظل رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة يصعب حلها، خاصةً عند ازدحام الشبكة. خلال فترات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة للغاية. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. يمكن أن يؤدي تحسين استهلاك الغاز إلى تقليل تكاليف المعاملات بشكل فعال، بالإضافة إلى تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وكفاءة على البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية ( EVM )، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات المشتركة في نظام blockchain.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في تخطيط هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل صفقة يتطلب موارد حسابية، سيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات拒绝服务(DoS). تُعرف الرسوم المطلوبة لإكمال صفقة باسم "رسوم الغاز".
منذ سريان شوكة لندن EIP-1559( )، يتم حساب رسوم الغاز باستخدام المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (الرسوم الأساسية + رسوم الأولوية)
سيتم حرق الرسوم الأساسية، بينما تُستخدم الرسوم الأولوية كحافز، لتشجيع المُحققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال المعاملة، فإن تعيين رسوم أولوية أعلى يمكن أن يزيد من احتمالية تضمين المعاملة في الكتلة التالية. هذا يشبه "إكرامية" يدفعها المستخدمون للمحققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من شفرة التشغيل ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) لديه تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على الـ EIP، تم تعديل تكلفة الغاز لبعض الرموز التشغيلية، وقد تكون هناك اختلافات مع ما هو مذكور في الكتاب الأصفر.
2.المفاهيم الأساسية لتحسين الغاز
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات التي تكون تكلفة الغاز مرتفعة.
في EVM، التكلفة لبعض العمليات منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغير calldata، مثل مصفوفة calldata والهياكل
استدعاء الدالة الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
عمليات الحلقة
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين خفض استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وصديقة للمستخدم.
1.حاول تقليل استخدام التخزين
في سوليديتي، تعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز فيها أعلى بكثير من Memory( الذاكرة). كلما قرأ العقد الذكي أو كتب بيانات من التخزين، تحدث تكاليف غاز عالية.
حسب تعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تعليمات OPcodesmload و mstore تستهلك فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload و sstore حتى في أفضل الحالات، تتطلب تكلفة لا تقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد مرات تعديل التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وبعد الانتهاء من جميع الحسابات، يتم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطرق عرض البيانات من قبل المطورين ستؤثر بشكل كبير على استهلاك Gas.
يعمل مترجم Solidity على حزم متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم 32 بايت من فتحة التخزين كالوحدة الأساسية لتخزين المتغيرات. يشير حزم المتغيرات إلى ترتيب المتغيرات بشكل منطقي، مما يسمح لعدة متغيرات بالتكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تتطلب 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])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 تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدم calldata بدلاً من الذاكرة
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata للدالة إلى memory.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. استخدم كلمات 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 تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. مُعدل التحسين
تم تضمين كود المعدل في الوظيفة المعدلة، وعند استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يمكن أن يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغلات || و &&، يحدث تقييم قصير للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتخطي الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###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، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
إثيريوم العقود الذكية Gas费 تحسين الاستراتيجيات والدليل العملي
دليل ممارسات تحسين رسوم الغاز للعقود الذكية إثيريوم
تظل رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة يصعب حلها، خاصةً عند ازدحام الشبكة. خلال فترات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة للغاية. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. يمكن أن يؤدي تحسين استهلاك الغاز إلى تقليل تكاليف المعاملات بشكل فعال، بالإضافة إلى تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وكفاءة على البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية ( EVM )، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات المشتركة في نظام blockchain.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في تخطيط هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل صفقة يتطلب موارد حسابية، سيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات拒绝服务(DoS). تُعرف الرسوم المطلوبة لإكمال صفقة باسم "رسوم الغاز".
منذ سريان شوكة لندن EIP-1559( )، يتم حساب رسوم الغاز باستخدام المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (الرسوم الأساسية + رسوم الأولوية)
سيتم حرق الرسوم الأساسية، بينما تُستخدم الرسوم الأولوية كحافز، لتشجيع المُحققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال المعاملة، فإن تعيين رسوم أولوية أعلى يمكن أن يزيد من احتمالية تضمين المعاملة في الكتلة التالية. هذا يشبه "إكرامية" يدفعها المستخدمون للمحققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من شفرة التشغيل ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) لديه تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على الـ EIP، تم تعديل تكلفة الغاز لبعض الرموز التشغيلية، وقد تكون هناك اختلافات مع ما هو مذكور في الكتاب الأصفر.
2.المفاهيم الأساسية لتحسين الغاز
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات التي تكون تكلفة الغاز مرتفعة.
في EVM، التكلفة لبعض العمليات منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين خفض استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وصديقة للمستخدم.
1.حاول تقليل استخدام التخزين
في سوليديتي، تعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز فيها أعلى بكثير من Memory( الذاكرة). كلما قرأ العقد الذكي أو كتب بيانات من التخزين، تحدث تكاليف غاز عالية.
حسب تعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تعليمات OPcodesmload و mstore تستهلك فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload و sstore حتى في أفضل الحالات، تتطلب تكلفة لا تقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطرق عرض البيانات من قبل المطورين ستؤثر بشكل كبير على استهلاك Gas.
يعمل مترجم Solidity على حزم متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم 32 بايت من فتحة التخزين كالوحدة الأساسية لتخزين المتغيرات. يشير حزم المتغيرات إلى ترتيب المتغيرات بشكل منطقي، مما يسمح لعدة متغيرات بالتكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تتطلب 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])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 تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدم calldata بدلاً من الذاكرة
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata للدالة إلى memory.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. استخدم كلمات 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 تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 9. مُعدل التحسين
تم تضمين كود المعدل في الوظيفة المعدلة، وعند استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يمكن أن يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغلات || و &&، يحدث تقييم قصير للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتخطي الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كانت هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. في الأساس، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لمتغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب عمليات الحلقات عالية التكلفة، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود المسبقة التجهيز
تقدم العقود المسبقة الترجمة وظائف مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإنها تتطلب غازًا أقل. يمكن أن يؤدي استخدام العقود المسبقة إلى توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقم البياني المنحني ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع المضمن
البرمجة المضمنة ### in-line assembly ( يسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يتم تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام كود العمليات المكلف في Solidity. كما تسمح البرمجة المضمنة بتحكم أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من تكلفة الغاز. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة لتحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع المضمن قد يجلب أيضًا مخاطر