在区块链的世界里,“记账”是核心概念之一,如果说比特币的记账模型相对简单,更像一个分布式的、公开的“账本”,记录着UTXO(未花费的交易输出)的流转,那么以太坊的记账模型则更为复杂和强大,它构建了一个支持智能合约的、动态的“世界计算机”的底层基础,以太坊采用的是账户模型(Account Model),这与比特币的UTXO模型有着本质的区别。

核心基石:账户(Accounts)

以太坊的记账模型围绕“账户”这一核心概念展开,每个账户都有一个唯一的地址,是以太坊网络中价值存储和智能合约执行的主体,账户主要分为两类:

  1. 外部账户(Externally Owned Accounts, EOAs)

    • 这是由用户通过私钥控制的账户,类似于我们日常使用的银行账户。
    • 特点:没有关联的代码,其状态变化完全由用户通过交易发起。
    • 功能:可以发送以太币(ETH)、发起智能合约交互、部署新的智能合约等。
    • 每个EOA都有一个nonce值,这是一个递增的计数器,用于防止重放攻击并确保交易的顺序性。
  2. 合约账户(Contract Accounts)

    • 这是由智能代码控制的账户,其代码部署在以太坊区块链上。
    • 特点:包含关联的智能合约代码,其状态变化由交易或来自其他合约的调用触发。
    • 功能:可以存储数据(在合约状态变量中)、接收ETH、执行逻辑运算、与其他合约交互等。
    • 合约账户也有nonce值,主要用于记录其创建的合约数量(对于创建合约的交易)或确保交易的顺序性。

账户的构成:状态(State)

每个账户(无论是EOA还是合约账户)都包含以下关键状态信息:

  • Nonce
    • 对于EOA:该账户已发送的交易数量。
    • 对于合约账户:该账户已创建的合约数量(当合约通过CREATE指令创建时)。
  • 余额(Balance)

    账户中持有的以太币(ETH)数量,以“wei”为最小单位(1 ETH = 10^18 wei)。

  • 存储(Storage)
    • 仅合约账户拥有,这是一个持久化的数据存储区域,用于保存合约的状态变量,存储在以太坊的“世界状态”(World State)中,修改存储需要消耗大量的Gas。
  • 代码(Code)
    • 仅合约账户拥有,这是部署在合约账户中的智能合约字节码,当合约账户被调用时,这部分代码会被EVM(以太坊虚拟机)执行。

核心载体:世界状态(World State)

以太坊的记账模型不仅仅是记录单个账户的变化,而是维护一个全局的、动态的“世界状态”,世界状态可以理解为一个键值对数据库,

  • 键(Key):账户地址(160位整数)。
  • 值(Value):该账户对应的上述状态信息(Nonce、Balance、Storage根哈希、代码哈希)。

这个“世界状态”是实时更新的,每当一笔交易被成功执行并打包进区块,世界状态就会相应地发生变化,当Alice向Bob转账1 ETH时:

  1. Alice的账户余额减少1 ETH,Nonce值加1。
  2. Bob的账户余额增加1 ETH,Nonce值加1。
  3. 世界状态数据库中Alice和Bob的账户记录被更新。

状态转换:交易的驱动

以太坊的记账过程是通过随机配图