Skip to content

Commit

Permalink
Update the geth Section
Browse files Browse the repository at this point in the history
  • Loading branch information
hsyodyssey committed Oct 7, 2022
1 parent 74f6229 commit 391f2ea
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 21 deletions.
26 changes: 18 additions & 8 deletions CN/00_geth.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# 00_万物的起点: Geth Start \
# [Chapter_00] 万物的起点: Geth Start

## 什么是Geth?
本章概要:

Geth是基于Go语言开发以太坊的客户端,它实现了Ethereum协议(黄皮书)中所有需要的实现的功能模块,包括状态管理,挖矿,P2P网络通信,密码学,数据库,EVM解释器等。我们可以通过启动Geth来运行一个Ethereum的节点。go-ethereum是包含了Geth在内的一个代码库,它包含了Geth,以及编译Geth所需要的其他代码。在本系列中,我们会深入go-ethereum代码库,从High-level的API接口出发,沿着Ethereum主Workflow,逐一的理解Ethereum具体实现的细节。
1. `go-ethereum`代码库的主要目录结构
2. `geth`客户端是如何启动的。

为了方便区分,在接下来的文章中,我们用Geth来表示Geth的客户端程序,用go-ethereum(geth)来表示go-ethereum的代码库。
## 什么是 geth?

`geth`是以太坊基金会基于Go语言开发以太坊的官方客户端,它实现了Ethereum协议(黄皮书)中所有需要的实现的功能模块。我们可以通过启动`geth`来运行一个Ethereum的节点。`go-ethereum`是包含了geth客户端代码和以及编译geth所需要的其他代码在内的一个完整的代码库。在本系列中我们会通过深入go-ethereum代码库,从High-level的API接口出发,沿着Ethereum主Workflow,逐一的理解Ethereum具体实现的细节。

为了方便区分,在接下来的文章中,我们用`geth`来表示Geth的客户端程序,用go-ethereum(`Geth`)来表示go-ethereum的代码库。

总结的来说:

1. 基于`go-ethereum`代码库中的代码,我们可以编译出`geth`客户端程序。
2. 通过运行`geth`客户端程序我们可以启动一个Ethereum的节点。

### go-ethereum Codebase 结构

