警告
このクレートはアーカイブされています。開発は zksync-crypto リポジトリに移行しました。代わりに使用してください。
zkSync Era は、ゼロ知識証明を使用して、セキュリティや分散化を損なうことなくイーサリアムを拡張するレイヤー 2 ロールアップです。 EVM 互換 (Solidity/Vyper) であるため、99% の Ethereum プロジェクトは、コードを 1 行もリファクタリングまたは再監査することなく再デプロイできます。 zkSync Era は LLVM ベースのコンパイラーも使用しており、最終的には開発者が C++、Rust、その他の一般的な言語でスマート コントラクトを作成できるようになります。
このライブラリの目的は、フィールド サイズに関する追加の仮定を使用して、非常に特殊な算術演算を処理することです。おおよそ、フィールドF
には |F| が含まれると予想されます。 ~ 64 ビット (マシンワードのサイズ) (フィールドサイズに関する仮定は、算術化とゲート配置の戦略にとって重要ではありませんが、特定のフィールドサイズに依存する特定の関数のガジェット実装ではアサートされます)。
システムには、論理関数 (ガジェット)、ゲート (トレースに自身を書き込むことができるエンティティ)、および評価器 (多項式間の関係) の階層があります。評価器は特性の形式で記述されており、これにより、後で満足可能性をチェックして証明を計算するための関数を自動的に構成したり、単純な再帰的検証器を合成したりすることができます。ゲートには、ゲート自体がトレース内のどこに配置されるべきかのロジックを追跡できるようにする追加のツールが取り付けられています。 Plonk のコピー制約に依存し、「変数」のコピー可能な論理エンティティを処理して、最終的な証明可能なステートメントを作成することに注意してください。このシステムは AIR 算術化を目的としていないため、トレースの複数行にわたる制約を表現することはできません。
一般に、トレースには数種類の列が含まれます。主な分離は次のとおりです。
さらに、トレースではルックアップ引数を追加できます。これにより、ルックアップ テーブルのエントリを格納する特殊な列を使用することも、単に汎用の列を使用することもできます。現時点では、テーブルは 1 セットの多項式のみとしてエンコードされるため、トレースの全長はテーブル内のエントリの総数より大きくなければなりません。
すべての「ゲート」(Rust タイプとして) は一意であるため、ゲートは特殊な列または汎用の列のいずれかにのみ配置でき、両方には配置できないことに注意してください。そのような機能が必要な場合は、newtype ラッパーを作成することができます。
より高いレベルの論理関数 (ブール分解、範囲チェック、ゼロ チェックなど) を使用して、CS の特定のインスタンスで一部のゲートが許可されるか許可されないかに応じて、回路がさまざまな方法で内部的に自身を組み込むようになります。異なるゲートのセットを持つ CS のインスタンスは、Rust の観点からは異なるタイプとみなされ、静的ジャンプへの分岐を減らすために、いくつかのインライン化/定数プロパティ/コンパイラの作業に依存しています。
|F|
であるため、引数を繰り返す必要があります) が、これは次のように拡張フィールドに移動するように変更されます。分母にゼロが発生する非常に「大きな」可能性を避けるために、証人にコミットした後、できるだけ早く実行してください。証明における計算コストへの影響はごくわずかですsum_i selector(x_i) / (witness(x_i) + beta) == sum_i multiplicity(x_i) / (table(x_i) + beta)
という関係を介して適用される検索引数を使用します。ここで、特殊な列selector(x_i)
) に対する検索が行われます。 selector(x_i)
単なるアイデンティティです。また、余分な次数境界チェックを排除するためにテーブルをより小さい次数の多項式としてエンコードせず、代わりにゼロを埋め込みます。複数のテーブルがある場合 (テーブルが 1 つだけ使用されている場合でも)、テーブル タイプごとに個別の ID 列を使用するため、テーブル エントリには(0,0,...,0)
の要素が含まれないことに注意してください。このように1から始まります。
このようなルックアップ引数の優れた特徴の 1 つは、その加算的な性質により、同じテーブル内で複数のwitness
多項式をルックアップする場合、多項式 (のタプル) ごとに引数を繰り返すのではなく (これには、別の多重度列と、後でいくつかの中間多項式を使用する場合)、多重度を「加算」し、引数をsum_i selector_0(x_i) / (witness_0(x_i) + beta) + sum_i selector_1(x_i) / (witness_1(x_i) + beta) == sum_i total_multiplicity(x_i) / (table(x_i) + beta)
のようなものに変換できます。 sum_i selector_0(x_i) / (witness_0(x_i) + beta) + sum_i selector_1(x_i) / (witness_1(x_i) + beta) == sum_i total_multiplicity(x_i) / (table(x_i) + beta)
、ルックアップの総コストは次のようになります。 1 つの多重度列と 2 (証人関連) + 1 (テーブル関連) の中間多項式だけですUnity の根の lhs と rhs 関係をエンコードします。
この議論の正しさは明らかです。健全性を保つために、「高速検索のためのキャッシュされた商」論文の補題 2.4 と同様に元の引数を使用します。 witness_0
とwitness_1
の多重度を個別にコミットするのではなく、 total_multiplicity
にコミットするだけで十分であることを示す必要があります。
sum_i selector_0(x_i) / (witness_0(x_i) + X) + sum_i selector_1(x_i) / (witness_1(x_i) + X) == sum_i total_multiplicity(x_i) / (table(x_i) + X)
式があるとします。 sum_i selector_0(x_i) / (witness_0(x_i) + X) + sum_i selector_1(x_i) / (witness_1(x_i) + X) == sum_i total_multiplicity(x_i) / (table(x_i) + X)
が成立します。 witness_0
とwitness_1
がテーブルt
に含まれていることを示す必要があります。 f = (witness_0 | witness_1)
、値の連結とします。上記の方程式はsum_i selector_i / (f_i + X) == sum_i total_multiplicity_i / (t_i + X)
を意味します (左側のi
の区間長が上記の 2 倍であることに注意してください)。補題 2.4 により、ベクトルf
のすべての座標がt
の座標であるという意味で、 f subset t
: "subset" が得られます。特に、 witness_0, witness_1 subset f subset t
です。
この引数は複数のwitness_i
にも当てはまります。選択されたbeta
に対する健全性引数の残りの部分は、上記の作業と同様に直接続きます。
0
が得られる2^-40
の確率と比較すると、このトレードオフは許容可能であるためです。 SHA256 回路のゲート + テーブルのある程度最適な構成と考えられるものを使用した、8kB の SHA256 のベンチマークがあります。証明者はある程度高速ですが、FFT を適切に最適化していないため、証明が再帰に使用されることが予想される構成には依然として Poseidon (Poseidon2 ではありません) を使用していることに注意してください。 2 つのスクリプトsha256_bench_recursive.sh
とsha256_bench_non_recursive.sh
を使用すると、対応するテスト (証明が再帰で使用されることが期待されているかどうか) を実行できます。証明時間を確認するにはProving is done, taken ...
という行を探す必要があります。なぜなら、その後に実行されるベリファイアは非常に冗長だからです。これらのベンチマークでは、すべての制約が次数 4 以下であるにもかかわらず、LDE 係数 8 が使用されています。ただし、これは他の公開ベンチマークでも使用されているパラメーターです。また、20 ビットの PoW は無視できる程度 (30 ミリ秒) であり、代数ハッシュ上の PoW はまだサポートしていないため、これらの証明では PoW を使用しません (ただし、それらは ~2 倍遅いだけなので、無視できる程度です)。セキュリティ レベルはおよそ100
ビットですが、FRI の健全性はクエリの数を増やすことで高めることができ、クエリの数が増えても証明時間は増加しません (FRI レートの変更と混同しないでください)。トレースの長さは2^16
で、60 個の汎用列と幅 4 の 8 個の検索引数を使用します。
注: ベンチマークはネイティブ アーチへのコンパイルを試行するだけであり、現時点では通常、AArch64 (Apple M1 と読みます) アーチのみがエンドツーエンドでテストされます。 x86-64 の算術実装の有効性はテストされましたが、完全な証明ではエンドツーエンドではテストされませんでした。 x86-64 の最大パフォーマンスには、 cpu = native
に加えて追加のコンパイラ機能フラグが必要であることに注意してください (AVX512 セットは、ネイティブ CPU 上でも Rust コンパイラでは使用されません)。
Boojum 証明者は、次のいずれかの条件に従って配布されます。
あなたのオプションで。
zkSync Era は多くのテストと監査を経てきました。ライブではありますが、まだアルファ版であり、さらなる監査とバグ報奨金プログラムが行われる予定です。それに関するコミュニティの意見や提案をぜひお聞かせください。今すぐフォークすると、重要なセキュリティ更新プログラム、重要な機能、およびパフォーマンスの向上が失われる可能性があることを述べておくことが重要です。
このソフトウェアにはサードパーティのコンポーネントが含まれています。これらのコンポーネントとそのライセンスの完全なリストについては、THIRD PARTY NOTICES ファイルを参照してください。