أفضل 10 ممارسات لتحسين الغاز في العقود الذكية في إثيريوم

يستكشف هذا المقال مشاكل رسوم الغاز على شبكة إثيريوم الرئيسية والطرق لتحسينها. يركز على آلية الغاز في EVM، المفاهيم الأساسية لتحسين تكاليف الغاز، وأفضل الممارسات لتطوير العقود الذكية. تشمل هذه الاستخدام المنخفض للتخزين، وتعبئة المتغيرات، وتحسين أنواع البيانات، واستخدام المتغيرات ذات الحجم الثابت.

من خلال اتباع هذه الممارسات ، يمكن للمطورين تقليل استهلاك الغاز في العقود الذكية ، وتخفيض تكاليف المعاملات ، وإنشاء تطبيقات أكثر كفاءة وسهولة الاستخدام.

رسوم الغاز على شبكة إثيريوم الرئيسية كانت دائمًا مشكلة كبيرة، خاصة خلال فترات ازدحام الشبكة. خلال أوقات الذروة، يحتاج المستخدمون في كثير من الأحيان إلى دفع رسوم معاملة مرتفعة للغاية. لذلك، فإن تحسين تكاليف الغاز خلال مرحلة تطوير العقود الذكية أمر حاسم. يمكن أن يساهم تحسين الغاز ليس فقط في تقليل تكاليف المعاملات بشكل فعال ولكن أيضًا في تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكشين أكثر اقتصادية وفعالية.

سيوضح هذا المقال آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. ومن المأمول أن يلهم هذا المحتوى المطورين ويساعدهم، بالإضافة إلى مساعدة المستخدمين العاديين على فهم كيفية عمل نظام رسوم الغاز في EVM، وبذلك يتم معالجة التحديات داخل النظام البيئي للبلوكشين.

نظرة عامة على آلية رسوم الغاز لـ EVM

في الشبكات المتوافقة مع EVM، يشير "Gas" إلى الوحدة المستخدمة لقياس الطاقة الحاسوبية المطلوبة لتنفيذ العمليات المحددة.

يلخص الشكل أدناه هيكل EVM. في الشكل، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العملية، والمكالمات الخارجية للرسائل، وقراءة وكتابة الذاكرة والتخزين.

المصدر: موقع إثيريوم الرسمي[1]

منذ تنشيط EIP-1559 (شوكة لندن)، يتم احتساب رسوم الغاز باستخدام الصيغة التالية:

رسوم الغاز = وحدات الغاز المستخدمة * (رسوم الأساس + رسوم الأولوية)

يتم حرق الرسوم الأساسية ، في حين أن رسوم الأولوية بمثابة حافز لتشجيع المدققين على تضمين المعاملة في blockchain. يؤدي تحديد رسوم أولوية أعلى عند إرسال معاملة إلى زيادة احتمالية تضمين المعاملة في الكتلة التالية. هذا مشابه ل "إكرامية" يدفعها المستخدمون إلى المدققين.

1. فهم أساسيات تحسين الغاز في EVM

عند تجميع عقد ذكي باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "أكواد العمليات" أو الأكواد العملية.

لكل عملية تشفير (مثل إنشاء عقد، إجراء مكالمات الرسائل، الوصول إلى تخزين الحساب، وتنفيذ العمليات على الجهاز الافتراضي) تكلفة استهلاك الغاز المرتبطة بها، موثقة في ورقة الاستثمار الأصفر لـ إثيريوم[2].

بعد تعديلات متعددة على EIP ، تم تعديل تكاليف الغاز لبعض العمليات ، والتي قد تختلف عن القيم الموجودة في الورقة الصفراء. لمزيد من المعلومات المفصلة حول تكاليف العمليات الأخيرة ، يرجى الاطلاع على هذا المصدر [3].

2. المفاهيم الأساسية لتحسين الغاز

المفهوم الأساسي لتحسين الغاز هو إعطاء الأولوية للعمليات الفعالة من حيث التكلفة على سلسلة الكتل EVM وتجنب العمليات التي تتسبب في تكاليف غاز عالية.

في EVM ، التشغيلات التالية ذات تكلفة منخفضة نسبيًا:

  • [ ] قراءة وكتابة متغيرات الذاكرة
  • [ ] قراءة الثوابت والمتغيرات غير القابلة للتغيير
  • [ ] قراءة وكتابة المتغيرات المحلية
  • قراءة متغيرات calldata، مثل مصفوفات calldata والهياكل
  • [ ] استدعاءات الوظائف الداخلية

تشمل العمليات المكلفة:

  • [ ] قراءة وكتابة المتغيرات الحالية المخزنة في تخزين العقد
  • [ ] مكالمات الدوال الخارجية
  • [ ] عمليات الحلقة

أفضل الممارسات لتحسين رسوم غاز EVM

بناءً على المفاهيم الأساسية أعلاه، قمنا بتجميع قائمة من أفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وإنشاء تطبيقات أكثر كفاءة وسهولة للمستخدم.

1. تقليل استخدام التخزين

في Solidity، الذاكرة التخزينية مورد محدود، واستهلاك الغاز الخاص بها أعلى بشكل كبير من الذاكرة. في كل مرة يقرأ فيها عقد ذكي من التخزين أو يكتب فيه، يتكبد تكلفة غاز عالية.

