Blockchain 为什么记录的是 State,而不只是交易

打开钱包时,余额几乎会立刻显示出来。很多人会自然地以为:区块链上一定直接保存着“某个地址现在有多少币”,所以钱包只是把这个数字读出来。

但区块链最初给人留下的印象,往往又是一串交易记录:谁在什么时候转给谁多少币。于是问题就出现了:如果链上主要记录的是一笔笔交易,钱包为什么能马上知道当前余额? 这正是理解区块链 State(状态)的入口。

你查余额时,节点看的是什么?

先做一个思想实验。假设一家银行只保存所有转账流水,不保存每个账户的当前余额。你每次查余额,银行都要从你开户后的第一笔交易开始,把所有收入加一遍、支出减一遍,最后算出一个数字。只查一次也许可以接受,但如果每天有大量用户查询,成本会迅速变得不可行。

所以银行通常会同时保存两类信息:

  • 交易流水:按时间记录“发生了什么”。
  • 账户余额:记录“现在是什么结果”。

区块链也需要类似的区分。一个区块链账本并不只有“交易列表”这一层。它至少包含两类关键信息:

  1. 有序的交易历史:交易被打包进区块,并按顺序连接起来。
  2. 交易执行后的当前结果:也就是当前世界状态,通常称为 State。

交易历史回答的是“过去发生过什么”;State 回答的是“执行完这些交易之后,现在世界是什么样子”。

这里先简单回顾两个背景概念。交易是对账本提出的变更请求,例如“从地址 A 转 10 个代币到地址 B”;区块是交易的集合,并按一定顺序排列。地址则像账户的标识,用来接收、持有或发出资产。State 往往就是围绕地址来组织当前结果的。

银行类比可以帮助理解“流水”和“余额”的区别,但它有边界:银行是中心化数据库,而区块链的状态需要由多个节点按同一套规则计算和验证。类比不能说明区块链的验证机制,只能说明为什么“只保存流水”会带来查询成本。

State 是什么:当前世界的快照

在区块链语境里,State 可以理解为:执行完所有已确认交易后,当前世界结果的快照。

在账户模型的区块链中,State 通常包括:

  • 每个地址的余额;
  • 每个地址的 nonce;
  • 智能合约保存的数据,也就是合约存储;
  • 以及其他由协议定义的账户信息。

其中 nonce 可以简单理解为某个地址已经发出过多少笔交易的计数,它用于交易排序和防止某些形式的重复提交。不同链对 nonce 的具体定义可能略有不同,但在账户模型里,它属于状态的一部分。

可以把它想成一张不断更新的表:

地址或合约当前状态的一部分
地址 A余额 80
地址 B余额 70
合约 C某个存储值为 42

这张表只是示意。真实系统中的状态组织方式会更复杂,不同区块链也可能采用不同模型。例如,有的链使用 UTXO 模型,有的链使用账户模型。本文不展开两者的完整比较,只抓住共同思想:State 表示“现在谁有什么、合约里存了什么”。

需要特别强调的是,State 不是凭空存在的,也不是永远不变的。它是交易历史按规则执行后的结果。新交易到来后,状态会从一个版本变成另一个版本。

也就是说,区块链的“不可篡改”主要指的是历史交易顺序和状态转换规则难以被随意改写,而不是说当前余额永远不变。余额当然会变;变的是当前状态,而不应被随意改写的是导致这些变化的交易历史。

交易驱动状态转换

理解了 State 是“当前结果”之后,还要理解它是怎么变化的。

可以把区块链看成一个确定性状态机。状态机有当前状态,有输入,也有按规则处理输入后得到的新状态。对区块链来说:

  • 当前状态是 S1;
  • 输入是一笔交易;
  • 执行规则由协议和合约定义;
  • 输出是新的状态 S2。

用一组简单数字来看。假设初始状态是:

  • Alice:100
  • Bob:50

第一笔交易:Alice 转给 Bob 20。执行后状态变成:

  • Alice:80
  • Bob:70

第二笔交易:Bob 转给 Alice 10。执行后状态变成:

  • Alice:90
  • Bob:60

这里的关键不只是数字变化,而是顺序。区块链中的交易按区块内顺序执行,前一笔交易的结果会成为后一笔交易的前提。如果顺序不同,结果可能不同。

更重要的是,这个过程是确定性的:在相同初始状态、相同交易顺序和相同执行规则下,任何诚实执行者都会得到相同的新状态。这正是节点能够验证彼此结果的基础。节点不需要相信某个中心机构说“现在余额是这样”,而是可以自己执行交易、计算状态,并检查结果是否一致。

有效交易会带来状态变化。无效交易不会带来预期的资产或合约状态变化;不过在实际系统中,失败交易的处理要按具体链的规则来看。有些链会把失败交易也打包进区块,可能收取费用或更新发送方的交易计数。为了理解主流程,可以先抓住核心:交易是状态转换的输入,状态是执行后的结果。

这个数字例子也有简化之处:它忽略了手续费、合约内部存储、失败交易等细节,只用于说明“交易序列如何确定性地改变状态快照”。

为什么不能只记录交易

