פריסה חד-פעמית באמצעות 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, בודקים לוגים, ומבצעים ביקורות קוד. לאחר הפריסה, החוזים מאומתים אוטומטית. קבלו ייעוץ מהנדס — נדון בפרויקט שלכם ונציע פתרון.







