Solidity programming essentials-本地以太坊模拟测试环境
复习一下前两章的内容
Solidity programming essentials-读书笔记
这一篇讨论了以太坊的一些基本概念。以太坊是一种基于密码学的算法,使用分布式的构架,把不同的节点分布在不同的计算机上进行通信,目的是解决不可信的环境下的可信数据传输的问题。以太坊的传输需要消耗gas,目的是防止黑客攻击,恶意堵塞以太坊网络,其次是为了激励矿工或者验证者维护以太坊网络。gas费就会奖励给打包以太的矿工或者验证者。 以太坊以前使用POW,工作量证明,现在使用POS。因为POW需要用计算机消耗大量电力去计算数学问题,POS更省电。
POS的原理是用户存入自己的真金白银,如果用户进行恶意操作,钱就会被罚没。 然后用户的资金越多,就可以优先打包区块,并获得gas费奖励。
Solidity programming essentials-读书笔记2
Remix IDE
这一篇讨论了solidity的学习要使用的一些工具,例如remix IDE,这是用来写solidity的编译运行的重要工具。 还有geth,这是以太坊的节点。以及metamask这是以太坊的钱包。 最后mist是以太坊早期的官方钱包,2019年不再更新,已经被淘汰,所以不用学习。
Ganache CLI
使用以太坊修改和写入账本的交易过程分为以下两个截然不同的阶段:
第一阶段是创建交易并将其放入交易池。
第二阶段是定期从交易池中获取所有交易并进行“挖矿”。这里的“挖矿”指的是将这些交易写入以太坊数据库或账本。
根据以上描述,如果开发和测试都采用相同的流程,将会非常耗时。
为了简化以太坊上解决方案和智能合约的开发和测试流程,开发了 ganache-cli。它之前被称为 TestRPC。
ganache-cli 本身就包含了以太坊的交易处理和挖矿功能。此外,交易无需等待即可进行挖矿。
交易在生成时即被写入账本。这意味着开发者可以将 ganache-cli 用作以太坊节点,而无需进行挖矿活动即可将交易写入账本。
相反,交易会在创建时立即存储在账本中。
ganache-cli 依赖于 Node.js,因此在部署 ganache-cli 之前,机器上必须已安装 Node.js。如果尚未安装 Node.js,可以从 https://nodejs.org/en/download/ 下载。
下载后,在cmd输入以下命令
1 | |
在另一个cmd面板输入以下命令geth attach rpc:http://127.0.0.1:8545
1 | |
这条命令和用 Ganache 学 Solidity 的关系,我给你详细解释一下:
1️⃣ geth attach rpc:http://127.0.0.1:8545 代表什么
geth是 以太坊官方客户端(Go Ethereum),可以用来运行一个完整节点或与节点交互。attach命令用于 连接到正在运行的 Geth 节点,进入一个交互式控制台(类似 JS 控制台),可以执行 web3 命令。rpc:http://127.0.0.1:8545表示你要连接的是 本地运行的以太坊节点的 RPC 接口,默认 Geth 的 JSON-RPC 端口是 8545。
所以整个命令的意思就是:
用 Geth 控制台连接本地节点,方便你用命令行操作链上的账户、合约和交易。
2️⃣ 使用 Ganache-cli 学习 Solidity
Ganache 是一个 本地以太坊模拟环境,比跑 Geth 节点简单,非常适合学习和测试 Solidity。
安装 Ganache CLI
1 | |
启动 Ganache CLI
1 | |
默认会启动一个本地链:
- RPC 地址:
http://127.0.0.1:8545 - 默认账户:10 个测试账户,每个 100 ETH
- 区块时间:即时出块,适合测试
在 Remix IDE 连接 Ganache
- 打开 Remix → 左侧“Deploy & Run Transactions”
- Environment 选择 “Web3 Provider”
- 输入
http://127.0.0.1:8545 - 点击“Connect”
这时候:
- 你在 Remix 编写的 Solidity 合约,可以直接部署到本地 Ganache 模拟链
- 可以看到即时的交易、gas 消耗和账户余额
3️⃣ 学习 Solidity 推荐流程
- 启动 Ganache CLI(本地测试链)
- 打开 Remix IDE
- 在 Remix 里编写简单合约,例如:
1 | |
- 编译 → 部署到 Ganache
- 调用函数测试状态变化
- 可以尝试连接 Web3.js / ethers.js 在 Node.js 中和本地链交互
✅ 总结:
geth attach rpc:http://127.0.0.1:8545是连接本地 Geth 节点。- 对于学习 Solidity,直接用 Ganache + Remix 更简单高效,无需跑全节点。
如果你愿意,我可以帮你画一张 Remix + Ganache + 测试账户交互流程图,让整个本地学习环境更直观。
Solidity 编译器
Solidity 是用于编写智能合约的语言之一。
智能合约将在后续章节中详细介绍。
使用 Solidity 编写的代码需要使用 Solidity 编译器进行编译,该编译器会输出字节码以及部署智能合约所需的其他工件。
Solidity 之前是 Geth 安装的一部分;但是,它已从 Geth 中分离出来,
应该使用其自身的安装程序进行部署。
安装官方 solc Windows 可执行文件(提供 solc 命令)
下载官方 solc Windows 版本:
https://github.com/ethereum/solidity/releases
解压后把 solc.exe 放到某个目录(比如 C:\solidity)。
把这个目录加入 系统 PATH:
控制面板 → 系统 → 高级系统设置 → 环境变量 → PATH → 添加 C:\solidity
打开新命令行,运行:
solc --version
然后你就可以用原来的命令:
solc --optimize --bin --abi helloworld.sol -o build
Web3 javascript 库
web3 库是一个开源的 JavaScript 库,可用于从同一台计算机或远程计算机连接到以太坊节点。
它支持进程间通信 (IPC) 和远程过程通信 (RPC) 连接到以太坊节点。web3 是一个客户端库,可以与网页一起使用,并进行查询,还可以向以太坊节点提交交易。它可以通过 Node 包管理器安装,就像 Solidity 编译器一样,作为 Node 模块安装。截至撰写本文时,最新版本的 web3 存在问题,由于缺少 BigNumber.js 文件,无法正确安装。但是,之前的稳定版本仍然可用于将 Web 应用程序连接到后端以太坊节点。让我们来看看安装 web3 JavaScript 库的步骤:
npm install web3@0.19
web3.js 是以太坊生态中最早也最广泛使用的 JavaScript 库之一,它的主要作用是让前端或后端 JavaScript 应用与以太坊区块链交互。具体来说,它可以:
连接以太坊节点
- 支持本地节点(如 Geth、OpenEthereum)或远程节点(Infura、Alchemy 等)。
- 允许通过 HTTP、WebSocket 或 IPC 与节点通信。
账户管理与签名交易
- 创建、导入、导出以太坊账户。
- 对交易或消息进行签名。
智能合约交互
- 调用已部署的智能合约函数(读写)。
- 监听事件(Event)和日志。
区块链信息查询
- 获取余额、区块信息、交易信息、网络状态等。
所以,它是 DApp 前端开发或后端服务的重要工具。
被淘汰了吗?
没有完全淘汰,但地位下降
web3.js现在仍然可用,而且社区很大,但开发节奏慢,部分 API 设计被认为不够现代化。新的选择是 **
ethers.js**:- 更轻量、模块化、TypeScript 友好。
- API 设计更现代,更适合前端和后端应用。
- 在新项目中,很多团队更倾向于使用
ethers.js。
总结:
- 旧项目或依赖 web3 的工具 → 仍然用
web3.js。 - 新项目开发 → 推荐
ethers.js,也可以和 web3 互通。
如果你愿意,我可以帮你画一张 web3.js vs ethers.js 对比图,让你一眼就能看出两者优缺点。你希望我画吗?
MetaMask
MetaMask 是一款轻量级的 Chrome 浏览器扩展程序,它可以帮助用户与以太坊网络进行交互。它同时也是一个钱包,可以帮助用户发送和接收以太币。MetaMask 可以从https://metamask.io/ 下载。由于 MetaMask 在浏览器中运行,它不会
将整个链数据下载到本地;而是将其集中存储,并帮助用户通过浏览器连接到其存储。
1. 安装 MetaMask
- Chrome 浏览器打开:https://metamask.io
- 点击 Install → 安装插件
- 选择“创建钱包(Create a new wallet)”
2. 创建账户
- 设置密码
- 保存助记词(12 个英文单词)
- 创建成功后,你会看到“Account 1”和一个 0 ETH 的余额
切换到测试网络(Sepolia)(3 分钟)
- 打开 MetaMask → 右上角圆点 → Settings(设置)
- 点击 “Advanced”(高级)
- 找到 “Show test networks”(显示测试网络) → 打开
- 回到主界面:点击网络切换,下拉找到
“Sepolia test network” → 选择
现在你在测试网上了。
摘要
本章内容丰富。以太坊
节点实现了 JSON RPC 端点,可以通过
WebSocket、IPC 和 RPC 连接到这些端点。本章讨论了
各种类型的网络——公共网络、主网络、测试网络和私有网络。
本章还讨论并实现了一个私有网络。本章提供了创建开发环境的步骤,该环境将在后续章节中使用。
本章重点介绍如何在 Windows 操作系统上部署多种工具和实用程序。
虽然每个工具都有其自身的工作原理和功能,
但有些工具最终可能会实现相同的功能。例如,基于 Geth 的私有链和 ganache-cli 本质上都是以太坊节点,但存在一些差异。本章介绍了 Geth、Solidity 编译器、ganache-cli、web3 JavaScript 框架、Mist 和 MetaMask 的部署。
一些读者可能喜欢使用ganache-cli,而另一些读者则可能对使用基于 Geth 的私有以太坊节点感兴趣。还有一个名为 Truffle 的重要实用程序,
我们将在后续章节中介绍。
下一章我们将重点介绍 Solidity 语言,这也是本书的标题。Solidity 支持面向对象编程,提供原生数据类型和复杂数据类型,帮助用户声明和定义接受参数和返回值的函数,提供控制结构和表达式,以及许多其他特性。下一章将深入探讨变量和数据类型。变量和数据类型是任何编程语言的核心,在 Solidity 中尤为重要,因为它需要在分布式账本中存储这些数据。
solc和remix ide编译运行solidity helloworld的区别
好的,我们来详细对比一下 solc CLI 和 Remix IDE 在编译、部署和运行 Solidity 合约(比如 HelloWorld.sol)时的区别,帮你理清思路:
1️⃣ 编译方式
| 特点 | solc CLI | Remix IDE |
|---|---|---|
| 编译器类型 | 官方命令行编译器(C++ 原生或 solc-js) | 内置 solc-js 或远程编译器 |
| 操作方式 | 命令行,需要手动指定文件路径和输出 | 图形界面操作,直接上传文件或新建合约 |
| 输出内容 | 生成 .bin(Bytecode)和 .abi 文件 |
可以直接在浏览器看到 Bytecode 和 ABI,也能直接部署 |
| 版本控制 | 需要手动安装不同版本的 solc | 可以在 Remix 选择不同版本的 solc 编译器(方便切换) |
✅ 总结:
solc更适合 自动化、脚本化编译- Remix 更适合 快速试验和可视化调试
2️⃣ 部署方式
| 特点 | solc CLI | Remix IDE |
|---|---|---|
| 需要环境 | 本地节点(Ganache / Geth) + Web3/ethers.js 脚本 | 内置虚拟机(JavaScript VM),也可连接本地节点或测试网 |
| 操作复杂度 | 手动用脚本部署,需要提供 ABI、Bytecode | 直接点击“Deploy”按钮即可部署 |
| 适合用途 | 自动化测试、CI/CD、与前端或脚本对接 | 快速调试、教学、测试智能合约逻辑 |
✅ 总结:
solc+ Node.js/ethers.js → 专业开发流程- Remix → 快速验证合约、学习和小项目
3️⃣ 运行/测试合约
| 特点 | solc CLI | Remix IDE |
|---|---|---|
| 调用合约方法 | 需要写 Web3.js 或 ethers.js 脚本调用 | 图形界面可直接输入参数调用函数,查看返回值 |
| 交易模拟 | 需要本地链或测试网环境 | JavaScript VM 内置账户和 ETH,模拟交易即时执行 |
| 调试功能 | 需要额外工具(如 Remix Debugger 或 Hardhat) | 内置调试器,可以单步执行、查看栈、事件等 |
✅ 总结:
- solc → 更贴近真实区块链环境
- Remix → 交互直观,适合调试、教学和演示
4️⃣ 适用场景
| 场景 | 推荐工具 |
|---|---|
| 快速写一个合约、测试函数逻辑 | Remix IDE |
| 编写完整项目,自动化编译、部署到本地链或测试网 | solc + Node.js/ethers.js 或 Hardhat/Truffle |
| 学习 Solidity 语法、调试事件、查看变量 | Remix IDE |
| 集成到前端 DApp 或自动化测试 | solc 编译生成 ABI/Bytecode + Web3.js/ethers.js |
⚡ 总结
- Remix IDE = 可视化、快速、适合学习和实验
- solc CLI = 专业、脚本化、适合自动化和真实项目流程
实际开发中,很多人是先用 Remix 验证逻辑,再用 solc + Node.js 部署到本地链或测试网,两者结合使用效率最高。
Remix 最新部署环境说明
| 环境选项 | 说明 | 适用场景 |
|---|---|---|
| Remix VM | 内置的本地 EVM,交易即时完成,不需要外部节点或 MetaMask | 测试、练习、学习 Solidity 合约 |
| Browser Wallet | 通过浏览器钱包(如 MetaMask)连接到网络(测试网/主网) | 部署到测试网或主网 |
| WalletConnect | 通过 WalletConnect 协议连接移动钱包 | 移动端钱包部署 |

