以太坊作为全球第二大区块链平台,其账户余额查询是用户与开发者最常接触的操作之一,无论是钱包应用、DeFi协议还是区块链浏览器,获取以太坊余额都是核心功能之一,看似简单的“查询余额”背后,涉及以太坊的账户模型、状态存储、节点通信等多层技术原理,本文将从底层机制出发,详细拆解以太坊余额获取的完整流程。

核心基础:以太坊的账户模型与状态存储

要理解余额获取原理,首先需明确以太坊的账户模型,与比特币的UTXO模型不同,以太坊采用账户模型(Account Model),每个账户分为两类:

  1. 外部账户(Externally Owned Account, EOA):由用户私钥控制,用于发起交易、持有资产(如ETH和ERC-20代币)。
  2. 合约账户(Contract Account):由代码控制,用于执行智能合约逻辑,不能主动发起交易。

两类账户的核心区别在于:EOA没有代码,仅通过nonce(交易序列号)、balance(余额)、storageRoot(合约存储根,仅合约账户有效)和codeHash(代码哈希,仅合约账户有效)四个字段存储状态;而合约账户在此基础上增加了代码执行能力。

余额(Balance)是EOA账户状态中最核心的字段之一,记录了该账户持有的ETH数量(以“wei”为单位,1 ETH = 10^18 wei),在以太坊区块链中,所有账户的状态共同构成了状态树(State Tree),而状态树又是更上层世界状态(World State)的一部分。

状态树的层级结构:余额如何“存”在链上

以太坊的状态数据通过Merkle Patricia Trie(MPT,梅克尔帕特里夏树)结构存储,这种设计既能高效查询,又能保证数据完整性,状态树的层级关系如下:

  1. 世界状态树(World State Tree):以太坊的“顶层字典”,key是账户地址(20字节),value是该账户的状态根(即状态树的根哈希)。
  2. 账户状态树(Account State Tree):每个账户对应一棵MPT,存储账户的四个字段(noncebalancestorageRootcodeHash)。balance作为叶子节点直接存储在账户状态树中。
  3. 存储树(Storage Tree):仅合约账户使用,存储合约的变量状态;EOA账户的storageRoot为空。
  4. 合约代码树(Code Tree):存储合约的字节码,codeHash是其根哈希。

一个EOA账户的余额存储路径为:世界状态树 → 账户状态树 → 随机配图