إن تقليل الغاز الذي يستهلكه العقد مهم في حالتين:
- تكلفة نشر العقد
- تكلفة استدعاء وظائف العقد
يحاول Solidity optimizer تحسين كفاءة عقدك قدر الإمكان أثناء وقت الترجمة. لا تتردد في البحث في العناصر الداخلية للمحسن.
تتمثل إحدى أفضل الطرق لتحسين استخدام الغاز في العقود الخاصة بك في تقليل العمليات باهظة الثمن في وظائف العقد. يمكن أن يكون إنشاء متغيرات التخزين وتعديلها مكلفًا.
20000 غاز عند ضبط القيمة غير صفرية من صفر ؛ 5000 غاز عند الكتابة إلى المخزن الحالي أو تحديد القيمة على الصفر ؛ واسترداد 15000 غاز عند ضبط قيمة غير صفرية إلى صفر.
هنا قائمة OPCODES وتكاليف الغاز الخاصة بهم.
قواعد Short Circuit
العوامل || و && تطبيق قواعد التقصير الشائعة. هذا يعني أنه في التعبيرf(x) || g(y) ، إذا كانت قيمة f (x) صحيحة ، فلن يتم تقييم g (y) حتى لو كان لها آثار جانبية.
كيف يمكن تعديل هذه الوظائف في Unoptimized.sol لتقليل استخدام الغاز؟
function shortCircuit() public view returns(bool){ if (oftenFalse || oftenTrue) { return true; } } function shortCircuit2() public view returns(bool){ if(oftenTrue && oftenFalse) { return false; } else { return true; } }
عمليات مكلفة في حلقة
يمكن أن يكون تعديل متغيرات التخزين في حلقة مكلفًا للغاية ويجب تجنبه ما لم يكن ذلك ضروريًا للغاية.
كيف يمكن تحسين هذه الوظيفة بالنظر إلى أن الحلقات هي متغير تخزين؟ هنا ملف المصدر.
function looping (uint x) public returns (bool) { for(uint i; i < x; i++){ loops += 1; } return true; }
قلل عدد الحلقات
عدم وجود حلقات هو الأمر المثالي ، لكن في بعض الأحيان نضطر إلى إستخدام حلقة . نظرًا لأن الحلقات باهظة الثمن ، هل يمكنك تقليل عدد الحلقات في وظائفك؟
function looping2 (uint x) public pure returns(bool){ uint m = 0; uint v = 0; for(uint i = 0; i < x; i++){ m += i; } for(uint j = 0; j < x; j++){ v -= j; } return true; }
مصفوفات بايت ذات حجم ثابت
من الممكن استخدام مصفوفة من البايت byte[] ، لكنها تهدر الكثير من المساحة ، 31 بايت لكل عنصر ، على وجه الدقة ، عند تمرير المكالمات. من الأفضل استخدام bytes. كقاعدة عامة ، استخدم bytes لبيانات البايت الخام ذات الطول التعسفي و string لبيانات السلسلة ذات الطول التعسفي (UTF-8). إذا كان بإمكانك قصر الطول على عدد معين من البايتات ، فاستخدم دائمًا واحدًا من bytes1 إلى bytes32 لأنها أرخص بكثير.
كيف يمكن تحسين هذه الوظيفة؟
function byteArray() public returns(uint){ byte[] byteArray; return gasleft(); }
إضافة تعليق