كانت تكاليف الغاز في شبكة إيثيريوم الرئيسية دائمًا مشكلة، خاصةً في أوقات الازدحام الشبكي. غالبًا ما يحتاج المستخدمون في ذروة الاستخدام إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين تكاليف الغاز أثناء تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات فحسب، بل يمكنه أيضًا تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكشين أكثر اقتصادية وفعالية.
سيستعرض هذا المقال آلية رسوم الغاز لآلة إيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في نظام blockchain البيئي.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال معاملة باسم "رسوم الغاز".
منذ سريان EIP-1559، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم الأساس + رسوم الأولوية)
سيتم حرق الرسوم الأساسية، بينما ستُستخدم الرسوم ذات الأولوية كحافز، لتشجيع المُحققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم ذات أولوية أعلى عند إرسال المعاملة، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا "البقشيش" الذي يدفعه المستخدمون للمحققين.
1. فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي مقطع من التعليمات البرمجية ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، يتم تسجيل هذه التكاليف في كتاب الإيثريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض رموز العمليات، وقد تكون مختلفة عن تلك الموجودة في الكتاب الأصفر.
2. مفهوم تحسين الغاز الأساسي
المفهوم الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات باهظة التكلفة من حيث الغاز.
في EVM، تكاليف العمليات التالية منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغيرات calldata، مثل مصفوفة calldata والهياكل
استدعاء الدوال الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
عمليات الحلقات
أفضل الممارسات لتحسين رسوم EVM Gas
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين تكلفة الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1. حاول تقليل استخدام التخزين
في Solidity، يعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز له أعلى بكثير من Memory( الذاكرة). في كل مرة يقرأ فيها العقد الذكي البيانات من التخزين أو يكتبها، يتم تكبد تكاليف غاز مرتفعة.
وفقًا لتعريف كتاب الإيثيريوم الأصفر، فإن تكلفة عمليات التخزين أعلى من تكلفة عمليات الذاكرة بمعدل يزيد عن 100 مرة. على سبيل المثال، تعليمتا OPcodesmload وmstore تستهلكان فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، تتطلب على الأقل 100 وحدة.
تشمل طرق تقييد استخدام التخزين:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد تعديلات التخزين: من خلال الاحتفاظ بالنتائج الوسيطة في الذاكرة، وعند الانتهاء من جميع العمليات الحسابية، يتم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity خلال عملية الترجمة بتجميع المتغيرات المخزنة المتتالية، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. تجميع المتغيرات يعني ترتيب المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات أن تتناسب في فتحة تخزين واحدة.
من خلال هذا التعديل في التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز )، حيث يتطلب تخزين فتحة تخزين غير مستخدمة 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن التعبئة المتغيرة تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![أفضل 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 في الذاكرة/التخزين في عملية واحدة.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على إيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 4. استخدم متغيرات ذات حجم ثابت بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات في 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، المتغيرات ذات الحجم الثابت تستهلك الغاز أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ###Arrays ( والعقود الذكية )Mappings (، ولكن قواعدها وبنيتها تختلف تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات قابلة للتكرار وتدعم تعبئة أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية على إيثريوم])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من الذاكرة
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديله بواسطة الدالة، بينما calldata غير قابل للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب تفضيل استخدام calldata بدلاً من memory. هذا يمكن أن يمنع عمليات النسخ غير الضرورية من calldata للدالة إلى memory.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة / غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت الكود الخاص بالعقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية للإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدم Unchecked مع ضمان عدم حدوث الفائض/الانخفاض
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص ، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب الفحوصات الزائدة عن الحاجة للتجاوز أو النقص ، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في الإصدارات 0.8.0 وما فوق، لأن المترجم نفسه يشتمل على ميزات حماية من الفائض والانخفاض.
9. مُعدل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وفي كل مرة يتم فيها استخدام المعدل، يتم نسخ الكود الخاص به. هذا سيزيد من حجم بايت الكود ويزيد من استهلاك الغاز.
من خلال إعادة هيكلة المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدل، مما يقلل من حجم الشيفرة البايتية ويخفض تكاليف الغاز.
بالنسبة ل|| و&&، يحدث تقويم قصير للعبارات المنطقية، أي إذا كان الشرط الأول قادراً على تحديد نتيجة العبارة المنطقية، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، ينبغي وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
نصائح عامة إضافية
) 1. حذف الشيفرة غير المستخدمة
إذا كانت هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغير.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهر الأمر هو أنه يجب حذف أي حسابات غير مستخدمة.
في الإيثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الدائرية عالية التكلفة، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية
تقدم العقود الذكية وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يتم تنفيذه على EVM، بل يتم تشغيله محليًا على العقد، فإنه يتطلب غازًا أقل. يمكن أن يوفر استخدام العقود الذكية من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود الذكية المسبقة التجميع خوارزمية توقيع الديجيتال المنحني Elliptic Curve Digital Signature Algorithm ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية, يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية على الإيثيريوم])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام كود التجميع المضمن
تسمح التجميعات المدمجة للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما تسمح التجميعات المدمجة بالتحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للتجميعات المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المتداخل إلى مخاطر وسهولة في الأخطاء. لذلك، يجب استخدامه بحذر، وأن يقتصر على المطورين ذوي الخبرة.
4. استخدام حلول Layer 2
استخدام حلول Layer 2 يمكن أن يقلل من كمية البيانات التي تحتاج إلى تخزينها وحسابها على الشبكة الرئيسية لإيثريوم.
مثل rollups و الجانبية و قنوات الحالة مثل حلول Layer 2
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 9
أعجبني
9
7
مشاركة
تعليق
0/400
AirdropATM
· 07-17 09:37
يمكن أن تنخفض رسوم الغاز، ستموت cex في الخسارة
شاهد النسخة الأصليةرد0
CommunityJanitor
· 07-17 02:30
كحمقى قديم، إن رسوم الغاز هذه حقًا تأكل الناس.
شاهد النسخة الأصليةرد0
GhostWalletSleuth
· 07-15 15:28
اسقاط الغاز أيضا ليس له فائدة، أليس V神 يريد خداع الناس لتحقيق الربح؟
شاهد النسخة الأصليةرد0
GasFeeNightmare
· 07-15 07:31
غاز真的要命~
شاهد النسخة الأصليةرد0
BrokenDAO
· 07-15 07:23
حالة أخرى من حوكمة العادات هل تم أخذ تشويه الحوافز في الاعتبار عند تحسين تكاليف داخل السلسلة؟ المستخدمون العاديون الذين يقومون بإرسال معاملات متكررة هم دائماً من يدفعون.
أفضل 10 ممارسات لتحسين تكلفة غاز العقود الذكية لتعزيز كفاءة تطوير EVM
أفضل 10 ممارسات لتحسين رسوم الغاز للعقود الذكية
كانت تكاليف الغاز في شبكة إيثيريوم الرئيسية دائمًا مشكلة، خاصةً في أوقات الازدحام الشبكي. غالبًا ما يحتاج المستخدمون في ذروة الاستخدام إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين تكاليف الغاز أثناء تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات فحسب، بل يمكنه أيضًا تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكشين أكثر اقتصادية وفعالية.
سيستعرض هذا المقال آلية رسوم الغاز لآلة إيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في نظام blockchain البيئي.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال معاملة باسم "رسوم الغاز".
منذ سريان EIP-1559، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم الأساس + رسوم الأولوية)
سيتم حرق الرسوم الأساسية، بينما ستُستخدم الرسوم ذات الأولوية كحافز، لتشجيع المُحققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم ذات أولوية أعلى عند إرسال المعاملة، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا "البقشيش" الذي يدفعه المستخدمون للمحققين.
1. فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي مقطع من التعليمات البرمجية ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، يتم تسجيل هذه التكاليف في كتاب الإيثريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض رموز العمليات، وقد تكون مختلفة عن تلك الموجودة في الكتاب الأصفر.
2. مفهوم تحسين الغاز الأساسي
المفهوم الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات باهظة التكلفة من حيث الغاز.
في EVM، تكاليف العمليات التالية منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين رسوم EVM Gas
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين تكلفة الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1. حاول تقليل استخدام التخزين
في Solidity، يعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز له أعلى بكثير من Memory( الذاكرة). في كل مرة يقرأ فيها العقد الذكي البيانات من التخزين أو يكتبها، يتم تكبد تكاليف غاز مرتفعة.
وفقًا لتعريف كتاب الإيثيريوم الأصفر، فإن تكلفة عمليات التخزين أعلى من تكلفة عمليات الذاكرة بمعدل يزيد عن 100 مرة. على سبيل المثال، تعليمتا OPcodesmload وmstore تستهلكان فقط 3 وحدات غاز، بينما عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، تتطلب على الأقل 100 وحدة.
تشمل طرق تقييد استخدام التخزين:
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity خلال عملية الترجمة بتجميع المتغيرات المخزنة المتتالية، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. تجميع المتغيرات يعني ترتيب المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات أن تتناسب في فتحة تخزين واحدة.
من خلال هذا التعديل في التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز )، حيث يتطلب تخزين فتحة تخزين غير مستخدمة 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن التعبئة المتغيرة تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![أفضل 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 في الذاكرة/التخزين في عملية واحدة.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على إيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 4. استخدم متغيرات ذات حجم ثابت بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات في 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، المتغيرات ذات الحجم الثابت تستهلك الغاز أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من البيانات: المصفوفات ###Arrays ( والعقود الذكية )Mappings (، ولكن قواعدها وبنيتها تختلف تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات قابلة للتكرار وتدعم تعبئة أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية على إيثريوم])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(
) 6. استخدام calldata بدلاً من الذاكرة
يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الاختلاف الرئيسي بين الاثنين هو أن memory يمكن تعديله بواسطة الدالة، بينما calldata غير قابل للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، يجب تفضيل استخدام calldata بدلاً من memory. هذا يمكن أن يمنع عمليات النسخ غير الضرورية من calldata للدالة إلى memory.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة / غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت الكود الخاص بالعقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، يُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية للإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدم Unchecked مع ضمان عدم حدوث الفائض/الانخفاض
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص ، يمكنهم استخدام الكلمة الرئيسية unchecked المقدمة في Solidity v0.8.0 لتجنب الفحوصات الزائدة عن الحاجة للتجاوز أو النقص ، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في الإصدارات 0.8.0 وما فوق، لأن المترجم نفسه يشتمل على ميزات حماية من الفائض والانخفاض.
9. مُعدل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وفي كل مرة يتم فيها استخدام المعدل، يتم نسخ الكود الخاص به. هذا سيزيد من حجم بايت الكود ويزيد من استهلاك الغاز.
من خلال إعادة هيكلة المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدل، مما يقلل من حجم الشيفرة البايتية ويخفض تكاليف الغاز.
![أفضل 10 ممارسات لتحسين غاز العقود الذكية لإيثيريوم])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة ل|| و&&، يحدث تقويم قصير للعبارات المنطقية، أي إذا كان الشرط الأول قادراً على تحديد نتيجة العبارة المنطقية، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، ينبغي وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
نصائح عامة إضافية
) 1. حذف الشيفرة غير المستخدمة
إذا كانت هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغير.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهر الأمر هو أنه يجب حذف أي حسابات غير مستخدمة.
في الإيثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الدائرية عالية التكلفة، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية
تقدم العقود الذكية وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يتم تنفيذه على EVM، بل يتم تشغيله محليًا على العقد، فإنه يتطلب غازًا أقل. يمكن أن يوفر استخدام العقود الذكية من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود الذكية المسبقة التجميع خوارزمية توقيع الديجيتال المنحني Elliptic Curve Digital Signature Algorithm ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية, يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية على الإيثيريوم])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام كود التجميع المضمن
تسمح التجميعات المدمجة للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما تسمح التجميعات المدمجة بالتحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للتجميعات المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المتداخل إلى مخاطر وسهولة في الأخطاء. لذلك، يجب استخدامه بحذر، وأن يقتصر على المطورين ذوي الخبرة.
4. استخدام حلول Layer 2
استخدام حلول Layer 2 يمكن أن يقلل من كمية البيانات التي تحتاج إلى تخزينها وحسابها على الشبكة الرئيسية لإيثريوم.
مثل rollups و الجانبية و قنوات الحالة مثل حلول Layer 2