פיתוח סקריפטים לפריסת חוזים חכמים (Turnkey)

הטמעות חוזה חכם חד-פעמיות דרך קונסול או פרמטרים מקודדים הופכות לחוב טכני: חזרה על רצף הקריאות חודש לאחר מכן או ברשת חדשה היא הגרלה. אנחנו בונים סקריפטים מקצועיים להטמעה (deployment) במפתח מלא, תוך אוטומציה של כל התהליך מפרמטריזציה ועד וריפיקציה. הצוות שלנו מטפל במחזור המלא, מאודיט ועד תמיכה מתמשכת, ומבטיח שחזוריות ואמינות ללא החמצת מועדים.

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

שאלות נפוצות

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

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

פריסה חד-פעמית באמצעות forge create או npx hardhat deploy עם פרמטרים מקודדים היא חוב טכני. כשצריך לפרוס ל-5 רשתות, ואז לשחזר על testnet עבור מבקרים, ואז לחזור על זה 3 חודשים אחר כך לגרסה חדשה — מסתבר שאף אחד לא זוכר את סדר הקריאות המדויק, אילו חוזים דורשים אתחול לאחר הפריסה, או באיזה בלוק אומת התהליך. לאחרונה, צוות פרוטוקול פנה אלינו: אחרי שהמפתח שלהם עזב, אף אחד לא יכול היה לשחזר את פריסת ה-mainnet. כתבנו סקריפט ביום אחד, ועכשיו הפריסה אורכת 5 דקות. אנו מתמחים ביצירת סקריפטים מקצועיים לפריסה: מהפרמטריזציה ועד אינטגרציית CI/CD. הניסיון שלנו: 5+ שנים ב-Web3, מעל 50 פרויקטים מוצלחים. צרו קשר לייעוץ או קבלו הערכת עלות אישית לפרויקט.

אילו בעיות פותרים סקריפטים לפריסה?

פריסה ידנית באמצעות .s.sol או קונסולת Hardhat מובילה למספר בעיות אופייניות:

  • חוסר שחזוריות: לחזור על סדר הקריאות המדויק חודש אחר כך זה הגרלה.
  • שגיאות אתחול: שכחתם לקרוא ל-// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {Script, console} from "forge-std/Script.sol"; import {MyProtocol} from "../src/MyProtocol.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract DeployMyProtocol is Script { function run() external { uint256 deployerKey = vm.envUint("PRIVATE_KEY"); address deployer = vm.addr(deployerKey); vm.startBroadcast(deployerKey); ProxyAdmin admin = new ProxyAdmin(deployer); MyProtocol implementation = new MyProtocol(); bytes memory initData = abi.encodeCall( MyProtocol.initialize, (vm.envAddress("TREASURY"), vm.envUint("FEE_BPS")) ); TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( address(implementation), address(admin), initData ); console.log("ProxyAdmin:", address(admin)); console.log("Implementation:", address(implementation)); console.log("Proxy:", address(proxy)); vm.stopBroadcast(); } } אחרי proxy — החוזה לא פונקציונלי.
  • כתובות שאבדו: אף אחד לא תיעד היכן מאוחסנים ה-proxy או ה-admin.
  • מעבר איטי בין רשתות: פריסה ידנית ל-5 רשתות מבזבזת 80% מהזמן.

סקריפטים פותרים את אלה: ריצה אחת, לוג מלא, אימות אוטומטי.

למה Forge Script הוא התקן התעשייתי?

Foundry Script (forge script script/DeployMyProtocol.s.sol --rpc-url $RPC --broadcast --verify) הוא קובץ Solidity שמור� כסקריפט פריסה. יתרון מרכזי: שפה אחת לחוזים ולפריסה, בדיקת טיפוסים על ידי המהדר, ויכולת לבדוק את הסקריפט עצמו. תיעוד Foundry מדגיש שזה מפחית משמעותית שגיאות בהשוואה לסקריפטים ב-JS.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {Script, console} from "forge-std/Script.sol";
import {MyProtocol} from "../src/MyProtocol.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";

contract DeployMyProtocol is Script {
    function run() external {
        uint256 deployerKey = vm.envUint("PRIVATE_KEY");
        address deployer = vm.addr(deployerKey);

        vm.startBroadcast(deployerKey);

        ProxyAdmin admin = new ProxyAdmin(deployer);
        MyProtocol implementation = new MyProtocol();

        bytes memory initData = abi.encodeCall(
            MyProtocol.initialize,
            (vm.envAddress("TREASURY"), vm.envUint("FEE_BPS"))
        );

        TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(
            address(implementation),
            address(admin),
            initData
        );

        console.log("ProxyAdmin:", address(admin));
        console.log("Implementation:", address(implementation));
        console.log("Proxy:", address(proxy));

        vm.stopBroadcast();
    }
}

ריצה: --verify. הדגל --slow מאמת אוטומטית את כל החוזים שנפרסו דרך Etherscan API. address treasury = vm.envAddress("TREASURY"); uint256 fee = vm.envUint("FEE_BPS"); bool isMainnet = vm.envBool("IS_MAINNET"); מוסיף עיכוב בין עסקאות — נדרש עבור ספקי RPC עם מגבלות קצב.

