[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-19-ikhtibar-qaim-khasais-uqud-dhakiya-foundry":3},{"article":4,"author":60},{"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-000000000119","a0000000-0000-0000-0000-000000000092","Deep EVM #19: الاختبار القائم على الخصائص للعقود الذكية — الاختبار العشوائي مع Foundry","deep-evm-19-ikhtibar-qaim-khasais-uqud-dhakiya-foundry","تجاوز اختبارات الوحدة: الاختبار القائم على الخصائص والاختبار العشوائي مع Foundry لاكتشاف ثغرات العقود الذكية التي تفوتها الاختبارات التقليدية.","## لماذا اختبارات الوحدة ليست كافية\n\nاختبارات الوحدة تتحقق من سيناريوهات محددة. لكن العقود الذكية تواجه مدخلات عشوائية من مهاجمين محتملين. الاختبار القائم على الخصائص يولّد مئات الآلاف من المدخلات العشوائية ويتحقق من أن خصائص معينة تبقى صحيحة دائماً.\n\n## الاختبار العشوائي (Fuzzing) مع Foundry\n\nFoundry يدعم الاختبار العشوائي بشكل أصلي. أي دالة اختبار تأخذ معاملات ستُستدعى تلقائياً بقيم عشوائية:\n\n```solidity\nfunction testFuzz_transferNeverExceedsBalance(\n    address from,\n    address to,\n    uint256 amount\n) public {\n    vm.assume(from != address(0) && to != address(0));\n    vm.assume(amount > 0 && amount \u003C= 1000 ether);\n    \n    deal(address(token), from, amount);\n    \n    vm.prank(from);\n    token.transfer(to, amount);\n    \n    \u002F\u002F الخاصية: الرصيد لا يتجاوز المبلغ الأصلي\n    assertLe(token.balanceOf(to), amount);\n    assertEq(token.balanceOf(from), 0);\n}\n```\n\n## اختبارات الثوابت (Invariant Testing)\n\nأقوى شكل من الاختبار العشوائي: Foundry يستدعي عدة دوال بترتيب عشوائي ويتحقق من الثوابت بعد كل استدعاء:\n\n```solidity\ncontract VaultInvariantTest is Test {\n    Vault vault;\n    \n    function setUp() public {\n        vault = new Vault();\n        targetContract(address(vault));\n    }\n    \n    function invariant_totalAssetsMatchesSum() public {\n        uint256 total = vault.totalAssets();\n        uint256 sum = 0;\n        for (uint i = 0; i \u003C users.length; i++) {\n            sum += vault.balanceOf(users[i]);\n        }\n        assertEq(total, sum, \"إجمالي الأصول لا يتطابق مع المجموع\");\n    }\n    \n    function invariant_noNegativeBalance() public {\n        for (uint i = 0; i \u003C users.length; i++) {\n            assertGe(vault.balanceOf(users[i]), 0);\n        }\n    }\n}\n```\n\n## تكوين الاختبار العشوائي\n\n```toml\n# foundry.toml\n[fuzz]\nruns = 10000           # عدد التكرارات\nmax_test_rejects = 500 # الحد الأقصى للرفض بواسطة vm.assume\nseed = \"0x1234\"        # بذرة قابلة لإعادة الإنتاج\n\n[invariant]\nruns = 256\ndepth = 100            # عدد الاستدعاءات لكل تشغيل\n```\n\n## أمثلة على خصائص\n\n1. **الحفظ** — إجمالي العرض لا يتغير بعد التحويل\n2. **أحادية الاتجاه** — السحب يقلل الرصيد دائماً\n3. **الحدود** — لا قيمة تتجاوز MAX_UINT256\n4. **التناظر** — الإيداع ثم السحب يُرجع المبلغ الأصلي\n5. **عدم التراجع** — التشغيل العادي لا يسبب revert\n\n## الخلاصة\n\nالاختبار القائم على الخصائص هو أقوى أداة لاكتشاف الثغرات قبل النشر. إنه يكتشف الحالات الحدية التي لا يفكر فيها المطور. استخدم الاختبار العشوائي لكل عقد واختبارات الثوابت للبروتوكولات المعقدة.","\u003Ch2 id=\"\">لماذا اختبارات الوحدة ليست كافية\u003C\u002Fh2>\n\u003Cp>اختبارات الوحدة تتحقق من سيناريوهات محددة. لكن العقود الذكية تواجه مدخلات عشوائية من مهاجمين محتملين. الاختبار القائم على الخصائص يولّد مئات الآلاف من المدخلات العشوائية ويتحقق من أن خصائص معينة تبقى صحيحة دائماً.\u003C\u002Fp>\n\u003Ch2 id=\"fuzzing-foundry\">الاختبار العشوائي (Fuzzing) مع Foundry\u003C\u002Fh2>\n\u003Cp>Foundry يدعم الاختبار العشوائي بشكل أصلي. أي دالة اختبار تأخذ معاملات ستُستدعى تلقائياً بقيم عشوائية:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">function testFuzz_transferNeverExceedsBalance(\n    address from,\n    address to,\n    uint256 amount\n) public {\n    vm.assume(from != address(0) &amp;&amp; to != address(0));\n    vm.assume(amount &gt; 0 &amp;&amp; amount &lt;= 1000 ether);\n    \n    deal(address(token), from, amount);\n    \n    vm.prank(from);\n    token.transfer(to, amount);\n    \n    \u002F\u002F الخاصية: الرصيد لا يتجاوز المبلغ الأصلي\n    assertLe(token.balanceOf(to), amount);\n    assertEq(token.balanceOf(from), 0);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"invariant-testing\">اختبارات الثوابت (Invariant Testing)\u003C\u002Fh2>\n\u003Cp>أقوى شكل من الاختبار العشوائي: Foundry يستدعي عدة دوال بترتيب عشوائي ويتحقق من الثوابت بعد كل استدعاء:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">contract VaultInvariantTest is Test {\n    Vault vault;\n    \n    function setUp() public {\n        vault = new Vault();\n        targetContract(address(vault));\n    }\n    \n    function invariant_totalAssetsMatchesSum() public {\n        uint256 total = vault.totalAssets();\n        uint256 sum = 0;\n        for (uint i = 0; i &lt; users.length; i++) {\n            sum += vault.balanceOf(users[i]);\n        }\n        assertEq(total, sum, \"إجمالي الأصول لا يتطابق مع المجموع\");\n    }\n    \n    function invariant_noNegativeBalance() public {\n        for (uint i = 0; i &lt; users.length; i++) {\n            assertGe(vault.balanceOf(users[i]), 0);\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تكوين الاختبار العشوائي\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-toml\"># foundry.toml\n[fuzz]\nruns = 10000           # عدد التكرارات\nmax_test_rejects = 500 # الحد الأقصى للرفض بواسطة vm.assume\nseed = \"0x1234\"        # بذرة قابلة لإعادة الإنتاج\n\n[invariant]\nruns = 256\ndepth = 100            # عدد الاستدعاءات لكل تشغيل\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">أمثلة على خصائص\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>الحفظ\u003C\u002Fstrong> — إجمالي العرض لا يتغير بعد التحويل\u003C\u002Fli>\n\u003Cli>\u003Cstrong>أحادية الاتجاه\u003C\u002Fstrong> — السحب يقلل الرصيد دائماً\u003C\u002Fli>\n\u003Cli>\u003Cstrong>الحدود\u003C\u002Fstrong> — لا قيمة تتجاوز MAX_UINT256\u003C\u002Fli>\n\u003Cli>\u003Cstrong>التناظر\u003C\u002Fstrong> — الإيداع ثم السحب يُرجع المبلغ الأصلي\u003C\u002Fli>\n\u003Cli>\u003Cstrong>عدم التراجع\u003C\u002Fstrong> — التشغيل العادي لا يسبب revert\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>الاختبار القائم على الخصائص هو أقوى أداة لاكتشاف الثغرات قبل النشر. إنه يكتشف الحالات الحدية التي لا يفكر فيها المطور. استخدم الاختبار العشوائي لكل عقد واختبارات الثوابت للبروتوكولات المعقدة.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.783757Z","الاختبار القائم على الخصائص للعقود الذكية — الاختبار العشوائي مع Foundry","الاختبار القائم على الخصائص والاختبار العشوائي مع Foundry لاكتشاف ثغرات العقود الذكية.","اختبار عشوائي Foundry",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-000000000021","Foundry","foundry",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000013","Security","security",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000018","Yul","yul","بلوكتشين",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"id":13,"name":61,"slug":62,"bio":63,"photo_url":19,"linkedin":19,"role":64,"created_at":65,"updated_at":65},"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"]