הגדרת Foundry לפיתוח חוזים חכמים
אנו משלבים את Foundry בצנרת פיתוח החוזים החכמים שלך. בניגוד ל-Hardhat, Foundry המבוסס על Rust מספק שיפור מהירות של עד פי 50 בבדיקות, אך הוא דורש הגדרה נכונה של פרופילים ותלויות. ללא זאת, אתה מסתכן בבנייה לא יציבה או בפספוס בעיות reentrancy במהלך הבדיקות.
חייו של מפתח בלוקצ'יין הם לולאה אינסופית: קומפילציה, הרצת בדיקות, מציאת באג, תיקון, הרצה חוזרת. Foundry הופך את המחזור הזה למהיר פי עשרות מונים, אבל כדי לנצל את הפוטנציאל שלו, אתה צריך את ההגדרה הנכונה. אנו נגדיר אותו עבורך מוכן לשימוש. ב-5 שנות עבודה, הגדרנו את Foundry ליותר מ-50 פרויקטים—מ-ERC-20 פשוטים ועד פרוטוקולי DeFi מורכבים על L2.
למה Foundry מהיר יותר מ-Hardhat
Foundry כתוב ב-Rust ומקמפל Solidity ישירות דרך solc, מה שמבטל שכבות ביניים. בדיקות רצות בסביבה טבעית, ו-fuzzing עובד ישירות מהקופסה. התוצאה היא קומפילציה ובדיקות מהירות פי 10–50 בפרויקטי DeFi טיפוסיים. כפי שצוין בתיעוד Foundry, בדיקת ביצועים על פרויקט עם 200 בדיקות מראה 3 שניות לעומת 45 שניות עבור Hardhat.
התקנה והגדרה בסיסית
הפקודה foundryup מתקינה את ערכת הכלים העדכנית ביותר. פרויקט מאותחל באמצעות forge init my-project. המבנה הבסיסי:
my-project/ ├── foundry.toml ├── src/ ├── test/ ├── script/ └── lib/ הקובץ my-project/ ├── foundry.toml ├── src/ ├── test/ ├── script/ └── lib/ הוא לב ליבה של ההגדרה. אנו מגדירים שני פרופילים: אחד מהיר לפיתוח מקומי ואחד מעמיק יותר ל-CI.
| פרמטר | [profile.default] | [profile.ci] |
|---|---|---|
| fuzz.runs | 1000 | 10000 |
| invariant.runs | 256 | 1000 |
| invariant.depth | 500 | 1000 |
גישה זו מאפשרת לבדוק לוגיקה בסיסית תוך דקות מקומית ולקבל תוצאות אמינות ב-CI.
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.24"
optimizer = true
optimizer_runs = 200
fuzz = { runs = 1000 }
invariant = { runs = 256, depth = 500 }
[profile.ci]
fuzz = { runs = 10000 }
invariant = { runs = 1000, depth = 1000 } איך להגדיר פרופיל CI ב-Foundry?
פרופיל ה-CI דורש fuzzing אגרסיבי יותר ועומק גדול יותר לבדיקות invariant. הגדר אותו בנפרד ב-[profile.default] src = "src" out = "out" libs = ["lib"] solc = "0.8.24" optimizer = true optimizer_runs = 200 fuzz = { runs = 1000 } invariant = { runs = 256, depth = 500 } [profile.ci] fuzz = { runs = 10000 } invariant = { runs = 1000, depth = 1000 } והרץ באמצעות foundry.toml. בצנרת ה-CI אנו גם מפעילים forge test --profile ci -vvv ובדיקות Slither נוספות.
תלויות באמצעות forge install
אנו מושכים את OpenZeppelin, forge-std וספריות אחרות.
forge install OpenZeppelin/openzeppelin-contracts forge install foundry-rs/forge-std לאחר ההתקנה, הוסף remappings:
remappings = [ "@openzeppelin/=lib/openzeppelin-contracts/", "forge-std/=lib/forge-std/src/", ] תלויות מאוחסנות כ-git submodules—זהו התקן של Foundry, המבטיח שחזוריות.
טיפ: איך להימנע מהתנגשויות remapping
אם מספר ספריות מייצאות את אותם נתיבים, השתמש בעדיפות ב-foundry.toml: remappings מעובדים בסדר ההכרזה. תמיד ודא קומפילציה לאחר הוספת תלות חדשה.איך להגדיר בדיקות Fork עם Anvil?
Anvil הוא צומת מקומי עם יכולת fork של mainnet. זו תכונה מרכזית לבדיקות אינטגרציה.
anvil --fork-url $MAINNET_RPC --fork-block-number 19000000 --chain-id 1 אתה מקבל עותק של מצב ה-mainnet בבלוק מסוים ללא mocks. הניסיון שלנו מראה שבדיקות fork תופסות שגיאות לא ברורות שבדיקות יחידה מפספסות. בפרויקט אחד, בדיקת invariant מצאה שלוש שגיאות לוגיות ב-20 דקות שבדיקות ידניות פספסו: בשרשרת --gas-report, totalSupply סטה ב-1 wei בגלל עיגול.
בדיקות Fuzz ו-Invariant
Fuzzing עובד אוטומטית—פשוט העבר פרמטר אקראי לבדיקה.
function testFuzz_Deposit(uint256 amount) public {
amount = bound(amount, 1, 1e27);
token.mint(alice, amount);
vm.prank(alice);
vault.deposit(amount);
assertEq(vault.balanceOf(alice), amount);
}בדיקות invariant מוודאות שהאינווריאנטים של המערכת מתקיימים לאחר כל רצף של קריאות.
function invariant_TotalSupplyEqualsDeposits() public { assertEq(vault.totalSupply(), vault.totalDeposits()); } אינטגרציית CI (GitHub Actions)
אנו מגדירים צנרת שמריצה בדיקות עם פרופיל ה-CI בכל commit.
---
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
- name: Run tests
run: forge test --profile ci -v
env:
FOUNDRY_ETH_RPC_URL: ${{ secrets.MAINNET_RPC }}
--- מה כלול בהגדרה
- הגדרת foundry.toml עם פרופילי default/ci
- התקנה ו-remapping של תלויות (OpenZeppelin, forge-std)
- הגדרת Anvil עם fork של mainnet לבדיקות אינטגרציה
- כתיבת בדיקות fuzz ו-invariant בסיסיות
- צנרת CI עם GitHub Actions (GitLab, CircleCI לפי בקשה)
- תיעוד על הדגלים והפקודות שבשימוש
לוחות זמנים
הגדרת Foundry עם תלויות, פרופילים ו-CI אורכת בין שעתיים ל-6 שעות בהתאם למורכבות הפרויקט. זה כולל כתיבת בדיקות תבנית וניפוי באגים של ה-fork. העלות נקבעת באופן אישי לאחר ניתוח.
למה לבחור בהגדרה שלנו?
אנחנו לא רק מעתיקים תצורות תבנית—אנו מנתחים את מבנה הפרויקט שלך, בוחרים פרמטרי fuzzing ו-invariant אופטימליים, ומגדירים דיווח גז. ניסיון של 5 שנים בפיתוח בלוקצ'יין ויותר מ-50 פרויקטים מוצלחים מבטיחים שההגדרה שלך תעבוד בצורה אמינה.
צור קשר כדי לקבל ייעוץ על הגדרת Foundry לפרויקט שלך. אנו נעריך את המשימות שלך ונציע את הפתרון האופטימלי.
הערה: עלויות ההגדרה תלויות בהיקף העבודה ונקבעות באופן אישי.