وفقًا لتعريف في ورقة إثيريوم الصفراء، تكلفة عمليات التخزين أكثر من 100 مرة تكلفة عمليات الذاكرة. على سبيل المثال، تكلف الأوبكودات مثل sload و sstore ما لا يقل عن 100 وحدة غاز في أفضل الحالات، بينما تستهلك عمليات الذاكرة مثل mload و mstore 3 وحدات غاز فقط.

تشمل الطرق المستخدمة لتقليل استخدام التخزين:

  • تخزين البيانات غير الدائمة في الذاكرة
  • [ ] تقليل عدد تعديلات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وتعيين النتيجة النهائية لمتغيرات التخزين فقط بمجرد استكمال جميع الحسابات.

2. حزمة المتغيرات

يمكن أن يؤثر عدد فتحات التخزين المستخدمة في عقد ذكي وكيفية تمثيل المطورين للبيانات بشكل كبير على استهلاك الغاز.

مترجم الصلابة يقوم بتجميع المتغيرات التخزين المتتالية أثناء عملية الترجمة، باستخدام فتحات التخزين بطول 32 بايت كوحدة أساسية لتخزين المتغيرات. تعني تجميع المتغيرات ترتيب المتغيرات بطريقة تسمح للمتغيرات المتعددة بملاءمة تخزين واحد في فتحة تخزين واحدة.

على اليسار توجد تنفيذ أقل كفاءة يستهلك 3 فتحات تخزين؛ على اليمين توجد تنفيذ أكثر كفاءة.

من خلال إجراء هذا التعديل، يمكن للمطورين توفير 20,000 وحدة غاز (لأن تخزين فتحة تخزين غير مستخدمة يكلف 20,000 غاز)، ولكن الآن يتطلب فقط فتحتي تخزين.

نظرًا لأن كل فتحة تخزين تستهلك غازًا، فإن تعبئة المتغيرات تحسن استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.

3. تحسين أنواع البيانات

يمكن تمثيل المتغير باستخدام أنواع بيانات مختلفة، ولكن تتفاوت تكاليف العملية اعتمادًا على النوع. اختيار نوع البيانات المناسب يساعد في تحسين استخدام الغاز.

على سبيل المثال، في سوليديتي، يمكن تجزئة الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، إلخ. نظرًا لأن EVM يعمل بوحدات 256 بت، استخدام uint8 يعني أن EVM يجب أن يحوله أولاً إلى uint256، ويترتب على هذا التحويل تكاليف إضافية للغاز.

يمكننا مقارنة تكاليف الغاز ل uint8 و uint256 باستخدام الكود في الرسم البياني. تستهلك وظيفة UseUint() 120،382 وحدة غاز، بينما تستهلك وظيفة UseUInt8() 166،111 وحدة غاز.

بمفردها، استخدام uint256 أرخص من uint8. ومع ذلك، إذا قمنا بتطبيق تحسين تعبئة المتغيرات المقترحة سابقًا، فإنه يحدث فرق. إذا كان يمكن للمطورين تعبئة أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن الكلفة الإجمالية للتكرار عليها ستكون أقل من استخدام أربعة متغيرات uint256. في هذه الحالة، يمكن للعقد الذكي قراءة وكتابة فتحة التخزين مرة واحدة، وتحميل جميع المتغيرات uint8 الأربعة في الذاكرة/التخزين في عملية واحدة.

4. استخدم متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية

إذا كان بإمكان تقييد البيانات إلى 32 بايتًا، فمن المستحسن استخدام نوع البيانات bytes32 بدلاً من bytes أو strings. عمومًا، تستهلك المتغيرات ذات الحجم الثابت أقل غاز من المتغيرات ذات الحجم المتغير. إذا كان طول البايت يمكن تحديده، فيجب اختيار أصغر طول من bytes1 إلى bytes32.

5. التعيينات مقابل الصفوف

في Solidity ، يمكن تمثيل قوائم البيانات باستخدام نوعي بيانات: المصفوفات والتعيينات ، كل منهما له بناء وبناء متميزين.

التعيينات عمومًا تكون أكثر كفاءة وتوفيرًا للتكلفة في معظم الحالات، في حين أن المصفوفات قابلة للتكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى بتفضيل استخدام التعيينات عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.

6. استخدم calldata بدلاً من الذاكرة

يمكن تخزين المتغيرات المعلنة في معلمات الدالة إما في calldata أو memory. الفرق الرئيسي هو أنه يمكن تعديل memory من قبل الدالة، بينما calldata لا يمكن تغييره.

حافظ على هذه المبدأ في الاعتبار: إذا كانت معلمات الوظيفة للقراءة فقط ، فافضل استخدام calldata بدلا من الذاكرة. يتجنب هذا العمليات النسخ غير الضرورية من calldata الوظيفة إلى الذاكرة.

المثال 1: باستخدام الذاكرة

عند استخدام كلمة الذاكرة، يتم نسخ قيم المصفوفة من بيانات الاتصال المشفرة إلى الذاكرة أثناء فك ترميز ABI. تبلغ تكلفة تنفيذ هذه الكود 3,694 وحدة غاز.

