zkSync 2.0: Hello Ethereum!
zkEVMテストネットのアルファ版が公開
汝を夏の日に例えよう
汝はよりスケーラブルで安全である
荒れた風が5月の愛らしい心を揺さぶる
夏のリリースとはあまりにも短い道程である
- サトシ・シェイクスピア、2021年
はじめに
最大の技術的課題を乗り越え、EVM互換環境でのスマートコントラクトのデプロイに向け走り続けています。テストネットの初バージョンがローンチされ、既にブロックエクスプローラーでzkSync 2.0のアクティビティを確認することができます。この記事では、各主要コンポーネントの説明と進捗状況、今後リリースに向けての計画を紹介します。
>> ZKSYNC 2.0 TESTNET EXPLORER <<
主な成果
zkEVMの命令セットが確定し、回路と実行環境の両方の実装が完了しました。
また、コンパイラに関してはSolidityとZincの両方で書かれたスマートコントラクトをzkEVMのバイトコードにコンパイルできるようになりました。
コア・インフラに関しては、ノードの統合が完了し、コンパイルされたスマートコントラクトをデプロイ・実行することができます。
zkEVMとコア2.0のインフラの公開準備は既にできていますが、コンパイラに関してはエッジケースをカバーする為の作業が更に必要です。より包括的な開発者エクスペリエンスを提供するために、コンパイラの信頼性が100%になり次第、zkEVM、コンパイラ、コアSDKへのアクセスを公開する予定です。
zkSync 2.0とイーサリアムの比較
大半の部分は同じように感じられるはずですが、いくつかの違いを紹介します。
Solidityスマートコントラクト
イーサリアムの大部分のオペコードがサポートされていますが、いくつかの例外があります:
- ADDMOD、SMOD、MULMOD、EXP、CREATE2の各オペコードは、将来的にサポート予定です
- KECCAK256オペコードは当面サポートされず、その代わりに全ての呼び出しを別の衝突耐性のあるハッシュ関数の呼び出しに自動的に置き換えます。KECCAK256 はプリコンパイルとして導入予定です
- SELFDESTRUCT opcodeについては、Ethereumが削除を予定している為搭載しません
- フル256ビットのXOR/AND/ORオペコードは、ビットマスキング用にコンパイルされたsolidityコード上にのみ存在しており、今後サポートを削除する可能性があります。この場合コンパイラが他のオペコードを使用して実行できます
ガス
zkSync 2.0では、ガスの概念が変わります。トランザクション価格は、現在のL1ガス価格(calldataの公開による)とZKP生成コストに応じて変動します。スマートコントラクトの呼び出しには、zkEVMステップ数とストレージ書き込みパラメータの最大数が設定されます。
Web3 API
次のリリースでは、Ethereumのドキュメントで定義されているWeb3標準と互換性のある、Web3 APIの実装が含まれます。イベントは迅速に動作し、全てのサービスに統合可能になります。
zkSyncには、コミットブロックやファイナライズブロックの概念など、L1にない機能が含まれ、開発者がデータをより正確にコントロールする為のメソッドが追加されます。Web3のクライアントコードはEthereumと同じデータを受け取りますが、特定の情報は`zksync_`というネームスペースを使って要求できます。
zkSyncには複数の種類のトランザクションがあり、EIP712署名を使用している為、`eth_sendRawTransaction`のデータのフォーマットはL1とは異なりますが、エンコーディングはEthereumのABIに対応しており、サポートは難しくないと考えられます。
トランザクションの署名
zkSync 2.0のトランザクションは以下の2つの方法で認証できます:
- ユーザーは、EIP712メッセージに署名することで、通常のEthereumウォレット(MetamaskやWalletConnectのものなど)でトランザクションに署名することができます
- アカウントで公開鍵を設定して、内部のシュノア署名を作成し、トランザクションに署名することができます。これにより、スマートコントラクトベースのウォレットは、L1メッセージを送信するための余分なコストをかけずにzkSync 2.0とのやり取りを実行できます
ストレージ効率の向上
ストレージスロットの上書きはブロックごとに一度だけ適用されます。複数のユーザーが1つのAMMコントラクトとやり取りする場合、AMMコントラクトのストレージスロットは1回だけ上書きされます。これにより、シーケンサは1回の書き込み費用をユーザーに返金することができます。
プリコンパイル
プリコンパイル・メカニズムは計画中ですが、後日リリース予定です。keccak256、sha256ハッシュ、ECDSAのリカバリープリミティブをサポートする予定となっています。Blake2fラウンド関数(現在の形ではEthereumでは事実上使用不可)などの他のプリコンパイルは、需要と複雑さに応じて搭載を検討します。
追加制限
zkSync 2.0の最初のイテレーションでは、適切なアカウンティングメカニズムが実装されるまで、トランザクションあたり32のスマートコントラクトコールという追加制限が課される場合があります。実行トレースにはハードリミットがありますが、Ethereumブロックサイズの現在の制限に匹敵するもので、ほとんどのプロトコルに影響を与えないはずです。
他にも制限があるかもしれませんが、最終バージョンではそれらを最小限に抑えます。
zkSync 2.0のアーキテクチャ
ブロックチェーンのトリレンマに関し、Ethereumのスケーリングについては4つ目の要素であるプログラマビリティが存在します。現在の全てのスケーリングソリューションは、スケーラビリティの為にセキュリティ、分散化、プログラマビリティを犠牲にするというスペクトラムに存在します。zkSync 2.0の設計では、以下の2つの技術的ブレークスルーの組み合わせにより、4つの機能を最大限に活用します:
- zkEVM:EVM対応のzkRollup稼働エンジンであり、L1セキュリティとsolidityスマートコントラクトをサポートする唯一のソリューション
- zkPorter:ロールアップに比べ2桁以上のスケーラビリティを持つ、オフチェーンのデータアベイラビリティシステム
zkEVMとzkPorterは相互運用性とコンポーザブルであるため、zkSync 2.0は他の全てのスケーリングソリューションを大幅に凌駕するものとなります。
現在のコンセンサスでは、Eth2データシャーディングが2022年末までに登場し、分散性を犠牲にせずに指数関数的に大きなデータ可用性層を提供するとされています。zkSyncのzkRollup技術とEth2データシャーディングの組み合わせは、4つの要素のいずれも犠牲にすることなく100,000以上のTPSを達成する事になるでしょう。
ステートツリー
zkSync 2.0のステートツリーは、Ethereumの160ビットのアドレススペースを完全にカバーします。zkRollupとzkPorterのアカウントは、データの可用性がどこで保証されているかという要素を除いて完全に同一です。zkRollupのトランザクションデータはcalldataを通じてEthereumに公開され、zkPorterのトランザクションデータはzkSync Guardianネットワークに公開され、zkSyncトークンホルダーはProof of Stakeに参加します。
どこにデータを公開するかは、コストとセキュリティのトレードオフの関係にあります。zkPorterトランザクションはRollupトランザクションに比べて指数関数的に安価になりますが、資金凍結の可能性を伴います。しかし、zkRollupとzkPorterの両方のアカウントの有効性は、ゼロナレッジプルーフ及びEthereumにより保証されます。つまり、zkPorterの資金は凍結されるだけで失う事はありません。
zkRollupとzkPorterアカウントの相互運用性とコンポーザビリティは、すべてのユーザーにzkSyncの第一級市民となる機会を与えます。zkRollupに導入されたUniswapは、zkPorterアカウントによる最低手数料でのスワップにアクセス可能となります。
クリプトグラフィー
zkSyncのVM(最も一般的にzkEVMと呼ばれる)は、EVMの1:1レプリカではなく、Solidityで書かれたコントラクトの99%を実行でき、復帰や例外時などの同じ動作を維持することを目指すものです。zkEVMはゼロ知識証明の生成回路で効率的に動作するように書かれています。
これは証明システムに大きな変更を加えることなく行われ、カスタムゲートとルックアップテーブルを持つPLONK(一般的にはUltraPLONKと呼ばれる)とEthereumのBN-254カーブを引き続き使用しています。この証明システムは、2020年6月以降のzkSync 1.0や、同じ証明システムを使用している他のプロジェクトで実戦的にテストされているため、この点は有利です。
何ヶ月にもわたる努力の末に、発表できた事を嬉しく思います。zkEVMの命令セットが最終決定され、回路及び実行環境に実装されました。
ここで重要なことは、回路への実装と実行環境への実装は別々のものであり、それぞれ異なる目的を持っているということです。実行トレースの証明を生成し、証人を提供するのは回路の仕事ですが、これには非常に時間がかかります。一方、実行環境は、zkEVMをrustで素直に実装したもので、効率的で高速です。もし、証明生成と実行の両方を回路に頼っていたら、トランザクションのファイナリティには何時間もかかるでしょう。証明の生成と単純な実行を分離することで、zkSyncでの取引の即時決済を実現します。
次に注力しているのは、zkEVMとコンパイラの結合と、再帰の結合です。ブロック間の再帰では、N個のブロックに対して1つの証明を投稿することができ、ブロック内の再帰では、ブロックの異なる論理部分のサブプルーフを集約することができます。ブロック間の再帰的集約証明は、2020年6月以降のzkSync 1.0ですでにメインネットで使用されています。
コンパイラ
YulとZincという、zkEVMをターゲットにした2つのコンパイラ・フロントエンドを同時に開発しています。YulはSolidityの中間的な表現で、異なるバックエンド用のバイトコードにコンパイルすることができます。Zincは、スマートコントラクトや汎用のゼロ知識証明回路のためのRustベースの言語です。
コンパイラはLLVMフレームワークを用いて構築されており、フロントエンドであるYul → LLVM IR、バックエンドであるLLVM IR → zkEVMのバイトコードがあると考えることができます。
LLVMの採用は、いくつかの大きなメリットをもたらします:
- LLVMの最適化フレームワークは他に類を見ないもので、LLVM IRから最も効率的なzkEVMバイトコードを生成します
- SolidityやZincの新バージョンでは、コンパイラのフロントエンドが全変更を処理し、LLVMがコンパイラのバックエンドの変更を抽象化します
- 将来的には、開発者がRustやJavascriptのネイティブ言語でスマートコントラクトをプログラムしたい場合、zkSyncでスマートコントラクトをすぐに動作させるためには、その言語のコンパイラフロントエンドのみを構築する必要があります
コンパイラのセキュリティは私たちにとって最重要であり、既に複数のテストスイートを提供しています:
- ZincおよびYulコンパイラでの言語、構文、セマンティックテスト
- ソースコードの解析からコントラクトのデプロイメント、zkSyncでのトランザクションの実行までスマートコントラクトのライフサイクル全体を実行するZincとSolidityの両方に対する統合テスト
- Solidityのリポジトリから統合され、zkSync統合テストツールに適合された広範囲なテストスイート
各スイートはすでに数千のテストで構成されていますが、この数を少なくとも1桁は増やす予定です。2つのコンパイラは、既に両言語でのシンプルなスマートコントラクトのデプロイと実行に成功しています。まだ最適化が必要であり、複雑なLLVM IRステートメントをzkEVMバイトコードに変換する必要があります。この為、コンパイラがより強固な状態になるまで、リリースしないことにしました。
コンパイラが完成後は、Zincの表現力と機能をより豊かにすることに注力し、Rustコンパイラのフロントエンドを構築し、Rustのネイティブ言語を使ってスマートコントラクトをプログラミングできるようにしたいと考えています。
コアインフラ
zkSync 2.0のコアは複数の主要アクターで構成されています。
フルノード
- zkEVMバイトコードの仮想マシンによるプリサーキット実行環境は、トランザクション送信から数秒で使用可能な状態になります
- ブロック肥大化の可能性のある、不正なトランザクション(例:トランザクションに必要な資金が足りない)をフィルタリングします
- mempool内のトランザクションを実行し、ブロックを生成します
プロバー
- ブロックの証明を受け取り、ゼロ知識証明を生成
- 並行して証明を生成するプロバー・インターフェース
- 必要に応じてプローバ・マシンを作成、削除するカスタム・プローバ・オートスケーラー
インタラクター
パラノイド・モニター
Prometheus、elastic、sentry、uptime、複数の独立したインシデント通知システム、およびカスタムヘルスチェックサービス
***
このコア・インフラは完全に機能しており、zkEVMのエグゼキュータもすでに統合されています。