---
title: "什麼是 reorg？"
description: "定義、成因，以及後續會發生的事"
---

## **什麼是 reorg？**

鏈重組（chain reorganization），或稱「reorg」，發生於驗證者對區塊鏈最正確的版本產生分歧時。Reorg 的成因可能是多個區塊剛好同時產生、系統出現 bug，或是遭受惡意攻擊。Reorg 會淘汰較弱的重複區塊鏈。Reorg 持續的時間越長，處理起來的成本就越高。

區塊鏈 reorg 會導致某個區塊從鏈上被移除，因為此時已產生一條更長的鏈。這也意味著不同的礦工會同時各自在難度相近的鏈上添加交易區塊。

之所以會發生這種情況，是因為負責添加下一個區塊的礦工必須決定分叉的哪一側才是正確或規範（canonical）的鏈。一旦礦工或驗證者選定了分叉或規範鏈，另一條鏈就會消失。

重組攻擊（reorganization attack）指的是節點開始接收來自新鏈的區塊，而舊鏈仍然存在的情況。在這種情況下，鏈會被分裂並產生一個分叉，也就是區塊鏈的複製版本。

### **什麼原因會導致區塊鏈 reorg？**

區塊鏈 reorg 的成因是兩個區塊同時被發布。由於網路延遲，短暫的一到兩個區塊的 reorg 經常發生，但當 reorg 持續超過一到兩個區塊時，就可能代表惡意攻擊，甚至導致網路故障。

### **鏈重組會帶來什麼後果？**

鏈重組主要有四種後果：延遲與較差的使用者體驗、節點成本、不確定性，以及容易遭受攻擊。

#### **1. 延遲與較差的使用者體驗**

除了增加節點成本外，reorg 還會提高交易延遲的機率。這對交易所來說是個嚴重問題，因為它們必須仰賴交易能準時確認，否則就可能因為存款等待時間變長而承受相應後果。

#### 2. 節點成本

隨著時間推移，reorg 可能增加區塊鏈中的節點數量，導致使用者體驗變差。當轉換到新的分叉時，狀態更新會牽涉更多的記憶體與磁碟成本。

#### **3. 不確定性**

當 reorg 頻繁發生時，使用者對交易能準時執行就少了保障。若缺乏足夠的上下文資訊，DeFi 交易的結果會更糟，也會導致有害的 MEV 提取。

#### **4. 容易遭受攻擊**

當 reorg 變得更常見時，攻擊者（由於「最長鏈規則」）只需要打敗一部分誠實礦工，而不必打敗全部。reorg 數量越多，攻擊者的任務就越輕鬆。

## **什麼是規範鏈（canonical chain）？**

<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 號區塊仍有可能被還原。

## **什麼是分叉（fork）？**

當社群對區塊鏈的協定或基本規則集做出變更時，就會發生分叉，實際上是將鏈分裂（或「分叉」）成一條遵循新規則的新鏈，以及一條大致上被淘汰的舊鏈。

由於 Bitcoin 和 Ethereum 這類區塊鏈是由去中心化、開源的軟體驅動，並由對網路有既得利益的社群成員維護，網路參與者可以提出並針對軟體變更進行投票。

### **什麼是分叉選擇規則（fork choice rule）？**

分叉選擇規則是一種函式，它以已看到的一組區塊及其他訊息作為輸入，並向客戶端輸出何者為「規範鏈」。

當多個已發布的區塊參照同一個先前狀態時，就會發生分叉。若兩個區塊幾乎在同一時間發布，區塊鏈可能會意外遇到這種情況；也可能是有意為之，例如惡意行為者試圖製造分叉以便從鏈上「移除」某筆付款。

無論是哪種情況，都需要有某種機制讓使用者能判斷哪個分叉才是正確或「規範」的分叉。這被稱為「分叉選擇規則」。

之所以需要分叉選擇規則，是因為可能存在多條有效鏈可供選擇。當有兩個具有相同父鏈的競爭區塊同時發布時，就會出現這種情況。

舉例來說，「最長有效鏈獲勝」就是一種與 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,
      },
    ],
  }}
/>

### **什麼是最終性（finality）？**

最終性是指一筆加密貨幣交易在完成後，能完全保證不會被更改、逆轉或以任何方式取消。最終性取決於區塊鏈本身的延遲。最終性通常用來衡量需要等待多久，才能保證一筆交易會被執行。

## **Ethereum 上的 reorg 會發生什麼事？**

Ethereum 目前使用 Proof-of-Work 共識機制。Ethereum 採用一種名為「最長鏈規則」的分叉選擇規則，意思是當客戶端看到兩條區塊鏈時，會選擇難度較高的那條。做法是比較鏈上所有區塊的難度總和。