مثال 2: استخدام البيانات الواردة

عند قراءة القيم مباشرة من البيانات الوصفية للوظيفة، يتم تخطي عملية الذاكرة المتوسطة. تحسين هذه العملية يقلل تكلفة التنفيذ إلى 2،413 وحدة غاز فقط، مما يؤدي إلى تحسين بنسبة 35٪ في كفاءة الغاز.

7. استخدم الكلمات الثابتة / الغير قابلة للتغيير في أي وقت ممكن

المتغيرات الثابتة / الغير قابلة للتغيير لا تُخزن في تخزين العقد. يتم حساب هذه المتغيرات في وقت الإعداد وتُخزن في بايت كود العقد. لذلك، تكلفة الوصول إليها أقل بكثير مقارنة بالمتغيرات التخزين. من المُفضّل استخدام الكلمات الرئيسية Constant أو Immutable عند الإمكان.

8. استخدم نوع البيانات Unchecked عندما لا يوجد قلق بشأن الفائض / النقص

عندما يمكن للمطورين أن يكونوا متأكدين من أن العمليات الحسابية لن تؤدي إلى تجاوز الحدود أو تحت الحدود ، يمكنهم استخدام الكلمة المفتاحية غير المدققة التي تم تقديمها في Solidity v0.8.0 لتجنب فحص التجاوز أو الانخفاض غير الضروري ، وبالتالي توفير تكاليف الغاز.

في الرسم البياني أدناه ، الشرط المقيد بشكل مشروط i

بالإضافة إلى ذلك ، لا تتطلب إصدارات المترجم 0.8.0 وما فوق استخدام مكتبة SafeMath بعد الآن ، حيث يتضمن المترجم نفسه الآن حماية مدمجة من التدفق الزائد والتدفق الناقص.

9. تحسين المعدل

تم تضمين كود المعدلات في الوظائف التي يقومون بتعديلها. في كل مرة يتم استخدام معدل ، يتم تكرار كوده ، مما يزيد من حجم البايت الثنائي ويزيد من استهلاك الغاز. إليك طريقة لتحسين تكلفة الغاز للمعدلات:

قبل الأمان

بعد الأمثلة:

في هذا المثال، من خلال إعادة تنظيم الخطط إلى وظيفة داخلية _checkOwner()، التي يمكن إعادة استخدامها في المعدل، يتم تقليل حجم البايت الثنائي وتكاليف الغاز.

10. تحسين الدائرة القصيرة

بالنسبة لعمليات المنطقية || (OR) و && (AND) ، يتم تقييم العمليات المنطقية بواسطة الانقطاع السريع ، وهذا يعني أنه إذا كانت الشرط الأولى كافية لتحديد نتيجة التعبير المنطقي ، فلن يتم تقييم الشرط الثاني.

لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكاليف الحسابية الأقل أولاً، بحيث يمكن تخطي الحسابات المكلفة بالتالي.

توصيات عامة

1. إزالة الشفرة غير المستخدمة

إذا كانت هناك وظائف أو متغيرات غير مستخدمة في العقد، فمن المُفضَّل حذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيرًا.

هنا بعض الاقتراحات العملية:

استخدام أكثر الخوارزميات كفاءة للحسابات. إذا استخدم العقد نتائج الحساب مباشرة، يجب إزالة الحسابات الزائدة. في الأساس، يجب حذف أي حسابات غير مستخدمة. في إثيريوم، يمكن للمطورين الحصول على مكافآت غاز عن طريق إطلاق مساحة تخزين. إذا لم يعد هناك حاجة لمتغير، يجب حذفه باستخدام الكلمة الرئيسية delete أو تعيين قيمته الافتراضية.

تحسين الحلقة: تجنب عمليات الحلقة ذات التكلفة العالية، وحاول دمج الحلقات، ونقل الحسابات المكررة خارج جسم الحلقة.

2. استخدم العقود المُعدّة مُسبقاً

العقود المُعدة مُسبقًا توفر وظائف مكتبة معقدة مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يُنفذ على EVM ولكنه يعمل محليًا على عقد العميل، يُطلب كمية أقل من الغاز. يمكن للاستفادة من العقود المُعدة مُسبقًا توفير الغاز من خلال تقليل العبء الحسابي المطلوب لتنفيذ العقد الذكي.

أمثلة على العقود المُعدة مُسبقًا تشمل خوارزمية التوقيع الرقمي للمنحنى البيضاوي (ECDSA) وخوارزمية التجزئة SHA2-256. من خلال استخدام هذه العقود المُعدة مُسبقًا في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وتحسين كفاءة التطبيق.

للحصول على قائمة كاملة بالعقود المُعدة مسبقًا المدعومة من قبل شبكة إثيريوم، يُرجى الرجوع إلى هذا الرابط [4].

3. استخدام تجميع الكود المضمن

يسمح التجميع الفوري للمطورين بكتابة كود منخفض المستوى ولكن فعال يمكن تنفيذه مباشرة عن طريق EVM، دون استخدام أكواد تشفير باهظة الثمن. كما يسمح التجميع الفوري أيضًا بمزيد من السيطرة الدقيقة على استخدام الذاكرة والتخزين، مما يقلل تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للتجميع الفوري أن ينفذ بعض العمليات المعقدة التي يصعب تنفيذها باستخدام Solidity وحده، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.

