以太坊,作为全球第二大加密货币平台和最具智能合约功能的区块链之一,其强大的功能和灵活性很大程度上源于其精心设计的底层基本数据结构,这些数据结构不仅是存储和组织数据的方式,更是支撑以太坊去中心化应用、虚拟机执行、状态管理以及共识机制的核心基石,本文将深入分析以太坊中最关键的基本数据结构,包括区块、交易、账户状态、Merkle Patricia Trie(MPT)以及RLP编码,揭示它们如何共同构建起以太坊的坚实基础。
区块(Block):区块链的基本单元
与比特币类似,以太坊也是一个基于区块链的系统,而区块是区块链的基本构建单元,每个区块都包含了一系列交易、区块头以及与前一个区块的链接信息。
- 区块头(Block Header):这是区块的核心元数据,包含了以下关键字段:
- 父区块哈希(Parent Hash):指向前一个区块的哈希值,形成链式结构。
- 叔块哈希(Uncle Hash):指向被包含在当前区块但未正常进入主链的“叔块”(Uncles)的哈希列表,用于处理网络延迟和分叉,增强安全性。
- Coinbase地址(Coinbase/Creator Address):区块打包者的接收奖励地址。
- 状态根(State Root):指向当前区块执行完毕后,整个以太坊状态的MPT根哈希,这是连接区块和全局状态的桥梁。
- 交易根(Transactions Root):指向当前区块中所有交易组成的MPT的根哈希。
- 收据根(Receipts Root):指向当前区块中所有交易执行后产生的收据(Receipts)组成的MPT的根哈希,收据包含了交易执行结果、日志等信息,对DApp开发者至关重要。
- 日志布隆过滤器(Logs Bloom Filter):一种空间效率高的概率性数据结构,用于快速判断某个地址或主题的日志是否存在于当前区块的收据中。
- 难度(Difficulty):当前区块的挖矿难度,影响挖矿所需的计算量。
- 数字(Number):区块高度,即该区块在链中的位置。
- 时间戳(Timestamp):区块创建的时间戳。
- 混合值(Mix Hash):与Nonce一起用于证明工作量。
- Nonce(Nonce):一个矿工为了满足难度要求而不断尝试的值,与Mix Hash共同证明区块的有效性。
区块头的设计确保了区块的不可篡改性,因为任何对区块内数据的修改都会导致区块头哈希的变化,从而破坏链的连续性。
交易(Transaction):状态变更的驱动者
交易是以太坊中状态变更的唯一驱动力,无论是转账还是执行智能合约,都需要通过交易来发起,以太坊的交易数据结构包含以下主要部分:
- 接收方地址(Recipient Address,
to):- 如果是普通转账,这里是接收方的地址。
- 如果是合约创建交易(Contract Creation),这里是
null。
- 发送方地址(Sender Address,
from):由签名者(Signer)的公钥派生得出,即发起交易的账户。 - 值(Value):交易发送的以太币数量,单位是Wei(1 ETH = 10^18 Wei)。
- 费用(Gas):
- Gas Price:发送方愿意为每单位Gas支付的价格。
- Gas Limit:发送方愿意为该交易支付的最大Gas量,用于限制交易执行的计算资源消耗。
- 数据(Data):
- 对于合约创建交易,通常是初始化合约的字节码。
- 对于调用合约的交易,是函数调用和参数的编码(通常使用ABI规范)。
- 对于普通转账,通常为空。
- Nonce:发送方账户发出交易的数量,用于防止重放攻击并确保交易顺序。
- V, R, S:签名值,用于验证交易发送方的身份和完整性,它们是由发送方使用其私钥对交易哈希(除V,R,S外的部分)进行签名后生成的。
交易被矿工打包进区块,并由以太坊虚拟机(EVM)执行,从而改变以太坊的全局状态。
账户(Account):状态的基本单位
以太坊的状态由一系列账户组成,账户分为两类:
- 外部账户(Externally Owned Account, EOA):
- 由私钥控制,可以主动发起交易。
- 包含的字段:
balance(余额)、nonce(交易计数器)、codeHash(代码哈希,对于EOA是其空字符串的哈希)。
- 合约账户(Contract Account):
- 由代码控制,不能主动发起交易,只能被交易或其他合约调用触发。
- 包含的字段:
