在探索以太坊这个复杂的区块链生态系统时,一个核心且基础的概念是“以太坊全球状态”(Ethereum Global State),它如同以太坊世界的“操作系统”或“共享内存”,记录了网络中所有账户、合约代码以及相关数据的实时快照,理解以太坊全球状态,是深入把握以太坊如何运作、智能合约如何执行以及价值如何转移的关键。
什么是以太坊全球状态?
以太坊全球状态是一个庞大的数据结构,它存储了在特定时间点,以太坊区块链上所有有价值的信息,这个“状态”是动态变化的,每当网络中发生新的交易或新的区块被确认时,状态就会随之更新,它主要由以下两部分组成:
-
账户状态(Account States):这是全球状态的核心组成部分,以太坊账户分为两类:
- 外部账户(Externally Owned Accounts, EOAs):由用户通过私钥控制的账户,用于发送交易、持有以太币(ETH)和代币,每个EOA都有地址、余额、nonce(交易计数器)等状态信息。
- 合约账户(Contract Accounts):由智能代码控制的账户,不能主动发起交易,只能响应来自EOA或其他合约账户的交易调用,每个合约账户除了地址、余额、nonce外,还包含其存储的代码(Code)和存储数据(Storage)。
-
存储状态(Storage State):特指合约账户中存储的数据,这些数据是合约在执行过程中读写的数据,例如一个代币合约中每个用户的代币余额,一个去中心化应用(DApp)中的用户设置等,合约的存储是持久化的,但修改它需要消耗Gas。
以太坊全球状态如何运作与更新?
以太坊全球状态的更新机制与区块链的出块过程紧密相连:
- 初始状态:在每个新区块开始构建时,以太坊客户端会从上一个区块的最终状态(称为“状态根”State Root)出发,加载当前的全局状态。
- 交易执行:矿工或验证者(在PoS后)会打包并执行区块中的交易,每笔交易都会改变一个或多个账户的状态。
- 一笔转账交易会改变发送方和接收方的余额,并增加双方的nonce。
- 一笔调用智能合约的交易可能会改变合约账户的存储数据,或者创建新的合约(从而新增一个合约账户状态)。
- 状态转换:每笔交易执行的过程,本质上就是一次“状态转换”(State Transition),以太坊虚拟机(EVM)是执行这些状态转换的引擎,它根据交易输入和当前状态,计算出新的状态。
- 状态根(State Root):在所有交易执行完毕后,整个全球状态会被“哈希”成一个唯一的固定长度的字符串,即状态根,这个状态根被打包进区块头中,成为区块的标识之一。
- 状态确认:当新区块被网络共识机制确认后,该区块中描述的状态就成为新的“全球状态”,并成为后续区块构建的起点,旧的全球状态则被历史记录保留,可以通过状态访问机制(如快照或历史数据服务)查询。
状态树(Merkle Patricia Trie)—— 高效存储与验证的基石
为了高效地存储和验证庞大的全球状态,以太坊采用了Merkle Patricia Trie(MPT,默克尔帕特里夏前缀树)这种数据结构。
- 状态树(State Trie):以账户地址为键,账户状态(包括余额、nonce、代码哈希、存储根)为值,构建的MPT,状态根就是状态树的根哈希。
- 存储树(Storage Trie):每个合约账户都有自己的存储树,以存储键为键,存储值为值,构建的MPT,合约账户状态中的“存储根”就是其对应存储树的根哈希。
- 交易树(Transactions Trie)和收据树(Receipts Trie):分别存储区块中的交易信息和交易执行后的收据信息。
MPT的优势在于:
- 高效查询
