دليل تحسين رسوم غاز العقود الذكية EVM - 13 نصيحة عملية

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

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

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

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

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

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

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

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

منذ سريان EIP-1559، يتم حساب رسوم الغاز من خلال الصيغة التالية:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. تغليف المتغيرات

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

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

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

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

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

اختيار نوع البيانات المناسب يساعد في تحسين استخدام الغاز. على سبيل المثال، في سوليديتي، يمكن تقسيم الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، إلخ. نظرًا لأن EVM ينفذ العمليات بوحدات 256 بت، فإن استخدام uint8 يعني أن EVM يجب أن تقوم أولاً بتحويلها إلى uint256، وهذا التحويل سيستهلك الغاز الإضافي.

ومع ذلك، إذا تم استخدام تحسين التعبئة المتغيرة، فإن تكلفة تكرار الأربعة متغيرات 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 (، لكن نحوهما وبنيتهما مختلفتان تمامًا.

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

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

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

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

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

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

) 7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان

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

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

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

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

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

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

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

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

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

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

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

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

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

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

) 1. حذف الشيفرة غير المستخدمة

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

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

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

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

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

2. استخدام العقود المسبقة

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

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

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

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

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

) 4. استخدام حلول Layer 2

استخدام حلول الطبقة الثانية يمكن أن يقلل من كمية البيانات التي تحتاج إلى التخزين والحساب على شبكة إثيريوم الرئيسية.

تستطيع حلول Layer 2 مثل rollups و الجوانب و قنوات الحالة نقل معالجة المعاملات من سلسلة إيثريوم الرئيسية، مما يتيح معاملات أسرع وأرخص.

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

ETH3.08%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 4
  • مشاركة
تعليق
0/400
GateUser-beba108dvip
· منذ 19 س
يكلفني الغاز الكثير ، أليس كذلك؟
شاهد النسخة الأصليةرد0
BTCBeliefStationvip
· منذ 19 س
غاز يجب أن يتنافس أيضًا، اسقاط قليلاً سيكون جيدًا.
شاهد النسخة الأصليةرد0
ParanoiaKingvip
· منذ 19 س
هذه الرسوم الغازية تأكل الناس ولا تترك لهم عظام.
شاهد النسخة الأصليةرد0
DegenGamblervip
· منذ 19 س
غاز جن جنونه بلا نهاية
شاهد النسخة الأصليةرد0
  • تثبيت