欢迎光临
我们一直在努力

WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署

一、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 智能合约代码,通过编译、构建交易、签名并发送至区块链的步骤。开发者常用部署工具如:

  • 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 -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)、部署后存储合约地址到数据库,也可以继续帮你加上。需要吗?

赞(0)
未经允许不得转载:171主机测评 » WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址