Solidity programming essentials-读书笔记2

  1. 介绍ethereum网络
  2. 安装和配置geth
  3. 创建私有网络
  4. 安装和配置testRPC
  5. 安装solidity编译器, solc
  6. 安装web3框架
  7. 安装和使用mist
  8. 安装和使用metamask

以太坊由大量计算机(亦称节点)共同支撑,这些节点彼此互联,并将数据存储在一个分布式账本中。所谓分布式账本,是指网络中每一个节点都持有该账本的完整副本。这种架构为开发者提供了灵活性,使其能够将解决方案部署到多种不同类型的网络上。开发者应根据自身需求和具体业务场景选择合适的网络。

这些不同类型的网络还能够帮助开发者将解决方案和智能合约部署到无需花费以太币或真实货币的环境中。有些网络是完全免费的,而有些网络的使用则需要以太币或其他代币形式的费用。

以太坊主网是一个全球公共网络,任何人都可以使用。用户可以通过账户访问该网络,并且任何人都可以自由创建账户并部署他们的解决方案和智能合约。使用主网会产生 Gas 费用。主网被称为 Homestead,之前被称为 Frontier。这是一个可通过互联网访问的公共链,任何人都可以连接到它并访问其中存储的数据和交易。

测试网络

测试网络旨在帮助促进和提高以太坊区块链的采用率。它们是主网络的精确副本。使用这些网络部署和使用合约完全免费。这是因为测试以太币可以通过水龙头生成,并在这些网络上使用。截至撰写本文时,有多个测试网络可用,例如 Ropsten、Kovan 和 Rinkeby。

Ropsten 是最早使用 PoW 共识机制生成区块的测试网络之一。它之前被称为 Morden。如前所述,Ropsten 完全免费,可用于智能合约的构建和测试。可以通过 Geth 中的 --testnet 选项来使用它。下一节将详细介绍 Geth。目前为止,Ropsten 是最流行的测试网络。

Rinkeby 是另一个基于以太坊的测试网络,它使用 PoA 作为共识机制。PoW 和 PoA 是两种不同的共识机制。PoW 足够稳健,可以维护数据的不可篡改性和去中心化;然而,它的缺点在于对矿工的控制不足。另一方面,PoA 不仅具备 PoW 的所有优点,而且还能更好地控制矿工。

私有网络是在私有基础设施上创建和托管的。私有网络由单个组织控制,该组织对其拥有完全控制权。有些解决方案、合同和用例,组织可能不希望将其部署在公共网络上,即使是出于测试目的。他们希望使用私有链来构建开发、测试和生产环境。

组织应该创建并托管私有网络,这样他们就能对其拥有完全控制权。在本章的后续部分,我们将了解如何创建自己的私有网络。

联盟网络也是一种私有网络,但与私有网络有所不同。

联盟网络由多个节点组成,每个节点由不同的组织管理。

实际上,没有任何组织能够控制数据和链。然而,数据和链在组织内部共享,这些组织中的每个人都可以查看和修改当前状态。这些网络可以通过互联网访问,也可以通过 VPN 等完全私有的网络访问。

以太坊节点和客户端的实现支持多种语言,包括 Go、C++、Python、JavaScript、Java、Ruby 等。这些客户端的功能和易用性在不同语言之间保持一致,开发​​者应选择自己最熟悉的实现方式。本书使用名为 Geth 的 Go 语言实现,它作为以太坊客户端连接到公共网络和测试网络。它还用于创建私有网络的挖矿节点和 EVM(交易节点)。Geth 是一个用 Go 语言编写的命令行工具,用于在私有链上创建节点和矿工。它也可以安装在 Windows、Linux 和 Mac 系统上。现在,让我们开始安装 Geth 吧。

创建私有ethereum网络的第一步是下载安装geth

https://geth.ethereum.org/downloads

在c盘program files目录下,成功安装了geth.exe
打开cmd,输入geth –help,即可发现go-ethereum命令行界面。

geth是什么?

简明定义(业务化、技术化):
Geth(Go-Ethereum)是以太坊官方提供的、用 Go 语言编写的 Ethereum 节点客户端。它是目前最常用、最成熟的以太坊全节点实现之一,被开发者、矿工、基础设施团队广泛使用。


