第十一章 | 智能合约主网部署与验证详解
📚 第十一章 | 智能合约主网部署与验证详解
——让你的合约真正上线、公开、透明!
✅ 本章导读
前面我们写了各种合约,ERC20、NFT、DAO……
但只在本地测试或测试网上部署运行,项目还没“上链”!
主网上线部署,是任何区块链项目走向用户的关键一步。
写代码只是 50%,剩下的 50% 是部署和验证。
合约要上主网,必须:
- 正确部署
- 代码公开验证
- 保证合约安全
- 优化 Gas,降低使用成本
这一章,从测试网到主网部署、Etherscan 验证,全面讲解每个细节,确保你的项目“看得懂、能用、能信任”。
✅ 本章你将掌握
- 主网部署前的准备
- 测试网部署(Goerli / Sepolia)
- 主网部署(Ethereum / Polygon / BNB Chain)
- Etherscan 合约验证
- Gas 优化部署策略
- 部署自动化脚本(Hardhat + Alchemy/Infura)
- 多链部署 & 升级合约策略
- Dune Analytics 数据展示
- 完整实战案例演示
1️⃣ 主网部署前的准备工作
✅ 主网部署 ≠ 测试网部署
- 主网部署 = 真金白银!每笔操作都要付 Gas
- 部署合约前必须反复检查:
- 合约已完成单元测试
- 权限管理没有漏洞
- 参数正确(代币总量、初始 owner、分红比例等)
- 依赖合约地址已确认(预言机地址、NFT 链接等)
✅ 环境准备
| 工具 | 说明 |
|---|---|
| Hardhat | 部署、编译、测试工具 |
| Node.js | v16.x 以上,运行 Hardhat |
| Alchemy/Infura | 远程节点提供 RPC,连接主网 |
| 钱包 | MetaMask,签名部署交易 |
| Etherscan API | 合约代码验证 |
✅ 确保你有:
- MetaMask 主网钱包(准备 ETH/MATIC/BNB 等 Gas)
- Alchemy / Infura 项目密钥
- Etherscan API 密钥(代码验证用)
2️⃣ 测试网部署实战(Goerli / Sepolia)
🔨 创建 Hardhat 项目
mkdir my-dapp
cd my-dapp
npm init -y
npm install --save-dev hardhat
npx hardhat
选择 Create a basic sample project
安装依赖
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-etherscan dotenv
🛠️ 配置 Hardhat(hardhat.config.js)
require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-etherscan");
require("dotenv").config();module.exports = {solidity: "0.8.19",networks: {goerli: {url: process.env.GOERLI_RPC,accounts: [process.env.PRIVATE_KEY],},sepolia: {url: process.env.SEPOLIA_RPC,accounts: [process.env.PRIVATE_KEY],}},etherscan: {apiKey: process.env.ETHERSCAN_API_KEY,}
};
✅ 配置环境变量 .env
GOERLI_RPC=https://eth-goerli.g.alchemy.com/v2/xxxx
SEPOLIA_RPC=https://eth-sepolia.g.alchemy.com/v2/xxxx
PRIVATE_KEY=你的部署钱包私钥
ETHERSCAN_API_KEY=你的 Etherscan API 密钥
❗ 私钥不要上传 GitHub!
📝 编写部署脚本
文件路径 scripts/deploy.js
async function main() {const [deployer] = await ethers.getSigners();console.log("部署账户:", deployer.address);console.log("账户余额:", (await deployer.getBalance()).toString());const Token = await ethers.getContractFactory("MyToken");const token = await Token.deploy();await token.deployed();console.log("合约地址:", token.address);
}main().then(() => process.exit(0)).catch((error) => { console.error(error); process.exit(1); });
🚀 部署命令
npx hardhat run scripts/deploy.js --network goerli
3️⃣ 主网部署实战(Ethereum / Polygon / BNB Chain)
✅ 主网 RPC 配置
networks: {mainnet: {url: process.env.MAINNET_RPC,accounts: [process.env.PRIVATE_KEY],},polygon: {url: process.env.POLYGON_RPC,accounts: [process.env.PRIVATE_KEY],},bsc: {url: process.env.BSC_RPC,accounts: [process.env.PRIVATE_KEY],}
}
✅ 主网环境
MAINNET_RPC=https://eth-mainnet.g.alchemy.com/v2/xxxx
POLYGON_RPC=https://polygon-rpc.com
BSC_RPC=https://bsc-dataseed.binance.org/
✅ 主网部署
npx hardhat run scripts/deploy.js --network mainnet
❗ 主网部署前请三思,部署后合约代码无法修改(非代理合约)
建议部署到测试网 Goerli / Sepolia / Mumbai 反复测试
4️⃣ Etherscan 合约验证(透明合约=信任)
✅ 为什么要验证合约?
- 增加透明度,用户信任
- 合约代码 + 编译信息一目了然
- Etherscan 界面可直接调用合约函数
✅ 验证命令
npx hardhat verify --network goerli 合约地址 参数1 参数2
示例
npx hardhat verify --network goerli 0xAbC123... "MyToken" "MTK" 1000000
✅ 验证失败常见问题
- 编译版本不一致 → 确认 Hardhat 配置和 Remix 编译版本相同
- 构造函数参数错误 → 参数顺序和格式完全一致
- 已经优化编译 → 验证时打开优化选项
- 私钥/ApiKey 配置错误 → 确认
.env内容
5️⃣ Gas 优化部署策略
| 优化项 | 说明 |
|---|---|
| 编译优化 | Hardhat 编译打开优化选项 |
immutable | 部署时初始化,减少状态读写 |
constant | 编译时写死变量,省 Gas |
| 事件精简 | 只使用必要 indexed 参数 |
| 最小代理 | Clone 工厂批量部署子合约 |
✅ 编译优化
solidity: {version: "0.8.19",settings: {optimizer: {enabled: true,runs: 200,},},
}
6️⃣ 多链部署与升级策略
✅ 主流公链部署
| 公链 | RPC 地址 |
|---|---|
| Ethereum | Alchemy / Infura |
| Polygon | polygon-rpc.com |
| BNB Chain | bsc-dataseed.binance.org |
| Arbitrum | arbitrum-rpc.com |
| zkSync Era | zksync2-mainnet.zksync.io |
✅ 升级合约推荐 UUPS
- 逻辑合约可升级
- 存储合约地址固定
- 结合 AccessControl 角色管理升级权限
7️⃣ Dune Analytics 数据集成
✅ 为什么要上 Dune?
- 免费的数据看板
- 自动抓取链上数据(合约调用、余额、交易等)
- 便于展示项目信息和透明度
- 用户无需技术背景即可查看数据
✅ 数据展示案例
- Token 分布图
- NFT 持有者排名
- DAO 投票统计
- 资金流向图表
🚀 推荐用 Dune 公开展示社区透明数据
8️⃣ 完整实战案例:ERC20 合约部署 + 验证 + Dune 展示
✅ 1. 部署 ERC20 合约
部署 MyToken,符号 MTK,总量 1000000
npx hardhat run scripts/deploy.js --network goerli
✅ 2. 验证 Etherscan
npx hardhat verify --network goerli 0xAbC123... "MyToken" "MTK" 1000000
✅ 3. 创建 Dune 看板
- 查询合约地址下
Transfer事件 - 分析 Token 分发
- 绘制 Token Holder 分布图
- 嵌入项目官网展示透明数据
✅ 小结
这一章完成了智能合约的完整主网部署流程:
✔️ 环境配置 + 硬件钱包保护私钥
✔️ 测试网反复测试
✔️ 主网安全部署
✔️ Etherscan 验证透明
✔️ Dune Analytics 数据展示
✔️ 多链部署 + 升级合约实战
🎯 课后挑战
- 部署 ERC20 + NFT 合约到 Sepolia / Polygon
- 验证合约代码并启用 Etherscan 界面交互
- 搭建 Dune 看板展示合约使用情况
- 写一篇完整的《合约上线全流程复盘》分享
✅ 下一章预告|第十二章
👉 Solidity 智能合约前后端集成实战
🚀 Ethers.js + React 前端交互
🚀 MetaMask 钱包集成登录/签名
🚀 DApp 完整项目开发
🚀 钱包授权 / 链上调用 / 交易签名流程
🛠️ 完整项目代码上传 GitHub,评论区见!
下一章继续冲第十二章!🔥
要直接做前后端集成 or DApp 快速开发?随时安排!
确认下第十一章!
需要补充 Layer2 主网部署(Arbitrum、zkSync)或批量发币工厂项目实战?
你拍板,我们继续!🔥
相关文章:
第十一章 | 智能合约主网部署与验证详解
📚 第十一章 | 智能合约主网部署与验证详解 ——让你的合约真正上线、公开、透明! ✅ 本章导读 前面我们写了各种合约,ERC20、NFT、DAO…… 但只在本地测试或测试网上部署运行,项目还没“上链”! 主网上线部署&#…...
蓝桥杯 回文数组
问题描述 小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 a_i,他觉得随机生成的数组不太美观,想把它变成回文数组,也就是对于任意 i ∈ [1, n] 满足: a_i a_(n-i1)小蓝一次操作可以指定相邻的…...
windows清除电脑开机密码,可保留原本的系统和资料,不重装系统
前言 很久的一台电脑没有使用了,开机密码忘了,进不去系统 方法 1.将一个闲置u盘设置成pe盘(注意,这个操作会清空原来u盘的数据,需要在配置前将重要数据转移走,数据无价,别因为配置这个丢了重…...
【深度学习】【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV3人脸检测
【深度学习】【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV3人脸检测 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV3人脸检测前言YOLOV3模型运行环境搭建YOLOV3模型运行数据集准备YOLOV3运行模型训练模型验证模型推理导出onnx模型 总结…...
html5-qrcode前端打开摄像头扫描二维码功能
实现的效果如图所示,全屏打开并且扫描到二维码后弹窗提醒,主要就是使用html5-qrcode这个依赖库,html5-qrcode开源地址:GitHub - mebjas/html5-qrcode: A cross platform HTML5 QR code reader. See end to end implementation at:…...
ui_auto_study(持续更新)
通过where python来找到python解释器的安装目录 如果不适配,谷歌浏览器插件可以在这个地址下载对应的驱动 谷歌浏览器驱动下载地址 下载对应的驱动版本,替换原驱动 替换后,可以执行成功 div代表标签 .开头的代表类# 使用class定位元素 …...
从Oracle到腾讯TDSQL数据库升级技术分享
目录 一、腾讯TDSQL简介 1.强大的分布式能力 2.高度兼容性 3.高可用性与容错性 4.云原生特性 二、Java类应用主要出现的问题及解决方案 1.驱动问题 2.事务处理差异 3.存储过程与函数的适配 三、性能调优问题及方案 1.索引优化 2.查询缓存利用 3.参数调优 四、生产…...
【nodejs】爬虫路漫漫,关于nodejs的基操
一.下载安装nodejs 官网地址:Node.js — 在任何地方运行 JavaScript 二.下载安装vscode代码编辑器 官网地址:Download Visual Studio Code - Mac, Linux, Windows 三.修改本地脚本策略 1,windowsi 打开电脑设置 2,输入powersh…...
蓝桥杯C++基础算法-0-1背包
这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品,每个物品有其体积和价值,要求在不超过背包容量的情况下,选择物品使得总价值最大。以下是代码的详细思路解析: 1. 问题背景 给定 n 个物品&am…...
常见中间件漏洞攻略-Jboss篇
一、CVE-2015-7501-Jboss JMXInvokerServlet 反序列化漏洞 第一步:开启靶场 第二步:访问该接口,发现直接下载,说明接⼝开放,此接⼝存在反序列化漏洞 http://47.103.81.25:8080/invoker/JMXInvokerServlet 第三步&…...
quartz.net条件执行
quartz.net条件执行 在使用Quartz.NET时,你可能需要基于某些条件来决定是否执行一个任务。Quartz.NET本身并不直接支持基于条件执行任务的功能,但你可以通过一些策略来实现这一需求。下面是一些方法来实现基于条件的任务执行: 1. 使用触发器…...
docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型
系统:没有限制,可以运行docker就行 磁盘空间:至少预留50GB; 内存:8GB docker版本:4.38.0 桌面版 下载ollama镜像 由于docker镜像地址,网络不太稳定,建议科学上网的一台服务器拉取ollama镜像&am…...
java TCP UDP 客户端访问例子和对比差异
Java TCP客户端示例 import java.io.*; import java.net.*;public class TCPClient {public static void main(String[] args) {try (Socket socket new Socket("localhost", 12345); // 连接服务端PrintWriter out new PrintWriter(socket.getOutputStream(), t…...
两个还算好用的ppt转word和PDF转word的python脚本
PPT转word: import re from pptx import Presentation from docx import Document from docx.shared import Inches from io import BytesIO from PIL import Imagedef clean_text(text):# 使用正则表达式删除控制字符和NULL字节return re.sub(r[\x00-\x1F\x7F], ,…...
opencascade 源码学习 XmlDrivers-XmlDrivers
OpenCASCADE 中的 XmlDrivers 是用于处理 XML 格式的 CAD 数据持久化模块,属于 OCAF(Open CASCADE Application Framework) 的一部分。它允许将 OCAF 文档(包含 CAD 数据、属性、关系等)序列化为 XML 文件,…...
Java-模块二-1
print和println print 和 println 是两种常用的输出方法,主要用于在控制台上打印信息。它们的行为因编程语言而异,但通常具有以下特点: Java中的print和println System.out.print():此方法用于打印输出内容到控制台,…...
k8s--集群内的pod调用集群外的服务
关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。 可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs,或者直接使用Pod网络。每种方法都有不同的适用场景,需要逐一分析。 例如&…...
AI比人脑更强,因为被植入思维模型【20】卡尼曼双系统理论
定义 卡尼曼双系统理论思维模型是由诺贝尔经济学奖得主丹尼尔卡尼曼提出的,该理论认为人类的思维系统可以分为两个相互关联但又具有不同特点的子系统,即系统1(快思考)和系统2(慢思考)。系统1是基于直觉、经…...
ccfcsp3302相似度计算
//相似度计算 #include<iostream> #include<set>//不重复 #include<string> using namespace std; int main() {int n, m;cin >> n >> m;set<string>str1;set<string>str2;for(int i0;i<n;i){string s;cin>>s;for(int j0;…...
jEasyUI 创建 RSS 阅读器
jEasyUI 创建 RSS 阅读器 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取所需信息,RSS 阅读器应运而生。jEasyUI 是一款流行的前端框架,具有丰富的组件和便捷的开发体验。本文将介绍如何使用 jEasyUI 创建一个功能齐…...
DeepSeek和Kimi在Neo4j中的表现
以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…...
【Java】TCP网络编程:从可靠传输到Socket实战
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
windows 平台编译openssl
文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…...
剑指小米特斯拉:秦L EV上市11.98万起
3月23日,比亚迪王朝网推出全新中级纯电轿车秦L EV,价格区间为11.98万-13.98万元,瞬间火爆市场。 依托e平台3.0 Evo技术赋能,秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势,直击年轻用户痛…...
避雷 :C语言中 scanf() 函数的错误❌使用!!!
1. 返回值说明 scanf函数会返回成功匹配并赋值的输入项个数,而不是返回输入的数据。 可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。 #include <stdio.h>int main() {int num;if (scanf("%d", …...
Godot读取json配置文件
概述 在Godot 4.3中读取JSON配置文件,可以通过以下步骤实现: 步骤说明 读取文件内容:使用FileAccess类打开并读取JSON文件。 解析JSON数据:使用JSON类解析读取到的文本内容。 错误处理:处理文件不存在或JSON格式错…...
Hadoop 3.x中的zookeeper和JournalNode的作用
在Hadoop 3.x版本中,ZooKeeper 和 JournalNode 的作用有所变化和增强,尤其是在HDFS高可用性(HA)架构和其他Hadoop组件的协作方面。下面是它们在Hadoop 3.x中的具体作用: ZooKeeper 继续在Hadoop 3.x中为集群提供协调服务,尤其是在HDFS的高可用性和YARN资源管理器的管理中…...
蓝桥杯高频考点——并查集(心血之作)
并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1(50分)solution 2(100分) 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是,合并&a…...
基于概率图模型的蛋白质功能预测
标题:基于概率图模型的蛋白质功能预测 内容:1.摘要 蛋白质功能预测在生物学研究中具有重要意义,能够帮助理解生命过程和疾病机制。本研究的目的是利用概率图模型进行蛋白质功能预测。方法上,收集了大量已知功能的蛋白质数据构建数据集,运用贝…...
Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)
Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 一、简单介绍 二、conne…...
