---
title: "什么是重组（reorg）？"
description: "重组是什么、成因是什么，以及之后会发生什么"
---

## **什么是重组？**

链重组（reorg）是指验证者对区块链的最准确版本产生分歧时发生的情况。重组发生在多个区块同时被生成时，也可能由 bug 引起，或由恶意攻击导致。重组会淘汰较弱的重复链。重组持续的时间越长，处理起来的成本就越高。

区块链重组会导致某个区块从链中移除，因为此时已生成了一条更长的链。这进一步导致不同的矿工同时在难度相近的链上添加交易区块。

之所以会出现这种情况，是因为负责添加下一个区块的矿工必须决定分叉的哪一侧是正确的、规范的链。一旦矿工或验证者确定了分叉或规范链，另一条链就会被丢弃。

重组攻击是指节点开始接收来自新链的区块，而旧链依然存在的情况。在这种情况下，链会发生分裂并产生分叉，即区块链的一个重复版本。

### **什么导致了区块链重组？**

区块链重组的产生原因是两个区块同时被发布。短暂的一到两个区块的重组常因网络延迟而发生，但当重组延续超过一到两个区块时，就可能是恶意攻击的信号，甚至可能导致网络故障。

### **链重组会带来哪些后果？**

链重组主要有四个后果：延迟和较差的用户体验、节点成本、不确定性，以及易受攻击。

#### **1. 延迟和较差的用户体验**

除了增加节点成本外，重组还会增加交易延迟的可能性。这对交易所来说是个重大问题，因为它们依赖交易能按时确认，否则可能因为存款等待时间过长而承担后果。

#### 2. 节点成本

随着时间推移，重组会增加区块链中的节点数量，从而导致用户体验变差。在切换到新分叉时，状态更新会涉及更多的内存和磁盘成本。

#### **3. 不确定性**

当重组频繁发生时，用户对交易能否按时执行的把握就会降低。在缺乏足够上下文的情况下，DeFi 交易的结果会大打折扣，也会导致更严重的有害 MEV 提取。

#### **4. 易受攻击**

当重组变得更加频繁时，攻击者只需击败一部分诚实矿工（由于“最长链规则”），而无需击败全部矿工。重组数量越多，攻击者的任务就越容易。

## **什么是规范链？**

<ImageBlock
  src="https://media.alchemy.com/1703848294-canonical-chain.png"
  alt="规范链与被丢弃的侧链对比图"
  width={1544}
  height={438}
  caption="Canonical chain Source - Preethi Kasireddyhttps://www.preethikasireddy.com/post/what-do-we-mean-by-blockchains-are-trustless"
/>

规范链是被公认的“主链”。因此，它不被视为最终会终结的侧链之一。

理论上，网络永远无法百分之百确定哪条链是规范链。这是因为，只要拥有足够的算力，理论上仍可能通过延续其侧链来回退第 1 号区块。

## **什么是分叉？**

分叉发生在某个社区对区块链协议或基本规则集做出更改，并有效地将链“分叉”成一条遵循新规则的新链，以及一条基本上被废弃的旧链时。

由于像 Bitcoin 和 Ethereum 这样的区块链是由去中心化、开源软件驱动，并由对该网络有既得利益的社区成员维护，网络参与者可以对软件的更改进行提议和投票。

### **什么是分叉选择规则？**

分叉选择规则是一个函数，其输入是已观察到的一组区块和其他消息，输出则是告诉客户端哪条是“规范链”。

分叉发生在多个已发布的区块引用了同一个先前状态时。区块链可能会意外遭遇这种情况，比如两个区块几乎同时被发布；也可能是有意为之，比如恶意行为者试图通过制造分叉来从链中“移除”某笔付款。

无论哪种情况，都需要某种机制让用户能够判断哪个分叉是正确的、“规范的”分叉。这就是所谓的“分叉选择规则”。

之所以需要分叉选择规则，是因为可能存在多条有效链可供选择。当两个具有相同父链的竞争区块同时被发布时，就会出现这种情况。

例如，“最长有效链获胜”就是一种与 Proof-of-Work 机制相契合的简单分叉选择规则。我们可以定义一种分叉选择规则，使区块链能够作为共识算法的提议机制。它们会具备如 [Vitalik Buterin](https://medium.com/@VitalikButerin/minimal-slashing-conditions-20f0b500fc6c) 所概述的那些特性。

下面这张图表展示了三种分叉选择规则：

1. Nakamoto
1. GASPER
1. Tendermint

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Algorithm", dataType: "object" },
      { key: "2", width: 200, title: "Finality", dataType: "object" },
      { key: "3", width: 200, title: "Reorgs", dataType: "object" },
      { key: "4", width: 200, title: "Fork choice", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>Nakamoto (eg. PoW Ethereum / Bitcoin)</p>", tooltip: "", icon: "" },
        "2": { title: "<p>None</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Frequent</p>", tooltip: "", icon: "" },
        "4": { title: "<p>Longest chain</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>GASPER (eg. PoS ethereum)</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Every 2-epochs (~12 min)</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Very occasional</p>", tooltip: "", icon: "" },
        "4": { title: "<p>Chain with strongest support after last finalized block</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>Tendermint</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Single block (~1-10s)</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Never</p>", tooltip: "", icon: "" },
        "4": { title: "<p>Only finalized blocks</p>", tooltip: "", icon: "" },
        id: 2,
      },
    ],
  }}