一、Geth 的核心功能

Geth 本质上是一个“以太坊节点软件”,具备以下能力:

1. 运行以太坊节点(全节点 / 轻节点 / 存档节点)

  • 同步区块
  • 验证交易
  • 执行 EVM 合约
  • 存储状态和链数据

2. 与以太坊网络交互

  • 提供 JSON-RPC API(你在 Web3.js/Ethers.js 连接 RPC 就是连这种 API)
  • 发送交易
  • 查询区块、日志、余额
  • 与钱包系统对接

3. 部署与调试智能合约

虽然开发者更常用 Remix 或 Hardhat 开发合约,但底层还是通过 RPC 调 Geth 的接口。

4. 挖矿(历史功能)

在以太坊升级为 PoS 之前,Geth 也用于 PoW 挖矿。
现在 PoS 已经终止挖矿功能,但历史资料里仍会看到。

5. 运行私链 / 本地链

开发团队常用 Geth 来:

  • 启动企业私链(consortium chain)
  • 在本机跑一个 dev chain(开发链)
  • 自定义链配置(创世块 genesis.json)

二、Geth 在以太坊生态中的位置

你可以把以太坊想像成一个需要数千节点维护的系统,而 Geth 就是其中最主流的节点软件

区块链客户端的主流实现包括:

客户端 语言 特点
Geth (Go-Ethereum) Go 最常用、官方支持最强
Nethermind C# 性能高,在机构中用得多
Erigon Go 快速同步、数据压缩优秀
Besu Java 企业链常用

在主网中,Geth 的节点占比长期约 **40–60%**,甚至曾超过 70%。


三、开发者为什么需要了解 Geth?

即使你做的是 DeFi / Audit / Security / 智能合约开发,也需要知道 Geth 的作用,因为:

1. Blockchain data = 你都从 RPC 拿

你调用的都是:

  • eth_call
  • eth_sendRawTransaction
  • eth_getLogs
  • eth_getBlockByNumber

这些都是 Geth 或其他客户端提供的标准化 RPC。

2. 做 Smart Contract Audit,经常需要了解底层 EVM 行为

例如:

  • 状态树(state trie)如何保存数据
  • Gas 如何计算
  • 日志(logs)怎么从区块读出来
  • 节点是如何验证交易的

这些在 Geth 中都有对应实现逻辑。

3. 做 Research/Security 需要跑本地节点重放交易

例如分析攻击交易,可以用:

1
geth --dev

启动一个临时链进行复现。

4. 做私链、测试链、DevOps 也离不开 Geth


四、你需要“精通 Geth”吗?

如果你目标是 Junior Smart Contract Auditor,你不需要深入读 Geth 源码,但你必须理解:

  • Geth 是什么
  • RPC 是什么
  • 节点如何执行 EVM
  • 为什么会出现节点差异(client diversity)
  • 节点同步模式(snap / full / archive)

理解到这个程度即可。

如果未来做 Protocol Security / Consensus / Client Security,那就需要深入研究 Geth 的内部实现。


五、一句话总结

Geth = 以太坊最主流的节点客户端,用于同步区块、执行合约、提供 RPC 服务、维护以太坊网络运行。

如果你愿意,我可以继续为你讲解:

  • Geth 的 RPC 架构
  • Geth 如何同步区块(snap sync vs full sync)
  • Geth 如何执行 EVM
  • Geth 日志(logs)、状态树(state trie)、存储布局
    你想深入哪个方向?

ChainID

链 ID 1 代表 Homestead 公共网络

链 ID 2 代表 Morden(已不再使用)

链 ID 3 代表 Ropsten

链 ID 4 代表 Rinkeby

链 ID 4 以上的链代表私有网络

Geth 提供了 --testnet 选项用于连接到 Ropsten 网络,以及 --rinkeby 选项用于连接到 Rinkeby 网络。这些选项应与 networkid 命令选项结合使用。

创建私有网络

Geth 安装完成后,可以配置为在本地运行,无需连接到任何互联网网络。

每个链和网络都有一个创世区块,也就是第一个区块。这个区块没有父区块,是链的第一个区块。

需要使用 genesis.json 文件来创建这个第一个区块。