هنا مثال على استخدام التجميع المضمن لتوفير الغاز:

كما هو موضح في المثال أعلاه، فإن الحالة الثانية، التي تستخدم التجميع الداخلي، تتمتع بكفاءة أعلى من حيث الغاز مقارنة بالحالة القياسية.

ومع ذلك ، يمكن أن يشكل استخدام التجميع الفوري أيضًا مخاطر ويكون عرضة للأخطاء. لذلك ، يجب استخدامه بحذر ويوصى به فقط للمطورين المتمرسين.

4. استخدام حلول الطبقة الثانية

يمكن لحلول الطبقة 2 تقليل كمية البيانات التي تحتاج إلى تخزينها وحسابها على شبكة إثيريوم الرئيسية.

تسمح حلول الطبقة 2 مثل اللفات، والجانبية، وقنوات الحالة بتحميل معالجة المعاملات من سلسلة إثيريوم الرئيسية، مما يتيح المعاملات الأسرع والأرخص.

من خلال تجميع عدد كبير من المعاملات معًا، تقلل هذه الحلول من عدد المعاملات على السلسلة، مما يقلل بدوره من رسوم الغاز. يزيد استخدام حلول الطبقة 2 أيضًا من قابلية توسع إثيريوم، مما يسمح لمزيد من المستخدمين والتطبيقات بالمشاركة في الشبكة دون تسبب الازدحام الناتج عن الحمولة الزائدة.

5. استخدام أدوات ومكتبات الأمثلة

هناك العديد من أدوات الأمثلة المتاحة، مثل محسن solc، محسن بناء Truffle، ومترجم Solidity لـ Remix.

يمكن أن تساعد هذه الأدوات في تقليل حجم البايت كود، وإزالة الشفرة غير المستخدمة، وتقليل عدد العمليات المطلوبة لتنفيذ العقود الذكية. بالاضافة الى ذلك مع وجود مكتبات التحسين الأخرى مثل 'سولميت'، يستطيع المطورون تقليل تكاليف الغاز بفعالية وتحسين كفاءة العقود الذكية.

استنتاج

تحسين استهلاك الغاز هو خطوة مهمة للمطورين، حيث أنها لا تقلل فقط من تكاليف المعاملات ولكنها تعزز أيضًا كفاءة العقود الذكية على شبكات متوافقة مع EVM. من خلال إعطاء الأولوية لعمليات توفير التكاليف، وتقليل استخدام التخزين، واستخدام التجميع المدمج، واتباع الممارسات الأفضل الأخرى المناقشة في هذه المقالة، يمكن للمطورين تقليل فعالية استهلاك الغاز للعقود.

مع ذلك، من المهم ملاحظة أنه خلال عملية التحسين، يجب على المطورين ممارسة الحذر لتجنب إدخال ثغرات أمان. في عملية تحسين الكود وتقليل استهلاك الغاز، يجب ألا يتم التنازل أبدًا عن الأمان الأساسي للعقد الذكي.

[1]https://ethereum.org/ar/developers/docs/غاز/
[2] https://ethereum.github.io/yellowpaper/paper.pdf
[3]https://www.evm.codes/
[4]https://www.evm.codes/precompiled

تنصل من المسؤولية:

  1. تم استنساخ هذه المقالة من [PANewslab]. حقوق النشر تعود للمؤلف الأصلي [CertiK]. إذا كان لديك أي اعتراض على إعادة النشر، يرجى التواصل بوابة تعلمالفريق، سيقوم الفريق بالتعامل معه في أقرب وقت ممكن وفقا للإجراءات ذات الصلة.
  2. تنويه: الآراء والآراء الواردة في هذا المقال تمثل وجهات نظر الكاتب فقط ولا تشكل أي نصيحة استثمارية.
  3. تتم ترجمة إصدارات اللغات الأخرى من المقالة بواسطة فريق gate Learn. ما لم ينص على خلاف ذلك ، لا يجوز نسخ المقالة المترجمة أو توزيعها أو سرقتها.

أفضل 10 ممارسات لتحسين الغاز في العقود الذكية في إثيريوم

متوسط1/3/2025, 11:25:57 AM
يستكشف هذا المقال مشاكل رسوم الغاز على شبكة إثيريوم الرئيسية والطرق لتحسينها. يركز على آلية الغاز في EVM، المفاهيم الأساسية لتحسين تكاليف الغاز، وأفضل الممارسات لتطوير العقود الذكية. تشمل هذه الاستخدام المنخفض للتخزين، وتعبئة المتغيرات، وتحسين أنواع البيانات، واستخدام المتغيرات ذات الحجم الثابت.

من خلال اتباع هذه الممارسات ، يمكن للمطورين تقليل استهلاك الغاز في العقود الذكية ، وتخفيض تكاليف المعاملات ، وإنشاء تطبيقات أكثر كفاءة وسهولة الاستخدام.

