![post-mortem.png](../images/post_mortem_7efc587c07.png)

## 定稿背景
Finality 是区块链中的一个重要概念，它保证交易不能被更改、取消或撤销。 比特币和大多数链在那里使用概率终结。 在 Symbol 中，我们将概率和确定性终结作为单独的函数。 也就是说，当交易包含在最终区块中时，交易被认为是最终的。

要最终确定一个块，2/3 的活跃投票节点必须对该块的哈希值进行投票。 选民可以自由参与最终确定过程。 成员变更在下一个纪元生效。 此外，在每个阶段结束时，将计算有效投票权，并将该数量用作下一个时期的分母。

## 问题
9 月 12 日星期日，我们注意到网络在 epoch 361 的终结过程中出现问题。这个 epoch 并不意外，因为我们预计这个 epoch 对终结过程来说是一个沉重的负载。

在网络启动时使用符号引导程序注册其投票密钥的投票（投票）节点已经注册了第 1 到 360 个时期的密钥。许多用户没有注册超过 361 个时期的密钥，因为定期更新投票密钥的重要性并不为人所知 . 结果，许多在纪元 360 投票的节点没有在纪元 361 投票。

尽管如此，仍然有足够的共识进入下一个纪元（362）。 不幸的是，我们在这里停滞不前。 更多的大节点停止投票，并且网络无法就超过大多数投票节点达成一致。

它似乎与过期投票节点的 XYM 持有有关，这是不可取的。 经调查，我们发现客户妥善处理了已注册更新投票密钥账户的XYM持仓量，未统计，但统计了未更新投票密钥账户的XYM持仓量。 数据中存储的数据立即显示出现了故障。 如果它按设计运行，总票数应该会显着减少，但变化不大。

## 主要修复
我们通过排除在当前纪元中没有注册投票密钥的帐户来修复此错误。 此外，绝大多数门槛从 70% 降低到 67%。 有了这些更改，一旦将此修复程序分发给绝大多数投票账户，最终确定过程就会恢复。

硬分叉将在区块 528,000 中发生。 这是纠正重要块中存储的统计数据的计算所必需的（因为它需要在所有节点上进行验证）。

由于最终确定是作为 Symbol 中的单个函数实现的，因此在最终确定处于搁置状态时，链会继续前进。 一旦最终确定，我们希望所有块都能快速同步。

## 二次修复
当一个 Voting 投票节点结束使用它的投票密钥时，该节点默认崩溃。 为了缓解这个问题，我们对其进行了更改，以便将其简单地记录为错误。 这意味着更少的噪音，但是不建议长时间在此状态下运行节点。 希望停止投票的节点应在将 enableVoting 设置为 false 后重新启动。

多重签名账户总是需要另一个账户（父账户）来支付费用，这给他们带来了不便。 此限制将放宽，以便在分叉区块中，多重签名帐户可以通过将费用汇给父帐户来间接支付费用。 请注意，这不会改变需要散列锁定的部分事务的发送行为。

## 未来的工作
在当前版本的 Symbol 中，没有对 Voting 投票节点的奖励或惩罚。 虽然这大大简化了启动最终确定的实施，但它并没有为投票节点创建我们预期的正确激励。 我们计划在不久的将来添加一个适当的系统来奖励选民。

我们意识到我们需要投资于更好的工具。 能够监控活跃投票节点的数量和投票率的下降会在最终决策过程停滞之前提醒我们注意问题。 在接下来的几个月里，我们将优先考虑基础设施，包括新的区块浏览器、改进的 REST API 以及易于理解且对用户和研究人员有用的数据分析。 如果您想与我们合作，请加入我们的 Discord。
