تعتبر رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة معقدة، خاصةً عند الازدحام في الشبكة. خلال أوقات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات بفاعلية، بل يمكنه أيضًا تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادًا وفعالية في البلوكتشين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بآلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في 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. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطرق عرض المطورين للبيانات سيؤثر بشكل كبير على استهلاك رسوم الغاز.
يعمل مترجم 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 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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. مُعدِّل التحسين
تم تضمين كود المُعدل في الدالة المعدلة، وعند استخدام المُعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لـ || و &&، فإن العمليات المنطقية ستحدث تقييمًا قصيرًا، أي إذا كانت الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، ينبغي وضع الشروط ذات التكلفة المنخفضة في البداية، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لمتغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود المسبقة البرمجة
تقدم العقود المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يعمل على EVM، بل يعمل محليًا على عقدة العميل، فإن الغاز المطلوب أقل. يمكن أن يوفر استخدام العقود المسبقة الترجمة الغاز عن طريق تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع رقمي باستخدام المنحنيات البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية, يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![العقود الذكية إثيريوم Gas الأمثل أفضل عشرة ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) ٣. استخدام كود التجميع الداخلي
التركيب الداخلي ### in-line assembly ( يسمح للمطورين بكتابة تعليمات برمجية منخفضة المستوى ولكن فعالة يمكن تنفيذها مباشرة بواسطة EVM ، دون الحاجة إلى استخدام
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 6
أعجبني
6
4
إعادة النشر
مشاركة
تعليق
0/400
GateUser-00be86fc
· منذ 8 س
غاز太贵搞毛线العقود الذكية
شاهد النسخة الأصليةرد0
PermabullPete
· منذ 9 س
غاز الرسوم مرتفعة بشكل مبالغ فيه، من يجرؤ على الاقتراب؟
شاهد النسخة الأصليةرد0
BearMarketMonk
· منذ 9 س
كل التحسينات، في النهاية، ليست سوى من أجل توفير ثمن وجبة واحدة فقط...
شاهد النسخة الأصليةرد0
RunWithRugs
· منذ 9 س
خلال ساعات الذروة، يمكن أن تغطي رسوم الغاز تكلفة وجبة.
دليل ممارسة تحسين الغاز للعقود الذكية إثيريوم: اسقاط التكاليف وزيادة الكفاءة
دليل ممارسات تحسين الغاز للعقود الذكية إثيريوم
تعتبر رسوم الغاز على شبكة إثيريوم الرئيسية مشكلة معقدة، خاصةً عند الازدحام في الشبكة. خلال أوقات الذروة، يحتاج المستخدمون غالبًا إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات بفاعلية، بل يمكنه أيضًا تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادًا وفعالية في البلوكتشين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بآلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في نظام البلوكشين البيئي.
! أفضل 10 ممارسات لتحسين الغاز لعقود Ethereum الذكية
مقدمة عن آلية رسوم الغاز في 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. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطرق عرض المطورين للبيانات سيؤثر بشكل كبير على استهلاك رسوم الغاز.
يعمل مترجم 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 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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. مُعدِّل التحسين
تم تضمين كود المُعدل في الدالة المعدلة، وعند استخدام المُعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لـ || و &&، فإن العمليات المنطقية ستحدث تقييمًا قصيرًا، أي إذا كانت الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، ينبغي وضع الشروط ذات التكلفة المنخفضة في البداية، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لمتغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود المسبقة البرمجة
تقدم العقود المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يعمل على EVM، بل يعمل محليًا على عقدة العميل، فإن الغاز المطلوب أقل. يمكن أن يوفر استخدام العقود المسبقة الترجمة الغاز عن طريق تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع رقمي باستخدام المنحنيات البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية, يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![العقود الذكية إثيريوم Gas الأمثل أفضل عشرة ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) ٣. استخدام كود التجميع الداخلي
التركيب الداخلي ### in-line assembly ( يسمح للمطورين بكتابة تعليمات برمجية منخفضة المستوى ولكن فعالة يمكن تنفيذها مباشرة بواسطة EVM ، دون الحاجة إلى استخدام