Layer1部署教程
把合约发到测试网很容易,但发到主网公链就是另一回事——成本真实、影响真实、错误也很真实。本 Layer1部署教程 面向准备首次或多次主网部署的团队,结合 Binance 智能链与以太坊主网经验给出一份可照做的流程。
一、准备阶段
1. 合约定型
- 完成所有功能与单元测试;
- 完成至少一轮第三方审计;
- Slither、Mythril 等静态分析无高危告警;
- 关键路径有 fuzz 与 invariant 测试。
2. 部署账户
- 使用全新的部署私钥,与日常账户隔离;
- 助记词离线保管,部署完成后可销毁;
- 在 B安 智能链上充入约 0.3 BNB 用于部署 Gas;以太坊主网建议预留 0.5 ETH 以上。
3. 多签准备
如果合约具有 owner / admin 角色,建议在部署完成后立即把权限转交多签:
- 选择 Safe(前 Gnosis Safe)作为多签方案;
- 至少 3/5 或 2/3 的签名阈值;
- 提前完成多签创建与签名人测试。
二、编译与产物固化
- 锁定 Solidity 编译器版本(package.json 中精确到补丁号);
- 启用 via-IR + optimizer.runs 与生产一致;
- 把编译产物(abi、bytecode)打 tag 存入仓库;
- 在 CI 中复现编译,确保字节码哈希一致。
三、部署脚本
推荐使用 Foundry 脚本:
contract Deploy is Script {
function run() external {
vm.startBroadcast();
Counter c = new Counter();
vm.stopBroadcast();
console2.log('deployed:', address(c));
}
}
执行:
forge script script/Deploy.s.sol --rpc-url $RPC --private-key $KEY --broadcast --slow
--slow 模式逐笔等待确认,避免 nonce 错乱。
四、Gas 策略
部署一次合约的 Gas 通常在 1M–4M 之间,单价直接影响总费用。建议:
- 通过
eth_feeHistory取得最近 20 个区块的 baseFee; - maxFeePerGas 取 p80 + 20% 缓冲;
- maxPriorityFeePerGas 设置为 1–2 gwei;
- 在 BN 与 必安 智能链上 Gas 单价稳定,可以使用固定值。
五、源码验证
部署完成后立刻:
- Etherscan / BscScan 提交源码验证;
- 在 Sourcify 上传 metadata,便于第三方工具自动识别;
- 在 GitHub 仓库 release 中附上字节码哈希与部署交易哈希。
六、多链同地址
如果需要在以太坊主网与 B安 智能链拥有相同地址:
- 使用 Safe Singleton Factory 或自建 CREATE2 工厂;
- 选取相同的 init code 与 salt;
- 部署前用本地 keccak 预计算地址;
- 在两条链上逐一执行部署。
七、上线后验证
- 调用关键 view 函数,检查初始值;
- 通过多签做一次低风险交易,确认权限切换成功;
- 用 Tenderly / OpenZeppelin Defender 设置事件监控;
- 把部署 trace 与 Gas 报告归档到团队文档。
八、回滚预案
部署不是终点,意外可能随时出现:
- 若合约支持升级,备好新的 implementation 与回滚 calldata;
- 若不可升级,事先准备「迁移」方案,引导用户到新合约;
- 多签持有人保持联系,确保 24 小时内可被召集签名。
九、文档化
把本次部署涉及的版本号、Gas 数据、踩坑经验都沉淀到团队 wiki。下一次同样规模的部署,时间和成本都会显著下降。把这份 Layer1部署教程 当作模板,团队就拥有了可重复执行的上线工序。