انتقل إلى المحتوى الرئيسي
بلوكتشينMar 28, 2026

Deep EVM #18: تصحيح بايتكود EVM — التتبعات وتفريغ المكدس وcast run

OS
Open Soft Team

Engineering Team

لماذا تصحيح البايتكود صعب

عندما يتراجع عقد Huff، تحصل على “revert” بدون رسالة خطأ. لا أسماء دوال، لا أرقام أسطر، لا traces قابلة للقراءة. كيف تجد الخطأ؟

forge debug

Foundry يوفر مصحح تفاعلي:

forge debug test/MyContract.t.sol --sig "testSwap()"

يعرض:

  • كود التشغيل الحالي
  • حالة المكدس
  • محتوى الذاكرة
  • عداد البرنامج
  • الغاز المتبقي

يمكنك التقدم خطوة بخطوة وفحص حالة EVM في كل نقطة.

cast run

cast run يعيد تشغيل معاملة تاريخية مع تتبع كامل:

cast run 0x<tx_hash> --rpc-url mainnet -vvvv

المخرج يظهر كل كود تشغيل نُفذ، تكلفة الغاز، وتغييرات المكدس.

تتبع المعاملات مع trace

cast call --trace <contract> "swap(address,address,uint256)" \
    <token0> <token1> 1000000 \
    --rpc-url mainnet

التتبع يظهر:

  • كل CALL/STATICCALL/DELEGATECALL
  • قيم الإدخال والإخراج
  • أي revert مع بيانات الخطأ

أنماط التصحيح الشائعة

1. نقص المكدس

العَرَض: تراجع غير مفسر. السبب: كود تشغيل يحاول السحب من مكدس فارغ. الحل: تتبع حالة المكدس يدوياً في كل فرع.

2. JUMPDEST غير صالح

العَرَض: “invalid jump destination”. السبب: القفز إلى موضع لا يحتوي JUMPDEST. الحل: تحقق من حسابات العلامات والإزاحات.

3. نفاد الغاز

العَرَض: “out of gas”. السبب: حلقة لانهائية أو عمليات تخزين مكلفة غير متوقعة. الحل: استخدم --gas-report لتحديد الدالة المكلفة.

4. فشل الاستدعاء الخارجي

العَرَض: call يُرجع false. السبب: العقد المستدعى يتراجع أو الغاز المُمرر غير كافٍ. الحل: تتبع الاستدعاء الخارجي بـ -vvvv لرؤية سبب التراجع.

أدوات تكميلية

  • Tenderly — تتبع معاملات مع واجهة رسومية
  • evm.codes — مرجع أكواد التشغيل مع أمثلة تفاعلية
  • ethervm.io — مفكك بايتكود عبر الإنترنت
  • heimdall — مفكك وفاكك بايتكود بـ Rust

بناء أدوات تصحيح مخصصة

// تتبع مخصص مع revm
use revm::Inspector;

struct DebugInspector {
    steps: Vec<StepInfo>,
}

impl Inspector for DebugInspector {
    fn step(&mut self, interp: &mut Interpreter, _context: &mut Context) {
        self.steps.push(StepInfo {
            pc: interp.program_counter(),
            opcode: interp.current_opcode(),
            stack: interp.stack.data().to_vec(),
            gas_remaining: interp.gas.remaining(),
        });
    }
}

الخلاصة

تصحيح بايتكود EVM يتطلب أدوات متخصصة وصبر. forge debug للتحليل التفاعلي، cast run لإعادة تشغيل المعاملات، والتتبع المفصل لفهم التنفيذ خطوة بخطوة. القاعدة: علّق كل سطر في Huff بحالة المكدس لتسهيل التصحيح لاحقاً.

الوسوم