[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-10-idarat-makdas-huff-dup-swap":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-000000000110","a0000000-0000-0000-0000-000000000092","Deep EVM #10: إدارة المكدس في Huff — takes() وreturns() وفن dup\u002Fswap","deep-evm-10-idarat-makdas-huff-dup-swap","إتقان آلة المكدس في EVM: تصور حالة المكدس، استخدام dup1-16 وswap1-16 بفعالية، وبناء أنماط للحفظ والتدوير والتنظيف.","## النموذج العقلي لآلة المكدس\n\nEVM هي آلة مكدسية. لا توجد سجلات ولا متغيرات مسماة — فقط مكدس آخر ما يدخل أول ما يخرج من كلمات 32 بايت بعمق 1024 فتحة. كل كود تشغيل إما يدفع أو يسحب أو يعيد ترتيب عناصر في هذا المكدس. إذا لم تستطع الاحتفاظ بحالة المكدس الحالية في ذهنك، ستنتج بايتكود خاطئ.\n\n### اتفاقية الترميز\n\nنمثل حالة المكدس بأقواس حيث العنصر الأيسر هو أعلى المكدس:\n\n```\n\u002F\u002F [أعلى, ثاني, ثالث, ..., أسفل]\n0x01  \u002F\u002F [1]\n0x02  \u002F\u002F [2, 1]\nadd   \u002F\u002F [3]\n```\n\nكل ماكرو Huff يجب أن يحتوي تعليق مكدس بعد كل كود تشغيل. هذا ليس اختيارياً — إنه الطريقة الوحيدة لتدقيق الصحة.\n\n## DUP: تكرار عناصر المكدس\n\nEVM توفر `DUP1` حتى `DUP16`. `DUPn` ينسخ العنصر n من الأعلى ويدفعه على المكدس. ينمو المكدس بمقدار 1.\n\n```huff\n\u002F\u002F المكدس: [a, b, c, d]\ndup1   \u002F\u002F [a, a, b, c, d]       — نسخ الأعلى\ndup3   \u002F\u002F [c, a, a, b, c, d]    — نسخ الثالث من الأعلى\n```\n\nتكلفة الغاز: 3 غاز لأي DUPn. من أرخص العمليات في EVM.\n\n### متى تستخدم DUP\n\nDUP هي أداتك **للقراءة غير المدمرة**. كثير من أكواد التشغيل تستهلك معاملاتها (ADD يسحب اثنين ويدفع واحد)، لذا إذا احتجت قيمة مرة أخرى لاحقاً، كررها بـ DUP قبل تمريرها لكود مستهلك.\n\n```huff\n#define macro SAFE_SUB() = takes(2) returns(1) {\n    \u002F\u002F takes: [a, b] — حساب a - b، تراجع إذا b > a\n    dup2 dup2       \u002F\u002F [a, b, a, b]\n    lt              \u002F\u002F [a \u003C b?, a, b]\n    revert_underflow jumpi  \u002F\u002F [a, b]\n    sub             \u002F\u002F [a - b]\n    done jump\n    revert_underflow:\n        0x00 0x00 revert\n    done:\n}\n```\n\n## SWAP: إعادة ترتيب المكدس\n\nEVM توفر `SWAP1` حتى `SWAP16`. `SWAPn` يبادل العنصر العلوي مع العنصر (n+1). حجم المكدس يبقى نفسه.\n\n```huff\n\u002F\u002F المكدس: [a, b, c, d]\nswap1  \u002F\u002F [b, a, c, d]          — تبديل الأعلى مع الثاني\nswap3  \u002F\u002F [d, a, c, b]          — تبديل الأعلى مع الرابع\n```\n\n## قيد العمق 16\n\nDUP وSWAP تصل فقط حتى عمق 16. إذا كانت قيمة في الموضع 17 أو أعمق، لا يمكنك الوصول إليها بكود تشغيل واحد. هذا قيد صلب في EVM.\n\n**استراتيجيات للمكدسات العميقة:**\n\n1. **أعد هيكلة المنطق** لإبقاء القيم المطلوبة قرب الأعلى\n2. **استخدم الذاكرة كمساحة مؤقتة.** خزّن قيمة بـ MSTORE واسترجعها لاحقاً بـ MLOAD. تكلفة 3+3=6 غاز مقابل 3 غاز لـ DUP، لكن تكسر حاجز العمق.\n3. **قسّم الماكرو إلى ماكرو أصغر** يعمل كل منها على عناصر مكدس أقل.\n\n## الأنماط الشائعة\n\n### النمط 1: الاحتفاظ بقيمة خلال عملية مستهلكة\n\n```huff\n\u002F\u002F نريد: حساب تجزئة x، لكن نحتفظ بـ x\n\u002F\u002F المكدس: [x]\ndup1        \u002F\u002F [x, x]\n0x00 mstore \u002F\u002F [x]  — memory[0] = x\n0x20 0x00   \u002F\u002F [0, 32, x]\nkeccak256   \u002F\u002F [hash, x]\n```\n\n### النمط 2: تدوير ثلاثة عناصر\n\nلديك `[a, b, c]` وتريد `[c, a, b]`:\n\n```huff\nswap2       \u002F\u002F [c, b, a]\nswap1       \u002F\u002F [c, a, b]\n```\n\n### النمط 3: تنظيف عناصر المكدس غير المرغوبة\n\n```huff\n\u002F\u002F المكدس: [result, garbage1, garbage2]\nswap1 pop   \u002F\u002F [result, garbage2]\nswap1 pop   \u002F\u002F [result]\n```\n\n### النمط 4: تكرار زوج\n\n```huff\n\u002F\u002F المكدس: [a, b]\ndup2        \u002F\u002F [b, a, b]\ndup2        \u002F\u002F [a, b, a, b]\n```\n\n## انضباط تصور المكدس\n\nعند كتابة Huff، اتبع هذا الانضباط:\n\n1. **علّق كل سطر** بحالة المكدس بعد التنفيذ\n2. **تحقق من takes\u002Freturns** — عُد عناصر المكدس عند الدخول والخروج\n3. **تتبع كل فرع** — عند كل JUMPI، كلا المسارين يجب أن يتركا المكدس في حالة صالحة\n4. **راقب انحراف المكدس** — إذا لم يوازن جسم الحلقة الدفع والسحب تماماً، سينمو المكدس أو ينكمش في كل تكرار\n\n## تصحيح أخطاء المكدس\n\nأشهر الأخطاء في Huff:\n\n1. **نقص المكدس** — السحب من مكدس فارغ. EVM يتراجع في وقت التشغيل\n2. **عدم توازن المكدس عند JUMP** — JUMPDEST يُصل إليه من مسارين مختلفين يتوقعان حالات مكدس مختلفة\n3. **خطأ واحد في DUP\u002FSWAP** — `dup3` مقابل `dup4` عندما أضفت push إضافي سابقاً\n\n`huffc` لديه علم `--stack-check` يجري تحليل مكدس أساسي.\n\n## الملخص\n\nإدارة المكدس هي المهارة الأساسية لتطوير Huff. DUP للقراءة غير المدمرة، SWAP لإعادة الترتيب، والذاكرة للقيم أبعد من عمق 16. علّق كل سطر بحالة المكدس. تحقق من كل فرع.","\u003Ch2 id=\"\">النموذج العقلي لآلة المكدس\u003C\u002Fh2>\n\u003Cp>EVM هي آلة مكدسية. لا توجد سجلات ولا متغيرات مسماة — فقط مكدس آخر ما يدخل أول ما يخرج من كلمات 32 بايت بعمق 1024 فتحة. كل كود تشغيل إما يدفع أو يسحب أو يعيد ترتيب عناصر في هذا المكدس. إذا لم تستطع الاحتفاظ بحالة المكدس الحالية في ذهنك، ستنتج بايتكود خاطئ.\u003C\u002Fp>\n\u003Ch3>اتفاقية الترميز\u003C\u002Fh3>\n\u003Cp>نمثل حالة المكدس بأقواس حيث العنصر الأيسر هو أعلى المكدس:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F [أعلى, ثاني, ثالث, ..., أسفل]\n0x01  \u002F\u002F [1]\n0x02  \u002F\u002F [2, 1]\nadd   \u002F\u002F [3]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>كل ماكرو Huff يجب أن يحتوي تعليق مكدس بعد كل كود تشغيل. هذا ليس اختيارياً — إنه الطريقة الوحيدة لتدقيق الصحة.\u003C\u002Fp>\n\u003Ch2 id=\"dup\">DUP: تكرار عناصر المكدس\u003C\u002Fh2>\n\u003Cp>EVM توفر \u003Ccode>DUP1\u003C\u002Fcode> حتى \u003Ccode>DUP16\u003C\u002Fcode>. \u003Ccode>DUPn\u003C\u002Fcode> ينسخ العنصر n من الأعلى ويدفعه على المكدس. ينمو المكدس بمقدار 1.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F المكدس: [a, b, c, d]\ndup1   \u002F\u002F [a, a, b, c, d]       — نسخ الأعلى\ndup3   \u002F\u002F [c, a, a, b, c, d]    — نسخ الثالث من الأعلى\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>تكلفة الغاز: 3 غاز لأي DUPn. من أرخص العمليات في EVM.\u003C\u002Fp>\n\u003Ch3>متى تستخدم DUP\u003C\u002Fh3>\n\u003Cp>DUP هي أداتك \u003Cstrong>للقراءة غير المدمرة\u003C\u002Fstrong>. كثير من أكواد التشغيل تستهلك معاملاتها (ADD يسحب اثنين ويدفع واحد)، لذا إذا احتجت قيمة مرة أخرى لاحقاً، كررها بـ DUP قبل تمريرها لكود مستهلك.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro SAFE_SUB() = takes(2) returns(1) {\n    \u002F\u002F takes: [a, b] — حساب a - b، تراجع إذا b &gt; a\n    dup2 dup2       \u002F\u002F [a, b, a, b]\n    lt              \u002F\u002F [a &lt; b?, a, b]\n    revert_underflow jumpi  \u002F\u002F [a, b]\n    sub             \u002F\u002F [a - b]\n    done jump\n    revert_underflow:\n        0x00 0x00 revert\n    done:\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"swap\">SWAP: إعادة ترتيب المكدس\u003C\u002Fh2>\n\u003Cp>EVM توفر \u003Ccode>SWAP1\u003C\u002Fcode> حتى \u003Ccode>SWAP16\u003C\u002Fcode>. \u003Ccode>SWAPn\u003C\u002Fcode> يبادل العنصر العلوي مع العنصر (n+1). حجم المكدس يبقى نفسه.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F المكدس: [a, b, c, d]\nswap1  \u002F\u002F [b, a, c, d]          — تبديل الأعلى مع الثاني\nswap3  \u002F\u002F [d, a, c, b]          — تبديل الأعلى مع الرابع\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"16\">قيد العمق 16\u003C\u002Fh2>\n\u003Cp>DUP وSWAP تصل فقط حتى عمق 16. إذا كانت قيمة في الموضع 17 أو أعمق، لا يمكنك الوصول إليها بكود تشغيل واحد. هذا قيد صلب في EVM.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>استراتيجيات للمكدسات العميقة:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>أعد هيكلة المنطق\u003C\u002Fstrong> لإبقاء القيم المطلوبة قرب الأعلى\u003C\u002Fli>\n\u003Cli>\u003Cstrong>استخدم الذاكرة كمساحة مؤقتة.\u003C\u002Fstrong> خزّن قيمة بـ MSTORE واسترجعها لاحقاً بـ MLOAD. تكلفة 3+3=6 غاز مقابل 3 غاز لـ DUP، لكن تكسر حاجز العمق.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>قسّم الماكرو إلى ماكرو أصغر\u003C\u002Fstrong> يعمل كل منها على عناصر مكدس أقل.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">الأنماط الشائعة\u003C\u002Fh2>\n\u003Ch3>النمط 1: الاحتفاظ بقيمة خلال عملية مستهلكة\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F نريد: حساب تجزئة x، لكن نحتفظ بـ x\n\u002F\u002F المكدس: [x]\ndup1        \u002F\u002F [x, x]\n0x00 mstore \u002F\u002F [x]  — memory[0] = x\n0x20 0x00   \u002F\u002F [0, 32, x]\nkeccak256   \u002F\u002F [hash, x]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>النمط 2: تدوير ثلاثة عناصر\u003C\u002Fh3>\n\u003Cp>لديك \u003Ccode>[a, b, c]\u003C\u002Fcode> وتريد \u003Ccode>[c, a, b]\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">swap2       \u002F\u002F [c, b, a]\nswap1       \u002F\u002F [c, a, b]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>النمط 3: تنظيف عناصر المكدس غير المرغوبة\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F المكدس: [result, garbage1, garbage2]\nswap1 pop   \u002F\u002F [result, garbage2]\nswap1 pop   \u002F\u002F [result]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>النمط 4: تكرار زوج\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F المكدس: [a, b]\ndup2        \u002F\u002F [b, a, b]\ndup2        \u002F\u002F [a, b, a, b]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">انضباط تصور المكدس\u003C\u002Fh2>\n\u003Cp>عند كتابة Huff، اتبع هذا الانضباط:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>علّق كل سطر\u003C\u002Fstrong> بحالة المكدس بعد التنفيذ\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تحقق من takes\u002Freturns\u003C\u002Fstrong> — عُد عناصر المكدس عند الدخول والخروج\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تتبع كل فرع\u003C\u002Fstrong> — عند كل JUMPI، كلا المسارين يجب أن يتركا المكدس في حالة صالحة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>راقب انحراف المكدس\u003C\u002Fstrong> — إذا لم يوازن جسم الحلقة الدفع والسحب تماماً، سينمو المكدس أو ينكمش في كل تكرار\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">تصحيح أخطاء المكدس\u003C\u002Fh2>\n\u003Cp>أشهر الأخطاء في Huff:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>نقص المكدس\u003C\u002Fstrong> — السحب من مكدس فارغ. EVM يتراجع في وقت التشغيل\u003C\u002Fli>\n\u003Cli>\u003Cstrong>عدم توازن المكدس عند JUMP\u003C\u002Fstrong> — JUMPDEST يُصل إليه من مسارين مختلفين يتوقعان حالات مكدس مختلفة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>خطأ واحد في DUP\u002FSWAP\u003C\u002Fstrong> — \u003Ccode>dup3\u003C\u002Fcode> مقابل \u003Ccode>dup4\u003C\u002Fcode> عندما أضفت push إضافي سابقاً\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>\u003Ccode>huffc\u003C\u002Fcode> لديه علم \u003Ccode>--stack-check\u003C\u002Fcode> يجري تحليل مكدس أساسي.\u003C\u002Fp>\n\u003Ch2 id=\"\">الملخص\u003C\u002Fh2>\n\u003Cp>إدارة المكدس هي المهارة الأساسية لتطوير Huff. DUP للقراءة غير المدمرة، SWAP لإعادة الترتيب، والذاكرة للقيم أبعد من عمق 16. علّق كل سطر بحالة المكدس. تحقق من كل فرع.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.464168Z","Deep EVM #10: إدارة المكدس في Huff — dup وswap وانضباط المكدس","إتقان إدارة المكدس في EVM مع Huff: dup1-16 وswap1-16 وقيد العمق 16 والأنماط الشائعة وتصحيح أخطاء المكدس.","إدارة مكدس 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-000000000020","Gas Optimization","gas-optimization",{"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"]