[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-11-jadawil-qafz-huff-irsal-dawal-o1":3},{"article":4,"author":59},{"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":39,"related_articles":40},"d9000000-0000-0000-0000-000000000111","a0000000-0000-0000-0000-000000000092","Deep EVM #11: جداول القفز في Huff — إرسال الدوال O(1) بدون حمل Solidity","deep-evm-11-jadawil-qafz-huff-irsal-dawal-o1","بناء مرسل دوال O(1) في Huff باستخدام جداول القفز المحزومة. مقارنة سلسلة if-else في Solidity مع جدول قفز يدوي يوفر آلاف الغاز.","## مشكلة مرسل Solidity\n\nعندما تستدعي عقد Solidity، أول ما تنفذه EVM هو مرسل الدوال. Solidity يولد سلسلة if-else خطية تقارن أول 4 بايت من calldata (محدد الدالة) مع كل محدد معروف:\n\n```\nCALLDATALOAD 0x00\nSHR 224\nDUP1\nPUSH4 0x70a08231    \u002F\u002F balanceOf(address)\nEQ\nPUSH2 dest1\nJUMPI\n...\n```\n\nلعقد بـ N دالة، هذا O(N) — أسوأ حالة تفحص جميع المحددات قبل العثور على تطابق. كل مقارنة تكلف ~22 غاز. عقد بـ 20 دالة يهدر حتى 440 غاز على الإرسال فقط.\n\nلروبوت MEV يُستدعى ملايين المرات، تلك 400+ وحدة غاز لكل استدعاء تتراكم إلى ETH حقيقي.\n\n## نهج جدول القفز: O(1)\n\nجدول القفز يربط محدد الدالة مباشرة بإزاحة الكود باستخدام الحساب، وليس المقارنة. الفكرة مستعارة من بنية المعالج — GOTOs المحسوبة استُخدمت منذ الستينيات.\n\nالمفهوم:\n1. استخراج محدد الدالة من calldata (4 بايت)\n2. استخدام الحساب لحساب وجهة القفز من المحدد\n3. القفز مباشرة إلى تلك الوجهة\n\nلا مقارنات، لا تفريع، وقت ثابت بغض النظر عن عدد الدوال.\n\n### النهج 1: ترميز محدد بسيط\n\nإذا كان عقدك يحتوي عدداً صغيراً من الدوال (1-8)، يمكنك تعيين المحددات يدوياً بتعدين محددات مخصصة حيث البايت الأول أو الثاني يرمز عدداً صحيحاً صغيراً فريداً:\n\n```huff\n#define macro DISPATCHER() = takes(0) returns(0) {\n    0x00 calldataload       \u002F\u002F [calldata_word]\n    0xe0 shr                \u002F\u002F [selector]\n    0x18 shr                \u002F\u002F [first_byte]\n    0x02 mul                \u002F\u002F [offset_in_table]\n    __tablestart(JumpTable) \u002F\u002F [table_start, offset_in_table]\n    add                     \u002F\u002F [entry_address]\n    codecopy_dest:\n    0x00 codecopy\n    0x00 mload\n    0xf0 shr\n    jump\n}\n\n#define jumptable JumpTable {\n    swap_exact\n    add_liq\n    remove_liq\n    flash_loan\n}\n```\n\n### النهج 2: جدول كود محزوم\n\nللكثافة القصوى، يمكنك حزم جدول القفز مباشرة في البايتكود باستخدام `__tablestart` و`__tablesize`. Huff يدعم جداول القفز كبنى أصلية.\n\n## مقارنة الغاز\n\n| الدوال | Solidity (if-else) | Solidity (ثنائي) | جدول قفز Huff |\n|--------|-------------------|-----------------|---------------|\n| 2 | 22-44 غاز | 22-44 غاز | 15 غاز |\n| 4 | 22-88 غاز | 22-66 غاز | 15 غاز |\n| 8 | 22-176 غاز | 22-88 غاز | 15 غاز |\n| 16 | 22-352 غاز | 22-110 غاز | 15 غاز |\n| 32 | 22-704 غاز | 22-132 غاز | 15 غاز |\n\nتكلفة جدول القفز ثابتة: CALLDATALOAD (3) + SHR (3) + حساب (3-6) + JUMP (8) = ~15-18 غاز. لا تتغير أبداً بغض النظر عن عدد الدوال.\n\n## تعدين محددات مخصصة\n\nلكي يعمل نهج جدول القفز، تحتاج محددات دوال ببايتات توجيه متوقعة:\n\n```python\nimport hashlib\nimport itertools\n\ntarget_byte = 0x00\nbase_name = \"swap\"\n\nfor suffix in itertools.count():\n    name = f\"{base_name}{suffix}(uint256,address)\"\n    selector = hashlib.sha3_256(name.encode()).digest()[:4]\n    if selector[0] == target_byte:\n        print(f\"Found: {name} -> 0x{selector.hex()}\")\n        break\n```\n\n## تأثير حجم البايتكود\n\nحجم البايتكود يؤثر مباشرة على تكلفة النشر (200 غاز لكل بايت عبر CREATE):\n\n| النهج | بايتكود التشغيل | غاز النشر |\n|-------|----------------|----------|\n| Solidity (8 دوال) | ~800 بايت | 160,000 غاز |\n| جدول قفز Huff (8 دوال) | ~200 بايت | 40,000 غاز |\n| Huff بسيط (دالتان) | ~61 بايت | 12,200 غاز |\n\n## القيود\n\n1. **ABI غير قياسي** — الأدوات الخارجية لا تستطيع فك تشفير calldata بدون تعريفات ABI مخصصة\n2. **تعدين المحددات** — يتطلب عملاً مسبقاً ويقيد تسمية الدوال\n3. **تكلفة الصيانة** — Huff أصعب في التدقيق والتعديل من Solidity\n\n## الملخص\n\nجداول القفز تستبدل سلسلة إرسال O(N) في Solidity بقفزات محسوبة O(1). التوفير في الغاز يتراكم عبر ملايين الاستدعاءات — ميزة ذات معنى للعقود عالية التردد مثل روبوتات MEV وموجهات DEX.","\u003Ch2 id=\"solidity\">مشكلة مرسل Solidity\u003C\u002Fh2>\n\u003Cp>عندما تستدعي عقد Solidity، أول ما تنفذه EVM هو مرسل الدوال. Solidity يولد سلسلة if-else خطية تقارن أول 4 بايت من calldata (محدد الدالة) مع كل محدد معروف:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>CALLDATALOAD 0x00\nSHR 224\nDUP1\nPUSH4 0x70a08231    \u002F\u002F balanceOf(address)\nEQ\nPUSH2 dest1\nJUMPI\n...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>لعقد بـ N دالة، هذا O(N) — أسوأ حالة تفحص جميع المحددات قبل العثور على تطابق. كل مقارنة تكلف ~22 غاز. عقد بـ 20 دالة يهدر حتى 440 غاز على الإرسال فقط.\u003C\u002Fp>\n\u003Cp>لروبوت MEV يُستدعى ملايين المرات، تلك 400+ وحدة غاز لكل استدعاء تتراكم إلى ETH حقيقي.\u003C\u002Fp>\n\u003Ch2 id=\"o-1\">نهج جدول القفز: O(1)\u003C\u002Fh2>\n\u003Cp>جدول القفز يربط محدد الدالة مباشرة بإزاحة الكود باستخدام الحساب، وليس المقارنة. الفكرة مستعارة من بنية المعالج — GOTOs المحسوبة استُخدمت منذ الستينيات.\u003C\u002Fp>\n\u003Cp>المفهوم:\u003C\u002Fp>\n\u003Col>\n\u003Cli>استخراج محدد الدالة من calldata (4 بايت)\u003C\u002Fli>\n\u003Cli>استخدام الحساب لحساب وجهة القفز من المحدد\u003C\u002Fli>\n\u003Cli>القفز مباشرة إلى تلك الوجهة\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>لا مقارنات، لا تفريع، وقت ثابت بغض النظر عن عدد الدوال.\u003C\u002Fp>\n\u003Ch3>النهج 1: ترميز محدد بسيط\u003C\u002Fh3>\n\u003Cp>إذا كان عقدك يحتوي عدداً صغيراً من الدوال (1-8)، يمكنك تعيين المحددات يدوياً بتعدين محددات مخصصة حيث البايت الأول أو الثاني يرمز عدداً صحيحاً صغيراً فريداً:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro DISPATCHER() = takes(0) returns(0) {\n    0x00 calldataload       \u002F\u002F [calldata_word]\n    0xe0 shr                \u002F\u002F [selector]\n    0x18 shr                \u002F\u002F [first_byte]\n    0x02 mul                \u002F\u002F [offset_in_table]\n    __tablestart(JumpTable) \u002F\u002F [table_start, offset_in_table]\n    add                     \u002F\u002F [entry_address]\n    codecopy_dest:\n    0x00 codecopy\n    0x00 mload\n    0xf0 shr\n    jump\n}\n\n#define jumptable JumpTable {\n    swap_exact\n    add_liq\n    remove_liq\n    flash_loan\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>النهج 2: جدول كود محزوم\u003C\u002Fh3>\n\u003Cp>للكثافة القصوى، يمكنك حزم جدول القفز مباشرة في البايتكود باستخدام \u003Ccode>__tablestart\u003C\u002Fcode> و\u003Ccode>__tablesize\u003C\u002Fcode>. Huff يدعم جداول القفز كبنى أصلية.\u003C\u002Fp>\n\u003Ch2 id=\"\">مقارنة الغاز\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>الدوال\u003C\u002Fth>\u003Cth>Solidity (if-else)\u003C\u002Fth>\u003Cth>Solidity (ثنائي)\u003C\u002Fth>\u003Cth>جدول قفز Huff\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>2\u003C\u002Ftd>\u003Ctd>22-44 غاز\u003C\u002Ftd>\u003Ctd>22-44 غاز\u003C\u002Ftd>\u003Ctd>15 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>4\u003C\u002Ftd>\u003Ctd>22-88 غاز\u003C\u002Ftd>\u003Ctd>22-66 غاز\u003C\u002Ftd>\u003Ctd>15 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>8\u003C\u002Ftd>\u003Ctd>22-176 غاز\u003C\u002Ftd>\u003Ctd>22-88 غاز\u003C\u002Ftd>\u003Ctd>15 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>16\u003C\u002Ftd>\u003Ctd>22-352 غاز\u003C\u002Ftd>\u003Ctd>22-110 غاز\u003C\u002Ftd>\u003Ctd>15 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>32\u003C\u002Ftd>\u003Ctd>22-704 غاز\u003C\u002Ftd>\u003Ctd>22-132 غاز\u003C\u002Ftd>\u003Ctd>15 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>تكلفة جدول القفز ثابتة: CALLDATALOAD (3) + SHR (3) + حساب (3-6) + JUMP (8) = ~15-18 غاز. لا تتغير أبداً بغض النظر عن عدد الدوال.\u003C\u002Fp>\n\u003Ch2 id=\"\">تعدين محددات مخصصة\u003C\u002Fh2>\n\u003Cp>لكي يعمل نهج جدول القفز، تحتاج محددات دوال ببايتات توجيه متوقعة:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">import hashlib\nimport itertools\n\ntarget_byte = 0x00\nbase_name = \"swap\"\n\nfor suffix in itertools.count():\n    name = f\"{base_name}{suffix}(uint256,address)\"\n    selector = hashlib.sha3_256(name.encode()).digest()[:4]\n    if selector[0] == target_byte:\n        print(f\"Found: {name} -&gt; 0x{selector.hex()}\")\n        break\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تأثير حجم البايتكود\u003C\u002Fh2>\n\u003Cp>حجم البايتكود يؤثر مباشرة على تكلفة النشر (200 غاز لكل بايت عبر CREATE):\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>النهج\u003C\u002Fth>\u003Cth>بايتكود التشغيل\u003C\u002Fth>\u003Cth>غاز النشر\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Solidity (8 دوال)\u003C\u002Ftd>\u003Ctd>~800 بايت\u003C\u002Ftd>\u003Ctd>160,000 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>جدول قفز Huff (8 دوال)\u003C\u002Ftd>\u003Ctd>~200 بايت\u003C\u002Ftd>\u003Ctd>40,000 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Huff بسيط (دالتان)\u003C\u002Ftd>\u003Ctd>~61 بايت\u003C\u002Ftd>\u003Ctd>12,200 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">القيود\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>ABI غير قياسي\u003C\u002Fstrong> — الأدوات الخارجية لا تستطيع فك تشفير calldata بدون تعريفات ABI مخصصة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تعدين المحددات\u003C\u002Fstrong> — يتطلب عملاً مسبقاً ويقيد تسمية الدوال\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تكلفة الصيانة\u003C\u002Fstrong> — Huff أصعب في التدقيق والتعديل من Solidity\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">الملخص\u003C\u002Fh2>\n\u003Cp>جداول القفز تستبدل سلسلة إرسال O(N) في Solidity بقفزات محسوبة O(1). التوفير في الغاز يتراكم عبر ملايين الاستدعاءات — ميزة ذات معنى للعقود عالية التردد مثل روبوتات MEV وموجهات DEX.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.470161Z","Deep EVM #11: جداول القفز في Huff — إرسال الدوال O(1)","بناء مرسل دوال O(1) في Huff باستخدام جداول القفز المحزومة. مقارنة مع Solidity وتوفير الغاز.","جداول قفز Huff EVM",null,"index, follow",[22,27,31,35],{"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",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000018","Yul","yul","بلوكتشين",[41,47,53],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":39,"published_at":46},"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":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":39,"published_at":52},"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":54,"title":55,"slug":56,"excerpt":57,"locale":12,"category_name":39,"published_at":58},"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":60,"slug":61,"bio":62,"photo_url":19,"linkedin":19,"role":63,"created_at":64,"updated_at":64},"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"]