رسوم الغاز على شبكة إثيريوم الرئيسية كانت دائمًا مشكلة كبيرة، خاصة خلال فترات ازدحام الشبكة. خلال أوقات الذروة، يحتاج المستخدمون في كثير من الأحيان إلى دفع رسوم معاملة مرتفعة للغاية. لذلك، فإن تحسين تكاليف الغاز خلال مرحلة تطوير العقود الذكية أمر حاسم. يمكن أن يساهم تحسين الغاز ليس فقط في تقليل تكاليف المعاملات بشكل فعال ولكن أيضًا في تحسين كفاءة المعاملات، مما يوفر للمستخدمين تجربة بلوكشين أكثر اقتصادية وفعالية.

سيوضح هذا المقال آلية رسوم الغاز في آلة إثيريوم الافتراضية (EVM)، والمفاهيم الأساسية المتعلقة بتحسين رسوم الغاز، وأفضل الممارسات لتحسين رسوم الغاز عند تطوير العقود الذكية. ومن المأمول أن يلهم هذا المحتوى المطورين ويساعدهم، بالإضافة إلى مساعدة المستخدمين العاديين على فهم كيفية عمل نظام رسوم الغاز في EVM، وبذلك يتم معالجة التحديات داخل النظام البيئي للبلوكشين.

نظرة عامة على آلية رسوم الغاز لـ EVM

في الشبكات المتوافقة مع EVM، يشير "Gas" إلى الوحدة المستخدمة لقياس الطاقة الحاسوبية المطلوبة لتنفيذ العمليات المحددة.

يلخص الشكل أدناه هيكل EVM. في الشكل، يتم تقسيم استهلاك الغاز إلى ثلاثة أجزاء: تنفيذ العملية، والمكالمات الخارجية للرسائل، وقراءة وكتابة الذاكرة والتخزين.

المصدر: موقع إثيريوم الرسمي[1]

منذ تنشيط EIP-1559 (شوكة لندن)، يتم احتساب رسوم الغاز باستخدام الصيغة التالية:

رسوم الغاز = وحدات الغاز المستخدمة * (رسوم الأساس + رسوم الأولوية)

يتم حرق الرسوم الأساسية ، في حين أن رسوم الأولوية بمثابة حافز لتشجيع المدققين على تضمين المعاملة في blockchain. يؤدي تحديد رسوم أولوية أعلى عند إرسال معاملة إلى زيادة احتمالية تضمين المعاملة في الكتلة التالية. هذا مشابه ل "إكرامية" يدفعها المستخدمون إلى المدققين.

1. فهم أساسيات تحسين الغاز في EVM

عند تجميع عقد ذكي باستخدام Solidity، يتم تحويل العقد إلى سلسلة من "أكواد العمليات" أو الأكواد العملية.

لكل عملية تشفير (مثل إنشاء عقد، إجراء مكالمات الرسائل، الوصول إلى تخزين الحساب، وتنفيذ العمليات على الجهاز الافتراضي) تكلفة استهلاك الغاز المرتبطة بها، موثقة في ورقة الاستثمار الأصفر لـ إثيريوم[2].

بعد تعديلات متعددة على EIP ، تم تعديل تكاليف الغاز لبعض العمليات ، والتي قد تختلف عن القيم الموجودة في الورقة الصفراء. لمزيد من المعلومات المفصلة حول تكاليف العمليات الأخيرة ، يرجى الاطلاع على هذا المصدر [3].

2. المفاهيم الأساسية لتحسين الغاز

المفهوم الأساسي لتحسين الغاز هو إعطاء الأولوية للعمليات الفعالة من حيث التكلفة على سلسلة الكتل EVM وتجنب العمليات التي تتسبب في تكاليف غاز عالية.

في EVM ، التشغيلات التالية ذات تكلفة منخفضة نسبيًا:

  • [ ] قراءة وكتابة متغيرات الذاكرة
  • [ ] قراءة الثوابت والمتغيرات غير القابلة للتغيير
  • [ ] قراءة وكتابة المتغيرات المحلية
  • قراءة متغيرات calldata، مثل مصفوفات calldata والهياكل
  • [ ] استدعاءات الوظائف الداخلية

تشمل العمليات المكلفة:

  • [ ] قراءة وكتابة المتغيرات الحالية المخزنة في تخزين العقد
  • [ ] مكالمات الدوال الخارجية
  • [ ] عمليات الحلقة

أفضل الممارسات لتحسين رسوم غاز EVM

بناءً على المفاهيم الأساسية أعلاه، قمنا بتجميع قائمة من أفضل الممارسات لتحسين رسوم الغاز لمجتمع المطورين. من خلال اتباع هذه الممارسات، يمكن للمطورين تقليل استهلاك الغاز للعقود الذكية، وتقليل تكاليف المعاملات، وإنشاء تطبيقات أكثر كفاءة وسهولة للمستخدم.

1. تقليل استخدام التخزين

في Solidity، الذاكرة التخزينية مورد محدود، واستهلاك الغاز الخاص بها أعلى بشكل كبير من الذاكرة. في كل مرة يقرأ فيها عقد ذكي من التخزين أو يكتب فيه، يتكبد تكلفة غاز عالية.

