دليل تحسين رسوم الغاز للعقود الذكية: 10 أفضل الممارسات
تعتبر رسوم الغاز على شبكة الإيثيريوم الرئيسية مشكلة معقدة، خاصةً عندما تكون الشبكة مزدحمة. خلال أوقات الذروة، غالبًا ما يتعين على المستخدمين دفع رسوم معاملات مرتفعة. لذلك، من الضروري تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية. لا يساهم تحسين استهلاك الغاز في تقليل تكاليف المعاملات فحسب، بل يعزز أيضًا كفاءة المعاملات، مما يوفر تجربة بلوكشين أكثر اقتصادًا وفعالية للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بآلة إيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وأيضًا أن تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوكشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، ينقسم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال عملية بأنها "رسوم الغاز".
منذ سريان هارد فورك لندن EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير رسوم الأساس، بينما ستُستخدم رسوم الأولوية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. يمكن أن يؤدي تعيين رسوم أولية أعلى عند إرسال المعاملة إلى زيادة احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند استخدام Solidity لتجميع العقود الذكية، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة معروفة من الغاز، وهذه التكاليف مسجلة في الكتاب الأصفر للإيثيريوم.
بعد العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض التعليمات، وقد تكون هناك اختلافات مع الكتاب الأصفر.
2.مفاهيم أساسية لتحسين الغاز
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل 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 غاز (، ولكن الآن تحتاج فقط إلى فتحتي تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![أفضل 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 في الذاكرة/التخزين في عملية واحدة.
![أفضل 10 ممارسات لتحسين غاز العقود الذكية على الإيثيريوم]###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.
عند قراءة القيم مباشرة من calldata، يتم تخطي عمليات الذاكرة الوسيطة. يمكن أن تؤدي هذه الطريقة في التحسين إلى زيادة كبيرة في كفاءة الغاز.
7. حاول استخدام كلمات Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثريوم]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدام Unchecked لضمان عدم حدوث overflow/underflow
عندما يتمكن المطورون من التأكد من أن العمليات الرياضية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة المفتاحية unchecked التي تم تقديمها في Solidity v0.8.0 لتجنب الفحوصات الزائدة على التجاوز أو النقص، وبالتالي توفير تكاليف الغاز.
بالإضافة إلى ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، حيث أن المترجم نفسه قد أدرج بالفعل ميزات حماية من الفائض والنقص.
9. مُعدل تحسين
تم تضمين كود المُعدِّل في الوظيفة المعدلة، وعند استخدام المُعدِّل، يتم نسخ الكود في كل مرة. هذا سيزيد من حجم بايت كود ويزيد من استهلاك الغاز. يمكن تقليل حجم بايت كود وتخفيض تكلفة الغاز من خلال إعادة هيكلة المنطق إلى وظيفة داخلية، مما يسمح بإعادة استخدام هذه الوظيفة الداخلية داخل المُعدِّل.
10. تحسين الدوائر القصيرة
بالنسبة لمشغل || و &&، يحدث تقييم قصير للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتقليل استهلاك الغاز ، يجب وضع الشروط ذات التكلفة المنخفضة للحساب في المقدمة ، حتى يمكن تخطي الحسابات ذات التكلفة العالية.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على إيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيراً.
فيما يلي بعض الاقتراحات العملية:
استخدام أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فإنه ينبغي إزالة هذه العمليات الحسابية الزائدة. في جوهرها، يجب حذف أي حسابات غير مستخدمة.
في الإيثريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام كلمة delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الدائرية ذات التكلفة العالية، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 2. استخدام العقود الذكية
توفر العقود المسبقة الترجمة دوال مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يوفر استخدام العقود المسبقة الترجمة الغاز من خلال تقليل عبء الحساب المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود الذكية المُعَدَّة مسبقًا خوارزمية توقيع الدوائر البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود الذكية المُعَدَّة مسبقًا في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع المضمن
الترميز المضمن ### in-line assembly ( يسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما يتيح الترميز المضمن التحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للترميز المضمن تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المضمن إلى مخاطر وسهولة في الخطأ. لذلك، يجب استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 12
أعجبني
12
6
مشاركة
تعليق
0/400
AlwaysAnon
· 07-09 16:21
啧 又是غاز优化فخ烦不烦
شاهد النسخة الأصليةرد0
ForkTongue
· 07-07 17:09
الغاز معطر حقا L2 الذي يستخدم من يدري
شاهد النسخة الأصليةرد0
NonFungibleDegen
· 07-07 01:27
رسوم الغاز تقتلني حرفيًا الآن... لا أستطيع الاستمرار يا رجل
شاهد النسخة الأصليةرد0
AllTalkLongTrader
· 07-07 01:20
تعبت تعباً، غاز كفى، سأقوم بشحن L2 مباشرة.
شاهد النسخة الأصليةرد0
0xInsomnia
· 07-07 01:16
الغاز مكلف للغاية للجرؤ على قول أفضل الممارسات
شاهد النسخة الأصليةرد0
CryptoTherapist
· 07-07 01:10
دعونا نتعامل مع قلق الغاز هذا معًا... أشعر بوجود صدمة عميقة من الرسوم المرتفعة. تحسين العقود بعناية هو المفتاح لاستقرار التداول العاطفي.
دليل تحسين رسوم الغاز للعقود الذكية EVM: 10 أفضل الممارسات ومفاهيم رئيسية解析
دليل تحسين رسوم الغاز للعقود الذكية: 10 أفضل الممارسات
تعتبر رسوم الغاز على شبكة الإيثيريوم الرئيسية مشكلة معقدة، خاصةً عندما تكون الشبكة مزدحمة. خلال أوقات الذروة، غالبًا ما يتعين على المستخدمين دفع رسوم معاملات مرتفعة. لذلك، من الضروري تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية. لا يساهم تحسين استهلاك الغاز في تقليل تكاليف المعاملات فحسب، بل يعزز أيضًا كفاءة المعاملات، مما يوفر تجربة بلوكشين أكثر اقتصادًا وفعالية للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بآلة إيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن توفر هذه المحتويات إلهامًا ومساعدة عملية للمطورين، وأيضًا أن تساعد المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، لمواجهة التحديات في النظام البيئي للبلوكشين.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل EVM، ينقسم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، استدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل عملية يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال عملية بأنها "رسوم الغاز".
منذ سريان هارد فورك لندن EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير رسوم الأساس، بينما ستُستخدم رسوم الأولوية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. يمكن أن يؤدي تعيين رسوم أولية أعلى عند إرسال المعاملة إلى زيادة احتمال تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند استخدام Solidity لتجميع العقود الذكية، سيتم تحويل العقد إلى سلسلة من "أكواد العمليات"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة معروفة من الغاز، وهذه التكاليف مسجلة في الكتاب الأصفر للإيثيريوم.
بعد العديد من التعديلات على EIP، تم تعديل تكلفة الغاز لبعض التعليمات، وقد تكون هناك اختلافات مع الكتاب الأصفر.
2.مفاهيم أساسية لتحسين الغاز
تتمثل الفكرة الأساسية لتحسين الغاز في اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة الكتل EVM، وتجنب العمليات المكلفة من حيث تكاليف الغاز.
في EVM، تكون تكلفة العمليات التالية منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بتجميع قائمة بأفضل ممارسات تحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وصديقة للمستخدم.
1.حاول تقليل استخدام التخزين
في Solidity، تعتبر Storage( تخزين) موردًا محدودًا، حيث أن استهلاك الغاز الخاص بها أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، ستنتج تكاليف غاز مرتفعة.
وفقًا لتعريف كتاب الإيثريوم الأصفر، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، تستهلك تعليمات OPcodesmload وmstore فقط 3 وحدات غاز، في حين أن عمليات التخزين مثل sload وsstore، حتى في أفضل الحالات، تحتاج إلى تكلفة لا تقل عن 100 وحدة.
طرق تقييد استخدام التخزين تشمل:
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك رسوم الغاز.
سيقوم مُجمع Solidity بتجميع المتغيرات المخزنة المتتالية أثناء عملية التجميع، ويستخدم وحدات التخزين الأساسية بحجم 32 بايت كخزانات لتخزين المتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل معقول بحيث يمكن أن تناسب عدة متغيرات في خزانة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز ) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز (، ولكن الآن تحتاج فقط إلى فتحتي تخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.
![أفضل 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 في الذاكرة/التخزين في عملية واحدة.
![أفضل 10 ممارسات لتحسين غاز العقود الذكية على الإيثيريوم]###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.
عند قراءة القيم مباشرة من calldata، يتم تخطي عمليات الذاكرة الوسيطة. يمكن أن تؤدي هذه الطريقة في التحسين إلى زيادة كبيرة في كفاءة الغاز.
7. حاول استخدام كلمات Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة/غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويُنصح باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير كلما كان ذلك ممكنًا.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثريوم]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدام Unchecked لضمان عدم حدوث overflow/underflow
عندما يتمكن المطورون من التأكد من أن العمليات الرياضية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة المفتاحية unchecked التي تم تقديمها في Solidity v0.8.0 لتجنب الفحوصات الزائدة على التجاوز أو النقص، وبالتالي توفير تكاليف الغاز.
بالإضافة إلى ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، حيث أن المترجم نفسه قد أدرج بالفعل ميزات حماية من الفائض والنقص.
9. مُعدل تحسين
تم تضمين كود المُعدِّل في الوظيفة المعدلة، وعند استخدام المُعدِّل، يتم نسخ الكود في كل مرة. هذا سيزيد من حجم بايت كود ويزيد من استهلاك الغاز. يمكن تقليل حجم بايت كود وتخفيض تكلفة الغاز من خلال إعادة هيكلة المنطق إلى وظيفة داخلية، مما يسمح بإعادة استخدام هذه الوظيفة الداخلية داخل المُعدِّل.
10. تحسين الدوائر القصيرة
بالنسبة لمشغل || و &&، يحدث تقييم قصير للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتقليل استهلاك الغاز ، يجب وضع الشروط ذات التكلفة المنخفضة للحساب في المقدمة ، حتى يمكن تخطي الحسابات ذات التكلفة العالية.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على إيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
نصائح عامة إضافية
) 1. حذف الكود غير المفيد
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيراً.
فيما يلي بعض الاقتراحات العملية:
استخدام أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فإنه ينبغي إزالة هذه العمليات الحسابية الزائدة. في جوهرها، يجب حذف أي حسابات غير مستخدمة.
في الإيثريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام كلمة delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقات: تجنب العمليات الدائرية ذات التكلفة العالية، دمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
![أفضل 10 ممارسات لتحسين الغاز للعقود الذكية على الإيثيريوم]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
) 2. استخدام العقود الذكية
توفر العقود المسبقة الترجمة دوال مكتبة معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يوفر استخدام العقود المسبقة الترجمة الغاز من خلال تقليل عبء الحساب المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود الذكية المُعَدَّة مسبقًا خوارزمية توقيع الدوائر البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود الذكية المُعَدَّة مسبقًا في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
) 3. استخدام كود التجميع المضمن
الترميز المضمن ### in-line assembly ( يسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام تعليمات Solidity المكلفة. كما يتيح الترميز المضمن التحكم بشكل أكثر دقة في استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للترميز المضمن تنفيذ بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، قد يؤدي استخدام التجميع المضمن إلى مخاطر وسهولة في الخطأ. لذلك، يجب استخدامه بحذر، ويقتصر على المطورين ذوي الخبرة.
![أفضل 10 ممارسات لتحسين غاز العقود الذكية لإيثريوم])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 4. استخدام حلول Layer 2
مبعوث