跳到主要内容
Web3 前端面试题库
返回题库
中级Web3 基础概念题

Ethereum 账户的四个状态字段

说明账户状态由哪四个字段组成、各自代表什么,以及前端读取这些字段的方式与常见误区。

题目

页面需要展示某个地址的概况:余额、是否有代码、交易次数。请说明这些信息在链上对应哪些字段,以及为什么不宜用其中某个字段单独判断「这是一个活跃用户」。

考察目标

  • 账户状态的四个字段与各自含义。
  • 两类账户在 nonce 语义上的差异。
  • 读取字段所对应的 JSON-RPC 方法。
查看参考答案包含简要回答、深入分析、常见错误与评分标准

30 秒回答

链上账户的状态由 nonce、balance、codeHash 与 storageRoot 四个字段组成。nonce 是账户级计数器:EOA 发起交易会增加它,EIP-7702 的有效授权也可能增加它;新合约账户的 nonce 初始为 1,之后创建合约也会增加。它不能直接当成交易次数或活跃度。codeHash 标识代码哈希,storageRoot 是存储根哈希。实现差异与工程取舍见深入回答。

深入回答

  • 【协议保证】账户状态包含 nonce、balance、codeHash 与 storageRoot 四个字段(依据:Yellow Paper §4.1 World State)。
  • 【协议保证】nonce 是账户状态中的计数器。EOA 作为交易发送者时会递增,EIP-7702 的有效授权也会使 authority 的 nonce 递增;新合约账户在初始化代码执行前把 nonce 设为 1,之后创建合约时继续递增。因此它不等于「已发送交易数」或「创建合约数」(依据:Yellow Paper §4.1 World State、EIP-161 §Specification、EIP-7702 §Specification)。
  • 【协议保证】balance 表示账户持有的原生资产数量,以 wei 为单位记账(依据:Yellow Paper §4.1 World State)。
  • 【协议保证】codeHash 指向账户代码的哈希;没有代码的账户对应空内容的哈希(依据:Yellow Paper §4.1 World State)。
  • 【协议保证】storageRoot 是账户存储数据的根哈希(依据:Yellow Paper §4.1 World State)。
  • 【协议保证】账户字段可以分别通过 JSON-RPC 方法读取:余额、交易计数、代码与存储各有对应方法(依据:EIP-1474 §eth_getBalance、§eth_getTransactionCount、§eth_getCode、§eth_getStorageAt)。
  • 【工程经验】拼出一个地址的概况需要多次读取或批量请求,按账户与链维度缓存结果可以减少重复请求(依据:工程经验,无规范依据)
  • 【工程经验】把 eth_getTransactionCount 的结果大于零当成「活跃用户」的判据并不成立:合约创建与 7702 授权都可能让 nonce 非零,且该计数不反映行为时间(依据:EIP-161、EIP-7702;工程经验)。

常见错误

  • 把 storageRoot 理解为可以直接还原出账户的完整存储内容(依据:ethereum.org Accounts §An account examined 对存储根的说明)
  • 认为节点为每个账户维护一个可变对象,并且可以一次取回四个字段(依据:ethereum.org JSON-RPC 的方法划分)
  • 用交易计数大于零判断地址是活跃用户(依据:工程经验,无规范依据)
  • 用普通数值类型承载余额,忽略 wei 的量级(依据:工程经验,无规范依据)
  • 忽略合约账户与外部拥有账户在 nonce 语义上的差异(依据:ethereum.org Accounts §An account examined)

面试官追问

  1. 想展示一个地址的概况,最少需要发起哪些读取?
  2. 为什么读到的存储根不能让前端直接还原出该账户的存储?
  3. 对使用代理模式的合约,读状态与读逻辑分别要注意什么?
  4. 合约账户的 nonce 与外部拥有账户不同,这对前端展示有什么影响?

评分标准

初级回答

  • 能列出四个字段并说出各自含义。
  • 知道余额以 wei 记账。

中级回答

  • 能区分两类账户的 nonce 语义。
  • 知道读取不同字段对应不同的读取方法。

高级回答

  • 能设计账户概况的批量读取与缓存方案。
  • 能说明代理合约与委托场景下读取目标选择的边界。

参考资料

发现这道题有问题? 反馈此题