ניפוי באגים ובדיקות Solidity: הגדרת Foundry, Hardhat, Anvil

בדיקת חוזים חכמים הופכת פעמים רבות לכאוס: בדיקות לא יציבות, שגיאות לא ברורות וחשש מהשקה. אנחנו מקימים סביבת בדיקות מקצועית על Foundry, Hardhat ו-Anvil, כך שתוכלו לפתח ולוודא חוזים בביטחון מלא. הצוות שלנו מטפל בכל המחזור—מהגדרת תצורה ועד Mocks ותמיכה—ומבטיח בדיקות אמינות וניתנות לשחזור, מוכנות לשימוש.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

בעיה: בדיקות נכשלות, אין ביטחון

תארו לעצמכם: אתם פורסים חוזה ל-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

הוראות מפורטות
  1. התקנת 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)); } } .
  2. יצירת קובץ תצורה: vm.mockCall והגדרת curl -L https://foundry.paradigm.xyz | bash לפרויקט שלכם.
  3. הוספת Hardhat: forge init ויצירת foundry.toml.
  4. הפעלת צומת מקומי: npm install --save-dev hardhat בטרמינל נפרד.
  5. כתיבת הבדיקה הראשונה: השתמשו בתבנית ה-fixture שלמעלה.
  6. הגדרת 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 יעבור בדיקות ללא הפתעות. הזמינו התקנה היום — התחילו לבדוק בביטחון.