既然交易历史已经记录了每一步,为什么节点还要专门维护 State?

原因在于效率和可验证性。

如果要回答“Alice 现在余额多少”,只靠交易历史,节点必须从创世区块开始,按顺序重放所有相关交易,一直计算到最新一笔。假设一条链已经运行多年,每年有数百万笔交易,那么查一次余额就可能需要重算大量历史。对钱包、交易所、区块浏览器和智能合约交互来说,这种成本无法接受。

验证一笔新交易也需要当前状态。比如 Alice 想再转 100 个币,节点需要快速检查:

  • Alice 当前余额是否足够?
  • 这笔交易的 nonce 是否符合预期?
  • 合约调用所需的条件是否满足?
  • 交易是否会违反协议规则?

如果每次验证都重放全部历史,系统会变得非常低效。维护当前状态,相当于让节点保存一份“最新结果”,从而能快速检查新交易是否有效。

所以,交易历史和 State 不是互相替代的关系:

  • 交易历史用于审计、追溯和重放;
  • State用于高效查询当前结果和验证新交易。

理论上,状态可以从交易历史重新计算出来。全节点之所以要维护状态,不是因为交易历史没有价值,而是因为现实使用需要快速得到当前结果。把 State 说成“多余缓存”是不准确的;它是区块链能够支持日常查询和合约执行的必要设计。

区块链如何承诺 State:状态根

接下来的问题是:状态可能很大,包含大量账户和合约数据。区块链总不能把完整状态复制到每一个区块里吧?

通常不会。区块头中保存的是对当前状态的一种密码学承诺,常见形式是状态根(state root)。

哈希摘要可以简单理解为一段数据的“指纹”:数据不变,指纹不变;数据一变,指纹通常就会变。状态根就是当前世界状态经过密码学摘要后得到的承诺。它不包含每个账户的完整余额,但可以用来检查某个状态是否与链上认可的结果一致。

以以太坊为例,其区块头包含 stateRoot 字段,用来承诺交易执行后的世界状态。节点执行区块中的交易后,会计算新的状态根,并与区块头中的状态根进行比对。如果两者不一致,说明执行结果与区块生产者声称的结果不符,区块会被拒绝。

这也说明了一个常见误解:区块链并不是把每个账户的完整当前余额都直接写进每个区块。 完整状态通常由全节点在本地维护;区块头保存的是状态根这样的摘要承诺。钱包查询余额时,通常是通过节点读取节点维护的状态,而不是从区块头的某个字段里直接读出余额。

状态根还带来验证上的好处。借助状态根和相应的证明,轻节点可以验证某个账户或存储值是否属于这个状态,而不必自己保存完整状态。具体证明结构涉及更复杂的数据结构,本文不展开;关键是理解:区块链对当前状态作出可验证承诺,而不是把完整状态塞进每个区块。

交易历史与 State 的分工

看到这里,容易产生另一个误解:既然 State 这么重要,那区块链是不是主要记录 State,而不是交易?

也不是。更准确的说法是:区块链既保存有序交易历史,也承诺交易执行后的状态结果。

交易历史像一段完整录像,记录每一步发生了什么;State 像当前比分,告诉你现在的结果。录像可以还原比分,但比赛要继续进行时,只靠当前比分更高效。这个比喻也有边界:区块链的状态不是由某个裁判单独维护,而是由多个节点按规则计算并验证。

二者分工可以这样理解:

  • 交易历史提供可审计的事件序列;
  • State 提供可查询、可验证的当前结果;
  • 状态可以从交易历史重新计算,因此全节点可以校验而不是盲信;
  • 节点也可以选择保留较旧状态,或通过重放交易重建状态,但这需要存储和计算成本。

实际系统中,不同节点保存的内容不同。全节点通常维护当前状态并验证交易;归档节点会保留更多历史状态,便于查询过去某个时刻的数据;轻节点则只保存较少信息,依赖状态根和证明进行验证。这里不需要深入各类节点的实现细节,只要知道:交易历史和 State 共同构成完整账本,而不是二选一。

把 State 放回区块链心智模型

现在可以回到最初的问题:区块链为什么记录 State,而不只是交易?

因为交易描述的是变化,State 描述的是变化后的结果。区块链要支持查询余额、验证新交易、执行智能合约,就必须知道当前状态。只保存交易历史,理论上可以重算出状态,但成本会随历史增长,无法支撑现实使用。

可以把核心关系压缩成一句话:

交易回答“发生了什么”,状态回答“现在是什么”。

交易是事件,State 是结果;交易是输入,状态转换是输出。区块链通过有序交易和确定性规则,从旧状态推导出新状态,并用状态根对当前结果作出密码学承诺。交易历史仍然重要,它用于审计和重放;但 State 让区块链成为可用的支付和计算系统,而不只是一个不断增长的历史日志。

以后看到账户余额、合约存储、TVL 等数据时,都可以把它们理解为对某个状态的引用或计算。遇到状态膨胀、状态过期、无状态客户端等更深入的话题时,也可以回到这个基础模型:区块链不只需要记住过去发生过什么,还需要知道现在是什么。

未找到文章。
滚动至顶部
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.