دليل تحسين غاز العقود الذكية لإيثريوم: اسقاط كلفة العملية وزيادة الكفاءة

دليل تحسين الغاز للعقود الذكية إثيريوم

تعتبر رسوم الغاز على الشبكة الرئيسية لإثيريوم مشكلة معقدة، خاصةً عند ازدحام الشبكة. خلال أوقات الذروة، يحتاج المستخدمون عادةً إلى دفع رسوم معاملات باهظة. لذلك، أصبح من الضروري تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية. يمكن أن يؤدي تحسين استهلاك الغاز إلى تقليل تكاليف المعاملات بشكل فعال، وزيادة كفاءة المعاملات، مما يوفر تجربة استخدام أكثر اقتصادية وفعالية على البلوكشين للمستخدمين.

ستتناول هذه المقالة آلية رسوم الغاز لـ إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهاماً ومساعدة عملية للمطورين، وفي الوقت نفسه تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي blockchain.

إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات

مقدمة عن آلية رسوم الغاز في EVM

في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.

في هيكل EVM، يتم تقسيم استهلاك الغاز بشكل رئيسي إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.

نظرًا لأن تنفيذ كل صفقة يتطلب موارد حسابية، فسوف يتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال صفقة "رسوم الغاز".

منذ سريان الشوكة الصلبة في لندن EIP-1559( ), يتم حساب رسوم الغاز من خلال المعادلة التالية:

رسوم الغاز = وحدات الغاز المستخدمة * ( الرسوم الأساسية + رسوم الأولوية )

سيتم تدمير الرسوم الأساسية، بينما تُستخدم الرسوم ذات الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم ذات أولوية أعلى عند إرسال المعاملة، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. هذا يشبه "إكرامية" يدفعها المستخدمون للمدققين.

إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات

فهم تحسين الغاز في EVM

عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "رموز العمليات"، أي opcodes.

أي مقطع من كود العملية ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة معترف بها من الغاز، وتُسجل هذه التكاليف في الكتاب الأصفر لإثيريوم.

بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض رموز العمليات، والتي قد تختلف عن ما هو موجود في الكتاب الأصفر.

مفهوم تحسين الغاز الأساسي

الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على بلوكتشين EVM، وتجنب العمليات ذات تكلفة الغاز المرتفعة.

في EVM، تكون تكلفة العمليات التالية منخفضة:

  • قراءة وكتابة متغيرات الذاكرة
  • قراءة الثوابت والمتغيرات غير القابلة للتغيير
  • قراءة وكتابة المتغيرات المحلية
  • قراءة متغير calldata، مثل مصفوفة calldata والهياكل
  • استدعاء الدالة الداخلية

تشمل العمليات ذات التكلفة العالية:

  • قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقود
  • استدعاء الدوال الخارجية
  • عمليات الحلقة

أفضل الممارسات لتحسين رسوم الغاز EVM

استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وإنشاء تطبيقات أكثر كفاءة وسهولة في الاستخدام.

إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات

1. حاول تقليل استخدام التخزين قدر الإمكان

في Solidity، تعتبر Storage( تخزين) موردًا محدودًا، حيث إن استهلاك الغاز الخاص بها أعلى بكثير من Memory( ذاكرة). في كل مرة تقوم فيها العقود الذكية بقراءة أو كتابة بيانات من التخزين، يتم تكبد تكاليف غاز مرتفعة.

وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من تكلفة عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload و mstore 3 وحدات غاز فقط، بينما تتطلب عمليات التخزين مثل sload و sstore حتى في أفضل الحالات ما لا يقل عن 100 وحدة.

طرق تقييد استخدام التخزين تشمل:

  • تخزين البيانات غير الدائمة في الذاكرة
  • تقليل عدد تغييرات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وبعد الانتهاء من جميع الحسابات، يتم تخصيص النتائج لمتغيرات التخزين.

إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر

2. تعبئة المتغيرات

ستؤثر عدد الفتحات التخزينية ( المستخدمة في العقود الذكية وطريقة عرض المطورين للبيانات بشكل كبير على استهلاك رسوم الغاز.

سيقوم مترجم Solidity خلال عملية الترجمة بتجميع المتغيرات المخزنة المتتالية، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. يعني تجميع المتغيرات ترتيب المتغيرات بشكل منطقي بحيث يمكن أن تتناسب عدة متغيرات في فتحة تخزين واحدة.

من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تتطلب 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.

نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.

![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3. تحسين نوع البيانات

يمكن تمثيل المتغير بأنواع بيانات متعددة، ولكن تكاليف العمليات المرتبطة بأنواع البيانات المختلفة تختلف أيضًا. إن اختيار نوع البيانات المناسب يساعد في تحسين استخدام غاز.

على سبيل المثال، في سوليديتي، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: 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.

![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 5. الخرائط والمصفوفات

يمكن تمثيل قائمة البيانات في Solidity بنوعين من البيانات: المصفوفات ### Arrays ( و الخرائط ) Mappings (، لكن نحوها وبنيتها مختلفتان تمامًا.

يكون استخدام الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، ولكن المصفوفات قابلة للتكرار وتدعم تجميع أنواع البيانات. لذلك، يُنصح باستخدام الخرائط عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تجميع أنواع البيانات.

![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 6. استخدام calldata بدلاً من الذاكرة

يمكن تخزين المتغيرات المعلنة في معلمات الدالة في calldata أو memory. الفرق الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.

تذكر هذه القاعدة: إذا كانت معلمات الدالة للقراءة فقط، ينبغي استخدام calldata بدلاً من memory. سيساعد ذلك في تجنب العمليات غير الضرورية لنسخ البيانات من calldata إلى memory.

![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 7. استخدم كلمات Constant/Immutable قدر الإمكان

لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في كود بايت العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ومن المستحسن استخدامها قدر الإمكان باستخدام الكلمات الرئيسية ثابت أو غير قابل للتغيير.

![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية إثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

) 8. استخدم Unchecked مع ضمان عدم حدوث تجاوز/تحت تجاوز

عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو انخفاض، يمكنهم استخدام الكلمة الرئيسية unchecked التي تم تقديمها في Solidity v0.8.0، لتجنب التحقق الزائد من التجاوز أو الانخفاض، وبالتالي توفير تكاليف الغاز.

بالإضافة إلى ذلك، لم تعد إصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، لأن المترجم نفسه قد أدرج ميزات حماية من الفيضانات والانخفاضات.

![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 9. مُحسِّن تعديل

تم تضمين كود المعدل في الدالة المعدلة، وكلما تم استخدام المعدل، يتم نسخ كوده. سيؤدي ذلك إلى زيادة حجم بايت كود وزيادة استهلاك الغاز.

من خلال إعادة هيكلة المنطق إلى دالة داخلية _checkOwner###(، يمكن السماح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم bytecode ويخفض تكاليف الغاز.

![إثيريومالعقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(

) 10. تحسين الدائرة القصيرة

بالنسبة لمشغل || و &&، تحدث عمليات المنطق تقييم التوقف القصير، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.

لتحسين استهلاك الغاز، ينبغي وضع الشروط ذات التكلفة المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.

نصائح عامة إضافية

1. حذف الكود غير المفيد

إذا كان هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بإزالتها. هذه هي الطريقة المباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغير.

إليك بعض النصائح المفيدة:

  • استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. في الأساس، يجب حذف أي حسابات غير مستخدمة.

  • في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.

  • تحسين الحلقة: تجنب العمليات الدائرية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، وإخراج الحسابات المكررة من جسم الحلقة.

2. استخدام العقود الذكية

تقدم العقود المسبقة التجهيز دوال مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يتم تشغيله على EVM، بل يتم تشغيله محليًا على عقدة العميل، فإن الغاز المطلوب أقل. يمكن أن يوفر استخدام العقود المسبقة التجهيز الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.

تشمل أمثلة العقود الذكية المسبقة التجميع خوارزمية توقيع الرقم البياني المنحني ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود الذكية المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.

) 3. استخدام كود التجميع المدمج

البرمجة المضمنة ### in-line assembly ( تسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما تتيح البرمجة المضمنة التحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز أكثر. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.

ومع ذلك، قد يؤدي استخدام التجميع المضمن أيضًا إلى الرياح

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 3
  • مشاركة
تعليق
0/400
Deconstructionistvip
· منذ 16 س
هذه تكلفة الغاز مرتفعة للغاية لا أستطيع تحمّلها
شاهد النسخة الأصليةرد0
MissedTheBoatvip
· منذ 16 س
تناول المعكرونة يوفر نقطتين من الزيت، ماذا يوفر أيضًا من الغاز؟
شاهد النسخة الأصليةرد0
OnchainGossipervip
· منذ 16 س
رسوم الغاز باهظة الثمن حقا
شاهد النسخة الأصليةرد0
  • تثبيت