Zilliqa 技术更新2019/8/13日 — — 加强我们的主网:一个深度的报告
大家好,
Zilliqa 总是乐见于我们的技术被广泛使用、迫切需要。最近,随着 Unstoppable Domains 在 2019 年 7 月 9 日上线,并立即开始面对来自社区的巨大需求,我们区块链上的智能合约交易数量创下了历史新高。
这种情况同时也在 Zilliqa 主网上催生出了繁重的智能合约处理需求,因此导致了一些不稳定事件。本次技术更新主要是针对这些近期的问题,概述我们已实现的修复,以及旨在巩固主网的即将到来的技术增强。毕竟,我们一直相信,平台的不断充实是增长和发展的关键。
理解智能合约状态
每个智能合约都有自己的状态。例如,假设我们有了一个众筹智能合约,记录每个捐赠者的贡献。一个简单的智能合约状态可以表示为:
只要众筹合约还在接受新的捐赠者的捐赠,我们就可以预计它会随着时间的推移而变得更大。
正如你所看到的那样,我们都预期智能合约状态将随着时间的推移而增长。一般来说,我们预计大多数智能合约在 Zilliqa 主网上运行得相当快。然而,Unstoppable Domains 状态大小增长得非常快,导致在处理这些智能合约事务时,我们的区块链上的网络可用性发生停滞。
在 Zilliqa 区块链中,有几个智能合约处理被切断的实例:
- 当微块的 gas 值达到上限时
- 当微块事务处理的时间达到上限时
在这种情况下……
- 随着 Unstoppable Domains 的智能合约状态增长,我们注意到处理每笔事务所需的时间呈线性增长。我们观察到智能合约处理时间从极短的时间,慢慢增加到 500 毫秒、700 毫秒,最终达到超过 1 秒
- 由于繁重的智能合约处理,我们在每个节点级别都达到了时间上限,之后便无法处理任何事务
对事件的深入调查
在理想的情况下,如果所有节点都在同一事务中完全切断智能合约处理,就不会出现任何问题。然而,在去中心化的区块链领域中,节点确实具有不同的机器特性。这意味着每个节点可能在每个微块上处理不同数量的智能合约,而这可能会影响 Zilliqa 主网的性能。
你可能知道,Zilliqa 使用实用拜占庭容错 (PBFT) 来达成共识。作为共识协议的一部分(在本例中是针对微块),领导者首先提出了一个微块,其中包含为该微块处理的所有智能合约事务。备份将验证所提议的内容。在这种情况下,如果网络分片中超过 ⅓ 的备份不同意领导者的提议,微块就不会达成任何共识。
这就是我们目前所观察到的情况。
此类事件的影响取决于其发生的级别。如果它发生在分片级别,来自该特定分片的微块将不会生成最终的区块。网络将在下一个 Tx 纪元与一个新的分片领导者继续前进。如果在 DS 委员会发生这种情况,将发生视图更改以选举新的领导者。然而,在选举新领导者后,类似的问题可能会再次发生,导致视图再次更改,重新选举另一名领导者。
根本原因何在?
发生这种情况的主要原因有两点,具体如下:
- 切断智能合同处理首先应该按 gas 上限处理。在这种情况下,我们设置的 gas 上限过高,而这种设置意味着总是先触及时间上限。这将导致总是先碰到时间限制。如果首先触及 gas 上限,我们将不会面临这个问题,因为所有节点都将处理完全相同的智能合约事务,而不是彼此各行其是,从而导致无法就该微块达成共识。
- 低效状态访问:随着 Unstoppable Domains 智能合约状态的状态大小增长,处理时间将线性增加。这是因为我们的 Scilla 解释器后端实现效率低下。目前,在这个特殊的智能合约中,大部分数据存储在 map 中。节点需要加载整个 map(它的大小正在增长),进行反序列化,最后更新 map。这是随着智能合约状态大小的增加,智能合约过程处理时间增加的主要原因。
实施修复和即将到来的升级
- 减少 gas 上限常数(自 v4.7.1 版起)
我们已经大大降低了 gas 的上限,使其在智能合约执行时限期满之前就会被触及。在 Scilla IPC 和高效状态访问(下面会做进一步解释)完成之后,我们将逐步增加它的备份。
2. 视图更改后自动降低 gas 上限(将在 v4.8.0 版中发布)
视图更改是 Zilliqa 区块链协议中的一个重要组件。视图更改只有一个目标 — — 保持网络活动并运行。视图更改涉及替换不良或恶意的领导者。这将便于协议在视图更改发生后恢复操作。
然而,在这种特殊的情况下,在视图发生更改之后,新领导者和备份人员未能就新的微块达成一致。这种情况发生了很多次。同样,这也是因智能合约处理的时间限制所导致(如本文所述)。
在即将到来的 v4.8.0 升级中,我们将引入通过指数回退来自动降低 gas 上限。简单地说,这意味着每次视图发生变化时,gas 限制将减少一半。
例如,如果在网络中有 5 个连续视图更改而没有进展,则每次将减少一半的 gas 上限。这就是²⁵,即减少 32 倍。对于这个特定的 Tx 纪元,微块的新 gas 上限为“gas 上限除以 32”。通过指数级降低 gas 上限,网络最终将能够就微块达成共识,因为 gas 上限最终将被触发。这将使网络得以前进。
成功达成共识后,将恢复原有的 gas 上限,以确保下一个 Tx新纪元不会影响网络处理能力。
3. Scilla 的新高效状态访问(计划在下月发布)
这将是Scilla智能合约处理的下一个重大更新之一。
回想一下,在 Unstoppable Domains 智能合约中,加载这样的数据将需要加载 JSON 文件,对其进行反序列化并最终进行处理。有了这个新的增强,就不需要在合约的整个状态中加载了。相反,只需要读取将要更改的记录。这将大大减少为智能合约处理加载不必要数据的开销。
4. Scilla 进程间通信 (IPC) 协议(计划在下月发布)
这是为智能合约处理安排的另一个重大更新。目前要运行 Scilla 智能合约,节点需要调用 Scilla 解释器二进制文件来读取现有状态、执行合约并输出新状态。然而,调用二进制的过程会带来一些性能开销。随着即将到来的增强,我们将把这个调用二进制文件的过程转移到进程间通信,从而减少不必要的开销。
总而言之,尽管我们在实现去中心化的道路上遇到了速度障碍,但技术团队仍然一如既往地致力于交付一个稳健的高性能平台,以支持 Unstoppable Domains 等应用程序。这些问题使技术团队对可能出现的问题有了很好的了解,我们将继续对我们发布的每个版本进行增强。我们的工作永远不会止步。感谢我们出色的团队,我们日复一日不断完善和丰富 Zilliqa 区块链。
如您想要了解 Zilliqa 的更多信息或与我们讨论项目技术,请随时通过以下官方渠道与我们联系: