一、Hardhat / Foundry 进行合约部署
概念介绍
Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件,支持合约的编译、测试和部署。
它们允许开发者在本地或测试网络快速开发智能合约,并部署到链上(测试网或主网)。
部署过程通常包含以下步骤:
编译合约代码生成字节码和ABI。
连接到区块链网络(本地测试链或远程测试/主网)。
发送部署交易,等待确认。
获取部署后的合约地址,供后续交互使用。
1️⃣ 使用 Hardhat 进行合约部署
环境准备
Node.js 环境
已安装 Hardhat(
npm install --save-dev hardhat
)
示例代码
1. 初始化 Hardhat 项目
npx hardhat
# 选择 "Create a basic sample project"
# 生成项目结构
2. 编写合约 contracts/Greeter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Greeter {
string private greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function greet() public view returns (string memory) {
return greeting;
}
}
3. 编写部署脚本 scripts/deploy.js
async function main() {
// 获取合约工厂(编译后的合约接口)
const Greeter = await ethers.getContractFactory("Greeter");
// 部署合约并传入构造函数参数
const greeter = await Greeter.deploy("Hello, Hardhat!");
// 等待合约部署交易被确认
await greeter.deployed();
console.log("Greeter deployed to:", greeter.address);
}
// 捕获异步错误
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
4. 配置网络 hardhat.config.js
require("@nomiclabs/hardhat-ethers");
module.exports = {
solidity: "0.8.17",
networks: {
sepolia: { // 以太坊测试网之一
url: "https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID",
accounts: ["YOUR_PRIVATE_KEY"] // 部署用账户私钥
}
}
};
5. 部署合约
npx hardhat run scripts/deploy.js --network sepolia
详细讲解
ethers.getContractFactory
从编译结果生成部署工厂。Greeter.deploy()
发起部署交易,参数是构造函数的入参。deployed()
确认部署完成,返回合约实例。hardhat.config.js
配置网络,设置 RPC 地址和私钥,实现远程部署。使用 Infura 作为 RPC 提供者,私钥不能泄露,需环境变量管理。
2️⃣ 使用 Foundry 进行合约部署
环境准备
安装 Foundry:https://book.getfoundry.sh/getting-started/installation
forge
是 Foundry 的 CLI,支持编译、测试、部署。
示例代码
1. 创建项目并编写合约
forge init MyProject
cd MyProject
2. 编写部署脚本 script/Deploy.s.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "forge-std/Script.sol";
import "../src/Greeter.sol";
contract DeployScript is Script {
function run() external {
// 启动广播交易(用私钥签名)
vm.startBroadcast();
// 部署合约
Greeter greeter = new Greeter("Hello, Foundry!");
// 停止广播
vm.stopBroadcast();
// 打印合约地址
console.log("Greeter deployed at:", address(greeter));
}
}
3. 配置 .env
私钥和 RPC
RPC_URL=https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID
PRIVATE_KEY=你的私钥
4. 配置 foundry.toml
[rpc_endpoints]
sepolia = "${RPC_URL}"
[profile.default]
sender = "${PRIVATE_KEY}"
5. 编译合约
forge build
6. 部署合约
forge script script/Deploy.s.sol:DeployScript --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast
详细讲解
vm.startBroadcast()
开始签名和发送交易。通过
new
关键字直接部署合约,语法简洁。Foundry 使用环境变量配置 RPC 和私钥,方便安全管理。
forge script
支持本地或远程链部署。部署过程自动打印合约地址,方便后续调用。
总结
工具 | 特点 | 适用场景 |
---|---|---|
Hardhat | 丰富插件体系,JS/TS 脚本灵活 | 复杂 DApp,前后端联动 |
Foundry | Rust 实现,编译和部署快速,Solidity 脚本 | 轻量、快速原生合约开发部署 |
如果你想,我可以帮你写完整 Hardhat 或 Foundry 部署脚本模板,或帮你配置环境!
二、CI/CD 自动化部署
1️⃣ 概念介绍
CI/CD 是 DevOps 实践中不可或缺的一部分:
CI(持续集成,Continuous Integration):开发人员频繁地将代码合并到主分支,并通过自动构建和测试保证质量。
CD(持续交付 / 部署,Continuous Delivery / Deployment):
持续交付:代码自动构建、测试并准备好部署。
持续部署:代码变更一旦通过测试就会自动部署到生产环境。
CI/CD 的目标是实现「高频率、小批量、安全」地发布应用和智能合约,最大化交付效率和稳定性。
2️⃣ 示例场景(使用 GitHub Actions)
我们以部署一个 Solidity 智能合约项目为例,使用:
Hardhat 构建部署逻辑
GitHub Actions 实现 CI/CD 流程
自动部署到 Sepolia 测试网
3️⃣ 项目结构(假设为 Hardhat 项目)
├── contracts/
│ └── Greeter.sol
├── scripts/
│ └── deploy.js
├── .github/
│ └── workflows/
│ └── deploy.yml 👈 CI/CD配置文件
├── .env 👈 私钥和Infura项目ID
├── hardhat.config.js
4️⃣ 配置 .env
文件(用于 secrets)
PRIVATE_KEY=0xabc...your_private_key
INFURA_PROJECT_ID=your_project_id
5️⃣ 配置 hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
module.exports = {
solidity: "0.8.17",
networks: {
sepolia: {
url: `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
accounts: [process.env.PRIVATE_KEY]
}
}
};
6️⃣ 部署脚本 scripts/deploy.js
async function main() {
const Greeter = await ethers.getContractFactory("Greeter");
const greeter = await Greeter.deploy("Hello CI/CD!");
await greeter.deployed();
console.log("Greeter deployed to:", greeter.address);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
7️⃣ 配置 GitHub Actions:
配置 GitHub Actions:.github/workflows/deploy.yml
name: Deploy to Sepolia
on:
push:
branches:
- main # 仅 main 分支触发部署
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Compile contracts
run: npx hardhat compile
- name: Deploy contracts
env:
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
INFURA_PROJECT_ID: ${{ secrets.INFURA_PROJECT_ID }}
run: npx hardhat run scripts/deploy.js --network sepolia
💡 关键说明:
步骤 | 说明 |
---|---|
actions/checkout |
拉取你提交的代码到 GitHub Runner |
setup-node |
配置 Node.js 运行环境 |
npm install |
安装 Hardhat 和依赖包 |
compile |
编译 Solidity 合约 |
deploy |
运行部署脚本并连接到 Sepolia |
8️⃣ 设置 GitHub Secrets
进入 GitHub 仓库:
进入
Settings > Secrets > Actions
添加以下两个 Secret:
名称 | 内容 |
---|---|
PRIVATE_KEY |
MetaMask 部署账号私钥(不含 0x) |
INFURA_PROJECT_ID |
Infura 项目的 ID |
9️⃣ 执行部署流程
每次你推送到 main
分支,GitHub Actions 会自动执行部署流程,并将合约部署到 Sepolia。
✅ 总结
优点 | 描述 |
---|---|
自动化流程 | 不再手动执行构建、测试、部署操作 |
提升部署安全性与一致性 | 脚本标准化部署,减少人为误差 |
多人协作与可追踪性 | 每次部署都有记录、版本控制与回滚能力 |
如果你希望部署前先执行测试、lint 或是多网络部署等功能,也可以轻松扩展 workflow 脚本。需要我帮你加上这些功能模板吗?
三、合约部署到以太坊主网或测试网(如 Sepolia)流程
1️⃣ 概念介绍
以太坊上的 合约部署流程 是将你编写的 Solidity 智能合约代码,通过编译、构建交易、签名并发送至区块链的步骤。开发者常用部署工具如:
Foundry
Remix IDE(适合初学者)
部署目标网络通常包括:
测试网(如 Sepolia、Goerli)👉 用于调试和验证部署效果
主网(Mainnet)👉 实际上线环境,需要支付真实 ETH 作为 gas
为了确保部署安全与效率,推荐使用 Hardhat + Infura + 私钥签名 的方式进行自动化部署。
2️⃣ 项目结构示意
my-contract-project/
├── contracts/
│ └── MyToken.sol # 智能合约
├── scripts/
│ └── deploy.js # 部署脚本
├── hardhat.config.js # 配置文件
├── .env # 环境变量(私钥等)
├── package.json
└── README.md
3️⃣ 安装依赖
npm init -y
npm install --save-dev hardhat dotenv @nomiclabs/hardhat-ethers ethers
npx hardhat # 初始化 Hardhat 项目
4️⃣ 编写合约:contracts/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract MyToken {
string public name = "MyToken";
string public symbol = "MTK";
uint256 public totalSupply = 1000000;
address public owner;
mapping(address => uint256) public balanceOf;
constructor() {
owner = msg.sender;
balanceOf[owner] = totalSupply;
}
}
5️⃣ 编写部署脚本:scripts/deploy.js
const hre = require("hardhat");
async function main() {
// 获取部署账户
const [deployer] = await hre.ethers.getSigners();
console.log("部署使用账户:", deployer.address);
// 获取合约工厂对象
const Token = await hre.ethers.getContractFactory("MyToken");
// 部署合约(可传构造函数参数)
const token = await Token.deploy();
// 等待链上确认
await token.deployed();
console.log("合约部署地址:", token.address);
}
main()
.then(() => process.exit(0))
.catch((err) => {
console.error(err);
process.exit(1);
});
6️⃣ 配置 .env
文件(用于保存私密信息)
PRIVATE_KEY=你的私钥(以0x开头)
INFURA_API_KEY=你的 Infura 项目 ID
7️⃣ 修改 hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
const { PRIVATE_KEY, INFURA_API_KEY } = process.env;
module.exports = {
solidity: "0.8.18",
networks: {
sepolia: {
url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`,
accounts: [PRIVATE_KEY]
},
mainnet: {
url: `https://mainnet.infura.io/v3/${INFURA_API_KEY}`,
accounts: [PRIVATE_KEY]
}
}
};
8️⃣ 部署命令
🚀 Sepolia 测试网部署
npx hardhat run scripts/deploy.js --network sepolia
🚨 Mainnet 主网部署(务必确认安全性和 gas)
npx hardhat run scripts/deploy.js --network mainnet
9️⃣ 主网部署前的安全检查建议:
安全项 | 建议说明 |
---|---|
✅ 合约代码审计 | 最好使用静态分析工具(如 Slither)和测试覆盖率 |
✅ 部署地址 ETH 充足 | 主网部署手续费高,建议准备 0.01 ETH+ |
✅ 使用硬件钱包部署 | MetaMask 或 Ledger 签名更安全 |
✅ 设置 require 权限控制 |
避免合约被恶意调用 |
✅ 启用多签治理机制 | 对于有权限控制的合约,避免单人完全控制 |
🔚 总结
阶段 | 工具/文件 | 说明 |
---|---|---|
编写合约 | contracts/*.sol |
用 Solidity 编写业务逻辑 |
配置部署环境 | .env , hardhat.config.js |
加入私钥、网络、API 密钥等 |
部署脚本 | scripts/deploy.js |
使用 ethers.js 部署逻辑 |
执行部署 | CLI 命令 | 使用 --network 指定目标网络 |
主网注意事项 | 钱包安全、合约审计等 | 防止资金损失和漏洞 |
如果你希望我扩展内容如多合约部署、多网络发布、部署后验证合约(Etherscan)、部署后存储合约地址到数据库,也可以继续帮你加上。需要吗?