---
title: "什麼是 shadow fork？"
description: "Shadow Fork 的重要性：為何使用它們，以及如何測試應用程式"
---

## **什麼是 shadow fork?**

**Shadow fork 與 devnet 類似,但不是擁有自己的狀態,而是複製另一個網路(devnet 或 mainnet)的狀態。**

舉例來說,Ethereum 主網的 shadow fork 仍會接受所有發送到 mainnet 的交易。

這個分支可以切換到 Proof-of-Stake,但仍會保留 mainnet 的交易及其他狀態/歷史資料。

在 shadow fork 上成功完成合併後,它會轉移到 Proof-of-Stake 鏈,並忽略在 mainnet 上新增的任何 Proof-of-Work 區塊。

### **shadow fork 與一般的 fork 有何不同?**

shadow fork 是刻意建立的,用來以原始鏈的既有狀態資料測試網路升級;而一般的 fork 則是在開發社群修改協定或受到駭客攻擊時發生。當 fork 發生時,區塊鏈會分裂,產生第二條(新的)區塊鏈,這條鏈與第一條有相同的歷史,但路徑不同。

核心開發者對區塊鏈進行升級而導致 fork 的其中一個例子,是 [London Hard Fork](https://www.alchemy.com/overviews/what-is-eip-1559),它引入了 EIP-1559,以優化 Ethereum 的交易手續費結構。

Bitcoin 和 Ethereum 都是基於區塊鏈技術,並在開源軟體上執行。它們之所以稱為「區塊鏈」,是因為它們由一連串的資料區塊組成,且可以追溯回網路上的第一筆交易。

由於它們是開源的,其社群負責維護和改進原始碼。因此,fork 可能是為了讓區塊鏈更安全、新增功能,或是減輕駭客攻擊造成的影響——例如 2016 年 The DAO 遭駭之後的情況。

2016 年,Ethereum 區塊鏈分裂成 Ethereum Classic,它保留了反映被竊取的 360 萬 ETH 的準確帳本;而 Ethereum 則透過 fork 逆轉了這次駭客攻擊。

### **soft fork 與 hard fork 有何差異?**

soft fork 與 hard fork 的差異在於,soft fork 是修改既有區塊鏈的程式碼,而 hard fork 則是將區塊鏈分裂成兩條不同的區塊鏈。

#### Soft fork

soft fork 可以視為對執行區塊鏈的軟體所做的更新。只要所有人都使用它,它就會成為該網路的新規則。

Ethereum 曾多次使用 soft fork 來新增功能,通常是透過修改程式碼庫和客戶端軟體來實現。這些變更與 fork 之前產生的區塊相容,因為最終結果仍是單一一條區塊鏈。

#### Hard fork

當程式碼的變動大到新版本無法與舊區塊相容時,這就稱為「hard fork」。在這種情況下,區塊鏈會分裂成兩部分:

1. 遵循舊規則的舊區塊鏈
1. 遵循新規則的新區塊鏈

這樣會產生一種全新的加密貨幣,許多知名的貨幣就是這樣誕生的。Bitcoin Cash 就是透過 hard fork 從原本的 Bitcoin 區塊鏈中產生,而 Ethereum Classic(ETC)則是由 Ethereum(ETH)分裂而來。

## **為什麼 shadow fork 很重要?**

**shadow fork 是 web3 開發者的重要工具,因為它讓開發者能夠針對 mainnet 生產環境的最新狀況,測試他們對於網路即將進行的升級所做的假設是否成立。**

[Kiln 測試網路](https://www.alchemy.com/overviews/kiln-testnet)是開發者為準備 [The Merge](https://www.alchemy.com/overviews/the-ethereum-merge) 而測試的最後一個 testnet,The Merge 將把 Ethereum 的執行層從 Proof-of-Work 改為 Proof-of-Stake。

shadow fork 的重要性在於證明 Merge 能夠順利實現,不會對在網路上執行的既有 [應用程式](https://www.alchemy.com/dapps/top/defi-dapps) 造成不良影響。

擁有這些 shadow fork 的 [testnet](https://www.alchemy.com/overviews/what-are-testnets) 將作為測試場地,確保合併過渡順利進行,並有助於建立節點營運商和開發者的信任。

## **shadow fork 如何運作?**

<ImageBlock
  src="https://media.alchemy.com/1703849021-how-shadow-fork-works.png"
  alt="顯示如何從現有的 Goerli 鏈建立 shadow fork 的圖片"
  width={601}
  height={546}
  caption="An image showing how a shadow fork is created out of an existing Goerli chain. Source: AllCoreDevs Update #011 https://tim.mirror.xyz/PWFVaHY3Mrx7srarMmuBWya0J5kioR1l2xaH3p5APDk"
/>

在上圖中,最上面一列的 Goerli 區塊顯示的是原本(即原始)區塊鏈上的節點,它並不知道 shadow fork 的存在。

中間一列的 Goerli 區塊代表的是 shadow-fork 鏈上的節點,其設定不同,會在達到終端總難度(terminal total difficulty,TTD,即用來觸發客戶端停止挖礦並轉換為 PoS 的總挖礦難度)時進行分裂。
最下面一列則是專為 shadow fork 建立的 Beacon Chain 示意圖。當達到 TTD 時,原本鏈上的節點會繼續照常產生區塊,彷彿什麼事都沒發生;而那些設定已變更的節點則會分裂出去,經歷 Merge。

接著,下一位驗證者會產生 [Merge 之後 Beacon Chain](https://www.alchemy.com/overviews/what-is-the-ethereum-beacon-chain) 的第一個區塊。

Shadow forking 是達成此目的的最佳方式,因為它讓開發者能夠測試 fork 和 merge 流程的運作情況,而不會影響公開的 testnet 或 mainnet。

透過反覆執行這個 shadow fork 操作,開發者可以在不同情境下測試合併的過渡過程。

## **有哪些知名的 shadow fork?**

**有兩個 testnet 因擁有一些最知名的 shadow fork 而特別突出:Goerli 已經歷過三次 shadow fork,而 mainnet 則已歷經六次。** 兩次 mainnet shadow fork 之間的主要差異在於,所有客戶端組合都成功通過了一次 shadow fork 轉移,並保持同步。

此次 shadow fork 也對每個客戶端使用了 develop/unstable 分支。這代表開發者不再需要合併分支。在 mainnet 上,存款合約再次被使用,但採用了不同的 fork ID。

這意味著在 shadow fork 上,每一筆 mainnet 的存款都必須被處理並標記為無效。這項運算相當耗費資源,導致少數客戶端出現一些邊緣狀況,但整體網路仍運作正常。

## **如何對 Ethereum 進行 shadow fork**

如果你有興趣 fork Ethereum,可以參考 Alchemy 的逐步指南,了解[如何 fork Ethereum mainnet](https://www.alchemy.com/docs),你需要一個[免費的 Alchemy 帳號](https://www.alchemy.com/?a=ddab180718)、HardHat,以及命令列介面(CLI)。

## **shadow fork 是關鍵的 Ethereum 開發者工具**

shadow fork 在 [Ethereum 區塊鏈的持續開發與擴展改進](https://www.alchemy.com/overviews/ethereum-scaling-solutions)中扮演重要角色。透過 shadow fork,Ethereum 核心開發者、節點提供商和獨立質押者可以為即將到來的全網變更做好準備,使 Ethereum 應用程式生態系統不會因此中斷。