وفقًا لتعريف في ورقة إثيريوم الصفراء، تكلفة عمليات التخزين أكثر من 100 مرة تكلفة عمليات الذاكرة. على سبيل المثال، تكلف الأوبكودات مثل sload و sstore ما لا يقل عن 100 وحدة غاز في أفضل الحالات، بينما تستهلك عمليات الذاكرة مثل mload و mstore 3 وحدات غاز فقط.

تشمل الطرق المستخدمة لتقليل استخدام التخزين:

  • تخزين البيانات غير الدائمة في الذاكرة
  • [ ] تقليل عدد تعديلات التخزين: من خلال حفظ النتائج الوسيطة في الذاكرة، وتعيين النتيجة النهائية لمتغيرات التخزين فقط بمجرد استكمال جميع الحسابات.

2. حزمة المتغيرات

يمكن أن يؤثر عدد فتحات التخزين المستخدمة في عقد ذكي وكيفية تمثيل المطورين للبيانات بشكل كبير على استهلاك الغاز.

مترجم الصلابة يقوم بتجميع المتغيرات التخزين المتتالية أثناء عملية الترجمة، باستخدام فتحات التخزين بطول 32 بايت كوحدة أساسية لتخزين المتغيرات. تعني تجميع المتغيرات ترتيب المتغيرات بطريقة تسمح للمتغيرات المتعددة بملاءمة تخزين واحد في فتحة تخزين واحدة.

على اليسار توجد تنفيذ أقل كفاءة يستهلك 3 فتحات تخزين؛ على اليمين توجد تنفيذ أكثر كفاءة.

من خلال إجراء هذا التعديل، يمكن للمطورين توفير 20,000 وحدة غاز (لأن تخزين فتحة تخزين غير مستخدمة يكلف 20,000 غاز)، ولكن الآن يتطلب فقط فتحتي تخزين.

نظرًا لأن كل فتحة تخزين تستهلك غازًا، فإن تعبئة المتغيرات تحسن استخدام الغاز عن طريق تقليل عدد فتحات التخزين المطلوبة.

3. تحسين أنواع البيانات

يمكن تمثيل المتغير باستخدام أنواع بيانات مختلفة، ولكن تتفاوت تكاليف العملية اعتمادًا على النوع. اختيار نوع البيانات المناسب يساعد في تحسين استخدام الغاز.

على سبيل المثال، في سوليديتي، يمكن تجزئة الأعداد الصحيحة إلى أحجام مختلفة: uint8، uint16، uint32، إلخ. نظرًا لأن EVM يعمل بوحدات 256 بت، استخدام uint8 يعني أن EVM يجب أن يحوله أولاً إلى uint256، ويترتب على هذا التحويل تكاليف إضافية للغاز.

يمكننا مقارنة تكاليف الغاز ل uint8 و uint256 باستخدام الكود في الرسم البياني. تستهلك وظيفة UseUint() 120،382 وحدة غاز، بينما تستهلك وظيفة UseUInt8() 166،111 وحدة غاز.

بمفردها، استخدام uint256 أرخص من uint8. ومع ذلك، إذا قمنا بتطبيق تحسين تعبئة المتغيرات المقترحة سابقًا، فإنه يحدث فرق. إذا كان يمكن للمطورين تعبئة أربعة متغيرات uint8 في فتحة تخزين واحدة، فإن الكلفة الإجمالية للتكرار عليها ستكون أقل من استخدام أربعة متغيرات uint256. في هذه الحالة، يمكن للعقد الذكي قراءة وكتابة فتحة التخزين مرة واحدة، وتحميل جميع المتغيرات uint8 الأربعة في الذاكرة/التخزين في عملية واحدة.

4. استخدم متغيرات ثابتة الحجم بدلاً من المتغيرات الديناميكية

إذا كان بإمكان تقييد البيانات إلى 32 بايتًا، فمن المستحسن استخدام نوع البيانات bytes32 بدلاً من bytes أو strings. عمومًا، تستهلك المتغيرات ذات الحجم الثابت أقل غاز من المتغيرات ذات الحجم المتغير. إذا كان طول البايت يمكن تحديده، فيجب اختيار أصغر طول من bytes1 إلى bytes32.

5. التعيينات مقابل الصفوف

في Solidity ، يمكن تمثيل قوائم البيانات باستخدام نوعي بيانات: المصفوفات والتعيينات ، كل منهما له بناء وبناء متميزين.

التعيينات عمومًا تكون أكثر كفاءة وتوفيرًا للتكلفة في معظم الحالات، في حين أن المصفوفات قابلة للتكرار وتدعم تعبئة أنواع البيانات. لذلك، يُوصى بتفضيل استخدام التعيينات عند إدارة قوائم البيانات، ما لم يكن هناك حاجة للتكرار أو يمكن تحسين استهلاك الغاز من خلال تعبئة أنواع البيانات.

6. استخدم calldata بدلاً من الذاكرة

يمكن تخزين المتغيرات المعلنة في معلمات الدالة إما في calldata أو memory. الفرق الرئيسي هو أنه يمكن تعديل memory من قبل الدالة، بينما calldata لا يمكن تغييره.

حافظ على هذه المبدأ في الاعتبار: إذا كانت معلمات الوظيفة للقراءة فقط ، فافضل استخدام calldata بدلا من الذاكرة. يتجنب هذا العمليات النسخ غير الضرورية من calldata الوظيفة إلى الذاكرة.

المثال 1: باستخدام الذاكرة

عند استخدام كلمة الذاكرة، يتم نسخ قيم المصفوفة من بيانات الاتصال المشفرة إلى الذاكرة أثناء فك ترميز ABI. تبلغ تكلفة تنفيذ هذه الكود 3,694 وحدة غاز.

مثال 2: استخدام البيانات الواردة

عند قراءة القيم مباشرة من البيانات الوصفية للوظيفة، يتم تخطي عملية الذاكرة المتوسطة. تحسين هذه العملية يقلل تكلفة التنفيذ إلى 2،413 وحدة غاز فقط، مما يؤدي إلى تحسين بنسبة 35٪ في كفاءة الغاز.

7. استخدم الكلمات الثابتة / الغير قابلة للتغيير في أي وقت ممكن

المتغيرات الثابتة / الغير قابلة للتغيير لا تُخزن في تخزين العقد. يتم حساب هذه المتغيرات في وقت الإعداد وتُخزن في بايت كود العقد. لذلك، تكلفة الوصول إليها أقل بكثير مقارنة بالمتغيرات التخزين. من المُفضّل استخدام الكلمات الرئيسية Constant أو Immutable عند الإمكان.

8. استخدم نوع البيانات Unchecked عندما لا يوجد قلق بشأن الفائض / النقص

عندما يمكن للمطورين أن يكونوا متأكدين من أن العمليات الحسابية لن تؤدي إلى تجاوز الحدود أو تحت الحدود ، يمكنهم استخدام الكلمة المفتاحية غير المدققة التي تم تقديمها في Solidity v0.8.0 لتجنب فحص التجاوز أو الانخفاض غير الضروري ، وبالتالي توفير تكاليف الغاز.

في الرسم البياني أدناه ، الشرط المقيد بشكل مشروط i

بالإضافة إلى ذلك ، لا تتطلب إصدارات المترجم 0.8.0 وما فوق استخدام مكتبة SafeMath بعد الآن ، حيث يتضمن المترجم نفسه الآن حماية مدمجة من التدفق الزائد والتدفق الناقص.

9. تحسين المعدل

تم تضمين كود المعدلات في الوظائف التي يقومون بتعديلها. في كل مرة يتم استخدام معدل ، يتم تكرار كوده ، مما يزيد من حجم البايت الثنائي ويزيد من استهلاك الغاز. إليك طريقة لتحسين تكلفة الغاز للمعدلات:

قبل الأمان

بعد الأمثلة:

في هذا المثال، من خلال إعادة تنظيم الخطط إلى وظيفة داخلية _checkOwner()، التي يمكن إعادة استخدامها في المعدل، يتم تقليل حجم البايت الثنائي وتكاليف الغاز.

10. تحسين الدائرة القصيرة

بالنسبة لعمليات المنطقية || (OR) و && (AND) ، يتم تقييم العمليات المنطقية بواسطة الانقطاع السريع ، وهذا يعني أنه إذا كانت الشرط الأولى كافية لتحديد نتيجة التعبير المنطقي ، فلن يتم تقييم الشرط الثاني.

لتحسين استهلاك الغاز، يجب وضع الشروط ذات التكاليف الحسابية الأقل أولاً، بحيث يمكن تخطي الحسابات المكلفة بالتالي.

توصيات عامة

1. إزالة الشفرة غير المستخدمة

إذا كانت هناك وظائف أو متغيرات غير مستخدمة في العقد، فمن المُفضَّل حذفها. هذه هي الطريقة الأكثر مباشرة لتقليل تكاليف نشر العقد والحفاظ على حجم العقد صغيرًا.

هنا بعض الاقتراحات العملية:

استخدام أكثر الخوارزميات كفاءة للحسابات. إذا استخدم العقد نتائج الحساب مباشرة، يجب إزالة الحسابات الزائدة. في الأساس، يجب حذف أي حسابات غير مستخدمة. في إثيريوم، يمكن للمطورين الحصول على مكافآت غاز عن طريق إطلاق مساحة تخزين. إذا لم يعد هناك حاجة لمتغير، يجب حذفه باستخدام الكلمة الرئيسية delete أو تعيين قيمته الافتراضية.

تحسين الحلقة: تجنب عمليات الحلقة ذات التكلفة العالية، وحاول دمج الحلقات، ونقل الحسابات المكررة خارج جسم الحلقة.

2. استخدم العقود المُعدّة مُسبقاً

العقود المُعدة مُسبقًا توفر وظائف مكتبة معقدة مثل عمليات التشفير والتجزئة. نظرًا لأن الكود لا يُنفذ على EVM ولكنه يعمل محليًا على عقد العميل، يُطلب كمية أقل من الغاز. يمكن للاستفادة من العقود المُعدة مُسبقًا توفير الغاز من خلال تقليل العبء الحسابي المطلوب لتنفيذ العقد الذكي.

