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

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

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

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

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

مقدمة عن آلية رسوم الغاز في EVM

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

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

نظرًا لأن تنفيذ كل معاملة يتطلب موارد حسابية، سيتم فرض رسوم معينة لمنع الدورات غير المحدودة وهجمات رفض الخدمة (DoS). تُعرف الرسوم المطلوبة لإكمال معاملة باسم "رسوم الغاز".

منذ سريان تحديث EIP-1559( لعملية الانقسام الصلب في لندن )، يتم حساب رسوم الغاز من خلال المعادلة التالية:

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

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

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

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

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

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

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

مفهوم تحسين الغاز الأساسي

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

في EVM، فإن العمليات التالية لها تكلفة منخفضة:

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

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

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

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

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

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

1. حاول تقليل استخدام التخزين قدر الإمكان

في Solidity، يعد Storage( تخزين) موردًا محدودًا، حيث إن استهلاك الغاز له أعلى بكثير من Memory( الذاكرة). في كل مرة يقرأ فيها العقد الذكي أو يكتب بيانات من التخزين، تتكبد تكاليف غاز مرتفعة.

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

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

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

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

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 في الذاكرة/التخزين في عملية واحدة.

![إثيريوم العقود الذكية من أفضل 10 ممارسات لتحسين الغاز]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

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

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

5. الخرائط والمصفوفات

يمكن تمثيل قائمة البيانات في Solidity بنوعين من بيانات: المصفوفات ### Arrays ( و الخرائط ) Mappings (، ولكن قواعدها وبنيتها تختلف تمامًا.

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

![إثيريوم العقود الذكية Gas الأمثل لأفضل عشر ممارسات])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 مع ضمان عدم حدوث تجاوز/تحت تجاوز

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

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

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

تم تضمين كود المُعدل في الدالة المعدلة، في كل مرة يتم فيها استخدام المُعدل، يتم نسخ الكود. سيؤدي ذلك إلى زيادة حجم بايت كود وزيادة استهلاك الغاز.

من خلال إعادة بناء المنطق كدالة داخلية _checkOwner###(، يسمح بإعادة استخدام هذه الدالة الداخلية في المعدلات، مما يقلل من حجم بايت الكود ويخفض تكاليف الغاز.

![إثيريوم العقود الذكية Gas تحسين عشر أفضل الممارسات])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 لحذفه, أو تعيينه إلى القيمة الافتراضية.

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

![إثيريوم العقود الذكية من حيث تحسين الغاز: أفضل 10 ممارسات]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 2. استخدام العقود المسبقة الترجمة

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

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

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

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

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

![إثيريوم العقود الذكية Gas تحسين أفضل عشرة ممارسات])

شاهد النسخة الأصلية
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.
  • أعجبني
  • 8
  • مشاركة
تعليق
0/400
WalletInspectorvip
· منذ 17 س
رسوم الغاز باهظة الثمن وليست جيدة مثل L2
شاهد النسخة الأصليةرد0
CryptoCross-TalkClubvip
· 07-11 01:06
يضحك حتى الموت، ارتفع رسوم الغاز، المحفظة الخاصة بالحمقى تحترق
شاهد النسخة الأصليةرد0
liquiditea_sippervip
· 07-11 01:03
الغاز باهظ الثمن بشكل يبعث على السخرية
شاهد النسخة الأصليةرد0
AirdropChaservip
· 07-11 01:03
الآن هل يمكن أن يكون الغاز أكثر إنسانية! إنفاق المال كما لو كان مجرى مائي
شاهد النسخة الأصليةرد0
MEVSandwichVictimvip
· 07-11 01:02
ما زلت أعمل على تحسينه، يتم استنزافي يوميًا بواسطة الغاز.
شاهد النسخة الأصليةرد0
LiquidityNinjavip
· 07-11 01:01
أنا نينجا في عالم التشفير، رسوم الغاز المرتفعة تؤلمني بشدة، التداول في النقاط هو الطريق الصحيح

يرجى كتابة تعليق باللغة الصينية على هذه المقالة.
شاهد النسخة الأصليةرد0
DaoDevelopervip
· 07-11 00:56
لقد تم نشر عقد ذكي مُحسَّن للغاز... لن تصدقوا المدخرات حقًا.
شاهد النسخة الأصليةرد0
ImpermanentPhilosophervip
· 07-11 00:44
أنفقت الكثير من الغاز ولم أستطع النوم
شاهد النسخة الأصليةرد0
  • تثبيت