איך פרמטריזציה מבטלת שגיאות?

אין כתובות מקודדות בסקריפט. הכל דרך משתני סביבה:

address treasury = vm.envAddress("TREASURY");
uint256 fee = vm.envUint("FEE_BPS");
bool isMainnet = vm.envBool("IS_MAINNET");

עבור סביבות שונות: קבצי .env.sepolia, .env.mainnet, .env.polygon. סקריפט הפריסה זהה. זה חוסך עד 40% מזמן הכנת הפריסה.

תיעוד כתובות חוזים שנפרסו

לאחר הפריסה, יש לתעד את הכתובות. גישות:

קובץ JSON דרך הדגל --json של Foundry. forge script ... --json > deployments/sepolia.json — פלט מובנה עם כתובות, hashes של עסקאות, ומספרי בלוקים.

לוג מותאם אישית בסקריפט דרך vm.writeJson() ו-vm.writeFile():

string memory json = vm.serializeAddress("deployment", "proxy", address(proxy));
vm.writeJson(json, string.concat("deployments/", vm.toString(block.chainid), ".json"));

קבצי הפריסה נשמרים ב-repository — הם משמשים כמקור האמת עבור ה-frontend, אנליטיקה, וסקריפטי שדרוג עתידיים.

סקריפטי שדרוג ופריסה מרובת רשתות

עבור תבניות UUPS ו-Transparent Proxy, סקריפט נפרד לכל שדרוג:

contract UpgradeV2 is Script {
    function run() external {
        address proxy = vm.envAddress("PROXY_ADDRESS");
        address admin = vm.envAddress("PROXY_ADMIN");
        vm.startBroadcast(vm.envUint("PRIVATE_KEY"));
        MyProtocolV2 newImpl = new MyProtocolV2();
        ProxyAdmin(admin).upgradeAndCall(
            ITransparentUpgradeableProxy(proxy),
            address(newImpl),
            ""
        );
        vm.stopBroadcast();
    }
}

כל סקריפט שדרוג נקרא עם גרסה (string memory json = vm.serializeAddress("deployment", "proxy", address(proxy)); vm.writeJson(json, string.concat("deployments/", vm.toString(block.chainid), ".json")); ) ונשמר בהיסטוריית ה-repository.

פריסה מרובת רשתות: הסקריפט מורץ ברצף עבור כל רשת:

forge script script/Deploy.s.sol --rpc-url $ETHEREUM_RPC --broadcast --verify
forge script script/Deploy.s.sol --rpc-url $POLYGON_RPC --broadcast --verify --verifier-url $POLYGONSCAN_API
forge script script/Deploy.s.sol --rpc-url $ARBITRUM_RPC --broadcast --verify

או דרך Makefile/סקריפט shell שעובר על מערך של נקודות קצה RPC. הסקריפטים שלנו מפחיתים את זמן הפריסה ב-80% בהשוואה לגישה ידנית.

מה כלול בעבודה שלנו?

  • פיתוח סקריפט פריסה בסיסי עם פרמטריזציה (env).
  • הגדרת אימות אוטומטי דרך Etherscan API.
  • תיעוד כל הכתובות וה-artifacts ב-JSON.
  • יצירת סקריפטי שדרוג עבור UUPS/Transparent Proxy.
  • תמיכה מרובת רשתות (Ethereum, Polygon, Arbitrum, BNB Chain וכו').
  • אינטגרציה עם CI/CD (GitHub Actions, GitLab CI).
  • תיעוד והדרכה לצוות שלכם.
  • אחריות לפריסה תקינה על testnet לפני mainnet.

לוחות זמנים ועלות

כתיבת סקריפט פריסה בסיסי עם פרמטריזציה ותיעוד: יום אחד. תשתית פריסה מלאה עם סקריפטי שדרוג, תמיכה מרובת רשתות, ואינטגרציית CI: 2-3 ימים. העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלכם. לקוחות חוסכים עד 70% מזמן הפריסה, מה שמתורגם לשכר מהנדס, חיסכון של עשרות אלפי דולרים בשנה. נבחן את הפרויקט שלכם בחינם — צרו קשר.

השוואה: פריסה ידנית מול סקריפטים

קריטריון פריסה ידנית סקריפטי פריסה (שלנו)
זמן לרשת אחת 30-60 דקות 2-5 דקות
אימות ידני דרך Etherscan אוטומטי
שחזוריות נמוכה 100%
שגיאות אתחול שכיחות מבוטלות על ידי בדיקות
מרובת רשתות ימים שעה אחת

איך אנו מבטיחים תקינות?

אנו כותבים בדיקות לסקריפטי פריסה (למשל, דרך Foundry), מדמים עסקאות ב-Tenderly, בודקים לוגים, ומבצעים ביקורות קוד. לאחר הפריסה, החוזים מאומתים אוטומטית. קבלו ייעוץ מהנדס — נדון בפרויקט שלכם ונציע פתרון.