Geth 源码系列:Geth 整体架构
源码版本:https://github.com/ethereum/go-ethereum/commit/c8a9a9c0917dd57d077a79044e65dbbdd421458b
以太坊在进行 The Merge 升级之前,以太坊只有一个客户端,这个客户端及负责交易的执行,也会负责区块链的共识,保证区块链以一定的顺序产生新的区块。在 The Merge 升级之后,以太坊客户端分为了执行层和共识层,执行层负责交易的执行、状态和数据的维护,共识层则负责共识功能的实现,执行层和共识层通过 API 来通信。执行层和共识层有各自的规范,客户端可以使用不同的语言来实现,但是要符合对应的规范,其中 Geth 就是执行层客户端的一种实现。当前主流的执行层和共识层客户端有如下实现:
Nethermind:由 Nethermind 团队开发和维护,使用 C# 语言开发,早期获以太坊基金会和 Gitcoin 社区资助
Lighthouse:由 Sigma Prime 团队维护,使用 Rust 语言开发,主打高性能和企业级安全,适用于高负载场景 执行层负责执行交易以及维护交易执行之后的状态,共识层负责选择哪些交易来执行。EVM 则是这个状态机中的状态转换函数,函数的输入会来源于多个地方,有可能来源于共识层提供的最新区块信息,也有可能来源于 p2p 网络下载的区块。 存储:负责 state 以及区块等数据的存储
如果是已经同步到最新状态的节点,那么就会持续通过 Engine API 从共识层获取到当前最新产出的区块,并验证区块,然后通过 EVM 执行区块中所有的交易来更新状态数据库,并将区块写入本地链
在 API 的下一层就核心功能的实现,包括交易池、交易打包、产出区块、区块和状态的同步等等。这些功能再往下就需要依赖更底层的能力,比如交易池、区块和状态的同步需要依赖 p2p 网络的能力,区块的产生以及从其他节点同步过来的区块需要被验证才能写入到本地的数据库,这些就需要依赖 EVM 和数据存储的能力。
type Node struct { eventmux *event.TypeMux config *Config // 账户管理器,负责管理钱包和账户 accman *accounts.Manager log log.Logger keyDir string keyDirTemp bool dirLock *flock.Flock stop chan struct{} // p2p 网络实例 server *p2p.Server startStopLock sync.Mutex // 跟踪节点生命周期状态(初始化、运行中、已关闭) state int lock sync.Mutex // 所有注册的后端、服务和辅助服务 lifecycles []Lifecycle // 当前提供的 API 列表 rpcAPIs []rpc.API // 为 RPC 提供的不同访问方式 http *httpServer ws *httpServer httpAuth *httpServer wsAuth *httpServer ipc *ipcServer inprocHandler *rpc.Server databases map[*closeTrackingDB]struct{} }计算:EVM
devp2p在 p2p/enode/node.go 中的 Node 结构代表了 p2p 网络中一个节点,其中 enr.Record 结构中存储了节点详细信息的键值对,包括身份信息(节点身份所使用的签名算法、公钥)、网络信息(IP 地址,端口号)、支持的协议信息(比如支持 eth/68 和 snap 协议)和其他的自定义信息,这些信息通过 RLP 的方式编码,具体的规范在 eip-778 中定义:
计算:EVM
在 p2p/enode/node.go 中的 Node 结构代表了 p2p 网络中一个节点,其中 enr.Record 结构中存储了节点详细信息的键值对,包括身份信息(节点身份所使用的签名算法、公钥)、网络信息(IP 地址,端口号)、支持的协议信息(比如支持 eth/68 和 snap 协议)和其他的自定义信息,这些信息通过 RLP 的方式编码,具体的规范在 eip-778 中定义:





