在以太坊区块链中,账号(Account) 是一切经济活动与交互的基础,它类似于现实世界中的“银行账户”或“数字身份”,记录了用户的资产状态、交易权限和链上行为,与比特币基于UTXO(未花费交易输出)的账户模型不同,以太坊采用账户余额模型,每个账号都拥有独立的数据结构,支撑着智能合约、代币转账、DeFi交互等复杂功能,本文将深入拆解以太坊账号的数据结构,揭示其核心组成与运行逻辑。

以太坊账号的两大类型

以太坊的账号分为两类,其数据结构与功能存在显著差异:

外部拥有账号(Externally Owned Account, EOA)

由用户通过私钥控制,无需部署智能代码,是普通用户进行交易、交互的主要入口,用户用MetaMask创建的账号即为EOA。

合约账号(Contract Account)

由智能合约代码控制,没有私钥,其行为由部署时传入的代码和触发交易的交易数据决定,DeFi协议(如Uniswap)或代币合约(如USDT)都属于合约账号。

EOA账号的核心数据结构

EOA的数据结构简洁但关键,存储在以太坊的状态树(State Trie)中,主要包含以下字段:

nonce(序列号)

  • 作用:防止重放攻击(Replay Attack),即同一笔交易被重复执行。
  • 逻辑
    • 每笔交易发送后,发送方EOA的nonce会自动+1;
    • 接收方EOA的nonce仅在创建合约时使用(初始值为1,合约创建后变为nonce+1)。
  • 示例:若账号A的nonce为5,下一笔合法交易的nonce必须为5,否则交易会被节点拒绝。

balance(余额)

  • 作用:存储账号持有的以太币(ETH)数量,单位为“wei”(1 ETH = 10¹⁸ wei)。
  • 逻辑
    • 通过transfersend等交易向其他账号转账时,发送方balance减少,接收方balance增加;
    • 合约账号的balance还可记录通过selfdestruct销毁合约时转ETH的金额。

storageRoot(存储根)

  • 作用:指向合约账号的存储树(Storage Trie)根哈希,仅对合约账号有效,EOA此字段为空。
  • 逻辑
    • 合约账号的存储数据(如变量值)以键值对形式存储在存储树中;
    • 每次修改存储数据时,存储树会重新计算根哈希并更新storageRoot

codeHash(代码哈希)

  • 作用:存储账号代码的哈希值,仅对合约账号有效,EOA此字段为空。
  • 逻辑
    • EOA的codeHash为空字符串的哈希值(即c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    • 合约账号的codeHash是其部署代码的Keccak-256哈希,用于验证代码完整性。

合约账号的特殊数据结构

合约账号在EOA的基础上,增加了代码(Code)存储(Storage)两部分,使其具备可编程性:

code(智能合约代码)

  • 组成:由EVM(以太坊虚拟机)可执行的字节码(Bytecode)组成,定义了合约的业务逻辑(如转账、投票等)。
  • 存储位置随机配图