Allen

Allen

crypto seeker||starknet

Stark TPS相关

IIRC rust vm 将在年底包含在 1.0 版本中

定序器并行化#

我们路线图的第一步是将并行化引入交易执行。这是在昨天在主网上发布的 StarkNet alpha 0.10.2 中引入的。我们现在深入了解什么是并行化。

那么 “交易并行化” 是什么意思呢?天真地,并行执行一个交易块是不可能的,因为不同的交易可能是相互依赖的。这在以下示例中进行了说明。考虑一个包含来自同一用户的三笔交易的区块:

  • 交易 A:将 USDC 换成 ETH
  • 交易 B:为 NFT 支付 ETH
  • 交易 C:USDT 换 BTC

显然,Tx A 必须在 Tx B 之前发生,但 Tx C 完全独立于两者并且可以并行执行。如果每笔交易需要 1 秒来执行,那么通过引入并行化,出块时间可以从 3 秒减少到 2 秒。

问题的症结在于我们事先并不知道交易的依赖关系。实际上,只有当我们从示例中执行事务 B 时,我们才能看到它依赖于事务 A 所做的更改。更正式地说,这种依赖性源于事务 B 从事务 A 写入的存储单元中读取这一事实。我们可以将交易视为形成一个依赖图,其中存在从交易 A 到交易 B 的一条边,当且仅当 A 写入一个由 B 读取的存储单元,因此必须在 B 之前执行。下图显示了一个这种依赖图的示例:

image

在上面的示例中,每一列都可以并行执行,这是最佳安排(天真地,我们会顺序执行事务 1-9)。

为了克服事先不知道依赖图的事实,我们本着 Aptos Labs 开发的BLOCK-STM的精神,将乐观并行化引入到 StarkNet 定序器中。在这种范式下,我们乐观地尝试并行运行事务并在发现冲突时重新执行。例如,我们可以并行执行图 1 中的交易 1-4,之后才发现 Tx4 依赖于 Tx1。因此,它的执行是无用的(我们相对于运行 Tx1 所针对的相同状态运行它,而我们应该针对应用 Tx1 所产生的状态运行它)。在这种情况下,我们将重新执行 Tx4。

请注意,我们可以在乐观并行化之上添加许多优化。例如,与其天真地等待每次执行结束,我们可以在发现使它无效的依赖项时中止执行。

另一个例子是优化重新执行哪些交易的选择。假设包含图 1 中所有事务的块被送入具有五个 CPU 内核的定序器。首先,我们尝试并行执行交易 1-5。如果完成顺序是 Tx2,Tx3,Tx4,Tx1,最后是 Tx5,那么只有在 Tx4 已经执行完之后,我们才会发现依赖 Tx1→Tx4—— 说明应该重新执行。天真地,我们可能也想重新执行 Tx5,因为考虑到 Tx4 的新执行,它的行为可能会有所不同。然而,我们可以遍历由执行已经终止的交易构建的依赖图,只重新执行依赖于 Tx4 的交易,而不是仅仅重新执行现在无效的 Tx4 之后的所有交易。

Cairo-VM 的新 Rust 实现#

StarkNet 中的智能合约是在 Cairo 中编写的,并在 Cairo-VM 中执行,该规范出现在Cairo 论文中。目前,排序器正在使用 Cairo-VM 的python 实现。为了优化 VM 实现性能,我们发起了用 Rust 重写 VM 的工作。感谢 Lambdaclass 的出色工作他们现在是 StarkNet 生态系统中一个非常宝贵的团队,这项工作很快就会取得成果。

VM 的 rust 实现cairo-rs现在可以执行原生 Cairo 代码。下一步是处理智能合约的执行和与 pythonic 排序器的集成。一旦与 cairo-rs 集成,音序器的性能有望显着提高。

Rust 中的定序器重新实现#

我们从 python 到 rust 以提高性能的转变不仅限于 Cairo VM。除了上述改进之外,我们还计划用 Rust 从头开始重写音序器。除了 Rust 的内部优势之外,这还为序列器的其他优化提供了机会。举几个例子,我们可以享受 cairo-rs 的好处,而无需 python-rust 通信的开销,我们可以完全重新设计状态的存储和访问方式(今天是基于Patricia-Trie 结构)。

其他问题

1.starknet 测试网的应用有执行轨迹限制 (执行计算步骤),目前限制在 100 万,后续会开放更高限制。

2.stark 定制化应用 (类似于 starkex) 可开发,但目前还没发现生态项目方使用,因为目前生成证明代码仍然是一个黑匣子,并未开源。要待 starkware 后续开源,这类应用才好进入市场。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。