/>

### **什么是终局性？**

终局性是指一笔加密交易在完成后，完全保证不会以任何方式被更改、撤销或取消。终局性取决于区块链本身的延迟。终局性常被用来衡量需要等待多久才能保证一笔交易会被执行。

## **Ethereum 上的重组会发生什么？**

Ethereum 目前使用 Proof-of-Work 共识机制。Ethereum 使用一种名为“最长链规则”的分叉选择规则，即当客户端看到两条区块链时，会选择难度总和最大的那一条。这是通过比较链中所有区块的难度总和来实现的。

[Ethereum Beacon Chain](https://www.alchemy.com/overviews/the-ethereum-merge) 最近经历了一次可能带来潜在安全风险的重组。[Beacon](https://www.alchemy.com/dapps/the-beacon) Chain 引入了原生质押（native staking），这是 Ethereum 所采用的 Proof-of-Stake 共识模型的核心组成部分。这次 Ethereum 内部的重组持续了七个区块，是近年来持续时间最长的重组之一。

**Martin Köppelmann** 是 Gnosis 的 CEO 兼联合创始人，他是最早在推特上分享自己对这次七区块重组观察的人之一。

七区块重组意味着发生了分叉，导致包含数百笔交易的七个区块被丢弃。这带来了用户可能对同一资产进行双重花费的风险。2-3 个区块的重组可能只是运气不好，因为区块链经常面临网络延迟问题。Beacon Chain 的情况也可能如此。

鉴于五个或更多区块的重组可能是恶意攻击的信号，据开发者所说，此次 Ethereum 重组似乎只是一次概率很低、并非出于恶意的事件。

[Vitalik Buterin](https://twitter.com/VitalikButerin/status/1529479408309768192?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1529479408309768192%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdecrypt.co%2F101390%2Fethereum-beacon-chain-blockchain-reorg) 及时回应称，这可能是由于使用了过时版本的挖矿软件所致。Ethereum 核心开发者 Preston Van Loon 表示，Beacon 链的这次重组是由于 Proposer Boost 分叉决策的部署所致，而该决策当时尚未在网络中完全推广开来。

引入 [Proposer boosting](https://github.com/ethereum/consensus-specs/pull/2730) 的目的是给及时收到的已提议区块赋予更大的权重。引入 Proposer boosting 是为了解决事前（ex-ante）重组的问题。

<ImageBlock
  src="https://media.alchemy.com/1703848568-proposer-boosting.png"
  alt="Ethereum 重组期间提议者加权在竞争链间做出选择的示意图"
  width={795}
  height={122}
  caption="Proposer boosting| Source - Terrence Tsaohttps://twitter.com/terencechain/status/1529566839033933824"
/>

简单来说，启用了 proposer boosting 的验证者使得底部的链成为规范链，而未启用 proposer boosting 的验证者则选择了较短的顶部链。这导致每条链都在从各自的验证者那里持续积累投票。

此外，这次重组反映的是更新版与过时版客户端软件之间一次不容忽视的分化。这次重组本身并不是分叉选择出现问题的表现。

Ethereum Beacon Chain 上的验证者在一次客户端更新提升了特定客户端版本后失去了同步。在此过程中，网络中的验证者陷入混乱，未能更新其客户端，从而导致了这次分叉，并最终引发了七区块重组。

如果所有验证者都运行相同的配置，这个问题本不会发生。

## **合并之后重组会发生什么？**

重组的难度将会随时间缓慢持续增加。然而，随着 Ethereum Beacon Chain 实现 Proof-of-Stake，它们将引入名为 [Gasper](https://arxiv.org/abs/2003.03052) 的分叉选择规则。

Gasper 分叉选择规则将使攻击 Ethereum 区块链变得极为困难，因为它引入了 attester 投票和 attestation，为区块赋予“权重”。

控制 attester 就意味着控制了分叉选择规则。这使得单区块重组变得更加困难，因为仅攻击少数几个控制性验证者，就需要与数千个 attester 相抗衡。

### **什么是提议者（proposer）和证明者（attester）？**

Proposer 和 Attester 是 Gasper 分叉选择规则中的两个重要角色：**Proposer** 是负责每隔 12 秒向一个“slot”中提议新区块的验证者，而 **Attester** 则是对他们认为的规范链头部进行投票的验证者。

通常，会从所有验证者中约 1/32 的一个委员会中随机选出一名 Proposer 验证者。在这个委员会中，也包含了 Attester。

Attester 的投票被称为 **attestation**，它们为区块赋予“权重”，也就是说，控制 attester 也就获得了控制分叉选择规则的能力。

由于委员会（由 Proposer 和 Attester 组成）是随机选出的，攻击者无法将自己的验证者集中到某个特定的 slot 中。

## **合并后的问题？**

总体而言，重组将变得不再那么令人担忧，因为作为单个或一小群 attester 去重组一个区块只会变得越来越困难。此外，Ethereum 开发者可以对分叉选择规则进行调整，以提高重组所需的条件，或寻求向单一 [slot 终局性共识](https://notes.ethereum.org/@vbuterin/single_slot_finality) 迈进的解决方案。单 slot 终局性共识将改善用户体验，提升对 MEV 重组的抵御能力，并降低协议复杂性和 bug 出现的可能性。
