MSTR Cat

区块链/等级 VII · 演进/7.1 以太坊:世界计算机/课程 2

账户与全局状态

从独立的硬币到单一的、可变化的全球状态

材料以太坊黄皮书(G. Wood著)维塔利克·布特林的以太坊白皮书(2013/2014年)访问 Etherscan 或其他以太坊区块浏览器

好奇

  1. 为何将财富视为一系列未使用的输出物来追踪,会使得编写通用程序变得困难?
  2. 如果允许任何交易读取和写入整个网络的存储,会带来怎样的机械性后果?
  3. 与 UTXO 集模型相比,基于账户的模型如何改变历史记录验证的成本?

探索

  1. 比特币的价值由未花费的交易输出,即UTXO来体现。每笔交易都会消耗特定的输入并生成新的输出;验证过程仅检查被花费的代币(参见2.2.1节)。这种模型是本地化的、离散的。而由维塔利克·布特林及加文·伍德等联合创始人于2015年7月推出的以太坊则采用基于账户的状态机模型。每个地址都拥有一个余额,该余额会实时更新。整个网络的历史信息被压缩为一个全局状态对象,其中包含所有账户的当前余额以及所有已部署合约的存储信息。
  2. 在该模型中,存在两种账户类型:由私钥控制的个人账户,以及由代码控制的合约账户。个人账户负责发起交易,而合约仅在被调用时才会执行相应逻辑。状态转换函数会根据当前的全局状态和交易信息来生成新的全局状态。由于所有节点都会从相同的起点出发以确定性方式计算状态转换,因此无需信任即可达成共识。这种结构使得通用计算成为可能,因为任何账户都可以在其存储空间中保存任意数据。
  3. 账户模型的表达能力使得去中心化交易所和借贷协议等复杂应用成为可能。一个合约可以承载数十亿的价值,并根据全局状况执行复杂的逻辑操作。然而,这种强大功能也带来了脆弱性——由于状态是可变且被共享的,某个合约代码中的缺陷就可能导致其全部资金损失或关联合约损坏。2016年6月发生的The DAO黑客攻击事件中利用的就是重入漏洞,这一案例展示了局部缺陷如何影响全局状态,进而促使社区发起分叉行动。
  4. 状态的增长是这种设计固有的结果。比特币的UTXO集合也会不断增长,但每条记录的数据量都很小,并且在被使用后会立即被删除;而以太坊的合约存储则会持续累积数据。每次`SSTORE`操作都会添加数据,这些数据会永久保留,除非被手动清零(而这同样需要消耗Gas)。这种无限制的增长使得运行全节点在磁盘空间和内存需求方面压力越来越大。为了验证交易,节点必须保存整个全局状态,这就导致了计算能力与验证成本之间的权衡。
  5. 以太坊黄皮书将此定义为一种确定性状态转换函数。EVM在堆栈机模式下处理指令,诸如`ADD`或`SLOAD`之类的操作会修改本地执行环境,同时可能更新全局账户存储。这种架构具备图灵完备性,但需要消耗“气”值才能确保程序正常终止。每项操作都会消耗气值,从而避免无限循环,并将单笔交易的计算成本控制在区块允许的气值范围内。
  6. 打开如 Etherscan 这样的区块浏览器,查看最近的合约交互记录。在合约页面的“存储”选项卡中,可以看到构成账户持久状态的关键值对。注意每次涉及该地址的交易之后这些数值是如何变化的。这一视图展现了全球状态的真实面貌:代码不仅会被执行,还会被存储下来,其数据会在多次交易之间持续存在,并随时间不断积累。

关键事实

  • 以太坊采用基于账户的模式,余额会直接在账户中更新,这与比特币的UTXO系统不同。
  • 全局状态包含所有的账户余额和合约存储信息,所有交易都可以读取或修改这些信息。
  • 合约账户由代码控制,而外部拥有的账户则由私钥控制。
  • 由于合约存储会永久存在,节点的硬件需求不断上升,因此状态空间的增长是无限的。
  • 由于全局状态的可变性,智能合约中的一个小错误就可能导致其全部资金被耗尽。
  • EVM在每个节点上都以确定性方式运行,通过一致的状态转换来实现共识。

练习 九、六、三、一

9收集列出比特币的UTXO模型与以太坊的基于账户的状态机在数据结构、验证范围以及存储增长方面的9个具体差异。
6归类将这9个项目分为6类:数据持久性、计算复杂度、安全影响、节点资源消耗、共识机制以及开发者体验。
3提炼将这6个分类归结为3个核心原因,即为何该账户模型能够实现通用计算,但代价是状态大小会增加。
1凝结可变的全球状态使得合约之间能够实现复杂的交互,而这在 UTXO 系统中是难以实现的。

事实核查

日期、数字及数据均依据下方列出的已发表资料进行核实。

在互动学院中打开 →

EN PT ES JA KO RU DE FR MS