第6节:Script 部署
小白入门:https://github.com/dukedaily/solidity-expert ,欢迎star转发,文末加V入群。
职场进阶: https://dukeweb3.com
Foundry 的部署脚本用 Solidity 编写(而非 JS),通过 forge script 执行。同一门语言写测试和部署,心智负担小。
Hello Script
script/Deploy.s.sol:
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
contract DeployCounter is Script {
function run() external returns (Counter counter) {
uint256 pk = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(pk);
counter = new Counter();
counter.setNumber(42);
vm.stopBroadcast();
console.log("Counter deployed at:", address(counter));
}
}
关键点:vm.startBroadcast 到 vm.stopBroadcast 之间的所有状态变更会被打包成真实交易,广播到链上。
本地 dry-run
不带 --broadcast 时,脚本只在本地模拟,不发交易:
forge script script/Deploy.s.sol:DeployCounter --rpc-url $MAINNET_RPC
输出显示将要发的交易与 gas 估算。部署前先跑一遍 dry-run 是好习惯。
广播到链上
forge script script/Deploy.s.sol:DeployCounter \
--rpc-url $MAINNET_RPC \
--broadcast \
--verify \
--etherscan-api-key $ETHERSCAN_KEY
常用 flag:
--broadcast:真正发交易。--verify:部署后自动向 Etherscan 提交源码 verify。--etherscan-api-key:verify 需要。--slow:等待前一笔上链再发下一笔,避免 nonce 冲突。--gas-estimate-multiplier 120:gas 预估打 120% 余量。
私钥管理
生产环境别直接用环境变量明文。Foundry 支持加密 keystore:
cast wallet import deployer --interactive
# 输入私钥与密码,生成 ~/.foundry/keystores/deployer
使用:
forge script ... --account deployer
或硬件钱包(Ledger):
forge script ... --ledger
多合约 + 依赖编排
脚本里可以写任意 Solidity 逻辑:
function run() external {
vm.startBroadcast();
Token token = new Token("Foo", "FOO");
Vault vault = new Vault(address(token));
token.mint(address(vault), 1_000_000e18);
vm.stopBroadcast();
console.log("token:", address(token));
console.log("vault:", address(vault));
}
部署记录
广播结果保存在 broadcast/<ScriptName>.s.sol/<chainId>/run-latest.json,包含交易 hash、合约地址、日志。CI 和前端可直接读取。
小结
Script = "可执行的 Solidity"。整合 cheatcode + 广播控制 + verify,替代了 Hardhat 的 deploy.js。下一节收尾,介绍 cast / anvil / chisel 三件套。