تعتبر رسوم الغاز في شبكة إثيريوم الرئيسية مشكلة شائكة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، غالبًا ما يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية يعد أمرًا بالغ الأهمية. يمكن أن يؤدي تحسين استهلاك الغاز إلى تقليل تكاليف المعاملات بشكل فعال، بالإضافة إلى تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وفعالية في مجال البلوك تشين.
ستستعرض هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوك تشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" تشير إلى وحدة تقيس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في بنية EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات غير المحدودة وهجمات رفض الخدمة ( DoS ). الرسوم المطلوبة لإكمال معاملة تُعرف باسم "رسوم الغاز".
منذ سريان EIP-1559، يتم حساب رسوم الغاز وفقًا للمعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (الرسوم الأساسية + رسوم الأولوية)
سيتم إحراق الرسوم الأساسية، بينما تُستخدم الرسوم الأولوية كمكافأة لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال معاملة، يمكن أن يؤدي تعيين رسوم أولية أعلى إلى زيادة احتمال تضمين المعاملة في الكتلة التالية. هذا مشابه لنوع من "البقشيش" الذي يدفعه المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عندما يتم تجميع العقود الذكية باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "رموز العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وتُسجل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض تعليمات التشغيل، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
2.مفهوم تحسين الغاز الأساسي
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة كتلة EVM، وتجنب العمليات ذات التكلفة العالية للغاز.
في EVM، التكاليف منخفضة للعمليات التالية:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
كتابة وقراءة المتغيرات المحلية
قراءة متغيرات calldata، مثل مصفوفات calldata والهياكل
استدعاء الدوال الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
عمليات التكرار
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.قلل من استخدام التخزين قدر الإمكان
في سوليدتي، Storage( التخزين) هو مورد محدود، واستهلاك الغاز فيه أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، تحدث تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload وmstore فقط 3 وحدات غاز، بينما تحتاج عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، إلى ما لا يقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد التعديلات على التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وبعد الانتهاء من جميع الحسابات، يتم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
تؤثر كمية Storage slot( المستخدمة في العقود الذكية وطريقة عرض المطورين للبيانات بشكل كبير على استهلاك Gas.
سيقوم مترجم سوليديتي بتجميع المتغيرات المخزنة المتتالية أثناء عملية الترجمة، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات التكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) حيث يتطلب تخزين فتحة تخزين غير مستخدمة 20,000 غاز (، ولكن الآن يحتاج الأمر فقط إلى فتحتين تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])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 تحسين أفضل 10 ممارسات]###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 تحسين أفضل 10 ممارسات])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 تحسين أفضل 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. مُعدل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وعندما يتم استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت كود وزيادة استهلاك الغاز.
من خلال إعادة هيكلة المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدلات، مما يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لعملية || و &&، تحدث عمليات المنطق تقييمًا مختصرًا، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات عالية التكلفة.
![أفضل عشرة ممارسات لتحسين الغاز للعقود الذكية في إثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الشيفرة غير المستخدمة
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لعنصر معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية عالية التكلفة، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية المسبقة التجهيز
تقدم العقود المسبقة التجهيز وظائف مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب يكون أقل. يمكن أن يوفر استخدام العقود المسبقة التجهيز الغاز من خلال تقليل عبء العمل الحسابي اللازم لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقم البياني المنحني ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 19
أعجبني
19
8
إعادة النشر
مشاركة
تعليق
0/400
SerumDegen
· 07-23 04:02
هههه الغاز ينزف محفظتي جافة الآن... تم تدميري من قبل
شاهد النسخة الأصليةرد0
WalletDivorcer
· 07-21 18:08
يمكنك رؤية تحسين العقد إذا كان لديك يد.
شاهد النسخة الأصليةرد0
ProofOfNothing
· 07-20 15:12
غاز ما عنده فلوس بعدين نتحدث عن إيه
شاهد النسخة الأصليةرد0
AlphaBrain
· 07-20 04:31
انس الأمر ، إنه كسول جدا لتحسين الغاز والانتقال إلى L2
شاهد النسخة الأصليةرد0
ImpermanentLossEnjoyer
· 07-20 04:29
من يتذكر حادثة صفقة بقيمة 2000 دولار؟
شاهد النسخة الأصليةرد0
OvertimeSquid
· 07-20 04:19
إذا كنت تريد رسوم التداول، يجب عليك دفع قرض المنزل.
إثيريوم العقود الذكيةGas费优化指南: 十大最佳实践与技巧
أفضل ممارسات تحسين الغاز للعقود الذكية إثيريوم
تعتبر رسوم الغاز في شبكة إثيريوم الرئيسية مشكلة شائكة، خاصةً عندما يكون هناك ازدحام في الشبكة. خلال أوقات الذروة، غالبًا ما يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية يعد أمرًا بالغ الأهمية. يمكن أن يؤدي تحسين استهلاك الغاز إلى تقليل تكاليف المعاملات بشكل فعال، بالإضافة إلى تعزيز كفاءة المعاملات، مما يوفر للمستخدمين تجربة استخدام أكثر اقتصادية وفعالية في مجال البلوك تشين.
ستستعرض هذه المقالة آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل من خلال هذه المحتويات أن نقدم إلهامًا ومساعدة عملية للمطورين، وفي الوقت نفسه نساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوك تشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" تشير إلى وحدة تقيس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في بنية EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاءات الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات غير المحدودة وهجمات رفض الخدمة ( DoS ). الرسوم المطلوبة لإكمال معاملة تُعرف باسم "رسوم الغاز".
منذ سريان EIP-1559، يتم حساب رسوم الغاز وفقًا للمعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (الرسوم الأساسية + رسوم الأولوية)
سيتم إحراق الرسوم الأساسية، بينما تُستخدم الرسوم الأولوية كمكافأة لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. عند إرسال معاملة، يمكن أن يؤدي تعيين رسوم أولية أعلى إلى زيادة احتمال تضمين المعاملة في الكتلة التالية. هذا مشابه لنوع من "البقشيش" الذي يدفعه المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عندما يتم تجميع العقود الذكية باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "رموز العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقود، إجراء استدعاءات الرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وتُسجل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض تعليمات التشغيل، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
2.مفهوم تحسين الغاز الأساسي
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة كتلة EVM، وتجنب العمليات ذات التكلفة العالية للغاز.
في EVM، التكاليف منخفضة للعمليات التالية:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1.قلل من استخدام التخزين قدر الإمكان
في سوليدتي، Storage( التخزين) هو مورد محدود، واستهلاك الغاز فيه أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، تحدث تكاليف غاز مرتفعة.
وفقًا لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload وmstore فقط 3 وحدات غاز، بينما تحتاج عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، إلى ما لا يقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
2. تعبئة المتغيرات
تؤثر كمية Storage slot( المستخدمة في العقود الذكية وطريقة عرض المطورين للبيانات بشكل كبير على استهلاك Gas.
سيقوم مترجم سوليديتي بتجميع المتغيرات المخزنة المتتالية أثناء عملية الترجمة، ويستخدم فتحة تخزين بحجم 32 بايت كوحدة أساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل منطقي بحيث يمكن لعدة متغيرات التكيف داخل فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) حيث يتطلب تخزين فتحة تخزين غير مستخدمة 20,000 غاز (، ولكن الآن يحتاج الأمر فقط إلى فتحتين تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])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 تحسين أفضل 10 ممارسات]###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 تحسين أفضل 10 ممارسات])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 تحسين أفضل 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. مُعدل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وعندما يتم استخدام المعدل، يتم نسخ الكود في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت كود وزيادة استهلاك الغاز.
من خلال إعادة هيكلة المنطق إلى دالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدلات، مما يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لعملية || و &&، تحدث عمليات المنطق تقييمًا مختصرًا، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات عالية التكلفة.
![أفضل عشرة ممارسات لتحسين الغاز للعقود الذكية في إثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
نصائح عامة إضافية
) 1. حذف الشيفرة غير المستخدمة
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة لعنصر معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية عالية التكلفة، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية المسبقة التجهيز
تقدم العقود المسبقة التجهيز وظائف مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب يكون أقل. يمكن أن يوفر استخدام العقود المسبقة التجهيز الغاز من خلال تقليل عبء العمل الحسابي اللازم لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية توقيع الرقم البياني المنحني ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.