أفضل الممارسات لتحسين تكاليف غاز العقود الذكية إثيريوم
تعتبر رسوم الغاز في شبكة إثيريوم الرئيسية من التحديات الرئيسية التي يواجهها المطورون والمستخدمون، وخاصة خلال الازدحام الشبكي. في ذروة المعاملات، غالبًا ما يتعين على المستخدمين دفع رسوم مرتفعة. لذلك، من الضروري تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية. لا يساعد تحسين استهلاك الغاز فقط في تقليل تكاليف المعاملات بشكل فعال، بل يعزز أيضًا كفاءة المعاملات، مما يوفر تجربة استخدام أكثر اقتصادية وفعالية في البلوكشين للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بـ إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن تقدم هذه المحتويات إلهامًا ومساعدة عملية للمطورين، بالإضافة إلى مساعدة المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، ومواجهة التحديات في النظام البيئي للكتلة.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات محددة.
يتكون هيكل EVM من ثلاثة أجزاء رئيسية لاستهلاك الغاز: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). الرسوم المطلوبة لإكمال المعاملة تُعرف باسم "رسوم الغاز".
منذ سريان الانقسام الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير الرسوم الأساسية، بينما سيتم استخدام رسوم الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى بلوكتشين. عند إرسال المعاملة، يمكن ضبط رسوم الأولوية الأعلى لزيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "رموز التشغيل"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة غاز بعض رموز العمليات، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
مفهوم أساسي لتحسين الغاز
المفهوم الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة التكلفة العالية على بلوكتشين 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 غاز(، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])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 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 4. استخدم متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان من الممكن التحكم في البيانات في 32 بايت، يُوصى باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان من الممكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
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.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة / غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ومن المستحسن استخدامها قدر الإمكان باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدم Unchecked مع التأكد من عدم حدوث overflow/underflow
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص, يمكنهم استخدام الكلمة المفتاحية unchecked التي تم إدخالها في Solidity v0.8.0, لتجنب الفحوصات الزائدة للتجاوز أو النقص, وبالتالي توفير تكاليف الغاز.
بالإضافة إلى ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، لأن المترجم نفسه قد أدرج بالفعل ميزات حماية من الفائض والنقص.
9. مُحسّنات التعديل
تم تضمين كود المعدل في الدالة المعدلة، وفي كل مرة يتم فيها استخدام المعدل، يتم نسخ الكود. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدِلات، مما يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغل || ومشغل &&، تحدث عمليات المنطق تقويمًا قصيرًا، أي أنه إذا كان الشرط الأول قادرًا على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
اقتراحات عامة إضافية
) 1. حذف الشيفرة غير المفيدة
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بإزالتها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الدائرية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية المسبقة التجهيز
توفر العقود الذكية المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يعمل على EVM، ولكنه يعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يؤدي استخدام العقود الذكية المسبقة الترجمة إلى توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية التوقيع الرقمي للمنحنيات البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![إثيريوم العقود الذكية من حيث تحسين الغاز لأفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام كود التجميع المضمن
التركيب الداخلي ### in-line assembly ( يسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام الرموز التشغيلية المكلفة في Solidity. كما يسمح التركيب الداخلي بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل المزيد من رسوم الغاز. بالإضافة إلى ذلك، يمكن أن ينفذ التركيب الداخلي بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع الداخلي قد ينطوي أيضًا على مخاطر ويكون عرضة للأخطاء. لذلك، يجب استخدامه بحذر، ويفضل أن يكون ذلك من قبل المطورين ذوي الخبرة.
) 4. استخدام حلول Layer 2
استخدام حلول الطبقة الثانية يمكن أن يقلل من كمية البيانات التي تحتاج إلى التخزين والحساب على شبكة إثيريوم الرئيسية.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 16
أعجبني
16
4
مشاركة
تعليق
0/400
MEV_Whisperer
· 08-02 05:53
غاز ارتفع مرة أخرى، تداول العقود مزعج للغاية
شاهد النسخة الأصليةرد0
fomo_fighter
· 08-02 05:46
تضخم الغاز إلى حد كبير، اذهب إلى حيث يكون الجو لطيفًا.
أفضل 10 ممارسات لتحسين رسوم الغاز للعقود الذكية على إثيريوم
أفضل الممارسات لتحسين تكاليف غاز العقود الذكية إثيريوم
تعتبر رسوم الغاز في شبكة إثيريوم الرئيسية من التحديات الرئيسية التي يواجهها المطورون والمستخدمون، وخاصة خلال الازدحام الشبكي. في ذروة المعاملات، غالبًا ما يتعين على المستخدمين دفع رسوم مرتفعة. لذلك، من الضروري تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية. لا يساعد تحسين استهلاك الغاز فقط في تقليل تكاليف المعاملات بشكل فعال، بل يعزز أيضًا كفاءة المعاملات، مما يوفر تجربة استخدام أكثر اقتصادية وفعالية في البلوكشين للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز الخاصة بـ إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. نأمل أن تقدم هذه المحتويات إلهامًا ومساعدة عملية للمطورين، بالإضافة إلى مساعدة المستخدمين العاديين على فهم كيفية عمل رسوم الغاز في EVM بشكل أفضل، ومواجهة التحديات في النظام البيئي للكتلة.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة تستخدم لقياس القدرة الحاسوبية المطلوبة لتنفيذ عمليات محددة.
يتكون هيكل EVM من ثلاثة أجزاء رئيسية لاستهلاك الغاز: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). الرسوم المطلوبة لإكمال المعاملة تُعرف باسم "رسوم الغاز".
منذ سريان الانقسام الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز وفقًا للصيغة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
سيتم تدمير الرسوم الأساسية، بينما سيتم استخدام رسوم الأولوية كحافز، لتشجيع المدققين على إضافة المعاملات إلى بلوكتشين. عند إرسال المعاملة، يمكن ضبط رسوم الأولوية الأعلى لزيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا نوعًا من "البقشيش" الذي يدفعه المستخدمون للمدققين.
فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "رموز التشغيل"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء عقد، إجراء استدعاء للرسائل، الوصول إلى تخزين الحسابات وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وهذه التكاليف مسجلة في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة غاز بعض رموز العمليات، وقد تكون مختلفة عن تلك المذكورة في الكتاب الأصفر.
مفهوم أساسي لتحسين الغاز
المفهوم الأساسي لتحسين الغاز هو اختيار العمليات ذات الكفاءة التكلفة العالية على بلوكتشين EVM، وتجنب العمليات التي تكلف الغاز غالي.
في EVM ، تكون تكلفة العمليات التالية منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، إليك قائمة بأفضل الممارسات لتحسين رسوم الغاز. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وسهولة في الاستخدام.
1. حاول تقليل الاستخدام التخزيني قدر الإمكان
في Solidity، يعتبر Storage( تخزين) موردًا محدودًا، حيث إن استهلاك الغاز له أعلى بكثير من Memory( الذاكرة). كلما قام العقد الذكي بقراءة أو كتابة بيانات من التخزين، فإن ذلك يؤدي إلى تكاليف غاز مرتفعة.
وفقاً لتعريف الكتاب الأصفر لإثيريوم، فإن تكلفة عمليات التخزين أعلى بأكثر من 100 مرة من عمليات الذاكرة. على سبيل المثال، فإن تعليمات OPcodesmload وmstore تستهلك فقط 3 وحدات غاز، في حين أن عمليات التخزين مثل sload وsstore، حتى في أفضل الظروف، تحتاج على الأقل إلى 100 وحدة.
تتضمن طرق تقييد استخدام التخزين:
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض المطورين للبيانات ستؤثر بشكل كبير على استهلاك رسوم الغاز.
سيقوم مترجم Solidity خلال عملية الترجمة بتجميع المتغيرات المخزنة بشكل متتابع، ويستخدم فتحة تخزين بحجم 32 بايت كالوحدة الأساسية لتخزين المتغيرات. يشير تجميع المتغيرات إلى ترتيب المتغيرات بشكل منطقي بحيث يمكن أن تتناسب عدة متغيرات ضمن فتحة تخزين واحدة.
من خلال هذا التعديل التفصيلي، يمكن للمطورين توفير 20,000 وحدة غاز) لتخزين فتحة تخزين غير مستخدمة تحتاج إلى استهلاك 20,000 غاز(، ولكن الآن تحتاج فقط إلى فتحتين للتخزين.
نظرًا لأن كل فتحة تخزين تستهلك الغاز، فإن تعبئة المتغيرات تعمل على تحسين استخدام الغاز من خلال تقليل عدد فتحات التخزين المطلوبة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])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 في الذاكرة/التخزين في عملية واحدة.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(
) 4. استخدم متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان من الممكن التحكم في البيانات في 32 بايت، يُوصى باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، تستهلك المتغيرات ذات الحجم الثابت غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان من الممكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
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.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين المتغيرات الثابتة / غير القابلة للتغيير في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة وتخزينها في بايت كود العقد. لذلك، فإن تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ومن المستحسن استخدامها قدر الإمكان باستخدام الكلمات الرئيسية الثابتة أو غير القابلة للتغيير.
![إثيريوم العقود الذكية Gas تحسين أفضل عشر ممارسات]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 8. استخدم Unchecked مع التأكد من عدم حدوث overflow/underflow
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص, يمكنهم استخدام الكلمة المفتاحية unchecked التي تم إدخالها في Solidity v0.8.0, لتجنب الفحوصات الزائدة للتجاوز أو النقص, وبالتالي توفير تكاليف الغاز.
بالإضافة إلى ذلك، لم تعد الإصدارات 0.8.0 وما فوق من المترجم بحاجة إلى استخدام مكتبة SafeMath، لأن المترجم نفسه قد أدرج بالفعل ميزات حماية من الفائض والنقص.
9. مُحسّنات التعديل
تم تضمين كود المعدل في الدالة المعدلة، وفي كل مرة يتم فيها استخدام المعدل، يتم نسخ الكود. سيؤدي ذلك إلى زيادة حجم البايت كود وزيادة استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية، يسمح بإعادة استخدام هذه الدالة الداخلية في المُعدِلات، مما يقلل من حجم البايت كود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغل || ومشغل &&، تحدث عمليات المنطق تقويمًا قصيرًا، أي أنه إذا كان الشرط الأول قادرًا على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، مما قد يسمح بتجاوز الحسابات ذات التكلفة العالية.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(
اقتراحات عامة إضافية
) 1. حذف الشيفرة غير المفيدة
إذا كان هناك وظائف أو متغيرات غير مستخدمة في العقد، يُنصح بإزالتها. هذه هي الطريقة الأكثر مباشرة لتقليل تكلفة نشر العقد والحفاظ على حجم العقد صغيراً.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة في الحساب. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز عن طريق تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الرئيسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الدائرية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
2. استخدام العقود الذكية المسبقة التجهيز
توفر العقود الذكية المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يعمل على EVM، ولكنه يعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن يؤدي استخدام العقود الذكية المسبقة الترجمة إلى توفير الغاز من خلال تقليل عبء العمل الحسابي المطلوب لتنفيذ العقود الذكية.
تشمل أمثلة العقود المسبقة التجميع خوارزمية التوقيع الرقمي للمنحنيات البيانية ###ECDSA( وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة التجميع في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
![إثيريوم العقود الذكية من حيث تحسين الغاز لأفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(
) 3. استخدام كود التجميع المضمن
التركيب الداخلي ### in-line assembly ( يسمح للمطورين بكتابة كود منخفض المستوى وفعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة إلى استخدام الرموز التشغيلية المكلفة في Solidity. كما يسمح التركيب الداخلي بالتحكم بدقة أكبر في استخدام الذاكرة والتخزين، مما يقلل المزيد من رسوم الغاز. بالإضافة إلى ذلك، يمكن أن ينفذ التركيب الداخلي بعض العمليات المعقدة التي يصعب تحقيقها باستخدام Solidity فقط، مما يوفر المزيد من المرونة في تحسين استهلاك الغاز.
ومع ذلك، فإن استخدام التجميع الداخلي قد ينطوي أيضًا على مخاطر ويكون عرضة للأخطاء. لذلك، يجب استخدامه بحذر، ويفضل أن يكون ذلك من قبل المطورين ذوي الخبرة.
) 4. استخدام حلول Layer 2
استخدام حلول الطبقة الثانية يمكن أن يقلل من كمية البيانات التي تحتاج إلى التخزين والحساب على شبكة إثيريوم الرئيسية.