---
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 和 Ethereum：前者保留了准确反映被盗 360 万 ETH 的账本，后者则通过 fork 撤销了这次攻击。

### **软分叉（soft fork）和硬分叉（hard fork）有什么区别？**

soft fork 和 hard fork 的区别在于：soft fork 修改的是现有区块链的代码，而 hard fork 会将区块链分裂成两条不同的链。

#### Soft fork

soft fork 可以看作是对运行区块链的软件所做的一次更新。只要所有人都使用它，它就会成为该网络的新规则集。

soft fork 被用来给 Ethereum 添加新特性或新功能，通常是通过修改代码库和客户端软件来实现。由于最终结果仍是同一条区块链，这些改动可以兼容 fork 之前生成的区块。

#### Hard fork

当代码改动幅度太大，导致新版本无法与旧区块兼容时，这就称为“hard fork”。在这种情况下，区块链会分裂成两部分：

1. 遵循旧规则的旧链
1. 遵循新规则的新链

这样会产生一种全新的加密货币，许多知名币种就是这样诞生的。Bitcoin Cash 就是通过 hard fork 从原始 Bitcoin 区块链分裂出来的，Ethereum Classic（ETC）也是从 Ethereum（ETH）分裂而来。

## **为什么 shadow fork 很重要？**

**对 web3 开发者来说，shadow fork 是重要的工具，因为它让开发者可以在 mainnet 生产环境的最新状况下，验证他们对网络即将进行的升级所做的假设是否成立。**

[Kiln 测试网](https://www.alchemy.com/overviews/kiln-testnet)是开发者为 [The Merge](https://www.alchemy.com/overviews/the-ethereum-merge)（将 Ethereum 的执行层从 Proof-of-Work 改为 Proof-of-Stake）做准备的最后一个测试网。

shadow fork 的重要性在于，它能证明 Merge 可以顺利实现，而不会对运行在网络上的现有 [应用](https://www.alchemy.com/dapps/top/defi-dapps) 造成破坏性影响。

带有这些 shadow fork 的 [测试网](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-forked 链上的一个节点，它的配置不同，会在达到终端总难度（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 之所以是实现这一目标的最佳方式，是因为它能让开发者在不影响公共测试网或 mainnet 的情况下，测试 fork 与合并过程的运行效果。

通过反复执行这种 shadow fork 操作，开发者可以在不同情况下测试合并过渡过程。

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

**有两个测试网因其一些最知名的 shadow fork 而著称：Goerli 经历了三次 shadow fork，而 mainnet 经历了六次。** 两次 mainnet shadow fork 之间最主要的区别在于：所有客户端组合都成功完成了 shadow fork 转换并保持了同步。

这次 shadow fork 还为每个客户端使用了 develop/unstable 分支，这意味着开发者不再需要合并分支。在 mainnet 上，同样使用了那个存款合约（deposit contract），但使用了不同的 fork ID。

这意味着在 shadow fork 上，每一笔 mainnet 存款都必须被处理并标记为无效。这种计算量很大的操作在少数客户端上引发了一些边界情况问题，但网络整体仍运行正常。

## **如何对 Ethereum 进行 shadow fork**

如果你有兴趣对 Ethereum 进行 fork，可以参考 Alchemy 的分步指南，学习如何使用 [免费的 Alchemy 账户](https://www.alchemy.com/?a=ddab180718)、HardHat 和命令行界面（CLI）来[fork Ethereum mainnet](https://www.alchemy.com/docs)。

## **shadow fork 是关键的 Ethereum 开发者工具**

shadow fork 在 [Ethereum 区块链的持续开发与扩容改进](https://www.alchemy.com/overviews/ethereum-scaling-solutions) 中扮演着重要角色。借助 shadow fork，Ethereum 核心开发者、节点提供商和独立质押者可以为即将到来的全网范围变更做好准备，从而使 Ethereum 应用生态系统不受影响。
