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 Sepoliaon:push:branches:- main # 仅 main 分支触发部署jobs:deploy:runs-on: ubuntu-lateststeps:- name: Checkout repositoryuses: actions/checkout@v3- name: Setup Node.jsuses: actions/setup-node@v3with:node-version: 18- name: Install dependenciesrun: npm install- name: Compile contractsrun: npx hardhat compile- name: Deploy contractsenv: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)、部署后存储合约地址到数据库,也可以继续帮你加上。需要吗?
相关文章:
WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署
一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件,支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约,并部署到链上(测试网或主网)。 部署过程…...

【动态规划】B4336 [中山市赛 2023] 永别|普及+
B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦,梦里有一个字符串,这个字符串无论正着读还是倒着读都是一样的,例如: a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么,只记得…...

可下载旧版app屏蔽更新的app市场
软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…...

claude3.7高阶玩法,生成系统架构图,国内直接使用
文章目录 零、前言一、操作指南操作指导 二、提示词模板三、实战图书管理系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 在线考试系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 四、感受 零、前言 现在很多AI大模型可以…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...

2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...
DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...

AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...
codeforces C. Cool Partition
目录 题目简述: 思路: 总代码: https://codeforces.com/contest/2117/problem/C 题目简述: 给定一个整数数组,现要求你对数组进行分割,但需满足条件:前一个子数组中的值必须在后一个子数组中…...
TMC2226超静音步进电机驱动控制模块
目前已经使用TMC2226量产超过20K,发现在静音方面做的还是很不错。 一、TMC2226管脚定义说明 二、原理图及下载地址 一、TMC2226管脚定义说明 引脚编号类型功能OB11电机线圈 B 输出 1BRB2线圈 B 的检测电阻连接端。将检测电阻靠近该引脚连接到地。使用内部检测电阻时,将此引…...

docker容器互联
1.docker可以通过网路访问 2.docker允许映射容器内应用的服务端口到本地宿主主机 3.互联机制实现多个容器间通过容器名来快速访问 一 、端口映射实现容器访问 1.从外部访问容器应用 我们先把之前的删掉吧(如果不删的话,容器就提不起来,因…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗
加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...

Modbus转Ethernet IP深度解析:磨粉设备效率跃升的底层技术密码
在建材矿粉磨系统中,开疆智能Modbus转Ethernet IP网关KJ-EIP-101的应用案例是一个重要的技术革新。这个转换过程涉及到两种主要的通信协议:Modbus和Ethernet IP。Modbus是一种串行通信协议,广泛应用于工业控制系统中。它简单、易于部署和维护…...
Python打卡训练营学习记录Day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
八、【ESP32开发全栈指南:UDP客户端】
1. 环境准备 安装ESP-IDF v4.4 (官方指南)确保Python 3.7 和Git已安装 2. 创建项目 idf.py create-project udp_client cd udp_client3. 完整优化代码 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…...

在MobaXterm 打开图形工具firefox
目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前(YUM) sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...

旋量理论:刚体运动的几何描述与机器人应用
旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比,旋量理论通过螺旋运动的概念统一了旋转和平移,在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观,而且计算…...
SE(Secure Element)加密芯片与MCU协同工作的典型流程
以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置 SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...

运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...

Redis专题-实战篇一-基于Session和Redis实现登录业务
GitHub项目地址:https://github.com/whltaoin/redisLearningProject_hm-dianping 基于Session实现登录业务功能提交版本码:e34399f 基于Redis实现登录业务提交版本码:60bf740 一、导入黑马点评后端项目 项目架构图 1. 前期阶段2. 后续阶段导…...

【前端实战】如何让用户回到上次阅读的位置?
目录 【前端实战】如何让用户回到上次阅读的位置? 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法:监听滚动,记录 scrollTop(不推荐) 2、Intersection Observer 插入探针元素 3、基…...

dvwa11——XSS(Reflected)
LOW 分析源码:无过滤 和上一关一样,这一关在输入框内输入,成功回显 <script>alert(relee);</script> MEDIUM 分析源码,是把<script>替换成了空格,但没有禁用大写 改大写即可,注意函数…...
关于疲劳分析的各种方法
疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数,可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础,采用雨流法取出一个个相互独立、互不相关的应力循环&…...
数据库优化实战指南:提升性能的黄金法则
在现代软件系统中,数据库性能直接影响应用的响应速度和用户体验。面对数据量激增、访问压力增大,数据库性能瓶颈经常成为项目痛点。如何科学有效地优化数据库,提升查询效率和系统稳定性,是每位开发与运维人员必备的技能。 本文结…...

【Axure高保真原型】图片列表添加和删除图片
今天和大家分享图片列表添加和删除图片的原型模板,效果包括: 点击图片列表的加号可以显示图片选择器,选择里面的图片; 选择图片后点击添加按钮,可以将该图片添加到图片列表; 鼠标移入图片列表的图片&…...

XXE漏洞知识
目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例:文件读取(需要Apache >5.4版本) 案例:内网探测(鸡肋) 案例:执行命…...

mq安装新版-3.13.7的安装
一、下载包,上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量,直接就安装了。 erl…...
第21节 Node.js 多进程
Node.js本身是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。 每个子进程总是带有三个流对象:child.stdin, child.stdout和child.stderr。他们可能会共享…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...

华硕电脑,全新的超频方式,无需进入BIOS
想要追求更佳性能释放 或探索更多可玩性的小伙伴, 可能会需要为你的电脑超频。 但我们常用的不论是BIOS里的超频, 还是Armoury Crate奥创智控中心超频, 每次调节都要重启,有点麻烦。 TurboV Core 全新的超频方案来了 4不规…...