明白了,你看到的 Remix VM 下拉菜单里列出了不同的 EVM 模拟环境,这些名字对应的是以太坊不同的 硬分叉(Hard Fork)版本或网络分支。我来帮你梳理:
1️⃣ 为什么会有这么多选项
以太坊网络会定期升级协议,这些升级称为 Hard Forks,每次升级都会引入新的 EVM 规则。Remix VM 模拟器提供了这些不同版本,方便你测试合约在不同 EVM 版本下的行为。
2️⃣ 各选项含义
| Remix VM 选项 | 含义 |
|---|---|
| Remix VM (Prague) | 对应近期以太坊网络升级后状态,支持最新 EVM 特性 |
| Remix VM (Cancun) | 最新以太坊硬分叉模拟(如 Proto-Danksharding 功能等) |
| Remix VM - Mainnet fork | 模拟主网当前状态,方便测试主网合约兼容性 |
| Remix VM - Sepolia fork | 模拟 Sepolia 测试网状态,适合测试部署在 Sepolia 的合约 |
| Remix VM - Custom fork | 自定义 fork,可指定 RPC URL 或特定网络状态 |
| Remix VM (Shanghai / Paris / London / Berlin) | 对应以太坊历史硬分叉版本,用于回测合约在旧 EVM 规则下的表现 |
简单来说:Prague / Cancun / Shanghai / Paris / London / Berlin 是不同版本 EVM
Mainnet / Sepolia / Custom fork 是带网络状态的模拟
3️⃣ 推荐选择
- 普通练习 / 测试
Counter合约:选择 Remix VM (Prague) 或 Remix VM (Shanghai) 就够了。 - 想测试在主网或测试网状态:用 Mainnet fork 或 Sepolia fork。
- 想自定义区块状态或余额:用 Custom fork。
对你的场景(简单增减计数器合约),直接选 **Remix VM (Prague)**,点击 Deploy 就能立即测试,无需连接外部节点或钱包。
如果你愿意,我可以帮你画一张 Remix VM 各版本对比图,标明哪些适合测试、哪些用于 fork 主网/测试网、哪些对应历史硬分叉,让你一眼就能选对环境。
如果使用Remix VM (Shanghai)那还需要ganache-cli干什么?
1️⃣ Remix VM(Shanghai)是什么?
Remix 内置的虚拟机 (Remix VM) 是一个 完全本地的 EVM 环境,不依赖外部节点。
Shanghai 是 Remix VM 的一个版本,对应 Ethereum 的 Shanghai 硬分叉特性。
优点:
- 不需要启动任何额外节点或网络。
- 部署和测试速度快。
- 可直接在 Remix 中调用 Solidity 合约、模拟交易、查看账户余额。
2️⃣ ganache-cli 是什么?
Ganache-cli 是 Truffle/Hardhat 生态常用的 本地以太坊模拟链,可以在终端启动一个本地链。
特点:
- 可以模拟区块时间、gas 费用、交易失败等。
- 可以通过 RPC 接口 与 web3/ethers.js 或 Hardhat/Truffle 交互。
- 支持 多种测试账户 和 预置资金。
- 更接近实际链的行为,可以模拟更多真实情况。
3️⃣ 两者对比和使用场景
| 特性 | Remix VM (Shanghai) | Ganache-cli |
|---|---|---|
| 是否独立于本地节点 | ✅ | ✅ |
| 支持 RPC 调用 | ❌(只能在 Remix 内) | ✅(前端/脚本可连接) |
| 区块控制 | Remix 自动生成 | 可自定义区块时间、gas、难度 |
| 调试功能 | ✅(Remix 自带调试器) | ✅(Truffle/Hardhat 调试) |
| 适合场景 | 快速编写、测试智能合约 | 集成测试、前后端联调、模拟真实链环境 |
4️⃣ 所以问题的答案
如果只是用 Remix VM (Shanghai) 写和测试合约 → 不需要 ganache-cli,因为 Remix VM 已经可以部署和测试了。
如果你想做更复杂的集成测试,比如:
- 用 Node.js 脚本调用合约
- 测试前端 dApp
- 模拟多账户和交易行为
- 或者要用 Truffle / Hardhat 框架
→ 那就需要 ganache-cli 或其他本地链。
💡 小结:
- 简单快速测试 → Remix VM 就够
- 复杂测试或开发 → ganache-cli / Hardhat 本地链更灵活