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

一、Hardhat / Foundry 进行合约部署

概念介绍

  • HardhatFoundry 都是以太坊智能合约开发的工具套件,支持合约的编译、测试和部署。

  • 它们允许开发者在本地或测试网络快速开发智能合约,并部署到链上(测试网或主网)。

  • 部署过程通常包含以下步骤:

    1. 编译合约代码生成字节码和ABI。

    2. 连接到区块链网络(本地测试链或远程测试/主网)。

    3. 发送部署交易,等待确认。

    4. 获取部署后的合约地址,供后续交互使用。


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 进行合约部署


环境准备


示例代码

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

相关推荐
sheep88883 小时前
Web3与区块链深度融合:重塑互联网基础设施的2025革命
区块链
倔强青铜三4 小时前
为什么 self 与 super() 成了 Python 的永恒痛点?
人工智能·python·面试
刚入坑的新人编程5 小时前
暑期算法训练.9
数据结构·c++·算法·leetcode·面试·排序算法
YSGZJJ5 小时前
上证50指数分红和股指期货有什么关系?
区块链
Sui_Network6 小时前
探索 Sui 上 BTCfi 的各类资产
大数据·人工智能·科技·游戏·区块链
前端小巷子8 小时前
深入 npm 模块安装机制
前端·javascript·面试
软件工程小施同学8 小时前
计算机学报 2025年 区块链论文 录用汇总 附pdf下载
pdf·区块链
ZzMemory11 小时前
一文搞懂前端开发必备的导入导出方式
前端·面试·前端工程化
Alfred king11 小时前
面试150 IPO
面试·职场和发展·贪心·数组··排序
练习时长两年半的程序员小胡11 小时前
JVM 基础架构全解析:运行时数据区与核心组件
java·jvm·面试