[Ethereum Beacon Chain](https://www.alchemy.com/overviews/the-ethereum-merge) 最近經歷了一次可能導致潛在安全風險的 reorg。[The Beacon](https://www.alchemy.com/dapps/the-beacon) Chain 引入了原生質押（native staking），這是 Ethereum 所採用的 Proof-of-Stake 共識模型的主要組成部分。這次 Ethereum 內部的 reorg 持續了七個區塊，是多年來最長的 reorg 之一。

**Martin Köppelmann**，Gnosis 的執行長暨共同創辦人，是最早針對這次七區塊 reorg 發表觀察推文的人之一。

七區塊的 reorg 意味著發生了一次分叉，並丟棄了七個包含數百筆交易的區塊。這導致使用者有可能將同一筆資產花費兩次。2-3 個區塊的 reorg 可能只是運氣不好，因為區塊鏈經常會面臨網路延遲。Beacon Chain 的情況也可能是如此。

鑑於五個區塊以上的 reorg 是潛在惡意攻擊的徵兆，根據開發者的說法，這次 Ethereum 的 reorg 似乎是遇到了一個發生機率很低、但並非惡意的事件。

[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 區塊鏈的這次 reorg 是由 Proposer Boost 分叉決策的部署所引起，而該決策當時尚未完全推廣到整個網路。

引入 [Proposer boosting](https://github.com/ethereum/consensus-specs/pull/2730) 的目的，是為即時收到的提議區塊賦予更高的權重。Proposer boosting 的引入是為了解決 ex-ante reorg 的問題。

<ImageBlock
  src="https://media.alchemy.com/1703848568-proposer-boosting.png"
  alt="Ethereum 重組期間 proposer boosting 在競爭鏈之間選擇的示意圖"
  width={795}
  height={122}
  caption="Proposer boosting| Source - Terrence Tsaohttps://twitter.com/terencechain/status/1529566839033933824"
/>

基本上，啟用 proposer boosting 的驗證者讓下方的鏈成為規範鏈，而未啟用 proposer boosting 的驗證者則選擇了較短的上方鏈。這導致兩條鏈各自持續從其對應的驗證者那裡累積票數。

此外，這次重組並非單純的、更新版與過時版客戶端軟體之間微不足道的區隔。這次 reorg 本身並非分叉選擇不當的徵兆。

在某次客戶端更新提升了特定客戶端之後，Ethereum Beacon Chain 上的驗證者失去了同步。在這個過程中，區塊鏈網路上的驗證者感到困惑，沒有更新其客戶端，因而導致了造成這次七區塊 reorg 的分叉。

如果所有驗證者都運行相同的配置，這個問題原本不會發生。

## **合併（merge）之後，reorg 會發生什麼變化？**

隨著時間推移，reorg 的難度將持續緩慢提升。然而，隨著 Ethereum Beacon Chain 實作 Proof-of-Stake，他們將導入名為 [Gasper](https://arxiv.org/abs/2003.03052) 的分叉選擇規則。

Gasper 分叉選擇規則會讓攻擊 Ethereum 區塊鏈變得極其困難，因為它引入了驗證者投票（attester votes）與見證（attestations），為區塊賦予「權重」。

控制見證者（attesters）就等於控制分叉選擇規則。這使得單一區塊的 reorg 變得更加困難，因為只針對少數幾個控制驗證者發動的攻擊，將需要與數千名見證者競爭。

### **什麼是提議者（proposer）與見證者（attester）？**

提議者與見證者是 Gasper 分叉選擇規則中的兩個重要角色：**提議者（Proposers）**是負責每 12 秒向某個「時槽（slot）」提議一個新區塊的驗證者，而**見證者（Attesters）**則是針對他們認為是規範鏈鏈頭的區塊進行投票的驗證者。

通常會從全體驗證者中隨機選出約 1/32 作為委員會的一部分，並從中選出一名提議者驗證者。這個委員會中同時也包含見證者。

見證者的投票稱為**見證（attestations）**，會為區塊賦予「權重」，這意味著控制見證者也等於獲得了控制分叉選擇規則的能力。

由於委員會（由提議者與見證者組成）是隨機選出的，攻擊者無法將自己的驗證者集中安排到特定的時槽中。

## **合併後的問題？**

整體而言，reorg 將不再是那麼令人擔憂的問題，因為單一或一小群見證者要進行區塊 reorg 只會變得越來越困難。此外，Ethereum 開發者可以對分叉選擇規則做出變更，以提高進行 reorg 所需的門檻，或找出邁向單一 [slot finality consensus](https://notes.ethereum.org/@vbuterin/single_slot_finality) 的解決方案。單一 slot finality consensus 將能改善使用者體驗、提升對 MEV reorg 的抵禦能力，並降低協定的複雜度與 bug 數量。
