📚 第十一章 | 智能合约主网部署与验证详解
------让你的合约真正上线、公开、透明!
✅ 本章导读
前面我们写了各种合约,ERC20、NFT、DAO......
但只在本地测试或测试网上部署运行,项目还没"上链"!
主网上线部署,是任何区块链项目走向用户的关键一步。
写代码只是 50%,剩下的 50% 是部署和验证。
合约要上主网,必须:
- 正确部署
- 代码公开验证
- 保证合约安全
- 优化 Gas,降低使用成本
这一章,从测试网到主网部署、Etherscan 验证,全面讲解每个细节,确保你的项目"看得懂、能用、能信任"。
✅ 本章你将掌握
- 主网部署前的准备
- 测试网部署(Goerli / Sepolia)
- 主网部署(Ethereum / Polygon / BNB Chain)
- Etherscan 合约验证
- Gas 优化部署策略
- 部署自动化脚本(Hardhat + Alchemy/Infura)
- 多链部署 & 升级合约策略
- Dune Analytics 数据展示
- 完整实战案例演示
1️⃣ 主网部署前的准备工作
✅ 主网部署 ≠ 测试网部署
- 主网部署 = 真金白银!每笔操作都要付 Gas
- 部署合约前必须反复检查:
- 合约已完成单元测试
- 权限管理没有漏洞
- 参数正确(代币总量、初始 owner、分红比例等)
- 依赖合约地址已确认(预言机地址、NFT 链接等)
✅ 环境准备
工具 | 说明 |
---|---|
Hardhat | 部署、编译、测试工具 |
Node.js | v16.x 以上,运行 Hardhat |
Alchemy/Infura | 远程节点提供 RPC,连接主网 |
钱包 | MetaMask,签名部署交易 |
Etherscan API | 合约代码验证 |
✅ 确保你有:
- MetaMask 主网钱包(准备 ETH/MATIC/BNB 等 Gas)
- Alchemy / Infura 项目密钥
- Etherscan API 密钥(代码验证用)
2️⃣ 测试网部署实战(Goerli / Sepolia)
🔨 创建 Hardhat 项目
mkdir my-dapp
cd my-dapp
npm init -y
npm install --save-dev hardhat
npx hardhat
选择 Create a basic sample project
安装依赖
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-etherscan dotenv
🛠️ 配置 Hardhat(hardhat.config.js)
require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-etherscan");
require("dotenv").config();
module.exports = {
solidity: "0.8.19",
networks: {
goerli: {
url: process.env.GOERLI_RPC,
accounts: [process.env.PRIVATE_KEY],
},
sepolia: {
url: process.env.SEPOLIA_RPC,
accounts: [process.env.PRIVATE_KEY],
}
},
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY,
}
};
✅ 配置环境变量 .env
GOERLI_RPC=https://eth-goerli.g.alchemy.com/v2/xxxx
SEPOLIA_RPC=https://eth-sepolia.g.alchemy.com/v2/xxxx
PRIVATE_KEY=你的部署钱包私钥
ETHERSCAN_API_KEY=你的 Etherscan API 密钥
❗ 私钥不要上传 GitHub!
📝 编写部署脚本
文件路径 scripts/deploy.js
async function main() {
const [deployer] = await ethers.getSigners();
console.log("部署账户:", deployer.address);
console.log("账户余额:", (await deployer.getBalance()).toString());
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy();
await token.deployed();
console.log("合约地址:", token.address);
}
main()
.then(() => process.exit(0))
.catch((error) => { console.error(error); process.exit(1); });
🚀 部署命令
npx hardhat run scripts/deploy.js --network goerli
3️⃣ 主网部署实战(Ethereum / Polygon / BNB Chain)
✅ 主网 RPC 配置
networks: {
mainnet: {
url: process.env.MAINNET_RPC,
accounts: [process.env.PRIVATE_KEY],
},
polygon: {
url: process.env.POLYGON_RPC,
accounts: [process.env.PRIVATE_KEY],
},
bsc: {
url: process.env.BSC_RPC,
accounts: [process.env.PRIVATE_KEY],
}
}
✅ 主网环境
MAINNET_RPC=https://eth-mainnet.g.alchemy.com/v2/xxxx
POLYGON_RPC=https://polygon-rpc.com
BSC_RPC=https://bsc-dataseed.binance.org/
✅ 主网部署
npx hardhat run scripts/deploy.js --network mainnet
❗ 主网部署前请三思,部署后合约代码无法修改(非代理合约)
建议部署到测试网 Goerli / Sepolia / Mumbai 反复测试
4️⃣ Etherscan 合约验证(透明合约=信任)
✅ 为什么要验证合约?
- 增加透明度,用户信任
- 合约代码 + 编译信息一目了然
- Etherscan 界面可直接调用合约函数
✅ 验证命令
npx hardhat verify --network goerli 合约地址 参数1 参数2
示例
npx hardhat verify --network goerli 0xAbC123... "MyToken" "MTK" 1000000
✅ 验证失败常见问题
- 编译版本不一致 → 确认 Hardhat 配置和 Remix 编译版本相同
- 构造函数参数错误 → 参数顺序和格式完全一致
- 已经优化编译 → 验证时打开优化选项
- 私钥/ApiKey 配置错误 → 确认
.env
内容
5️⃣ Gas 优化部署策略
优化项 | 说明 |
---|---|
编译优化 | Hardhat 编译打开优化选项 |
immutable |
部署时初始化,减少状态读写 |
constant |
编译时写死变量,省 Gas |
事件精简 | 只使用必要 indexed 参数 |
最小代理 | Clone 工厂批量部署子合约 |
✅ 编译优化
solidity: {
version: "0.8.19",
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
}
6️⃣ 多链部署与升级策略
✅ 主流公链部署
公链 | RPC 地址 |
---|---|
Ethereum | Alchemy / Infura |
Polygon | polygon-rpc.com |
BNB Chain | bsc-dataseed.binance.org |
Arbitrum | arbitrum-rpc.com |
zkSync Era | zksync2-mainnet.zksync.io |
✅ 升级合约推荐 UUPS
- 逻辑合约可升级
- 存储合约地址固定
- 结合 AccessControl 角色管理升级权限
7️⃣ Dune Analytics 数据集成
✅ 为什么要上 Dune?
- 免费的数据看板
- 自动抓取链上数据(合约调用、余额、交易等)
- 便于展示项目信息和透明度
- 用户无需技术背景即可查看数据
✅ 数据展示案例
- Token 分布图
- NFT 持有者排名
- DAO 投票统计
- 资金流向图表
🚀 推荐用 Dune 公开展示社区透明数据
8️⃣ 完整实战案例:ERC20 合约部署 + 验证 + Dune 展示
✅ 1. 部署 ERC20 合约
部署 MyToken
,符号 MTK
,总量 1000000
npx hardhat run scripts/deploy.js --network goerli
✅ 2. 验证 Etherscan
npx hardhat verify --network goerli 0xAbC123... "MyToken" "MTK" 1000000
✅ 3. 创建 Dune 看板
- 查询合约地址下
Transfer
事件 - 分析 Token 分发
- 绘制 Token Holder 分布图
- 嵌入项目官网展示透明数据
✅ 小结
这一章完成了智能合约的完整主网部署流程:
✔️ 环境配置 + 硬件钱包保护私钥
✔️ 测试网反复测试
✔️ 主网安全部署
✔️ Etherscan 验证透明
✔️ Dune Analytics 数据展示
✔️ 多链部署 + 升级合约实战
🎯 课后挑战
- 部署 ERC20 + NFT 合约到 Sepolia / Polygon
- 验证合约代码并启用 Etherscan 界面交互
- 搭建 Dune 看板展示合约使用情况
- 写一篇完整的《合约上线全流程复盘》分享
✅ 下一章预告|第十二章
👉 Solidity 智能合约前后端集成实战
🚀 Ethers.js + React 前端交互
🚀 MetaMask 钱包集成登录/签名
🚀 DApp 完整项目开发
🚀 钱包授权 / 链上调用 / 交易签名流程
🛠️ 完整项目代码上传 GitHub,评论区见!
下一章继续冲第十二章!🔥
要直接做前后端集成 or DApp 快速开发?随时安排!
确认下第十一章!
需要补充 Layer2 主网部署(Arbitrum、zkSync)或批量发币工厂项目实战?
你拍板,我们继续!🔥