---
title: 生成分叉
---

本节描述了由于 [轮换领导者](leader-rotation.md) 而自然产生分叉的情况。

## 概览

节点会变为领导者并生成编码更改的 PoH。 群集可以通过综合领导者 _**可能**_ 生成的内容，来容忍与任何领导者的连接中断，但不会进行任何的状态更改。 因此可能的分叉数量仅限于“有/无”跳过在领导者轮换时，在插槽边界可能出现的分叉列表。 在任何指定的插槽上，只接受一名领导者的交易。

## 消息流

1. 交易被当前的领导者吸纳。
2. 领导者过滤有效的交易。
3. 领导人执行有效交易的状态更新。
4. 以当前 PoH 插槽为基础的领导者软件包交易记录。
5. 领导者将条目传送到验证节点 \(嵌入签名的碎片\)
   1. PoH 流包括滴答计数；空白条目显示了领导者的主动性和集群时间的流逝。
   2. 领导者传输首先是必要的滴答目录，以便 PoH 返回领导者最近观察到的上一个领导者插槽。
6. 验证节点将条目重新传输给他们集合中的对等点和未来的下游节点。
7. 验证节点验证交易并在其状态下执行它们。
8. 验证节点计算状态的哈希值。
9. 在特定时间, 例如特定的 PoH 滴答计数, 验证节点将投票传给领导者。
   1. 投票是指计算状态的 PoH 滴答计数的哈希签名。
   2. 投票也是通过 Gossip 进行传播的。
10. 领导者进行与任何其他交易相同的选票，并将投票广播到集群。
11. 验证节点观察他们的投票和该集群的所有选票。它

## 分区，分叉

在 PoH 滴答计数时，可能出现与投票相对应的分叉。 下一位领导者可能没有观察到最后一次投票，可能会用生成的虚拟 PoH 条目开始它们的插槽。 这些空白滴答是由集群中的所有节点按集群配置的每次滴答哈希 `Z` 生成的。

投票时间段中只能有两个版本的 PoH ：`T` 滴答的 PoH 并且有当前领导者生成的条目或仅进行滴答的 PoH。 "只滴答"的 PoH 版本可以被视为一个虚拟账本，集群中的所有节点都可以从上一个插槽的最后一次滴答产生。

验证节点可以在其它方面忽略分叉\(例如从错误的领导者\)，或罚没产生分叉的领导者。

验证节点根据贪婪算法进行投票，以最大限度提高他们在 [Tower BFT](../implemented-proposals/tower-bft.md) 中描述的奖励。

### 验证节点视图

#### 时间进度

下面图表代表了验证器关于 PoH 流的视图，以及一段时间内可能的分叉。 L1、L2 等是领导者插槽， `E`s 代表领导者插槽中的领导者条目。 `x`s 代表仅滴答，时间流向图表下方。

![生成分叉](/img/fork-generation.svg)

注意，在同一个槽位的两个分叉上显示 `E` 是一个可罚没条件，因此一个验证节点观察 `E3` 和 `E3` 可以对 L3 进行罚没，该插槽安全地选择 `x`。 一旦验证节点承认了某个分叉，在该滴答下方的其他分叉可以被丢弃了。 对于任何插槽，验证节点只需要考虑一个单一的“有条目”链或一个由一位领导者提出的“只滴答”的链。 但由于多个虚拟条目与上一个插槽相连接，它们可能会重叠。

#### 时间分隔

将领导者轮换对 PoH 滴答计数视为集群编码状态的时间分隔非常有用。 下表列出了上述分叉树作为一个时间分隔的帐本。

| 领导者插槽   | L1 | L2 | L3 | L4 | L5 |
|:------- |:-- |:-- |:-- |:-- |:-- |
| 数据      | E1 | E2 | E3 | E4 | E5 |
| 自上次起的滴答 |    |    |    | x  | xx |

请注意，领导者插槽 L3 期间只接受来自领导者 L3 的数据。 如果 L3 没有观察到 L2 的数据，L3 的数据可能包括回到 L2 以外的另一个插槽。 L4 和 L5 的传输包括“ticks to prev” PoH 条目。

网络数据流的这种结构允许节点将其准确保存到账本，用于重新播放、重新启动和检查点。

### 领导者视图

当新的领导者开始一个插槽时，它必须首先发送将新插槽与最近观察到并投票的插槽链接所需的任何 PoH \(ticks\)。 领导者提议的分叉将把目前的插槽连接到前一个分叉，而前一个分叉是该分叉的虚拟分叉。
