本文档介绍了 go-ethereum 中以太坊客户端的必要内部系统。这些组件协同工作,实现了核心区块链功能,包括区块管理、状态转换、交易处理和共识操作。
有关用户界面和 API 的信息,请参阅 用户界面。有关网络和点对点功能的信息,请参阅 网络。有关智能合约执行的详细信息,请参阅 智能合约执行。
go-ethereum 客户端围绕几个核心组件构建,每个组件负责以太坊协议实现的特定方面。这些组件紧密集成,并通过明确定义的接口进行通信,以维护区块链的一致性和性能。
核心组件交互流程
来源:core/blockchain.go1-486 core/state/statedb.go1-194 miner/worker.go core/txpool/
核心组件遵循分层架构,每个组件都有特定的职责和与其他组件交互的清晰接口。
核心组件的分层架构
来源:core/blockchain.go225-293 core/state/statedb.go79-158 core/headerchain.go57-70 trie/secure_trie.go63-69
BlockChain 结构体在 core/blockchain.go239-293 中充当管理规范区块链的中央组件。它负责区块插入、验证、重组和维护当前链状态。
主要职责
StateDB 协调以进行状态转换BlockChain 组件结构
来源:core/blockchain.go225-293 core/blockchain.go295-486 core/blockchain.go1500-1600
状态管理系统围绕 StateDB 结构体展开,该结构体在 core/state/statedb.go79-158 中,它提供了以太坊状态树的缓存层。它管理账户余额、nonce、合约代码和存储。
StateDB 维护几个重要的数据结构
stateObjects:账户对象的内存缓存stateObjectsDestruct:跟踪块内已删除的账户mutations:记录用于提交操作的账户更改trie:底层的 Merkle Patricia TrieStateDB 内部结构
来源:core/state/statedb.go79-158 core/state/state_object.go47-86 core/state/statedb.go580-637 core/state/state_object.go47-86
单个以太坊账户由 stateObject 结构体表示,位于 core/state/state_object.go47-86 中。每个状态对象跟踪:
来源:core/state/state_object.go47-86 core/state/state_object.go153-208 core/state/state_object.go275-362
以太坊状态的加密基础建立在 Merkle Patricia Trie(默克尔帕特里夏树)之上,该树实现在 trie/trie.go39-60。该 Trie 系统为存储账户和合约存储提供了认证数据结构。
Trie 系统架构
StateTrie 在 trie/secure_trie.go63-69 包装了基础 Trie,并进行键哈希处理以确保安全,从而保证所有键都经过 Keccak256 哈希处理,以防止长路径攻击。
来源: trie/trie.go39-60 trie/secure_trie.go63-69 trie/node.go trie/committer.go
核心组件在区块处理和状态转换期间协同工作
核心组件处理流程
此序列展示了区块如何在系统中流动,每个组件执行其专业角色,同时通过状态数据库和底层 Tries 结构维护一致性。
来源: core/blockchain.go1500-1600 core/state_processor.go core/state/statedb.go778-915 trie/trie.go580-650
核心组件构成了一个协调一致的系统,其中:
BlockChain 协调整体区块处理和链管理StateDB 提供高效的状态访问和修改跟踪stateObject 实例代表单个账户状态每个组件在实现完整的以太坊协议规范时,都维护着自己的缓存和优化策略。
来源: core/blockchain.go1-486 core/state/statedb.go1-1000 core/state/state_object.go1-580 trie/trie.go1-700