Maxlion

Posted on Dec 01, 2022Read on Mirror.xyz

解读StarkNet性能路线图与性能瓶颈

StarkNet 背后团队 StarkWare 在 11 月 29 日官宣了 StarkNet 性能路线图

本文将解读路线图中即将推进的三件事:排序器并行、Cairo VM 的 Rust 实现、排序器的 Rust 实现;并将解释 StarkNet 的性能瓶颈。

一、排序器并行

排序器是 StarkNet 网络中的一个链下服务器,接收所有的事务、订单,在验证确认后将他们打包到区块,类似以太坊上的矿工(值得注意的是StarkNet仅在链下执行交易,并生成执行证明,链上验证证明)。

排序器引入并行交易执行的意义在于,排序器可以同时执行多笔交易,从而提高整个网络的交易处理量/TPS。

具体而言,有的交易可以并行执行,有的不可以。比如在一个区块中,可能有来自一个用户的三笔交易:交易A)将 USDC 换成 ETH交易;B)为 NFT 支付 ETH交易;C)将 USDT 换成 BTC。在这个例子中,交易 A 和 B 不能并行执行,B 必须在 A 之后执行。但交易 C 可以和 交易 A 同时并行执行。假设每笔交易需要 1 秒钟执行时间,引入并行后将把总执行时间从 3 秒减少到 2 秒,TPS 也将增加 0.5。

https://starkware.medium.com/starknet-performance-roadmap-bb7aae14c7de

StarkNet 即将引入的并行执行将借鉴 Aptos 开发的 BLOCK-STM,将乐观并行引入到排序器。简单来讲,排序器将会乐观地假设所有交易都是可并行执行的,并将直接并行运行事务,最后会在发现冲突时再重新执行。

二、Cairo VM 的 Rust 实现

以太坊的智能合约在以太坊虚拟机 EVM 中运行,其开发语言为 Solidity。

而 StarkNet 的虚拟机为 Cairo VM,StarkNet 上所有的智能合约在 Cairo VM 中运行,其开发语言也叫 Cairo。Cairo VM 不同于以太坊的 EVM,它本身并不执行计算,仅仅验证计算的正确性。

目前,排序器正在使用 Cairo VM 的 Python 实现(Python语言编写Cairo VM),Cairo VM 的 Rust 实现(Rust语言)的意义在于可以进一步优化 VM 的性能。目前业界基本公认 Python 的实现并不是最优的方案。

我们可以通过 EVM 的 Python 实现来感受其低效。

https://github.com/ziyadedher/evm-bench/blob/main/README.md

想起来 @msfew_eth 说的一句话:“知道不行,但是没想到这么不行。”(我要笑死了🤣)

三、排序器的 Rust 实现

排序器的 Rust 实现的目的与 Cairo VM 的 Rust 实现的目的一样,也是为了让 Rust 实现替代更加低效的 Python 实现。

四、性能瓶颈

  1. 证明加速

    StarkNet 承认证明加速是性能提升最重要的瓶颈之一,不过这是一个对所有 ZK 项目都需要解决的问题。路线图中没有公布更多的硬件加速相关的信息。根据我对 Cairo 的了解,猜测 StarkNet 可能做一个 ZK CPU,因为 Cairo VM 本身就是一个图灵完备的 CPU,而且做出一个 Cairo CPU 之后,理论上来讲还可以通过 Cairo VM 中软件编程的方式无限接近 ASIC 的性能。

  2. 交易打包

    StarkNet 需要为交易生成证明,然后发送到以太坊验证。交易量越大,均摊的以太坊验证成本越低,用户均摊的 calldata 成本越低。而如果交易量不足,StarkNet 仍然需要在固定时间打包出块的话,StarkNet 就需要自行承担损失。StarkNet 减少这个损失的方法是把 StarkEx 的交易也纳入 StarkNet 的证明中,以均摊成本。

    StarkWare 联合创始人 Eli Ben-Sasson 曾在首尔会议表示,其新的递归有效性证明理论上可以将以太坊区块链上多达 6000 万笔交易汇总为以太坊上的一笔交易。

  3. 验证成本

    Cairo 使用 STARK 证明系统,验证成本和电路规模、函数调用呈对数关系。函数调用增加 99 倍,成本可能只增加两倍(f(x)=log1.2(x)),简单来讲就是交易越多,平均验证成本越低。因此从验证成本的角度来看,StarkNet 的性能瓶颈会达到一个非常恐怖的量级,当验证时间为一秒时,能够完成的函数调用约在 1.51 e+79(10的79次方)这样的量级。

这是一个较小的量级(我手画的),x轴为哈希函数调用次数,y轴为验证时间(ms)

这是一个更大的量级,注意坐标轴数值

上图数据来自 ethSTARK 文档。

https://eprint.iacr.org/2021/582.pdf

StarkNet