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


环境准备

  • 安装 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,前后端联动
FoundryRust 实现,编译和部署快速,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_KEYMetaMask 部署账号私钥(不含 0x)
INFURA_PROJECT_IDInfura 项目的 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)、部署后存储合约地址到数据库,也可以继续帮你加上。需要吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【题解-洛谷】B4292 [蓝桥杯青少年组省赛 2022] 路线

题目:B4292 [蓝桥杯青少年组省赛 2022] 路线 题目描述 有一个旅游景区,景区中有 N N N 个景点,景点以数字 1 1 1 到 N N N 编号,其中编号为 N N N 的景点为游客服务中心所在地。景区中有 M M M 条连接路线,每条…

MySQL体系架构解析(四):MySQL数据存储的揭秘

MySQL中的数据目录 确定MySQL的数据目录 到底MySQL把数据都存到哪个路径下呢?其实数据木对应着一个系统变量datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了。 -- 以下两种方式都可以 show variables like datadir; selec…

Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型

Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型 讲了那么多理论,相信大家对区块链/web3也有了一定认知;这时候可能就问有人会问了如何把理论变成实际的代码实现。 这就来了接下来会给大家分享Solidity入门教程 这时候就会有同学问了Sol…

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…

在.NET Core控制器中获取AJAX传递的Body参数

.Net Core是支持前后端不分离式的开发的,如果在原始系统中采用不分离式开发,后面需要在原系统中增加功能,并且新的服务采用其他语言开发,且系统原来功能保持原样,这样前端系统可以单独调用新开发的接口。 但是&#x…

ubuntu24安装opencv过程

1.访问opencv官网,下载源代码。 opencv 2.选择相应版本的源码下载 我这里用的是4.8.1版本的源码进行安装,opencv-4.8.1.tar.gz 安装命令 tar xvf opencv-4.8.1.tar.gz #在当前文件夹创建build文件,并进入 mkdir build && cd build …

Kubernetes ClusterIP 端口深度解析:虚拟服务与流量转发机制

事情的起因是创建了一个 NodePort 类型 Service,其端口映射关系为 8000:30948/TCP。既然30948是在每个node开的端口,那8000是开在哪的呢?出于好奇回顾了一下K8s的Cluster IP和Service 端口映射关系解析 在 Kubernetes 的 NodePort Service 中…

C++左值与右值及引用的总结

前言 在C中,理解左值(lvalue)和右值(rvalue)是掌握现代C核心特性的关键。左值通常指代具名的、持久存在的对象,可以取地址;而右值则是临时的、即将销毁的值,如字面量或表达式结果。…

学习记录:DAY31

Java课设:数字水印处理与解析器开发 前言 想养成写日记的习惯真不容易。最近比较懒散,复习不想复,项目又做完了,处于一种能干些什么,但是不太想干,但是不干些什么又浑身难受的处境。其实完全就不是匀不出…

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘&#xf…

系统模块与功能设计框架

系统模块与功能设计框架,严格遵循专业架构设计原则,基于行业标准(如微服务架构、DDD领域驱动设计)构建。设计采用分层解耦模式,确保可扩展性和可维护性,适用于电商、企业服务、数字平台等中大型系统。 系统…

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程学习之自我一致性

自我一致性 (Self-consistency) 概念:该技术通过对同一问题采样不同的推理路径,并通过多数投票选择最一致的答案,来解决大语言模型(LLM)输出的可变性问题。通过使用不同的温度(temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…

数据集-目标检测系列- 口红嘴唇 数据集 lips >> DataBall

贵在坚持! * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关项目:GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI:传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7关闭防火墙、Linux开启关闭防火墙

文章目录 一、firewalld开启、关闭防火墙1、查看防火墙状态 一、firewalld开启、关闭防火墙 以下命令在linux系统CentOS7中操作开启关闭防火墙 # 查询防火墙状态 systemctl status firewalld.service # 开启防火墙 systemctl start firewalld.service # 开机自启动防火墙 syste…

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见:mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中,两个或多个对象相互依赖,导致创建过程陷入死循环。以下通过一个简…

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…