Expand All @@ -22,7 +32,7 @@ Geth是基于Go语言开发以太坊的客户端,它实现了Ethereum协议(
- 节点数据同步
- ...

目前,go-ethereum项目的主要目录结构如下所示:
目前,go-ethereum代码库中的主要目录结构如下所示:

```
cmd/ ethereum相关的Command-line程序。该目录下的每个子目录都包含一个可运行的main.go。
Expand Down Expand Up @@ -50,7 +60,7 @@ ethdb/ Ethereum 本地存储的相关实现, 包括leveldb的调用
|── leveldb/ Go-Ethereum使用的与Bitcoin Core version一样的Leveldb作为本机存储用的数据库
miner/
|── miner.go 矿工模块的实现。
|── worker.go 真正的block generation的实现实现,包括打包transaction,计算合法的Block
|── worker.go Block generation的实现实现,包括打包transaction,计算合法的Block
p2p/ Ethereum 的P2P模块
|── params Ethereum 的一些参数的配置,例如: bootnode的enode地址
|── bootnodes.go bootnode的enode地址 like: aws的一些节点,azure的一些节点,Ethereum Foundation的节点和 Rinkeby测试网的节点
Expand All @@ -70,9 +80,9 @@ trie/ Ethereum 中至关重要的数据结构 Merkle Patrica Trie(MPT)的实

### 前奏: Geth Console

当我们想要部署一个Ethereum节点的时候,最直接的方式就是下载官方提供的发行版的geth程序。Geth是一个基于CLI的应用,启动Geth和调用Geth的功能性API需要使用对应的指令来操作。Geth提供了一个相对友好的console来方便用户调用各种指令。当我第一次阅读Ethereum的文档的时候,我曾经有过这样的疑问,为什么Geth是由Go语言编写的,但是在官方文档中的Web3的API却是基于Javascript的调用?
当我们想要部署一个Ethereum节点的时候,最直接的方式就是下载官方提供的发行版的geth客户端程序。`geth`是一个基于CLI的应用,启动`geth`和调用`geth`的功能性API需要使用对应的指令来操作。`geth`提供了一个相对友好的console来方便用户调用各种指令。当我第一次阅读Ethereum的文档的时候,我曾经有过这样的疑问,为什么`geth`是由Go语言编写的,但是在官方文档中的Web3的API却是基于Javascript的调用?

这是因为Geth内置了一个Javascript的解释器*Goja* (interpreter),来作为用户与Geth交互的CLI Console。我们可以在`console/console.go`中找到它的定义。
这是因为`geth`内置了一个Javascript的解释器*Goja* (interpreter),来作为用户与`geth`交互的CLI Console。我们可以在`console/console.go`中找到它的定义。

<!-- /*Goja is an implementation of ECMAScript 5.1 in Pure GO*/ -->

Expand Down
24 changes: 11 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ Blockchain这一概念,最早由中本聪在**比特币白皮书**提出,至
- 剩余的gas又是怎么返还给Transaction Proposer的呢?
- EVM是怎么解释Contract的Message Call并执行的呢?
- 在执行Transaction中是哪个模块,是怎样去修改Contract中的持久化变量呢?
- Smart Contract中的持久化变量又是以什么样的形式存储在什么地方的呢
- 当新的Block加入到Blockchain中时,World State又是何时怎样更新的呢?
- Smart Contract中的持久化变量又是以什么样的形式存储?在什么地方的呢
- 当新的Block更新到Blockchain中时,World State又是何时怎样更新的呢?
- 哪些数据常驻内存,哪些数据又需要保存在Disk中呢?

2. 目前的Blockchain系统并没有像数据库系统(DBMS)那样统一的形成系统性的方法论。在Ethereum中每个不同的模块中都集成了大量的细节。从源码的角度出发可以了解到很多容易被忽视的细节。简单的说,一个完整的区块链系统至少包含以下的模块:
Expand All @@ -66,17 +66,17 @@ Blockchain这一概念,最早由中本聪在**比特币白皮书**提出,至
- [02_State Management i: StateDB](CN/02_state_management_statedb.md)
- [03_State Management ii: World State Trie and Storage Trie](CN/03_state_management_stateTrie.md)
- [04_Transaction: 一个Transaction的生老病死](CN/04_transaction.md)
- [05_从Block到Blockchain: 链状区块结构的构建](CN/05_block_blockchain.md)
- [05_从Block到Blockchain](CN/05_block_blockchain.md)
- [06_一个网吧老板是怎么用闲置的电脑进行挖矿的]
- [07_一个新节点是怎么加入网络并同步区块的]

### PART TWO - General Source Code Analysis: Lower-level Services

- [10_状态数据优化: Batch and Pruning]
- [10_State数据优化: Batch and Pruning]
- [11_Blockchain的数据是如何持久化的: Leveldb in Practice]
- [12_当I/O变成瓶颈: Caching in Practice]
- [13_深入EVM: 设计与实现]
- [14_Signer: 如何证明Transaction的合法性]
- [14_Signer: 如何保证Transaction的合法性]
- [15_节点的调用 RPC and IPC](CN/15_rpc_ipc.md)

### PART THREE - Advanced Topics~P
Expand Down Expand Up @@ -133,20 +133,18 @@ Blockchain这一概念,最早由中本聪在**比特币白皮书**提出,至
## Some Details

- 以太坊是基于State状态机模型的区块链系统,交易的结果会直接更新到账户的状态上。因此,Miner在生成新的区块的时候,会直接调用EVM中增加余额的函数,添加区块奖励给自己。因此,与Bitcoin不同的是,Ethereum的区块中,并没有额外增加Coinbase的transaction。
- 在core/transaction.go 中, transaction的的数据结构是有time.Time的参数的。但是在下面的newTransaction的function中只是使用Local的time.now()对Transaction.time进行初始化。
- 在core/transaction.go 的transaction 数据结构定义的时候, 在transaction.time 后面的注释写到(Time first seen locally (spam avoidance), Time 只是用于在本地首次看到的时间。
- uncle block中的transaction 不会被包括到主链上。
- go-ethereum有专用函数来控制每次transaction执行完,返还给用户的Gas的量。有根据EIP-3529,每次最多返还50%的gas.
- 不同的Contracts的数据会混合的保存在底层的一个LevelDB instance中。
- LevelDB中保存的是MPT的Node信息,包括State Trie和Storage Trie。
- 在以太坊更新数据相关的工作流中,通常先调用`Finalise`函数,然后执行`Commit`函数。
- 在core/transaction.go 中, transaction的数据结构是包含了一个time.Time类型的成员变量的。在后续创建一个新的Transaction的newTransaction函数中,只使用Local time(`time.now()`)对Transaction.time进行初始化。
- uncle block中打包的transaction 不会被更新到包含该叔块的主链区块中。
- 不同的合约中的数据会混合的保存在底层的同一个LevelDB instance中。
- LevelDB中保存的KV-Pair是MPT的Node信息,包括State Trie和Storage Trie。
- 在以太坊更新数据的工作流中,通常先调用`Finalise`函数,然后执行`Commit`函数。


### Blockchain System (BCS) VS Database Management System (DBMS)

Blockchain 系统在设计层面借鉴了很多数据库系统中的设计逻辑。

- Blockchain系统同样也从Transaction作为基本操作的载体,包含一个Parser模块,Transaction Executor模块,和一个Storage 管理模块
- Blockchain系统同样也从Transaction作为基本操作的载体,包含一个Parser模块,Transaction Executor模块,和一个Storage管理模块

## 关键函数

Expand Down

0 comments on commit 391f2ea

Please sign in to comment.