当前位置:首页 区块链 正文

StarkNet是如何攻克排序器难题

2022-12-01

一年之前, StarkNet Alpha公司正式推出了以太坊的主网,当时我们把主要精力放在了增强性能上,并且打算采取一系列措施改善 StarkNet的用户体验。

区块限制:价值路线与L1

改善区块链可扩充性及 TPS的一种方式是:在不改变区块的范围(例如 GAS及区块大小)的情况下,维持区块产生的时间。这就要求区块生产商(L1上的验证程序,L2上的排序程序)能够提供更高效率的服务,所以我们将集中于 StarkNet排序器的优化,下面详细介绍。

问题是,为何对排序程序的优化只适用于 Validity Rollups,也就是说,我们为何不能用同样的方式在L1上进行改进,从而避免效率累积(Validity Rollups)的复杂性?下一部分将给出这个问题的答案。

L1的吞吐量为何受限

L1的区块限制一旦被解封,将会面临一个大问题,即由于链路的高吞吐量导致了链路上的区块成长率,因此必须要增加更多的全节点,以保证每一个节点都能与最新的全链保持一致。再加上L1的全部数据都要被记录下来,因此,数据块的数量会对整个节点造成很大的压力,甚至会导致某些节点的性能下降,从而导致整个节点的运行受到影响,而那些大型的实体则只能在不受信任的情况下运行。

这也使我们了解到,L1的吞吐量极限在一定程度上造就了一个真正的分散型、相对安全的网路系统。

为何以上的问题没有在 Validity Rollups的上面?

只有当我们把整个结点都考虑进去的时候,我们才会发现有效集合的好处。通常,L1全节点都要重启整个链条的历史才能保证其目前的状态,而 StarkNet则仅需对 STARK进行校验,并且这样的校验所耗费的运算资源会成倍的减少。关键在于,对链上所有节点的状态进行校验并不包括执行;只要用 STARK证明确认该状态是否正确,就可以从其他全节点接收到目前的状态。这样就可以在不增加总结点数目的情况下,提高网络的吞吐量。

所以,在L2上,可以通过优化排序来提高系统的整体性能,但是L1无法做到这一点。

未来的 StarkNet的性能路径

本节我们将讨论 StarkNet排序器当前正在进行的优化。

排序并联

性能路径图的第一个步骤是将并行处理引入到事务执行中。这项建议是正式在 StarkNet alpha0.10.2中推出的,它将于11月29号在 Ethernet上发行。

通常,由于不同的业务可以互相依存,所以不能同时进行多个业务。下面的例子将给出解释,假定存在一个由相同的用户组成的三个事务的区块:

Tx A (A,以下): USDC与 ETH的转换

Tx B:为特定的 NFT付费

把 USDT换成 BTC

很明显, A交易一定要比 B先进行,但是 C交易是完全独立的,可以同时进行。如果每次交易只需一秒钟,则在采用平行处理的情况下,将生产块的时间从3秒缩短至2秒。

问题是,我们没有提前了解到各种交易的相关性。实际上,如果我们在这个例子中运行 Tx B,那么我们就会发现, Tx A的变化取决于 Tx A。更确切地说,这个依赖是来自 Tx B从 Tx A所写的存储器中读出的行为。我们可以将不同的 Tx看作一个依赖关系,在这个关系中, A和 B之间有一条边沿,只有当 A写到 B所读的内存时, B才会被执行。下面的图表展示了这些依赖性的关系:

StarkNet的性能路径:怎样解决分类器的问题?

在上述例子中,每个栏都可以同时进行。

为克服预先不能识别各种交易活动的相关性,本研究利用 Aptos实验室推出的BLOCK-STM,在 StarkNet分类器中引入 OP并行(optimistic parallelization)。在此模式中,交易将以一种积极的方式并行进行,并且一旦发生冲突,就会被再次执行。例如,在上面的示例图中,我们可以同时进行TX1-4,但是之后发现 Tx 4是Tx1的依赖性,所以这个执行是无效的(Tx4在Tx1被执行之后),此时Tx4将被再次执行。

注意,除了以上提到的乐观平行化外,我们还加入了一些优化。比如,当您找到一个导致运行结果无效的依赖时,您可以停止执行,而不是等待每次执行的末尾。

另外一个最佳化的示例是,选择要重做的交易。假定上面所示的所有交易都包含在一个五核心 CPU的排序程序中。首先,我们要同时进行tx1到5的操作,如果按照Tx2,Tx3,Tx4,Tx1,Tx5,则当Tx4被执行之后,我们会发现Tx1→Tx4,这表示需要重新执行。从直觉上讲,Tx5也必须重新执行Tx4,但是,我们可以重复执行已完成的交易所建立的依赖关系,仅重做Tx4相关的交易,而不是在Tx4失败后所有的交易。

Rust环境下Cairo-VM的实现

在 StarkNet中,智能合同采用Cairo-VM虚拟机上的Cairo-VM实现。现在,利用 python语言对Cairo-VM进行排序。我们已经开始使用 Rust来覆盖Cairo-VM虚拟机,以使虚拟机的性能最优化。

当前cairo-rs能够实现原生 Cairo代码,接下来将会处理执行智能合同,并与 pythonic排序程序整合,如果与cairo-rs整合,那么该排序程序的性能将会得到进一步的改善。

Rust环境中的排序

为了改进网络性能, python向 rust过渡, StarkNet并不局限于Cairo-VM,而是使用 Rust覆盖了与排序程序有关的代码。除了 Rust本身的优点,它还可以对排序程序进行其它的优化,例如,在没有python-rust通讯的开销的情况下,可以将cairo-rs的优点集中起来,并且可以对状态的存取和存取进行彻底的重构。

见证人(Provers)

在本文中,没有提及“证据”的核心要素,即“证据”。作为整个体系结构中最为复杂的一个部件,验证器(Provers)可以说是一个瓶颈,也是一个优化的关键。但是,目前 StarkNet的瓶颈在于“标准”的组件,尤其是在目前的测试网络/主机网络中,有更多的交易可以被添加到这个证书中。实际上, StarkNet区块和 StarkEx的交易都是有效的,而 StarkEx有时候也会发生成百上千的 NFT事件。

总的来说,并行化、 Rust等方面的进步,都是为下一步 StarkNet提高 TPS的基础。