本文档解释了节点、账户、交易、区块等基本概念,以及 geth 在以太坊生态系统中的作用。它提供了以太坊执行层核心数据结构和机制的技术概述,将概念理解与 go-ethereum 中的实际代码实现联系起来。有关系统级架构信息,请参阅架构。
Geth(Go Ethereum)是以太坊执行客户端的完整实现。以太坊节点是运行以太坊客户端软件的计算机,通过验证交易、执行智能合约和维护区块链状态来参与以太坊网络。
来源:cmd/geth/main.go276-312 cmd/utils/flags.go256-261 eth/backend.go90-125 eth/downloader/downloader.go p2p/server.go
Geth 可以作为不同类型的节点运行
来源:eth/backend.go90-125 cmd/geth/main.go314-329 eth/ethconfig/config.go76-166
Geth 负责以太坊的执行层,负责
以太坊区块链由一系列区块组成,每个区块都包含修改全局状态的交易。此结构通过几个关键数据类型实现。
以太坊中的区块由 types.Block 结构表示,它封装了区块头和区块体。
来源:core/types/block.go core/blockchain.go core/genesis.go452-459
区块头包含有关区块的元数据,包括
ParentHash:父区块的哈希,构成区块链的“链”Root:执行此区块后状态树的根哈希TxHash:区块交易的 Merkle 根哈希ReceiptHash:收据树的哈希Number:区块编号(链中的高度)Time:区块创建时间戳区块体包含
交易是以太坊中状态转换的机制。types.Transaction 结构是不同交易类型的容器。
来源:core/types/transaction.go core/types/tx_legacy.go core/types/tx_dynamic_fee.go core/txpool/txpool.go
关键交易组成部分
Type:交易类型(Legacy, AccessList, DynamicFee, Blob)To:收款方地址(合约创建时为 nil)Value:转移的 ETH 数量Data:输入数据(简单转账时为空,包含合约部署代码或函数调用数据)Gas:交易可消耗的最大 Gas 单位GasPrice / GasFeeCap / GasTipCap:Gas 定价机制以太坊的状态代表所有账户和合约的当前状态。状态通过称为 StateDB 的结构进行管理。
state.StateDB 是在区块执行过程中跟踪和修改世界状态的核心组件。
来源:core/state/statedb.go core/state/state_object.go core/types/state_account.go core/blockchain.go
StateDB 提供用于以下操作的方法:
在交易执行期间,更改会被应用到内存中的 stateObjects 中,并通过日志记录以备回滚。在区块结束时,更改会被提交到树结构。
状态可以通过交易进行修改,并且这些修改会通过日志机制进行跟踪。
来源:core/state/journal.go core/state/statedb.go core/state_processor.go
对于每个交易,StateDB 会
Snapshot() 创建快照RevertToSnapshot() 恢复到快照Finalise() 完成更改IntermediateRoot() 计算中间状态根Commit()以太坊使用改进型默克尔帕特里夏树 (MPT) 来存储状态、交易、收据和存储数据。这种数据结构提供了高效的数据完整性验证。
来源:trie/trie.go trie/node.go triedb/database.go
每个 Trie 由四种节点组成
Trie 提供
以太坊出于不同目的使用了多种 Trie
来源:trie/trie.go trie/secure_trie.go core/state/statedb.go
Trie 上的关键操作包括
来源:trie/trie.go core/state/statedb.go triedb/database.go
StateTrie 为 Trie 提供了安全的包装器,可以自动对键进行哈希处理,从而防止可能导致深层 Trie 和性能问题的恶意键构造。
交易处理是一个多阶段的过程,会改变系统状态。
来源:core/state_processor.go core/state_transition.go core/types/transaction.go
关键阶段包括
以太坊支持多种交易类型
来源:core/types/transaction.go core/types/tx_legacy.go core/types/tx_dynamic_fee.go params/config.go
以太坊有两种类型的账户,都由 StateAccount 结构表示。
来源:core/state/state_object.go core/state/statedb.go core/types/state_account.go
两种账户类型在状态 Trie 中共享相同的结构,但合约账户具有非空的 code 并且可能有非空的 storage Trie。
以太坊节点需要高效的机制来同步状态。
来源:eth/downloader/downloader.go eth/downloader/statesync.go eth/handler.go eth/ethconfig/config.go52-53
以太坊支持不同的同步策略
同步包括
本页面涵盖了 go-ethereum 的基本概念,重点关注
这些概念构成了以太坊执行层的基础,在 go-ethereum 代码库中实现。理解这些组件对于使用或贡献代码库至关重要。