[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-18-tashih-baytakud-evm-tatabbuat-tafrig-makdas-cast-run":3},{"article":4,"author":55},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":35,"related_articles":36},"d9000000-0000-0000-0000-000000000118","a0000000-0000-0000-0000-000000000092","Deep EVM #18: تصحيح بايتكود EVM — التتبعات وتفريغ المكدس وcast run","deep-evm-18-tashih-baytakud-evm-tatabbuat-tafrig-makdas-cast-run","أدوات وتقنيات تصحيح بايتكود EVM: تتبع المعاملات، تفريغ المكدس، forge debug، cast run، وتحليل التنفيذ خطوة بخطوة.","## لماذا تصحيح البايتكود صعب\n\nعندما يتراجع عقد Huff، تحصل على \"revert\" بدون رسالة خطأ. لا أسماء دوال، لا أرقام أسطر، لا traces قابلة للقراءة. كيف تجد الخطأ؟\n\n## forge debug\n\nFoundry يوفر مصحح تفاعلي:\n\n```bash\nforge debug test\u002FMyContract.t.sol --sig \"testSwap()\"\n```\n\nيعرض:\n- كود التشغيل الحالي\n- حالة المكدس\n- محتوى الذاكرة\n- عداد البرنامج\n- الغاز المتبقي\n\nيمكنك التقدم خطوة بخطوة وفحص حالة EVM في كل نقطة.\n\n## cast run\n\n`cast run` يعيد تشغيل معاملة تاريخية مع تتبع كامل:\n\n```bash\ncast run 0x\u003Ctx_hash> --rpc-url mainnet -vvvv\n```\n\nالمخرج يظهر كل كود تشغيل نُفذ، تكلفة الغاز، وتغييرات المكدس.\n\n## تتبع المعاملات مع trace\n\n```bash\ncast call --trace \u003Ccontract> \"swap(address,address,uint256)\" \\\n    \u003Ctoken0> \u003Ctoken1> 1000000 \\\n    --rpc-url mainnet\n```\n\nالتتبع يظهر:\n- كل CALL\u002FSTATICCALL\u002FDELEGATECALL\n- قيم الإدخال والإخراج\n- أي revert مع بيانات الخطأ\n\n## أنماط التصحيح الشائعة\n\n### 1. نقص المكدس\nالعَرَض: تراجع غير مفسر.\nالسبب: كود تشغيل يحاول السحب من مكدس فارغ.\nالحل: تتبع حالة المكدس يدوياً في كل فرع.\n\n### 2. JUMPDEST غير صالح\nالعَرَض: \"invalid jump destination\".\nالسبب: القفز إلى موضع لا يحتوي JUMPDEST.\nالحل: تحقق من حسابات العلامات والإزاحات.\n\n### 3. نفاد الغاز\nالعَرَض: \"out of gas\".\nالسبب: حلقة لانهائية أو عمليات تخزين مكلفة غير متوقعة.\nالحل: استخدم `--gas-report` لتحديد الدالة المكلفة.\n\n### 4. فشل الاستدعاء الخارجي\nالعَرَض: call يُرجع false.\nالسبب: العقد المستدعى يتراجع أو الغاز المُمرر غير كافٍ.\nالحل: تتبع الاستدعاء الخارجي بـ `-vvvv` لرؤية سبب التراجع.\n\n## أدوات تكميلية\n\n- **Tenderly** — تتبع معاملات مع واجهة رسومية\n- **evm.codes** — مرجع أكواد التشغيل مع أمثلة تفاعلية\n- **ethervm.io** — مفكك بايتكود عبر الإنترنت\n- **heimdall** — مفكك وفاكك بايتكود بـ Rust\n\n## بناء أدوات تصحيح مخصصة\n\n```rust\n\u002F\u002F تتبع مخصص مع revm\nuse revm::Inspector;\n\nstruct DebugInspector {\n    steps: Vec\u003CStepInfo>,\n}\n\nimpl Inspector for DebugInspector {\n    fn step(&mut self, interp: &mut Interpreter, _context: &mut Context) {\n        self.steps.push(StepInfo {\n            pc: interp.program_counter(),\n            opcode: interp.current_opcode(),\n            stack: interp.stack.data().to_vec(),\n            gas_remaining: interp.gas.remaining(),\n        });\n    }\n}\n```\n\n## الخلاصة\n\nتصحيح بايتكود EVM يتطلب أدوات متخصصة وصبر. forge debug للتحليل التفاعلي، cast run لإعادة تشغيل المعاملات، والتتبع المفصل لفهم التنفيذ خطوة بخطوة. القاعدة: علّق كل سطر في Huff بحالة المكدس لتسهيل التصحيح لاحقاً.","\u003Ch2 id=\"\">لماذا تصحيح البايتكود صعب\u003C\u002Fh2>\n\u003Cp>عندما يتراجع عقد Huff، تحصل على “revert” بدون رسالة خطأ. لا أسماء دوال، لا أرقام أسطر، لا traces قابلة للقراءة. كيف تجد الخطأ؟\u003C\u002Fp>\n\u003Ch2 id=\"forge-debug\">forge debug\u003C\u002Fh2>\n\u003Cp>Foundry يوفر مصحح تفاعلي:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge debug test\u002FMyContract.t.sol --sig \"testSwap()\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>يعرض:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>كود التشغيل الحالي\u003C\u002Fli>\n\u003Cli>حالة المكدس\u003C\u002Fli>\n\u003Cli>محتوى الذاكرة\u003C\u002Fli>\n\u003Cli>عداد البرنامج\u003C\u002Fli>\n\u003Cli>الغاز المتبقي\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>يمكنك التقدم خطوة بخطوة وفحص حالة EVM في كل نقطة.\u003C\u002Fp>\n\u003Ch2 id=\"cast-run\">cast run\u003C\u002Fh2>\n\u003Cp>\u003Ccode>cast run\u003C\u002Fcode> يعيد تشغيل معاملة تاريخية مع تتبع كامل:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cast run 0x&lt;tx_hash&gt; --rpc-url mainnet -vvvv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>المخرج يظهر كل كود تشغيل نُفذ، تكلفة الغاز، وتغييرات المكدس.\u003C\u002Fp>\n\u003Ch2 id=\"trace\">تتبع المعاملات مع trace\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-bash\">cast call --trace &lt;contract&gt; \"swap(address,address,uint256)\" \\\n    &lt;token0&gt; &lt;token1&gt; 1000000 \\\n    --rpc-url mainnet\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>التتبع يظهر:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>كل CALL\u002FSTATICCALL\u002FDELEGATECALL\u003C\u002Fli>\n\u003Cli>قيم الإدخال والإخراج\u003C\u002Fli>\n\u003Cli>أي revert مع بيانات الخطأ\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">أنماط التصحيح الشائعة\u003C\u002Fh2>\n\u003Ch3>1. نقص المكدس\u003C\u002Fh3>\n\u003Cp>العَرَض: تراجع غير مفسر.\nالسبب: كود تشغيل يحاول السحب من مكدس فارغ.\nالحل: تتبع حالة المكدس يدوياً في كل فرع.\u003C\u002Fp>\n\u003Ch3>2. JUMPDEST غير صالح\u003C\u002Fh3>\n\u003Cp>العَرَض: “invalid jump destination”.\nالسبب: القفز إلى موضع لا يحتوي JUMPDEST.\nالحل: تحقق من حسابات العلامات والإزاحات.\u003C\u002Fp>\n\u003Ch3>3. نفاد الغاز\u003C\u002Fh3>\n\u003Cp>العَرَض: “out of gas”.\nالسبب: حلقة لانهائية أو عمليات تخزين مكلفة غير متوقعة.\nالحل: استخدم \u003Ccode>--gas-report\u003C\u002Fcode> لتحديد الدالة المكلفة.\u003C\u002Fp>\n\u003Ch3>4. فشل الاستدعاء الخارجي\u003C\u002Fh3>\n\u003Cp>العَرَض: call يُرجع false.\nالسبب: العقد المستدعى يتراجع أو الغاز المُمرر غير كافٍ.\nالحل: تتبع الاستدعاء الخارجي بـ \u003Ccode>-vvvv\u003C\u002Fcode> لرؤية سبب التراجع.\u003C\u002Fp>\n\u003Ch2 id=\"\">أدوات تكميلية\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Tenderly\u003C\u002Fstrong> — تتبع معاملات مع واجهة رسومية\u003C\u002Fli>\n\u003Cli>\u003Cstrong>evm.codes\u003C\u002Fstrong> — مرجع أكواد التشغيل مع أمثلة تفاعلية\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ethervm.io\u003C\u002Fstrong> — مفكك بايتكود عبر الإنترنت\u003C\u002Fli>\n\u003Cli>\u003Cstrong>heimdall\u003C\u002Fstrong> — مفكك وفاكك بايتكود بـ Rust\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">بناء أدوات تصحيح مخصصة\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F تتبع مخصص مع revm\nuse revm::Inspector;\n\nstruct DebugInspector {\n    steps: Vec&lt;StepInfo&gt;,\n}\n\nimpl Inspector for DebugInspector {\n    fn step(&amp;mut self, interp: &amp;mut Interpreter, _context: &amp;mut Context) {\n        self.steps.push(StepInfo {\n            pc: interp.program_counter(),\n            opcode: interp.current_opcode(),\n            stack: interp.stack.data().to_vec(),\n            gas_remaining: interp.gas.remaining(),\n        });\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>تصحيح بايتكود EVM يتطلب أدوات متخصصة وصبر. forge debug للتحليل التفاعلي، cast run لإعادة تشغيل المعاملات، والتتبع المفصل لفهم التنفيذ خطوة بخطوة. القاعدة: علّق كل سطر في Huff بحالة المكدس لتسهيل التصحيح لاحقاً.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.778045Z","تصحيح بايتكود EVM — التتبعات وتفريغ المكدس وcast run","تصحيح بايتكود EVM: forge debug وcast run والتتبع المفصل وأنماط التصحيح الشائعة لعقود Huff.","تصحيح EVM بايتكود",null,"index, follow",[22,27,31],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000021","Foundry","foundry",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000017","Huff","huff","بلوكتشين",[37,43,49],{"id":38,"title":39,"slug":40,"excerpt":41,"locale":12,"category_name":35,"published_at":42},"d0000000-0000-0000-0000-000000000617","طبقة التشغيل البيني لـ Ethereum: كيف تصبح 55+ سلسلة L2 سلسلة واحدة","tabaqat-altashghil-albaini-ethereum-55-l2-silsila-wahida","يملك Ethereum اكثر من 55 rollup من الطبقة الثانية، مما يجزئ السيولة وتجربة المستخدم. طبقة التشغيل البيني لـ Ethereum — الجمع بين الرسائل عبر الـ rollups والمتسلسلات المشتركة والـ based rollups — تهدف الى توحيدها في شبكة قابلة للتركيب واحدة.","2026-03-28T10:44:45.626845Z",{"id":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":35,"published_at":48},"d0000000-0000-0000-0000-000000000616","اثباتات ZK ما وراء الـ Rollups: استدلال الذكاء الاصطناعي القابل للتحقق على Ethereum","ithbatat-zk-ma-waraa-rollups-istidlal-dhakaa-istinaai-ethereum","اثباتات المعرفة الصفرية لم تعد مجرد اداة للتوسع. في 2026، يتيح zkML استدلال الذكاء الاصطناعي القابل للتحقق على السلسلة، وتنقل معالجات ZK المشتركة الحسابات الثقيلة خارج السلسلة مع التحقق على السلسلة، وانظمة الاثبات الجديدة مثل SP1 وJolt تجعل ذلك عمليا.","2026-03-28T10:44:45.621594Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":35,"published_at":54},"d0000000-0000-0000-0000-000000000593","EIP-7702 في الممارسة العملية: بناء تدفقات الحساب الذكي بعد Pectra","eip-7702-fi-almumaarasa-alamaliyya-binaa-tadaffuqat-alhisab-aldhaki-baad-pectra","يسمح EIP-7702 لأي EOA على Ethereum بالعمل مؤقتاً كعقد ذكي في معاملة واحدة. إليك كيفية تنفيذ المعاملات المجمّعة ورعاية الغاز والاسترداد الاجتماعي باستخدام البدائية الجديدة لتجريد الحساب.","2026-03-28T10:44:44.185251Z",{"id":13,"name":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]