أمثلة على العقود المُعدة مُسبقًا تشمل خوارزمية التوقيع الرقمي للمنحنى البيضاوي (ECDSA) وخوارزمية التجزئة SHA2-256. من خلال استخدام هذه العقود المُعدة مُسبقًا في العقود الذكية، يمكن للمطورين تقليل تكاليف الغاز وتحسين كفاءة التطبيق.

للحصول على قائمة كاملة بالعقود المُعدة مسبقًا المدعومة من قبل شبكة إثيريوم، يُرجى الرجوع إلى هذا الرابط [4].

3. استخدام تجميع الكود المضمن

يسمح التجميع الفوري للمطورين بكتابة كود منخفض المستوى ولكن فعال يمكن تنفيذه مباشرة عن طريق EVM، دون استخدام أكواد تشفير باهظة الثمن. كما يسمح التجميع الفوري أيضًا بمزيد من السيطرة الدقيقة على استخدام الذاكرة والتخزين، مما يقلل تكاليف الغاز بشكل أكبر. بالإضافة إلى ذلك، يمكن للتجميع الفوري أن ينفذ بعض العمليات المعقدة التي يصعب تنفيذها باستخدام Solidity وحده، مما يوفر مزيدًا من المرونة في تحسين استهلاك الغاز.

هنا مثال على استخدام التجميع المضمن لتوفير الغاز:

كما هو موضح في المثال أعلاه، فإن الحالة الثانية، التي تستخدم التجميع الداخلي، تتمتع بكفاءة أعلى من حيث الغاز مقارنة بالحالة القياسية.

ومع ذلك ، يمكن أن يشكل استخدام التجميع الفوري أيضًا مخاطر ويكون عرضة للأخطاء. لذلك ، يجب استخدامه بحذر ويوصى به فقط للمطورين المتمرسين.

4. استخدام حلول الطبقة الثانية

يمكن لحلول الطبقة 2 تقليل كمية البيانات التي تحتاج إلى تخزينها وحسابها على شبكة إثيريوم الرئيسية.

تسمح حلول الطبقة 2 مثل اللفات، والجانبية، وقنوات الحالة بتحميل معالجة المعاملات من سلسلة إثيريوم الرئيسية، مما يتيح المعاملات الأسرع والأرخص.

من خلال تجميع عدد كبير من المعاملات معًا، تقلل هذه الحلول من عدد المعاملات على السلسلة، مما يقلل بدوره من رسوم الغاز. يزيد استخدام حلول الطبقة 2 أيضًا من قابلية توسع إثيريوم، مما يسمح لمزيد من المستخدمين والتطبيقات بالمشاركة في الشبكة دون تسبب الازدحام الناتج عن الحمولة الزائدة.

5. استخدام أدوات ومكتبات الأمثلة

هناك العديد من أدوات الأمثلة المتاحة، مثل محسن solc، محسن بناء Truffle، ومترجم Solidity لـ Remix.

يمكن أن تساعد هذه الأدوات في تقليل حجم البايت كود، وإزالة الشفرة غير المستخدمة، وتقليل عدد العمليات المطلوبة لتنفيذ العقود الذكية. بالاضافة الى ذلك مع وجود مكتبات التحسين الأخرى مثل 'سولميت'، يستطيع المطورون تقليل تكاليف الغاز بفعالية وتحسين كفاءة العقود الذكية.

استنتاج

تحسين استهلاك الغاز هو خطوة مهمة للمطورين، حيث أنها لا تقلل فقط من تكاليف المعاملات ولكنها تعزز أيضًا كفاءة العقود الذكية على شبكات متوافقة مع EVM. من خلال إعطاء الأولوية لعمليات توفير التكاليف، وتقليل استخدام التخزين، واستخدام التجميع المدمج، واتباع الممارسات الأفضل الأخرى المناقشة في هذه المقالة، يمكن للمطورين تقليل فعالية استهلاك الغاز للعقود.

مع ذلك، من المهم ملاحظة أنه خلال عملية التحسين، يجب على المطورين ممارسة الحذر لتجنب إدخال ثغرات أمان. في عملية تحسين الكود وتقليل استهلاك الغاز، يجب ألا يتم التنازل أبدًا عن الأمان الأساسي للعقد الذكي.

[1]https://ethereum.org/ar/developers/docs/غاز/
[2] https://ethereum.github.io/yellowpaper/paper.pdf
[3]https://www.evm.codes/
[4]https://www.evm.codes/precompiled

تنصل من المسؤولية:

  1. تم استنساخ هذه المقالة من [PANewslab]. حقوق النشر تعود للمؤلف الأصلي [CertiK]. إذا كان لديك أي اعتراض على إعادة النشر، يرجى التواصل بوابة تعلمالفريق، سيقوم الفريق بالتعامل معه في أقرب وقت ممكن وفقا للإجراءات ذات الصلة.
  2. تنويه: الآراء والآراء الواردة في هذا المقال تمثل وجهات نظر الكاتب فقط ولا تشكل أي نصيحة استثمارية.
  3. تتم ترجمة إصدارات اللغات الأخرى من المقالة بواسطة فريق gate Learn. ما لم ينص على خلاف ذلك ، لا يجوز نسخ المقالة المترجمة أو توزيعها أو سرقتها.
Comece agora
Registe-se e ganhe um cupão de
100 USD
!