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