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