以下代码片段展示了一个 genesis.json 文件的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"mixhash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x200",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xffffffff",
"alloc": {
}
}

需要将 genesis.json 文件传递​​给 Geth 以初始化私有网络。

Geth 节点还需要存储区块链数据和账户密钥。

这些信息也应该在初始化私有网络时提供给 Geth。

以下 geth init 命令使用以下参数初始化节点
genesis.json 文件和目标数据目录位置,用于存储链数据和密钥库信息

geth init “C\myeth\genesis.json” –datadir “C:\myeth\chaindata”

省略输出内容.jpg

运行以后报了一个错Fatal: need genesis.json file as the only argument

把命令改成
geth –datadir “D:\learnSolidity1108” init “D:\learnSolidity1108\genesis.json”

也就是genesis.json放到命令最后,这样就没报错了。

看到最后的successfully wrote就说明命令和genesis.json都成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\Program Files\Geth>geth --datadir "D:\learnSolidity1108" init "D:\learnSolidity1108\genesis.json"
INFO [11-08|21:53:20.377] Maximum peer count ETH=50 total=50
INFO [11-08|21:53:20.415] Set global gas cap cap=50,000,000
INFO [11-08|21:53:20.416] Initializing the KZG library backend=gokzg
INFO [11-08|21:53:20.419] Using pebble as the backing database
INFO [11-08|21:53:20.419] Allocated cache and file handles database=D:\learnSolidity1108\geth\chaindata cache=512.00MiB handles=8192
INFO [11-08|21:53:20.446] Opened ancient database database=D:\learnSolidity1108\geth\chaindata\ancient\chain readonly=false
INFO [11-08|21:53:20.451] Opened Era store datadir=D:\learnSolidity1108\geth\chaindata\ancient\chain\era
INFO [11-08|21:53:20.452] State schema set to default scheme=path
INFO [11-08|21:53:20.452] Load database journal from disk
WARN [11-08|21:53:20.452] Head block is not reachable
INFO [11-08|21:53:20.459] Opened ancient database database=D:\learnSolidity1108\geth\chaindata\ancient\state readonly=false
INFO [11-08|21:53:20.459] State snapshot generator is not found
INFO [11-08|21:53:20.459] Starting snapshot generation root=56e81f..63b421 accounts=0 slots=0 storage=0.00B dangling=0 elapsed=0s
INFO [11-08|21:53:20.459] Initialized path database triecache=16.00MiB statecache=16.00MiB buffer=64.00MiB state-history="last 90000 blocks" journal-dir=D:\learnSolidity1108\geth\triedb
INFO [11-08|21:53:20.460] Resuming snapshot generation root=56e81f..63b421 accounts=0 slots=0 storage=0.00B dangling=0 elapsed="545µs"
INFO [11-08|21:53:20.460] Writing custom genesis block
INFO [11-08|21:53:20.460] Generated snapshot accounts=0 slots=0 storage=0.00B dangling=0 elapsed="545µs"
INFO [11-08|21:53:20.460] Successfully wrote genesis state database=chaindata hash=8da729..3e3e9f

在用创世区块初始化 Geth 节点后(如上图所示),即可启动 Geth。

Geth 默认使用 IPC 协议,并且已启用。

确保 Geth 节点可通过 RPC 协议访问

需要显式提供 RPC 选项。

  1. 要将环境设置为 Geth 节点,请执行以下命令行:

以下命令行:
geth –datadir “C:\myeth\chaindata” –rpc –rpcapi “eth,web3,miner,admin,personal,net” –rpccorsdomain “*” –nodiscover –networkid 15

这条命令又报了两个错
错误一: 从 Geth 1.10+ 版本开始,HTTP-RPC 被 –http 取代,–rpc 会报
flag provided but not defined: -rpc

错误二:
Geth only supports PoS networks. Please transition legacy networks using Geth v1.13.x.
Fatal: Failed to register the Ethereum service: ‘terminalTotalDifficulty’ is not set in genesis block
从 Geth 2.x / v1.14+ 开始,官方客户端只支持 以太坊 PoS(合并后)网络。

你创建的是一个私链 PoW 风格的 genesis(legacy network),里面没有 terminalTotalDifficulty 字段。

所以新版本 Geth 会拒绝启动这种老式私链。

学习 Solidity 已经不一定非要自己部署私有链

完全正确,你说的很对——学习 Solidity 已经不一定非要自己部署私有链了。现代初学者的主流学习方式和 5 年前有明显差异,主要原因是现在有更多工具可以模拟链环境、提供快速部署和调试,而不必自己搭建完整 Geth 节点。

我给你梳理一下现状:


1️⃣ 为什么不必自己部署私有链

  • 旧书推荐:用 Geth/Parity 部署私链,自己挖矿,手动管理账户。

  • 问题

    • Geth 最新版本只支持 PoS,配置复杂。
    • 部署节点、调试 RPC 太麻烦。
    • 学 Solidity 重点是合约逻辑,而不是节点运维。
  • 现代做法:用工具模拟链环境即可,快速部署合约和测试交易。


2️⃣ 初学者常用工具

工具 特点 使用场景
Ganache(桌面或 CLI) 模拟完整链,支持 PoA,开箱即用,RPC 端口可自定义 快速测试合约,练习交易、账户管理
Hardhat Network 内置本地链,可写测试脚本,自动挖矿,模拟交易 单元测试合约、模拟多账户场景、部署脚本
Foundry Rust 编写,轻量快速,可直接写 Solidity 测试 高级测试、Gas 分析、快速部署
Remix IDE 浏览器直接部署合约,支持 JavaScript VM、Injected Web3、Ganache 入门练习,快速验证合约逻辑
Alchemy / Infura / QuickNode 提供测试网 RPC 节点 部署到真实测试网(Goerli、Sepolia),不用管理节点

3️⃣ 学习流程推荐(现代方法)

  1. 写合约

    • RemixVSCode + Hardhat
  2. 测试合约

    • Hardhat NetworkGanache CLI 上运行单元测试。
  3. 部署到测试网

    • Goerli 或 Sepolia 测试网,体验真实部署和交易。
  4. 调试和分析

    • 查看交易、事件、Gas 使用情况。
    • 使用 Hardhat console / Remix debugger

⚡ 重点:你只需要一个可模拟链的环境,真实挖矿和节点管理可以完全忽略,除非你想深入以太坊底层或做节点开发。


4️⃣ 总结

  • 私有链在现代初学者学习中已经不必要,更多用于企业内网或者节点开发实验。

  • 学 Solidity 核心是:

    • 合约语法
    • 单元测试
    • 部署到测试网
    • 与前端或脚本交互
  • 推荐从 Hardhat + Ganache + Remix 组合入手,快速上手。


如果你愿意,我可以帮你画一个 现代 Solidity 初学者完整学习路径图,从写合约到测试网部署,一目了然,而且不用自己搭建 Geth 私链。

你希望我帮你画吗?

那么书里提到了mist和metamask还需要学习吗

完全可以有选择性地学,不必全部掌握,原因如下:


1️⃣ Mist

  • 这是以太坊早期官方钱包和 DApp 浏览器。

  • 现状

    • 已经停止维护多年(2019 年左右就不再更新)。
    • 安全性、兼容性都很差。
    • 现在几乎没人用它做开发或日常测试。
  • 结论不必学习,只需要知道它是以太坊早期的钱包和 DApp 浏览器即可。


2️⃣ MetaMask

  • 目前最主流的浏览器插件钱包,也有移动端。

  • 用途

    • 管理账户和私钥
    • 与 DApp 交互
    • 链上部署和交易测试
  • 结论必须学习

    • 对初学者来说,MetaMask + 测试网就可以完成所有开发和测试需求。
    • 即便用 Hardhat 或 Remix,也可以通过 MetaMask 注入账户完成测试网部署。

⚡ 建议

  • 书里的 Mist 可以忽略,直接学习 MetaMask + Remix / Hardhat / Ganache

  • 学 MetaMask 时重点掌握:

    1. 创建测试账户
    2. 切换测试网(Goerli、Sepolia 等)
    3. 与 Remix 或 Hardhat 连接部署合约
    4. 签署交易和查看事件

如果你愿意,我可以帮你列一个 现代 Solidity 初学者必学工具清单,标明哪些可以跳过,哪些必须掌握,这样你的学习效率会大大提高。

你希望我直接列吗?