Zilliqa 技术更新2019/8/13日 — — 加强我们的主网:一个深度的报告

Aparna Narayanan
Zilliqa — Official Blog
7 min readAug 30, 2019

大家好,

Zilliqa 总是乐见于我们的技术被广泛使用、迫切需要。最近,随着 Unstoppable Domains 在 2019 年 7 月 9 日上线,并立即开始面对来自社区的巨大需求,我们区块链上的智能合约交易数量创下了历史新高。

这种情况同时也在 Zilliqa 主网上催生出了繁重的智能合约处理需求,因此导致了一些不稳定事件。本次技术更新主要是针对这些近期的问题,概述我们已实现的修复,以及旨在巩固主网的即将到来的技术增强。毕竟,我们一直相信,平台的不断充实是增长和发展的关键。

理解智能合约状态

每个智能合约都有自己的状态。例如,假设我们有了一个众筹智能合约,记录每个捐赠者的贡献。一个简单的智能合约状态可以表示为:

只要众筹合约还在接受新的捐赠者的捐赠,我们就可以预计它会随着时间的推移而变得更大。

正如你所看到的那样,我们都预期智能合约状态将随着时间的推移而增长。一般来说,我们预计大多数智能合约在 Zilliqa 主网上运行得相当快。然而,Unstoppable Domains 状态大小增长得非常快,导致在处理这些智能合约事务时,我们的区块链上的网络可用性发生停滞。

在 Zilliqa 区块链中,有几个智能合约处理被切断的实例:

  1. 当微块的 gas 值达到上限时
  2. 当微块事务处理的时间达到上限时

在这种情况下……

  • 随着 Unstoppable Domains 的智能合约状态增长,我们注意到处理每笔事务所需的时间呈线性增长。我们观察到智能合约处理时间从极短的时间,慢慢增加到 500 毫秒、700 毫秒,最终达到超过 1 秒
  • 由于繁重的智能合约处理,我们在每个节点级别都达到了时间上限,之后便无法处理任何事务

对事件的深入调查

在理想的情况下,如果所有节点都在同一事务中完全切断智能合约处理,就不会出现任何问题。然而,在去中心化的区块链领域中,节点确实具有不同的机器特性。这意味着每个节点可能在每个微块上处理不同数量的智能合约,而这可能会影响 Zilliqa 主网的性能。

你可能知道,Zilliqa 使用实用拜占庭容错 (PBFT) 来达成共识。作为共识协议的一部分(在本例中是针对微块),领导者首先提出了一个微块,其中包含为该微块处理的所有智能合约事务。备份将验证所提议的内容。在这种情况下,如果网络分片中超过 ⅓ 的备份不同意领导者的提议,微块就不会达成任何共识。

这就是我们目前所观察到的情况。

此类事件的影响取决于其发生的级别。如果它发生在分片级别,来自该特定分片的微块将不会生成最终的区块。网络将在下一个 Tx 纪元与一个新的分片领导者继续前进。如果在 DS 委员会发生这种情况,将发生视图更改以选举新的领导者。然而,在选举新领导者后,类似的问题可能会再次发生,导致视图再次更改,重新选举另一名领导者。

根本原因何在?

发生这种情况的主要原因有两点,具体如下:

  1. 切断智能合同处理首先应该按 gas 上限处理。在这种情况下,我们设置的 gas 上限过高,而这种设置意味着总是先触及时间上限。这将导致总是先碰到时间限制。如果首先触及 gas 上限,我们将不会面临这个问题,因为所有节点都将处理完全相同的智能合约事务,而不是彼此各行其是,从而导致无法就该微块达成共识。
  2. 低效状态访问:随着 Unstoppable Domains 智能合约状态的状态大小增长,处理时间将线性增加。这是因为我们的 Scilla 解释器后端实现效率低下。目前,在这个特殊的智能合约中,大部分数据存储在 map 中。节点需要加载整个 map(它的大小正在增长),进行反序列化,最后更新 map。这是随着智能合约状态大小的增加,智能合约过程处理时间增加的主要原因。

实施修复和即将到来的升级

  1. 减少 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 的更多信息或与我们讨论项目技术,请随时通过以下官方渠道与我们联系:

--

--