IIRC rust vm 将在年底包含在 1.0 版本中
定序器并行化#
我々のロードマップの最初のステップは、トランザクションの並列実行を導入することです。これは、昨日公開された StarkNet alpha 0.10.2 で導入されました。ここでは、並列化とは何かについて詳しく説明します。
では、「トランザクションの並列化」とはどういう意味でしょうか?単純に言えば、トランザクションブロックを並列に実行することは不可能です。なぜなら、異なるトランザクションは相互に依存している場合があるからです。これは以下の例で説明されています。同じユーザーからの 3 つのトランザクションを含むブロックを考えてみましょう:
- トランザクション 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 の前に実行する必要があります。以下の図は、このような依存関係グラフの例を示しています:
上記の例では、各列は並列に実行できます。これが最適なスケジュールです(単純にトランザクション 1-9 を順番に実行することもできます)。
事前に依存グラフを知らないという事実に対処するために、私たちは StarkNet オーソライザに乐观并行化を導入しました。このパラダイムでは、トランザクションを楽観的に並列実行し、競合が発生した場合に再実行します。例えば、図 1 のトランザクション 1-4 を並列に実行し、その後に Tx4 が Tx1 に依存していることがわかります。したがって、その実行は無駄です(Tx1 が生成した状態に対して実行する必要があります)。この場合、私たちは Tx4 を再実行します。
乐观并行化の上には、さまざまな最適化を追加することができます。たとえば、各実行の終了を単純に待つのではなく、無効にする依存関係が見つかった場合に実行を中止することができます。
もう 1 つの例は、再実行するトランザクションの選択を最適化することです。図 1 に含まれるすべてのトランザクションを含むブロックがオーソライザに送信され、オーソライザには 5 つの CPU コアがあるとします。最初に、トランザクション 1-5 を並列に実行してみます。順番が Tx2、Tx3、Tx4、Tx1、最後に Tx5 である場合、Tx4 が実行された後にのみ、Tx1→Tx4 の依存関係が発見されるため、再実行する必要があります。単純には、Tx5 も再実行したいかもしれませんが、Tx4 の新しい実行を考慮すると、その動作が異なる可能性があるためです。しかし、終了したトランザクションによって構築された依存グラフをトラバースし、Tx4 に依存するトランザクションのみを再実行することができます。これにより、現在無効な Tx4 の後に実行されるすべてのトランザクションを再実行する必要はありません。
Cairo-VM の新しい Rust 実装#
StarkNet のスマートコントラクトは Cairo で記述され、Cairo-VM で実行されます。Cairo の仕様はCairo 論文に記載されています。現在、オーソライザは Cairo-VM のPython 実装を使用しています。VM の実装のパフォーマンスを最適化するために、VM の Rust による再実装の作業を開始しました。この作業には、Lambdaclass の素晴らしい仕事(https://lambdaclass.com/)に感謝します。彼らは StarkNet エコシステムで非常に貴重なチームとなっており、この作業はすぐに成果を上げるでしょう。
Rust で実装された VM であるcairo-rsは、現在、ネイティブの Cairo コードを実行することができます。次のステップは、スマートコントラクトの実行と Pythonic オーソライザとの統合を処理することです。cairo-rs との統合が完了すると、オーソライザのパフォーマンスが大幅に向上することが期待されます。
Rust でのオーソライザの再実装#
Python から Rust へのパフォーマンス向上への移行は、Cairo VM に限定されません。上記の改善策に加えて、オーソライザを Rust でゼロから再実装する計画もあります。Rust の内部的な利点に加えて、オーソライザの他の最適化の機会も提供されます。いくつかの例を挙げると、Python-Rust の通信のオーバーヘッドを気にすることなく cairo-rs の利点を享受できるようになりますし、状態の格納とアクセス方法を完全に再設計することもできます(現在はPatricia-Trie 構造に基づいています)。
その他の問題
-
StarkNet テストネットでは、実行トレースの制限(実行ステップ数)があります。現在の制限は 100 万ですが、将来的にはより高い制限が設定される予定です。
-
Stark のカスタマイズアプリ(Starkex のようなもの)は開発できますが、現時点では生態系プロジェクトが使用していないようです。これは、証明コードの生成がまだブラックボックスであり、オープンソース化されていないためです。Starkware が将来的にオープンソース化するまで、このようなアプリは市場に参入することはできません。