WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署_hardhat 和 foundry
一、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: MITpragma 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 MyProjectcd MyProject
2. 编写部署脚本 script/Deploy.s.sol
// SPDX-License-Identifier: MITpragma 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_IDPRIVATE_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 或 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_keyINFURA_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 Sepoliaon: 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
setup-node
npm install
compile
deploy
8️⃣ 设置 GitHub Secrets
进入 GitHub 仓库:
-
进入
Settings > Secrets > Actions
-
添加以下两个 Secret:
PRIVATE_KEY
INFURA_PROJECT_ID
9️⃣ 执行部署流程
每次你推送到 main
分支,GitHub Actions 会自动执行部署流程,并将合约部署到 Sepolia。
✅ 总结
如果你希望部署前先执行测试、lint 或是多网络部署等功能,也可以轻松扩展 workflow 脚本。需要我帮你加上这些功能模板吗?
三、合约部署到以太坊主网或测试网(如 Sepolia)流程
1️⃣ 概念介绍
以太坊上的 合约部署流程 是将你编写的 Solidity 智能合约代码,通过编译、构建交易、签名并发送至区块链的步骤。开发者常用部署工具如:
-
Hardhat
-
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 -ynpm install --save-dev hardhat dotenv @nomiclabs/hardhat-ethers ethersnpx hardhat # 初始化 Hardhat 项目
4️⃣ 编写合约:contracts/MyToken.sol
// SPDX-License-Identifier: MITpragma 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️⃣ 主网部署前的安全检查建议:
require
权限控制🔚 总结
contracts/*.sol
.env
, hardhat.config.js
scripts/deploy.js
--network
指定目标网络如果你希望我扩展内容如多合约部署、多网络发布、部署后验证合约(Etherscan)、部署后存储合约地址到数据库,也可以继续帮你加上。需要吗?