أفضل الممارسات لتحسين تكاليف غاز العقود الذكية على إثيريوم
تعتبر رسوم الغاز في الشبكة الرئيسية لإثيريوم مشكلة معقدة، وخاصة عندما تكون الشبكة مزدحمة. خلال فترات الذروة، يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. إن تحسين استهلاك الغاز لا يقتصر فقط على خفض تكاليف المعاملات بفعالية، ولكنه أيضًا يعزز كفاءة المعاملات، مما يوفر تجربة بلوكتشين أكثر اقتصادية وفعالية للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة الإيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز أثناء تطوير العقود الذكية. نأمل أن توفر هذه المحتويات الإلهام والمساعدة العملية للمطورين، وكذلك تساعد المستخدمين العاديين على فهم كيفية عمل رسوم غاز EVM بشكل أفضل، لمواجهة التحديات في بيئة blockchain.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال معاملة بـ "رسوم الغاز".
منذ سريان الشق الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
ستتم إتلاف الرسوم الأساسية، بينما ستُستخدم الرسوم الأولية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم أولية أعلى عند إرسال المعاملات، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا "إكرامية" يدفعها المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وتُسجل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض التعليمات البرمجية، وقد تختلف عن تلك الموجودة في الكتاب الأصفر.
2.المفهوم الأساسي لتحسين الغاز
فكرة تحسين الغاز الأساسية هي اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة EVM blockchain، وتجنب العمليات باهظة التكلفة من حيث الغاز.
في EVM، فإن العمليات التالية تكون ذات تكلفة منخفضة:
قراءة وكتابة متغيرات الذاكرة
قراءة الثوابت والمتغيرات غير القابلة للتغيير
قراءة وكتابة المتغيرات المحلية
قراءة متغير calldata، مثل مصفوفة calldata والهياكل
استدعاء الدالة الداخلية
تشمل العمليات ذات التكلفة العالية:
قراءة وكتابة المتغيرات الحالة المخزنة في تخزين العقد
استدعاء الدوال الخارجية
العمليات الدائرية
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بإعداد قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وصديقة للمستخدم.
1.قم بتقليل استخدام التخزين قدر الإمكان
في سوليديتي، Storage( التخزين) هو مورد محدود، استهلاك الغاز الخاص به أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، يتم تكبد تكاليف غاز عالية.
وفقًا لتعريف الكتاب الأصفر لإثيريوم ، فإن تكلفة عمليات التخزين أعلى من تكلفة عمليات الذاكرة بأكثر من 100 مرة. على سبيل المثال ، فإن تعليمات OPcodesmload و mstore تستهلك فقط 3 وحدات من الغاز ، بينما عمليات التخزين مثل sload و sstore تتطلب على الأقل 100 وحدة حتى في أفضل الحالات.
تتضمن طرق تقييد استخدام التخزين:
تخزين البيانات غير الدائمة في الذاكرة
تقليل عدد تعديل التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وبعد انتهاء جميع الحسابات، يتم تخصيص النتائج لمتغيرات التخزين.
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض البيانات من قبل المطورين ستؤثر بشكل كبير على استهلاك Gas.
سيقوم مجمع 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 في الذاكرة/التخزين في عملية واحدة.
4. استخدام متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، فإن المتغيرات ذات الحجم الثابت تستهلك غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من أنواع البيانات: المصفوفات ( Arrays ) و الخرائط ### Mappings (، لكن قواعدها وبنيتها مختلفة تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بإمكانية التكرار وتدعم تغليف أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تغليف أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 6. استخدام calldata بدلاً من memory
المتغيرات المعلنة في معلمات الدالة يمكن أن تُخزن في calldata أو memory. الفرق الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الوظيفة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين متغيرات Constant/Immutable في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، ستكون تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويُنصح باستخدام الكلمات الرئيسية Constant أو Immutable كلما كان ذلك ممكنًا.
8. استخدم Unchecked لضمان عدم حدوث تجاوز/نقص
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة المفتاحية unchecked التي تم إدخالها في Solidity v0.8.0، لتجنب الفحوصات الزائدة للتجاوز أو النقص، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في الإصدارات 0.8.0 وما فوق، لأن المترجم نفسه يحتوي على ميزات حماية من تجاوز السعة ونقص السعة.
9. مُعدّل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وعند استخدام المعدل، يتم نسخ كوده في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود ورفع استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner()، يمكن السماح بإعادة استخدام هذه الدالة الداخلية في المعدل، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغلات || و &&، ستحدث تقييمات قصيرة للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، بحيث يمكن أن يتاح تخطي العمليات الحسابية ذات التكلفة العالية.
نصائح عامة إضافية
( 1. حذف الشيفرة غير المستخدمة
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيرًا.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الأساسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-248337b15929868ed1250ffb9fcfa289.webp###
2. استخدام العقود الذكية المسبقة التجميع
تقدم العقود المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن تساعد العقود المسبقة الترجمة في توفير الغاز من خلال تقليل عبء العمل الحاسوبي المطلوب لتنفيذ العقود الذكية.
تتضمن أمثلة العقود المسبقة الترجمة خوارزمية توقيع رقمية باستخدام منحنى بيضاوي (ECDSA) وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
3. استخدام كود التجميع المضمن
البرمجة المضمنة ( in-line assembly ) يسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة لاستخدام تعليمات Solidity المكلفة. كما أن البرمجة المضمنة تتيح السيطرة بدقة أكبر على استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة أن
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
تسجيلات الإعجاب 16
أعجبني
16
7
مشاركة
تعليق
0/400
AlgoAlchemist
· منذ 4 س
غاز要搞死我了
شاهد النسخة الأصليةرد0
BearEatsAll
· منذ 15 س
ارتفاع الغاز ليس إلا طريق مسدود للراغبين في استغلال الفرص.
شاهد النسخة الأصليةرد0
MEVHunterWang
· 07-11 05:59
غاز又 ارتفع了看着心疼
شاهد النسخة الأصليةرد0
CoffeeNFTrader
· 07-11 05:55
يعد تحسين الغاز أيضا مأزقا ، فمن الأفضل حقا الانتقال إلى الطبقة 2
شاهد النسخة الأصليةرد0
StrawberryIce
· 07-11 05:54
علق في غاز عالي غاز! انطلق انطلق انطلق!
شاهد النسخة الأصليةرد0
OffchainWinner
· 07-11 05:50
لقد مللت من استخدام L2...
شاهد النسخة الأصليةرد0
HalfBuddhaMoney
· 07-11 05:31
حتى لو كانت رسوم الغاز مرتفعة، يجب أن تستمر في الدفع، يا أخي.
13 ممارسات لتحسين رسوم الغاز للعقود الذكية على إثيريوم
أفضل الممارسات لتحسين تكاليف غاز العقود الذكية على إثيريوم
تعتبر رسوم الغاز في الشبكة الرئيسية لإثيريوم مشكلة معقدة، وخاصة عندما تكون الشبكة مزدحمة. خلال فترات الذروة، يحتاج المستخدمون إلى دفع رسوم معاملات مرتفعة. لذلك، فإن تحسين رسوم الغاز خلال مرحلة تطوير العقود الذكية أمر بالغ الأهمية. إن تحسين استهلاك الغاز لا يقتصر فقط على خفض تكاليف المعاملات بفعالية، ولكنه أيضًا يعزز كفاءة المعاملات، مما يوفر تجربة بلوكتشين أكثر اقتصادية وفعالية للمستخدمين.
ستتناول هذه المقالة آلية رسوم الغاز في آلة الإيثريوم الافتراضية (EVM)، والمفاهيم الأساسية لتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز أثناء تطوير العقود الذكية. نأمل أن توفر هذه المحتويات الإلهام والمساعدة العملية للمطورين، وكذلك تساعد المستخدمين العاديين على فهم كيفية عمل رسوم غاز EVM بشكل أفضل، لمواجهة التحديات في بيئة blockchain.
مقدمة عن آلية رسوم الغاز في EVM
في الشبكات المتوافقة مع EVM، "Gas" هو وحدة لقياس القدرة الحسابية المطلوبة لتنفيذ عمليات معينة.
في هيكل تخطيط EVM، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العمليات، واستدعاء الرسائل الخارجية، وقراءة وكتابة الذاكرة والتخزين.
نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، فسيتم فرض رسوم معينة لمنع الحلقات اللانهائية وهجمات رفض الخدمة ( DoS ). تُعرف الرسوم المطلوبة لإكمال معاملة بـ "رسوم الغاز".
منذ سريان الشق الصلب لندن EIP-1559( )، يتم حساب رسوم الغاز من خلال المعادلة التالية:
رسوم الغاز = وحدات الغاز المستخدمة * (رسوم أساسية + رسوم الأولوية)
ستتم إتلاف الرسوم الأساسية، بينما ستُستخدم الرسوم الأولية كحافز لتشجيع المدققين على إضافة المعاملات إلى سلسلة الكتل. من خلال تعيين رسوم أولية أعلى عند إرسال المعاملات، يمكن زيادة احتمالية تضمين المعاملة في الكتلة التالية. يشبه هذا "إكرامية" يدفعها المستخدمون للمدققين.
1.فهم تحسين الغاز في EVM
عند تجميع العقود الذكية باستخدام Solidity، سيتم تحويل العقد إلى سلسلة من "أكواد التشغيل"، أي opcodes.
أي جزء من كود التشغيل ( مثل إنشاء العقد، إجراء استدعاء الرسائل، الوصول إلى تخزين الحسابات، وتنفيذ العمليات على الآلة الافتراضية ) له تكلفة استهلاك غاز معترف بها، وتُسجل هذه التكاليف في كتاب إثيريوم الأصفر.
بعد عدة تعديلات على EIP، تم تعديل تكلفة الغاز لبعض التعليمات البرمجية، وقد تختلف عن تلك الموجودة في الكتاب الأصفر.
2.المفهوم الأساسي لتحسين الغاز
فكرة تحسين الغاز الأساسية هي اختيار العمليات ذات الكفاءة العالية من حيث التكلفة على سلسلة EVM blockchain، وتجنب العمليات باهظة التكلفة من حيث الغاز.
في EVM، فإن العمليات التالية تكون ذات تكلفة منخفضة:
تشمل العمليات ذات التكلفة العالية:
أفضل الممارسات لتحسين تكاليف الغاز في EVM
استنادًا إلى المفاهيم الأساسية المذكورة أعلاه، قمنا بإعداد قائمة بأفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك رسوم الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وبناء تطبيقات أكثر كفاءة وصديقة للمستخدم.
1.قم بتقليل استخدام التخزين قدر الإمكان
في سوليديتي، Storage( التخزين) هو مورد محدود، استهلاك الغاز الخاص به أعلى بكثير من Memory( الذاكرة). في كل مرة يقوم فيها العقد الذكي بقراءة أو كتابة بيانات من التخزين، يتم تكبد تكاليف غاز عالية.
وفقًا لتعريف الكتاب الأصفر لإثيريوم ، فإن تكلفة عمليات التخزين أعلى من تكلفة عمليات الذاكرة بأكثر من 100 مرة. على سبيل المثال ، فإن تعليمات OPcodesmload و mstore تستهلك فقط 3 وحدات من الغاز ، بينما عمليات التخزين مثل sload و sstore تتطلب على الأقل 100 وحدة حتى في أفضل الحالات.
تتضمن طرق تقييد استخدام التخزين:
2. تعبئة المتغيرات
عدد Storage slot( المستخدم في العقود الذكية وطريقة عرض البيانات من قبل المطورين ستؤثر بشكل كبير على استهلاك Gas.
سيقوم مجمع 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 في الذاكرة/التخزين في عملية واحدة.
4. استخدام متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية
إذا كان يمكن التحكم في البيانات ضمن 32 بايت، يُنصح باستخدام نوع بيانات bytes32 بدلاً من bytes أو strings. بشكل عام، فإن المتغيرات ذات الحجم الثابت تستهلك غازًا أقل من المتغيرات ذات الحجم المتغير. إذا كان يمكن تحديد طول البايت، حاول اختيار الحد الأدنى من الطول من bytes1 إلى bytes32.
5. الخرائط والمصفوفات
يمكن تمثيل قائمة بيانات Solidity بنوعين من أنواع البيانات: المصفوفات ( Arrays ) و الخرائط ### Mappings (، لكن قواعدها وبنيتها مختلفة تمامًا.
تكون الخرائط أكثر كفاءة وأقل تكلفة في معظم الحالات، لكن المصفوفات تتمتع بإمكانية التكرار وتدعم تغليف أنواع البيانات. لذلك، يُنصح باستخدام الخرائط كأولوية عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تغليف أنواع البيانات.
![إثيريوم العقود الذكية Gas تحسين أفضل الممارسات العشر])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(
) 6. استخدام calldata بدلاً من memory
المتغيرات المعلنة في معلمات الدالة يمكن أن تُخزن في calldata أو memory. الفرق الرئيسي بين الاثنين هو أن memory يمكن تعديلها بواسطة الدالة، بينما calldata غير قابلة للتغيير.
تذكر هذه القاعدة: إذا كانت معلمات الوظيفة للقراءة فقط، يجب استخدام calldata بدلاً من memory. هذا يمكن أن يتجنب عمليات النسخ غير الضرورية من calldata إلى memory.
7. حاول استخدام الكلمات الرئيسية Constant/Immutable قدر الإمكان
لن يتم تخزين متغيرات Constant/Immutable في تخزين العقد. سيتم حساب هذه المتغيرات في وقت الترجمة، وتخزينها في بايت كود العقد. لذلك، ستكون تكلفة الوصول إليها أقل بكثير مقارنة بالتخزين، ويُنصح باستخدام الكلمات الرئيسية Constant أو Immutable كلما كان ذلك ممكنًا.
8. استخدم Unchecked لضمان عدم حدوث تجاوز/نقص
عندما يتمكن المطورون من التأكد من أن العمليات الحسابية لن تؤدي إلى تجاوز أو نقص، يمكنهم استخدام الكلمة المفتاحية unchecked التي تم إدخالها في Solidity v0.8.0، لتجنب الفحوصات الزائدة للتجاوز أو النقص، مما يوفر تكاليف الغاز.
بالإضافة إلى ذلك، لم يعد من الضروري استخدام مكتبة SafeMath في الإصدارات 0.8.0 وما فوق، لأن المترجم نفسه يحتوي على ميزات حماية من تجاوز السعة ونقص السعة.
9. مُعدّل التحسين
تم تضمين كود المعدل في الدالة المعدلة، وعند استخدام المعدل، يتم نسخ كوده في كل مرة. سيؤدي ذلك إلى زيادة حجم بايت الكود ورفع استهلاك الغاز.
من خلال إعادة بناء المنطق كدالة داخلية _checkOwner()، يمكن السماح بإعادة استخدام هذه الدالة الداخلية في المعدل، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.
![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(
) 10. تحسين الدائرة القصيرة
بالنسبة لمشغلات || و &&، ستحدث تقييمات قصيرة للمنطق، أي إذا كان الشرط الأول قادرًا بالفعل على تحديد نتيجة التعبير المنطقي، فلن يتم تقييم الشرط الثاني.
لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكلفة الحسابية المنخفضة في المقدمة، بحيث يمكن أن يتاح تخطي العمليات الحسابية ذات التكلفة العالية.
نصائح عامة إضافية
( 1. حذف الشيفرة غير المستخدمة
إذا كانت هناك دوال أو متغيرات غير مستخدمة في العقد، يُنصح بحذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيرًا.
إليك بعض النصائح المفيدة:
استخدم أكثر الخوارزميات كفاءة لإجراء الحسابات. إذا تم استخدام نتائج بعض الحسابات مباشرة في العقد، فيجب إزالة هذه العمليات الحسابية الزائدة. جوهريًا، يجب حذف أي حسابات غير مستخدمة.
في إثيريوم، يمكن للمطورين الحصول على مكافآت الغاز من خلال تحرير مساحة التخزين. إذا لم يعد هناك حاجة إلى متغير معين، يجب استخدام الكلمة الأساسية delete لحذفه، أو تعيينه إلى القيمة الافتراضية.
تحسين الحلقة: تجنب العمليات الحلقية ذات التكلفة العالية، ودمج الحلقات قدر الإمكان، ونقل الحسابات المتكررة خارج جسم الحلقة.
![إثيريوم العقود الذكية Gas تحسين أفضل 10 ممارسات])https://img-cdn.gateio.im/webp-social/moments-248337b15929868ed1250ffb9fcfa289.webp###
2. استخدام العقود الذكية المسبقة التجميع
تقدم العقود المسبقة الترجمة وظائف مكتبية معقدة، مثل عمليات التشفير والتجزئة. نظرًا لأن الشيفرة لا تعمل على EVM، بل تعمل محليًا على عقد العميل، فإن الغاز المطلوب أقل. يمكن أن تساعد العقود المسبقة الترجمة في توفير الغاز من خلال تقليل عبء العمل الحاسوبي المطلوب لتنفيذ العقود الذكية.
تتضمن أمثلة العقود المسبقة الترجمة خوارزمية توقيع رقمية باستخدام منحنى بيضاوي (ECDSA) وخوارزمية تجزئة SHA2-256. من خلال استخدام هذه العقود المسبقة في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وزيادة كفاءة تشغيل التطبيقات.
3. استخدام كود التجميع المضمن
البرمجة المضمنة ( in-line assembly ) يسمح للمطورين بكتابة كود منخفض المستوى ولكنه فعال يمكن تنفيذه مباشرة بواسطة EVM، دون الحاجة لاستخدام تعليمات Solidity المكلفة. كما أن البرمجة المضمنة تتيح السيطرة بدقة أكبر على استخدام الذاكرة والتخزين، مما يقلل من رسوم الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للبرمجة المضمنة أن