בעיה: בדיקות נכשלות, אין ביטחון
תארו לעצמכם: אתם פורסים חוזה ל-mainnet, אבל שעה לאחר מכן מגלים פרצת reentrancy. משתמשים איבדו כספים — המוניטין נפגם, הביקורת לא עזרה. כל שעת השבתה עולה $5,000, והנזקים מהתקפות reentrancy עולים על $100M. או מצב טיפוסי: מפתח חדש מבלה חצי יום בהתקנת תלויות והרצת הבדיקה הראשונה. ה-CI pipeline נכשל, אבל אף אחד לא יודע למה — הלוגים ריקים.
הצוות שלנו עם 5 שנות ניסיון בפיתוח blockchain הקים סביבות כאלה עבור 50+ פרויקטים, כולל פרוטוקולים עם TVL כולל > $1B. כתוצאה מכך, זמן הפריסה ירד ב-40%, ומספר הבאגים בייצור — ב-70%. זו לא רק ערכת כלים — זו ערובה ליציבות ושחזוריות.
איזה Framework לבחור למשימה?
לפרויקטים של Solidity, יש כיום שתי אפשרויות אמיתיות: Foundry ו-Hardhat. הם פותרים משימות שונות ולעיתים קרובות משמשים יחד. הבחירה תלויה במה אתם בודקים: לוגיקת חוזה או אינטגרציה עם frontend.
| פרמטר | Foundry | Hardhat |
|---|---|---|
| שפת בדיקות | Solidity | TypeScript/JavaScript |
| מהירות ביצוע | מהיר מאוד (revm על Rust) | איטי יותר (עד פי 5) |
| בדיקות Fuzz | מובנה (differential, invariant) | רק דרך פלאגינים |
| Fork של Mainnet | vm.createFork() |
--fork-url |
| אינטגרציה עם Frontend | קשה יותר | קל יותר (ethers.js, Wagmi) |
| סקריפטי פריסה | סקריפטי Solidity | TypeScript + ethers.js |
| ניפוי עסקאות | forge debug |
console.log() בחוזה |
הסטנדרט שלנו: Foundry לבדיקות יחידה ו-fuzz, Hardhat לסקריפטי פריסה ואינטגרציה עם frontend. שתי התצורות מתקיימות יחד במאגר אחד — זה מאפשר כתיבת בדיקות ב-Solidity ופריסה דרך TypeScript.
כיצד מאורגן מבנה הפרויקט?
אנו משתמשים בהפרדה מודולרית: contracts/core, contracts/interfaces, test/unit, test/integration, test/invariant, script (Foundry), deploy (Hardhat) ו-fixtures. ארגון זה מאפשר להפריד בדיקות יחידה (ללא RPC) מבדיקות אינטגרציה (עם fork). בדיקות יחידה צריכות לרוץ בשניות, אינטגרציה רק במיזוג ל-main.
הקמת רשת מקומית, Mocks ו-Fixtures
רשת מקומית: Anvil במקום Ganache
Anvil (כלול ב-Foundry) הוא צומת EVM מקומי על Rust. מהיר פי 10 מ-Ganache, מתוחזק באופן פעיל. לפיתוח, אנו מריצים אותו במצב fork מ-mainnet או testnet:
# Форк Ethereum mainnet с конкретным блоком (воспроизводимость)
anvil --fork-url $MAINNET_RPC --fork-block-number 19500000
# Форк с предопределёнными аккаунтами и балансами
anvil --fork-url $MAINNET_RPC --accounts 10 --balance 10000
בדיקות Fork הן הדרך היחידה לבדוק אינטגרציה עם Uniswap, Aave, Chainlink ללא פריסה ל-testnet. עסקה ב-fork מקומי היא מיידית. ב-Sepolia — 12-15 שניות. חיסכון בזמן לכל איטרציה: מ-15 שניות ל-0.1 שניות. השתמשו ב-Ethereum testnets כדי להכיר רשתות.
Mocks ו-Fixtures: בידוד ללא שבריריות
לבידוד בדיקות אנו משתמשים בירושת fixtures:
// BaseFixture.sol — общие зависимости
abstract contract BaseFixture is Test {
MockERC20 token;
MockChainlinkOracle oracle;
function setUp() public virtual {
token = new MockERC20("Test", "TST", 18);
oracle = new MockChainlinkOracle(2000e8); // $2000 price
}
}
// ProtocolFixture.sol — деплой тестируемого протокола
contract ProtocolFixture is BaseFixture {
Protocol protocol;
function setUp() public override {
super.setUp();
protocol = new Protocol(address(token), address(oracle));
}
}איננו משתמשים ב-# Форк Ethereum mainnet с конкретным блоком (воспроизводимость) anvil --fork-url $MAINNET_RPC --fork-block-number 19500000 # Форк с предопределёнными аккаунтами и балансами anvil --fork-url $MAINNET_RPC --accounts 10 --balance 10000 לתלויות ליבה — זה שביר ולא בודק ממשקים. אנו יוצרים חוזי mock מלאים עם מימוש מינימלי. גישה זו מפחיתה תוצאות חיוביות שגויות ב-30%.
התקנה שלב אחר שלב ו-CI/CD
הוראות מפורטות
- התקנת Foundry:
// BaseFixture.sol — общие зависимости abstract contract BaseFixture is Test { MockERC20 token; MockChainlinkOracle oracle; function setUp() public virtual { token = new MockERC20("Test", "TST", 18); oracle = new MockChainlinkOracle(2000e8); // $2000 price } } // ProtocolFixture.sol — деплой тестируемого протокола contract ProtocolFixture is BaseFixture { Protocol protocol; function setUp() public override { super.setUp(); protocol = new Protocol(address(token), address(oracle)); } }. - יצירת קובץ תצורה:
vm.mockCallוהגדרתcurl -L https://foundry.paradigm.xyz | bashלפרויקט שלכם. - הוספת Hardhat:
forge initויצירתfoundry.toml. - הפעלת צומת מקומי:
npm install --save-dev hardhatבטרמינל נפרד. - כתיבת הבדיקה הראשונה: השתמשו בתבנית ה-fixture שלמעלה.
- הגדרת CI: הוספת GitHub Actions workflow (ראו למטה).
CI/CD: אוטומציה ללא הפתעות
תצורת GitHub Actions עבור Foundry:
name: Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - name: Run unit tests run: forge test --match-path "test/unit/*" -vvv - name: Run integration tests run: forge test --match-path "test/integration/*" --fork-url ${{ secrets.MAINNET_RPC }} - name: Coverage check run: forge coverage --min-line-coverage 80 הפרידו בדיקות יחידה ואינטגרציה — בדיקות יחידה חייבות לעבוד ללא מפתחות RPC. בדיקות אינטגרציה רק ב-PR ל-main. זה מקצר את זמן המשוב ל-2 דקות.
Testnets והיקף העבודה
תמיכה מרובת רשתות
אנו מגדירים תצורה מרובת רשתות ב-Hardhat:
networks: {
sepolia: {
url: process.env.SEPOLIA_RPC,
accounts: [process.env.DEPLOYER_KEY],
chainId: 11155111,
},
polygon_amoy: {
url: process.env.AMOY_RPC,
accounts: [process.env.DEPLOYER_KEY],
chainId: 80002,
},
} | Testnet | Chain ID | Faucet | זמן בלוק |
|---|---|---|---|
| Sepolia | 11155111 | Alchemy / Chainlink | 12 שניות |
| Polygon Amoy | 80002 | Polygon הרשמי | 2 שניות |
| BNB Testnet | 97 | Binance Faucet | 3 שניות |
היקף ולוחות זמנים
מה כלול בהתקנה:
- תצורת Foundry ו-Hardhat (
hardhat.config.ts,anvil) - סט חוזי mock (ERC-20, Chainlink Oracle)
- היררכיית fixtures לפרוטוקול שלכם
- צומת EVM מקומי (Anvil) עם מצב fork
- CI pipeline (GitHub Actions) עם הפרדת בדיקות יחידה/אינטגרציה
- הגדרת Testnet (Sepolia, Polygon Amoy, BNB Chain testnet)
- תיעוד על הרצה והרחבה
- הדרכת צוות (1-2 שעות)
לוחות זמנים: התקנה בסיסית — יום עסקים אחד. עם mocks ו-fixtures מותאמים אישית — 1-2 ימים. לפרויקטים עם מספר רשתות (EVM + Solana) — 2-3 ימים. תוצאה: הפחתת זמן בדיקות עד 60%, זיהוי מוקדם של פרצות, CI יציב. חיסכון חודשי מגישה זו יכול להגיע ל-$10,000.
הזמנת הקמת סביבת בדיקות
צרו קשר — נערוך ביקורת חינם של התהליך הנוכחי שלכם ונציע תצורה לפרוטוקול שלכם. קבלו ייעוץ על אופטימיזציה של סביבת הבדיקות שלכם. אנו מבטיחים: לאחר ההתקנה, כל commit יעבור בדיקות ללא הפתעות. הזמינו התקנה היום — התחילו לבדוק בביטחון.







