跳转至

最长链原则

来源:密码学引论 / electronic_payment/最长链原则.md

image.png 最长链原则常见于 比特币、区块链共识机制 里,意思是:

当网络中同时出现多条合法区块链分支时,节点默认承认“累计工作量最大”的那条链为主链。
在简化说法里,经常叫“最长链原则”。

注意,严格来说比特币不是单纯看“区块数量最长”,而是看 累计工作量最大。不过在难度相同的情况下,区块越多,通常累计工作量越大,所以就被称为“最长链”。


1. 为什么会出现多条链?

区块链网络是去中心化的,没有一个中央服务器来决定谁先记账。

假设某一时刻,两个矿工几乎同时挖出了新区块:

原来的链:

A -> B -> C

矿工甲挖出了区块 D1:

A -> B -> C -> D1

矿工乙也几乎同时挖出了区块 D2:

A -> B -> C -> D2

于是网络中就出现了分叉:

        -> D1
A -> B -> C
        -> D2

有些节点先收到 D1,有些节点先收到 D2。此时两条链都合法,暂时无法确定谁是最终主链。


2. 最长链原则怎么解决分叉?

节点会先接受自己看到的那条链,但会继续观察后续发展。

如果后来有矿工在 D1 后面继续挖出了 E1:

A -> B -> C -> D1 -> E1
        \
         -> D2

那么 D1 这条链更长,节点就会认为:

A -> B -> C -> D1 -> E1

是主链。

而 D2 所在的分支会被放弃,变成“孤块”或者“叔块”。

所以最长链原则的核心是:

谁后面接上的区块更多,谁就更可能代表全网大多数算力的选择。


3. 它为什么能保证安全?

因为在 PoW,也就是工作量证明机制里,挖区块需要消耗真实算力。

如果攻击者想篡改历史交易,比如把某笔付款撤销,他需要从被篡改的那个区块开始,重新挖一条分叉链,并且追上甚至超过诚实节点维护的主链。

例如原链是:

A -> B -> C -> D -> E -> F

攻击者想改 C 里面的交易,就要从 C 之前开始伪造:

A -> B -> C -> D -> E -> F      诚实链
     \
      C' -> D' -> E' -> F' -> G'   攻击链

只有当攻击链的累计工作量超过诚实链,网络节点才会接受攻击链。

但是如果攻击者算力不超过全网诚实算力,他追上的概率会随着确认数增加而迅速降低。

这就是为什么比特币交易一般要等多个确认,比如 6 个确认。


4. 最长链原则和“确认数”的关系

一笔交易被打包进区块后,还不是绝对安全。

假设交易在区块 C 中:

A -> B -> C

这时它有 1 个确认。

如果后面又接了 D、E、F:

A -> B -> C -> D -> E -> F

那么 C 里的交易就有更多确认。

确认数越多,攻击者要重写历史的成本越高。

因此:

确认数越多,交易越难被回滚。

5. 用生活例子理解

可以把区块链想象成大家共同维护一本账本。

有时候两个人同时写了一页账,导致出现两个版本:

版本1:账本到第 100 页
版本2:账本到第 100 页

大家暂时不知道该认哪个版本。

后来更多人继续在版本1后面写:

版本1:第 101 页、第 102 页、第 103 页
版本2:停在第 100 页

于是大家认为版本1才是主账本。

因为它代表了更多人的持续投入。


6. 最长链原则的本质

最长链原则本质上是在解决去中心化系统里的一个问题:

没有中心裁判时,大家如何对同一份历史记录达成一致?

它的答案是:

承认累计工作量最大的历史版本。

所以它不是简单的“谁说得早听谁的”,而是“谁付出的计算成本最多,谁更可信”。


7. 需要注意的误区

第一个误区是:最长链不是绝对不可逆。

区块链不是说一旦写入就永远不能变,而是随着后续区块增加,被推翻的概率越来越低。

第二个误区是:最长链不一定是区块数最多。

严格来说,比特币比较的是累计工作量。如果两个分支区块难度不同,区块更多的链不一定是工作量最大的链。

第三个误区是:最长链原则主要适用于 PoW。

像 PoS,也就是权益证明系统,可能用的是其他分叉选择规则,不一定完全等同于比特币式最长链原则。


一句话总结:

最长链原则就是:当区块链发生分叉时,节点选择累计工作量最大的那条链作为主链。它通过算力竞争让全网在没有中心裁判的情况下达成共识。

image.png