تعتبر رسوم الغاز في الشبكة الرئيسية لإثيريوم مسألة معقدة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، غالباً ما يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات بشكل فعال فحسب، بل يمكنه أيضًا تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصاداً وكفاءة في البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز لآلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن تقدم هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي نفس الوقت تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM، لمواجهة التحديات في النظام البيئي للبلوك تشين معًا.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). وتسمى الرسوم المطلوبة لإكمال عملية "رسوم الغاز".
منذ سريان تقسيم لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * ( الرسوم الأساسية + رسوم الأولوية )
سيتم تدمير الرسوم الأساسية، بينما ستستخدم رسوم الأولوية كحوافز، لتشجيع المدققين على إضافة المعاملات إلى البلوكشين. يمكن أن تزيد تعيين رسوم الأولوية الأعلى عند إرسال المعاملة من احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "الإكرامية" التي يدفعها المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي جزء من كود العمليات ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) لديه تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد إجراء العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض عمليات التعليمات البرمجية، وقد تكون مختلفة عن تلك الموجودة في الكتاب الأصفر.
مفهوم تحسين الغاز الأساسي
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية في التكلفة على سلسلة الكتل EVM، وتجنب العمليات باهظة التكلفة في الغاز.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغيرات calldata، مثل مصفوفة calldata والهياكل
استدعاء الدوال الداخلية
تشمل العمليات ذات التكاليف المرتفعة:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقود
استدعاء دالة خارجية
عمليات الحلقة
أفضل الممارسات لتحسين رسوم الغاز EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين تكاليف الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وودية للمستخدم.
1. حاول تقليل استخدام التخزين
في سوليديتي، تعتبر Storage( تخزين) من الموارد المحدودة، حيث أن استهلاك الغاز الخاص بها أعلى بكثير من Memory( ذاكرة). كلما قرأ عقد ذكي أو كتب بيانات من التخزين، يحدث تكلفة غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من تكلفة العمليات في الذاكرة. على سبيل المثال، فإن تعليمات OPcodesmload وmstore تستهلك فقط 3 وحدات من الغاز، بينما تتطلب عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، على الأقل 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد تعديلات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وانتظار اكتمال جميع الحسابات، ثم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
ستؤثر كمية Storage slot( المستخدمة في العقود الذكية وطرق عرض البيانات من قبل المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم فتحة تخزين 32 بايت كالوحدة الأساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى توزيع المتغيرات بشكل معقول بحيث يمكن أن تناسب عدة متغيرات في فتحة تخزين واحدة.
من خلال هذا التعديل في التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتي تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية الخاصة بتحسين الغاز لأفضل عشرة ممارسات])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 تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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.
![إثيريوم العقود الذكية غاز تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات أثناء عملية الترجمة، وتخزينها في بايت كود العقد. لذلك، تكون تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويوصى باستخدام كلمات المفتاح الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###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. مُحسّن التعديل
تم تضمين كود المُعدل داخل الدالة المعدلة، وفي كل مرة يتم استخدام المُعدل، يتم نسخ كوده. سيؤدي ذلك إلى زيادة حجم الشيفرة البايتية وزيادة استهلاك الغاز. يمكن تقليل حجم الشيفرة البايتية وتقليل تكلفة الغاز من خلال إعادة هيكلة المنطق إلى دالة داخلية، مما يسمح بإعادة استخدام هذه الدالة الداخلية داخل المُعدل.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية لإثيريوم]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة ل|| و &&، ستحدث تقييمات قصيرة للعمليات المنطقية، أي إذا كانت الحالة الأولى قادرة على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الحالة الثانية.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة المنخفضة للحساب في المقدمة، بحيث يمكن تجاوز الحسابات المكلفة.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية إثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الكود غير الضروري
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغير.
فيما يلي بعض الاقتراحات العملية:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لإزالته، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل العمليات الحسابية المتكررة خارج جسم الحلقة.
2. استخدام العقود المسبقة التجهيز
تقدم العقود المسبقة الترجمة وظائف مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يساعد استخدام العقود المسبقة في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجهيز خوارزمية التوقيع الرقمي المنحني البيضاوي ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجهيز في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع الداخلي
البرمجة المدمجة ### assembly in-line ( يسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما يسمح البرمجة المدمجة بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز. بالإضافة إلى ذلك، يمكن للبرمجة المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة لتحسين استهلاك الغاز.
ومع ذلك، قد يجلب استخدام التجميع الداخلي أيضًا مخاطر وسهولة
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 13
أعجبني
13
4
مشاركة
تعليق
0/400
DaoGovernanceOfficer
· منذ 19 س
*sigh* مرة أخرى منشور عن الغاز يتجاهل أبحاث توسيع المستوى الثاني...
شاهد النسخة الأصليةرد0
ApeShotFirst
· منذ 19 س
الغاز费高得我都破产了吧
شاهد النسخة الأصليةرد0
BottomMisser
· منذ 19 س
تحسين الغاز؟ من الأفضل الانتظار حتى سوق الدببة يأتي
شاهد النسخة الأصليةرد0
Rekt_Recovery
· منذ 19 س
rip رسوم الغاز... لا زلت أتعافى من صدمة 2021 بصراحة
إثيريوم العقود الذكية Gas تحسين شامل اسقاط كلفة العملية رفع الكفاءة
دليل ممارسات تحسين غاز العقود الذكية لإثيريوم
تعتبر رسوم الغاز في الشبكة الرئيسية لإثيريوم مسألة معقدة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، غالباً ما يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. لا يقتصر تحسين استهلاك الغاز على تقليل تكاليف المعاملات بشكل فعال فحسب، بل يمكنه أيضًا تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصاداً وكفاءة في البلوكشين.
ستتناول هذه المقالة آلية رسوم الغاز لآلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن تقدم هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وفي نفس الوقت تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM، لمواجهة التحديات في النظام البيئي للبلوك تشين معًا.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). وتسمى الرسوم المطلوبة لإكمال عملية "رسوم الغاز".
منذ سريان تقسيم لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * ( الرسوم الأساسية + رسوم الأولوية )
سيتم تدمير الرسوم الأساسية، بينما ستستخدم رسوم الأولوية كحوافز، لتشجيع المدققين على إضافة المعاملات إلى البلوكشين. يمكن أن تزيد تعيين رسوم الأولوية الأعلى عند إرسال المعاملة من احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "الإكرامية" التي يدفعها المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي جزء من كود العمليات ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) لديه تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد إجراء العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض عمليات التعليمات البرمجية، وقد تكون مختلفة عن تلك الموجودة في الكتاب الأصفر.
مفهوم تحسين الغاز الأساسي
الفكرة الأساسية لتحسين الغاز هي اختيار العمليات ذات الكفاءة العالية في التكلفة على سلسلة الكتل EVM، وتجنب العمليات باهظة التكلفة في الغاز.
في EVM، فإن العمليات التالية تكلفتها منخفضة:
تشمل العمليات ذات التكاليف المرتفعة:
أفضل الممارسات لتحسين رسوم الغاز EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين تكاليف الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وودية للمستخدم.
1. حاول تقليل استخدام التخزين
في سوليديتي، تعتبر Storage( تخزين) من الموارد المحدودة، حيث أن استهلاك الغاز الخاص بها أعلى بكثير من Memory( ذاكرة). كلما قرأ عقد ذكي أو كتب بيانات من التخزين، يحدث تكلفة غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من تكلفة العمليات في الذاكرة. على سبيل المثال، فإن تعليمات OPcodesmload وmstore تستهلك فقط 3 وحدات من الغاز، بينما تتطلب عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، على الأقل 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
2. تعبئة المتغيرات
ستؤثر كمية Storage slot( المستخدمة في العقود الذكية وطرق عرض البيانات من قبل المطورين بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity بتجميع متغيرات التخزين المتتالية أثناء عملية الترجمة، ويستخدم فتحة تخزين 32 بايت كالوحدة الأساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى توزيع المتغيرات بشكل معقول بحيث يمكن أن تناسب عدة متغيرات في فتحة تخزين واحدة.
من خلال هذا التعديل في التفاصيل، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتي تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن حزم المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية الخاصة بتحسين الغاز لأفضل عشرة ممارسات])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 تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 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.
![إثيريوم العقود الذكية غاز تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات أثناء عملية الترجمة، وتخزينها في بايت كود العقد. لذلك، تكون تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويوصى باستخدام كلمات المفتاح الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###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. مُحسّن التعديل
تم تضمين كود المُعدل داخل الدالة المعدلة، وفي كل مرة يتم استخدام المُعدل، يتم نسخ كوده. سيؤدي ذلك إلى زيادة حجم الشيفرة البايتية وزيادة استهلاك الغاز. يمكن تقليل حجم الشيفرة البايتية وتقليل تكلفة الغاز من خلال إعادة هيكلة المنطق إلى دالة داخلية، مما يسمح بإعادة استخدام هذه الدالة الداخلية داخل المُعدل.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية لإثيريوم]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة ل|| و &&، ستحدث تقييمات قصيرة للعمليات المنطقية، أي إذا كانت الحالة الأولى قادرة على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الحالة الثانية.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة المنخفضة للحساب في المقدمة، بحيث يمكن تجاوز الحسابات المكلفة.
![أفضل 10 ممارسات لتحسين الغاز في العقود الذكية إثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الكود غير الضروري
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغير.
فيما يلي بعض الاقتراحات العملية:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لإزالته، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل العمليات الحسابية المتكررة خارج جسم الحلقة.
2. استخدام العقود المسبقة التجهيز
تقدم العقود المسبقة الترجمة وظائف مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يساعد استخدام العقود المسبقة في توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجهيز خوارزمية التوقيع الرقمي المنحني البيضاوي ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجهيز في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع الداخلي
البرمجة المدمجة ### assembly in-line ( يسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما يسمح البرمجة المدمجة بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل من تكاليف الغاز. بالإضافة إلى ذلك، يمكن للبرمجة المدمجة تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر مزيدًا من المرونة لتحسين استهلاك الغاز.
ومع ذلك، قد يجلب استخدام التجميع الداخلي أيضًا مخاطر وسهولة