以太坊“改现在、不碰历史”?区块链为什么不回头改数据!copy-on-write

小编:大闷头 更新时间:2026-01-28 13:25

区块链里有一个经常被误解的概念,叫copy-on-write,很多人第一次听到都会下意识觉得,这是不是在原来的数据上改一份副本,那会不会牵一发动全身,把后面的区块都搞乱,其实真正的实现方式和直觉完全相反,它反而是区块链状态能安全、稳定演进的关键。

以太坊“改现在、不碰历史”?区块链为什么不回头改数据!copy-on-write

copy-on-write的核心不是“改旧的”,而是“永远只写新的”,旧的数据一旦写入就不再动。

copy-on-write是在解决什么问题

在区块链里,每个区块都会记录一个状态摘要,比如以太坊里的stateRoot,它代表了“当下整个链上所有账户和合约的状态集合”,余额、合约代码、存储值都在里面。

问题来了,如果某个账户发生交易,余额变了,那状态树是不是也得跟着变,如果状态树变了,那以前区块里记录的stateRoot还准不准,会不会被改坏,copy-on-write正是用来解决这个矛盾的,它的目标很明确:既允许状态不断更新,又保证历史状态永远不被修改。

很多人容易产生的直觉误区

一个常见的误解是这样想的,某个很早就存在的账户发生交易,余额发生变化,那状态树中间某个节点肯定要改,树的根哈希一改,后面引用这个根的区块是不是都得重算,这个推理在普通可变数据结构里是对的,但在区块链状态树里恰好反过来。

真正发生的事情是什么

在copy-on-write模型下,任何一次状态变更,都会生成一棵“新的状态树”,而不是修改旧树,这里的“新”,并不是整棵树从头到尾复制一遍!

1、只复制从根节点到被修改账户的那一条路径

2、路径之外的所有节点,全部直接复用旧的

3、旧树保持完整、不变、永远可追溯

一次交易的真实效果是:在旧状态树的基础上,长出了一棵几乎一模一样、但局部不同的新树。

用一个生活化的比喻理解

可以把状态树想成一本每天记账的账本。

1、昨天的账已经写完并装订好

2、今天发生了一笔新交易

3、你不会把昨天那一页撕开重写

4、而是新开一页,只记录今天的变化

copy-on-write做的事情就是:旧账页永远不动,新账页只写变化,账本索引指向最新一页。

在以太坊里具体是怎么运作的

以太坊的状态存储在一棵Merkle Patricia Trie里,每个节点的内容一旦确定,对应的哈希值就固定不变。

当一笔交易修改某个账户时

1、从上一个区块的stateRoot开始

2、沿着账户地址对应的路径向下

3、把这条路径上的节点逐个复制一份

4、在新的叶子节点里写入新的余额或状态

5、自底向上重新计算这些新节点的哈希

6、得到一个全新的stateRoot

整个过程中

1、旧节点没有被修改

2、旧stateRoot依然指向旧树

3、新区块只记录新的stateRoot

后续区块也只关心最新的stateRoot,不会回头触碰历史状态。

为什么不会出现“连锁修改”

关键原因只有一个:每个区块的stateRoot都是独立、不可变的快照引用。

历史区块引用的是旧stateRoot

新区块引用的是新stateRoot

它们指向的是不同的树根

哪怕两棵树共享了99%的节点,这种共享也是只读的,不存在“被改坏”的风险。

那存储空间会不会爆炸

这是copy-on-write的另一个好处。

1、没改动的节点不会复制

2、多个stateRoot可以引用同一个节点

3、相同内容只存一份

故而节点实际只需要存储“变化的那一小部分”,而不是每个区块存一整棵完整状态树。

这也是为什么节点可以同时支持

1、查询任意历史区块状态

2、又能维护最新状态,而不会把磁盘写爆。

为什么说这是区块链里的“魔法”

1、状态更新会破坏历史

2、或者每个区块都得复制全量状态

3、两条路都走不通

copy-on-write用一个看似简单的规则解决了这个矛盾:状态只能前进,历史永远冻结,每一次写入都是在时间线上新增一层,而不是回头修改。

免责声明:本文所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任!