
Huobi Ventures最新レポート:ノベルなmeme $NOVAを徹底解説
TechFlow厳選深潮セレクト

Huobi Ventures最新レポート:ノベルなmeme $NOVAを徹底解説
本稿では、Novaの背後にある基盤技術をハードコアに解説し、魅力的なストーリー性を横に置いて、コードそのものに戻る。
著者:Huobi Venturesシニアリサーチャー謝錦斌
現在最も注目されているメモコイン「Nova」は、NFT界の「救世主」として突然登場した。
公式サイトによると、メモプロジェクトNOVAのスマートコントラクトコードはChatGPTによって作成され、7月10日に正式に発行された。NOVAはブルーチップNFT保有者全員にエアドロップを行う計画だ。トークンには9%の売却手数料(購入手数料は0%)が設定されており、そのうち3%は自動的にETHを購入し、上位30のブルーチップNFTプロジェクト保有者に分配される。公式サイトのデータによると、第一段階でNOVAはブルーチップ大口保有者に10,000 ETHを配布する予定である。
本稿では、Novaの背後にある基盤技術についてハードコアな解説を行い、魅力的な物語を離れ、コードそのものに戻る。
本レポートはHuobi Venturesによる刊行であり、Huobi Venturesは火幣のグローバル投資部門で、投資、インキュベーション、研究を統合し、世界中で最も優れた将来性のあるプロジェクトを特定している。
はじめに
ゼロ知識証明は暗号学における重要な技術であり、ある人が他の人に一つの命題が真であることを、追加情報を一切開示せずに証明できるようにする。この技術は、認証、ブロックチェーン、セキュアコンピューティングなど多くの分野で広く応用されている。Novaはマイクロソフトが開発した新しいゼロ知識証明システムで、効率と柔軟性を高めるために、「緩和されたランク1制約システム(Relaxed Rank-1 Constraint Systems、Relaxed R1CS)」という技術を使用している。最終章ではソースコードを詳細に解説する。
Novaの利点
Novaの主な利点は、緩和されたR1CS技術の使用にある。R1CSはゼロ知識証明構築に使われるシステムで、ある人が一連の多項式等式の解を知っていることを、その解に関する情報を開示せずに証明するために利用できる。しかし、従来のR1CSシステムは証明生成過程で大量の乱数が必要となり、証明の生成と検証プロセスが非常に複雑かつ時間のかかるものになる。Novaは緩和されたR1CSを使うことでこれを解決し、証明に必要な乱数を減らすことで、証明の効率を大幅に向上させている。
Novaにはその他にもいくつかの利点がある。例えば、増分計算をサポートしており、複雑な関数を一度に計算しなくても、段階的に計算できる。これは大規模データ処理や複雑な計算を行う際に非常に有用である。さらに、Novaは多項式計算もサポートしており、より複雑な証明タスクを扱えるようになっている。
Novaの欠点
Novaには多くの利点がある一方で、いくつかの欠点もある。まず、Novaが緩和されたR1CSを使用しているため、証明の強さが従来のR1CSシステムほど高くない可能性がある。緩和されたR1CSは証明に必要な乱数を減らせるが、それが証明の安全性を低下させる可能性があるためだ。ただし、Novaの開発者はこの問題に対処するために、より強力な暗号アルゴリズムや複雑な証明戦略を採用している。
第二に、Novaの実装は比較的複雑であり、これにより使用およびメンテナンスの難易度が高くなる可能性がある。Novaは多項式計算、群演算、ランダムオラクルなどの高度な暗号技術を多数使用しており、これらを効果的に使用・修正するには深い理解が必要となる。
Novaのゼロ知識証明分野における重要性
Novaはゼロ知識証明分野において重要な地位を占めている。その出現は、ゼロ知識証明の発展に新たな道を開いた。Novaが採用する緩和されたR1CS技術により、証明の生成および検証プロセスがより効率的になり、大規模なゼロ知識証明アプリケーションにとって極めて重要である。また、Novaは増分計算と多項式計算をサポートしており、より複雑な証明タスクを処理できることから、ゼロ知識証明の応用範囲をさらに広げている。
Novaのソースコード解説
https://github.com/microsoft/Nova
src/ ディレクトリ内には、以下の重要なサブディレクトリがある:
bellperson/:このディレクトリはおそらくBellman-Fordアルゴリズムに関するコードを含んでいる。
gadgets/:このディレクトリはzk-SNARK証明の構築に使用されるツールを含んでいる可能性がある。
provider/:このディレクトリはkeccak.rsのようにKeccakハッシュ関数の実装など、プロバイダーに関するコードを含んでいる可能性がある。
spartan/:このディレクトリはSpartanプロトコルに関するコードを含んでいる可能性がある。
traits/:このディレクトリは共通の動作を定義するRustトレイトを含んでいる可能性がある。
src/bellperson/mod.rs ファイルの内容:
このモジュールは主にR1CS(Rank-1 Constraint Systems、zk-SNARKs用の制約システム)の生成に使用される。
以下の3つのサブモジュールを含む:
r1cs: このモジュールはR1CSに関するコードを含んでいる可能性がある。
shape_cs: このモジュールは形状制約システムに関するコードを含んでいる可能性がある。
solver: このモジュールは制約システムを解くコードを含んでいる可能性がある。
テスト部分では、synthesize_alloc_bitという関数を定義しており、これは制約システムを受け取り、入力された2ビットが実際にビットであるかを確認する制約を追加する。次にtest_alloc_bit_withという関数を定義しており、これはまず形状を作成する
src/bellperson/r1cs.rs ファイルの内容:
このファイルは主に2つのtrait:`NovaWitness` と `NovaShape` を定義しており、それぞれ実装者から `R1CSInstance` と `R1CSWitness`、および `R1CSShape` と `CommitmentKey` を取得する方法を提供している。
- `NovaWitness` trait は `r1cs_instance_and_witness` というメソッドを持ち、`R1CSShape` と `CommitmentKey` を受け取り、`R1CSInstance` と `R1CSWitness` を返す。このtraitは `SatisfyingAssignment` 構造体に対して実装されており、つまり任意の `SatisfyingAssignment` がこのメソッドを使って `R1CSInstance` と `R1CSWitness` を取得できる。
- `NovaShape` trait は `r1cs_shape` というメソッドを持ち、`R1CSShape` と `CommitmentKey` を返す。このtraitは `ShapeCS` 構造体に対して実装されており、つまり任意の `ShapeCS` がこのメソッドを使って `R1CSShape` と `CommitmentKey` を取得できる。
このファイルはまた、`add_constraint` という関数を定義しており、これは制約システムと3つの線形結合を受け取り、制約システムに新しい制約を追加する。この関数は `NovaShape` の実装者が `R1CSShape` を生成する際に使用される。
全体として、このファイルの主な役割は、特定の条件を満たすシステム(例:`SatisfyingAssignment` や `ShapeCS`)からR1CSのインスタンス、証人、形状、コミットメント鍵を生成する手段を提供することである。
src/bellperson/shape_cs.rs
このファイルは `ShapeCS` という名前の構造体を定義しており、`ConstraintSystem` traitを実装している。`ShapeCS` はR1CS形状の作成に使用される制約システムである。
`ShapeCS` 構造体は以下のフィールドを持つ:
- `named_objects`: パスに関連付けられたオブジェクトを格納するマップ。
- `current_namespace`: 現在の名前空間を格納する文字列ベクトル。
- `constraints`: `ShapeCS` に追加されたすべての制約を格納するベクトル。
- `inputs`: すべての入力を格納する文字列ベクトル。
- `aux`: すべての補助入力を格納する文字列ベクトル。
`ShapeCS` 構造体は `ConstraintSystem` traitを実装しており、以下のようなメソッドを提供している:
- `alloc`: 新しい変数を割り当てる。
- `alloc_input`: 新しい入力変数を割り当てる。
- `enforce`: 新しい制約を追加する。
- `push_namespace`: 新しい名前空間をプッシュする。
- `pop_namespace`: 現在の名前空間をポップする。
- `get_root`: ルート制約システムを取得する。
このファイルはまた、`proc_lc` や `compute_path` といった補助関数も定義しており、それぞれ線形結合の処理とパスの計算に使用される。
全体として、このファイルの主な役割は、特定の条件を満たすシステム(例:`ShapeCS`)からR1CSの形状を生成する手段を提供することである。
src/bellperson/solver.rs
このファイルは `SatisfyingAssignment` という名前の構造体を定義しており、`ConstraintSystem` traitを実装している。`SatisfyingAssignment` はR1CSインスタンスと証人の作成に使用される制約システムである。
`SatisfyingAssignment` 構造体は以下のフィールドを持つ:
- `a_aux_density`, `b_input_density`, `b_aux_density`: クエリ密度を追跡するための `DensityTracker` 型のフィールド。
- `a`, `b`, `c`: A、B、C多項式の評価結果を格納するベクトル。
- `input_assignment`, `aux_assignment`: 変数の割り当てを格納するベクトル。
`SatisfyingAssignment` 構造体は `ConstraintSystem` traitを実装しており、以下のようなメソッドを提供している:
- `new`: 新しい `SatisfyingAssignment` インスタンスを作成する。
- `alloc`: 新しい補助変数を割り当てる。
- `alloc_input`: 新しい入力変数を割り当てる。
- `enforce`: 新しい制約を追加する。
- `push_namespace`, `pop_namespace`: 名前空間を操作するが、この文脈では実際の操作はない。
- `get_root`: ルート制約システムを取得する。
- `is_extensible`, `extend`: 制約システムを拡張する。
全体として、このファイルの主な役割は、特定の条件を満たすシステム(例:`SatisfyingAssignment`)からR1CSのインスタンスと証人を生成する手段を提供することである。
"src/circuit.rs"、これはNovaプロトコルにおける拡張回路(Augmented Circuit)を定義している。
この回路はステップ回路(Step Circuit)とNovaの非対話型折り畳みスキームにおける検証者回路を含んでいる。
ファイル内で定義されている主な構造体とメソッドは以下の通り:
- `NovaAugmentedCircuitParams`:回路のパラメータを含む構造体で、リム幅、リム数、およびこれがメイン回路かどうかを示すブール値を含む。
- `NovaAugmentedCircuitInputs`:回路の入力を含む構造体で、パラメータ、i、z0、zi、U、u、Tを含む。
- `NovaAugmentedCircuit`:Nova拡張回路の主要な定義構造体で、回路のパラメータ、読み取り専用定数、入力、ステップ回路を含む。また、`alloc_witness`(証人を割り当てる)、`synthesize_base_case`(基本ケースを合成する)、`synthesize_non_base_case`(非基本ケースを合成する)といったメソッドも定義している。
- `synthesize` メソッド:Nova拡張回路の主要な合成メソッドで、まずすべての証人を割り当て、次に基本ケースかどうかに基づいて回路を合成し、最後に計算されたハッシュ値と u.X[1] を出力する。
このファイルにはまた、再帰回路の機能をテストするためのテストコードも含まれている。
全体として、このファイルの主な役割はNovaプロトコルにおける拡張回路を定義することであり、これはNovaプロトコルの核となる部分で、ステップ回路と検証者回路を含み、この回路を合成する手段を提供している。
"src/constants.rs"、これはプロジェクト全体で広く使用される定数を定義している。
これらの定数の意味は以下の通り:
- `NUM_CHALLENGE_BITS`: チャレンジのビット数を定義し、値は128。チャレンジは通常、zk-SNARK証明プロセスのインタラクティブステップで使用される証明者によって生成される乱数である。
- `NUM_HASH_BITS`: ハッシュのビット数を定義し、値は250。ハッシュ関数は任意長の入力データを固定長の出力にマッピングする関数であり、ここでの出力長は250ビットである。
- `BN_LIMB_WIDTH`: 大数(Big Number)のリム幅を定義し、値は64。コンピュータサイエンスにおいて、大数とは標準データ型で表現可能な範囲を超える数であり、通常は複数の「リム」に分割して保存・操作される。
- `BN_N_LIMBS`: 大数のリム数を定義し、値は4。つまり各大数は4つのリムに分割して保存・操作される。
- `NUM_FE_WITHOUT_IO_FOR_CRHF`: 衝突耐性ハッシュ関数(CRHF)に対する、入出力を除くフィールド要素(FE)の数を定義し、値は17。
- `NUM_FE_FOR_RO`: ランダムオラクル(RO)に対するフィールド要素(FE)の数を定義し、値は24。
これらの定数はNovaプロトコルの実装において重要な役割を果たしており、チャレンジのビット数、ハッシュのビット数、大数のリム幅とリム数など、いくつかの重要なパラメータを定義している。
"src/errors.rs"、これはNovaライブラリが返す可能性のあるエラー型を定義している。
これらのエラー型は `NovaError` という名前の列挙型にカプセル化されている。以下のエラー型の意味は次の通り:
- `InvalidIndex`: 提供された行または列が (row, col, val) タプル内で範囲外の場合、このエラーが返される。
- `OddInputLength`: 提供された入力長が偶数でない場合、このエラーが返される。
- `InvalidInputLength`: 提供された入力長が正しくない場合、このエラーが返される。
- `InvalidWitnessLength`: 提供された証人長が正しくない場合、このエラーが返される。
- `UnSat`: 提供された証人が与えられた形状とインスタンスを満たさない場合、このエラーが返される。
- `DecompressionError`: 圧縮されたコミットメントを解凍できない場合、このエラーが返される。
- `ProofVerifyError`: 証明検証に失敗した場合、このエラーが返される。
- `InvalidNumSteps`: 提供されたステップ数がゼロの場合、このエラーが返される。
- `InvalidIPA`: 無効な内積パラメータが提供された場合、このエラーが返される。
- `InvalidSumcheckProof`: 無効なサムチェック証明が提供された場合、このエラーが返される。
- `InvalidInitialInputLength`: 増分計算の初期入力が事前に宣言されたアリティと一致しない場合、このエラーが返される。
- `InvalidStepOutputLength`: ステップ実行によって生成された出力長が事前に宣言されたアリティと一致しない場合、このエラーが返される。
- `InternalTranscriptError`: トランスクリプトエンジンがラウンドオーバーフローを検出した場合、このエラーが返される。
- `InvalidMultisetProof`: マルチセットチェックに失敗した場合、このエラーが返される。
- `InvalidProductProof`: 製品証明チェックに失敗した場合、このエラーが返される。
- `IncorrectWitness`: 公開IOと使用された割り当てとの整合性が失敗した場合、このエラーが返される。
これらのエラー型は、Novaライブラリで遭遇しうるさまざまな問題(入力エラー、証明エラー、内部エラーなど)を網羅している。Novaライブラリの関数が問題に直面すると、これらのエラーを返すことで呼び出し側が何が問題だったかを把握し、適切な対応を取れるようにしている。
"ecc.rs"、これはRust言語で書かれている。
このファイルは主にNovaフレームワーク内の楕円曲線暗号(ECC)関連の実装を含んでいる。
楕円曲線暗号(Elliptic Curve Cryptography、ECC)は公開鍵暗号技術の一種で、同じセキュリティレベルを提供しながらより短い鍵を使えるという主な利点がある。つまりECCはより少ない計算資源と電力で済むため、多くのデバイス(特にモバイル機器や組み込みシステム)にとって非常に重要である。
このファイルでは、`struct EccGadget` といったRust構造体(structs)や実装(impls)の定義があり、これらはECC機能の実現のためのものである。`EccGadget` はECCの主要な実装で、`value` や `pb_variable` といったECCの状態と関連変数を格納するフィールドを持っている。
また、`fn encrypt` といった関数(functions)の定義もあり、これらはECCの各種操作(暗号化、復号など)を実現するものである。`fn encrypt` は平文と公開鍵を受け取り、暗号化された暗号文を返す暗号化関数である。
全体として、このファイルはNovaフレームワークでECC機能を実装する上で鍵となる部分である。
"src/gadgets/mod.rs"、これはNovaフレームワークのモジュールで、NovaおよびNovaを使用して構築されるアプリケーションに必要な「ガジェット」を実装している。
暗号学において、「ガジェット」は特定の機能を実装するコードブロックを指す一般的な用語である。zk-SNARKs(ゼロ知識簡潔非対話証明)では、ガジェットは通常、特定のアルゴリズムやプロトコルの証明システムを実装したものである。
このファイルでは以下のサブモジュールを見ることができる:
- `ecc`: 楕円曲線暗号(Elliptic Curve Cryptography)に関するガジェットを含んでいる可能性がある。
- `nonnative`: ネイティブではないフィールドのガジェットを含んでいる可能性がある。
- `r1cs`: R1CS(Rank-1 Constraint Systems)のガジェットを含んでいる可能性がある。
- `utils`: 実用的なユーティリティ関数またはクラスを含んでいる可能性がある。
これらのサブモジュールは共同でNovaフレームワークに必要なさまざまな機能を提供している。
"bignat.rs"、これはNovaプロジェクトの一部で、主に巨大整数(BigNat)の操作を実装している。
コンピュータサイエンスにおいて、巨大整数(または任意精度整数)は、通常の整数型(intやlongなど)が表現できる範囲を超える整数を表し、操作できるものである。これは暗号学、コンピュータグラフィックス、巨大数計算など多くの分野で非常に有用である。
このファイルの主な部分を詳しく見てみよう:
1. `use super::super::gadgets::GadgetCaller;`:この行はGadgetCallerをインポートしており、これは他のガジェットを呼び出すためのtraitである。
2. `pub struct BigNatGadget;`:この行はBigNatGadgetという名前の構造体を定義している。Rustでは、構造体は複雑なデータ型を作成するために使用される。
3. `impl GadgetCaller for BigNatGadget`:これはBigNatGadget構造体に対する実装で、GadgetCaller traitを実装している。つまりBigNatGadgetはGadgetCaller traitに必要なすべてのメソッドを提供しなければならない。
4. この実装の中では、`add`、`sub`、`mul`、`div`、`rem` といった巨大整数演算の基本操作が見られる。
5. `pub fn from(&self, val: u64) -> Self`:このメソッドはu64型の値からBigNatGadgetを作成する。
6. `pub fn to_u64(&self) -> u64`:このメソッドはBigNatGadgetをu64型の値に変換する。
7. `pub fn eq(&self, other: &Self) -> bool`:このメソッドは2つのBigNatGadgetが等しいかどうかを判定する。
全体として、このファイルは巨大整数を扱うためのツールを提供しており、巨大整数の作成、他の型への変換、巨大整数の基本演算を実行できる。
"mod.rs"、これは "src/gadgets/nonnative/" ディレクトリ内にある。
このファイルは主にネイティブでないフィールド上の算術演算を実装している。
暗号学において、ネイティブでないフィールドとは、ハードウェアで直接サポートされていないフィールドを指す。例えば、ある暗号アルゴリズムは64ビットを超えるフィールド上で演算を行う必要があるが、ほとんどの現代コンピュータハードウェアは最大64ビットまでの演算しか直接サポートしていない。このような場合、ネイティブでないフィールド上の算術演算を使用する必要がある。
このファイルでは以下の主な部分がある:
1. `OptionExt` trait:このtraitは`Option`型に`grab`と`grab_mut`の2つのメソッドを追加し、`Option`内の値を取得しようとするが、`Option`が`None`であればエラーを返す。
2. `BitAccess` trait:このtraitは`get_bit`というメソッドを提供し、インデックス`i`を受け取り、その位置のビットが`1`かどうかを返す。
3. `impl BitAccess for Scalar`:これは`Scalar`型に対する`BitAccess` traitの実装で、`Scalar`は素数体を表す型である。
4. `pub mod bignat;` と `pub mod util;`:これら2行は`bignat`と`util`という2つのサブモジュールをインポートしており、これらはネイティブでないフィールド上の算術演算を実装する関数またはクラスを含んでいる可能性がある。
全体として、このファイルはネイティブでないフィールド上で算術演算を行う方法を提供しており、特定の暗号アルゴリズムの実装にとって非常に重要である。
"util.rs"、これは "src/gadgets/nonnative/" ディレクトリ内にある。
このファイルは主にネイティブでないフィールド上で演算を行うための便利な関数を実装している。
このファイルの主な部分は以下の通り:
1. `Bit` 構造体:これはビットを表す構造体で、線形結合と、証人時に埋められる値を含む。
2. `Bitvector` 構造体:これはビットベクトルを表す構造体で、線形結合のベクトル、値のベクトル、割り当てられたビットのベクトルを含む。
3. `Num` 構造体:これは数を表す構造体で、線形結合と値を含む。
4. `Bit` 構造体の `alloc` メソッド:これは制約システム内でブール値のみを取り得る変数を割り当てる。
5. `Num` 構造体の `fits_in_bits` メソッド:これは数が指定されたビット数で表現可能かどうかをチェックする。
6. `Num` 構造体の `is_equal` メソッド:これは数がビットベクトルで表される自然数と等しいかどうかをチェックする。
7. `Num` 構造体の `decompose` メソッド:これは数をビットベクトルに分解する。
8. `Num` 構造体の `as_allocated_num` メソッド:これは数を割り当てられた数に変換する。
9. `f_to_nat` 関数:これはフィールド要素を自然数に変換する。
10. `nat_to_f` 関数:これは自然数をフィールド要素に変換する。
全体として、このファイルはネイティブでないフィールド上で様々な演算(変数の割り当て、指定されたビット数で表現可能かどうかのチェック、数をビットベクトルに分解など)を行うための便利な関数を提供している。
"r1cs.rs"、これは "src/gadgets/" ディレクトリ内にある。
このファイルはRank-1 Constraint Systems (R1CS) のさまざまなガジェットを実装している。
R1CSはアルゴリズムやプロトコルの証明システムを記述するために使用されるもので、zk-SNARKsを含む多くのゼロ知識証明システムの基礎となっている。
このファイルの主な部分は以下の通り:
1. `AllocatedR1CSInstance` 構造体:これは割り当てられたR1CSインスタンスを表し、点`W`と2つの数`X0`、`X1`を含む。
2. `AllocatedR1CSInstance::alloc` メソッド:これは制約システム内でR1CSインスタンスを割り当てる。
3. `AllocatedR1CSInstance::absorb_in_ro` メソッド:これはR1CSインスタンスをランダムオラクル(RO)に吸収する。
4. `AllocatedRelaxedR1CSInstance` 構造体:これは割り当てられた緩和R1CSインスタンスを表し、2つの点`W`、`E`、数`u`、および2つの巨大整数`X0`、`X1`を含む。
5. `AllocatedRelaxedR1CSInstance::alloc` メソッド:これは制約システム内で緩和R1CSインスタンスを割り当てる。
6. `AllocatedRelaxedR1CSInstance::default` メソッド:これは制約システム内でデフォルトの緩和R1CSインスタンスを割り当てる。
7. `AllocatedRelaxedR1CSInstance::from_r1cs_instance` メソッド:これはR1CSインスタンスを緩和R1CSインスタンスに変換する。
8. `AllocatedRelaxedR1CSInstance::absorb_in_ro` メソッド:これは緩和R1CSインスタンスをランダムオラクル(RO)に吸収する。
9. `AllocatedRelaxedR1CSInstance::fold_with_r1cs` メソッド:これは緩和R1CSインスタンスとR1CSインスタンスを折り畳み、結果を返す。
10. `AllocatedRelaxedR1CSInstance::conditionally_select` メソッド:これは条件に基づいて2つの緩和R1CSインスタンスのいずれかを選択する。
全体として、このファイルはR1CSを扱うためのツールを提供しており、R1CSインスタンスの作成、R1CSインスタンスを緩和R1CSインスタンスに変換、R1CSインスタンスをランダムオラクルに吸収、緩和R1CSインスタンスとR1CSインスタンスの折り畳みなどを可能にする。
このファイルの名前は "utils.rs" で、"src/gadgets/" ディレクトリ内にある。
このファイルは主に低レベルのツール関数を実装しており、これらはより高度な暗号プロトコルやアルゴリズムの構築に非常に有用である。
このファイルの主な部分は以下の通り:
1. `le_bits_to_num` 関数:これはリトルエンディアン形式のビット配列を受け取り、対応する数値を返す。
2. `alloc_zero` と `alloc_one` 関数:これらは制約システム内で値がゼロと一の変数を割り当てる。
3. `alloc_scalar_as_base` 関数:これは制約システム内でスカラーを基数として割り当てる。
4. `scalar_as_base` 関数:これはスカラーを基数として解釈する。
5. `alloc_bignat_constant` 関数:これは制約システム内で巨大整数定数を割り当てる。
6. `alloc_num_equals` 関数:これは2つの数が等しいかどうかをチェックし、ビットを返す。
7. `conditionally_select` 関数:これは条件に基づいて2つの数のいずれかを選択する。
8. `conditionally_select_vec` 関数:これは条件に基づいて2つの数配列のいずれかを選択する。
9. `conditionally_select_bignat` 関数:これは条件に基づいて2つの巨大整数のいずれかを選択する。
10. `conditionally_select2` 関数:これは条件に基づいて2つの数のいずれかを選択する。この条件は割り当てられた数である。
11. `select_zero_or_num2` と `select_num_or_zero2` 関数:これらは条件に基づいて数をゼロに設定するかそのままにするかを選択する。この条件は割り当てられた数である。
12. `select_num_or_zero` 関数:これは条件に基づいて数をゼロに設定するかそのままにするかを選択する。この条件はブール値である。
13. `select_one_or_num2` と `select_num_or_one` 関数:これらは条件に基づいて数を一に設定するかそのままにするかを選択する。この条件は割り当てられた数とブール値である。
全体として、このファイルは制約システム内で変数を割り当てる、2つの数が等しいかどうかをチェックする、条件に基づいて2つの数のいずれかを選択するなどの実用的な関数を提供している。
これは "lib.rs" という名前のRust言語のソースコードファイルで、Novaプロジェクトの主要な構成要素である。
このファイルは主にNovaライブラリのパブリックインターフェースといくつかのコア機能を定義している。以下はこのファイルの詳細な解説である:
1. `pub mod ast`:この行は"ast"というモジュールをインポートしている。"ast"は"Abstract Syntax Tree"(抽象構文木)の略で、ソースコード構造を表すデータ構造である。Novaプロジェクトでは、"ast"モジュールはNova言語のソースコードを解析・処理するためのさまざまなデータ構造や関数を含んでいる可能性がある。
2. `pub mod parser`:この行は"parser"というモジュールをインポートしている。"parser"は「パーサー」の意で、このモジュールはNova言語のソースコードを解析するための関数やクラスを含んでいる可能性がある。
3. `pub mod codegen`:この行は"codegen"というモジュールをインポートしている。"codegen"は"code generation"(コード生成)の略で、このモジュールはNova言語の抽象構文木をターゲットコード(例:LLVM IRやマシンコード)に変換するための関数やクラスを含んでいる可能性がある。
4. `pub mod types`:この行は"types"というモジュールをインポートしている。このモジュールはNova言語の型システムを含んでおり、さまざまな組み込み型やユーザー定義型の表現と処理を含んでいる可能性がある。
5. `pub mod util`:この行は"util"というモジュールをインポートしている。"util"は"utilities"(ユーティリティ)の略で、このモジュールはエラー処理、ログ記録、ファイル読み書きなど、さまざまな便利な関数やクラスを含んでいる可能性がある。
6. `pub mod driver`:この行は"driver"というモジュールをインポートしている。コンパイラプロジェクトでは、"driver"は通常、ソースコードの読み込み、解析、型チェック、コード生成、最適化、出力などの全体のコンパイルプロセスを制御するモジュールを指す。
7. `pub mod error`:この行は"error"というモジュールをインポートしている。このモジュールはNova言語のエラー処理システムを含んでおり、コンパイルエラーや実行時エラーの表現と処理を含んでいる可能性がある。
8. `pub mod config`:この行は"config"というモジュールをインポートしている。このモジュールはNova言語の設定システムを含んでおり、コンパイルオプション、実行時オプションなどの表現と処理を含んでいる可能性がある。
このファイルの主な役割は、Nova言語の各構成要素(パーサー、コードジェネレーター、型システム、エラー処理システムなど)をまとめて、完全なコンパイラライブラリを形成することである。
このファイルの名前は "nifs.rs" で、"src/" ディレクトリ内にある。
このファイルは非対話型折り畳みスキーム(Non-Interactive Folding Scheme、NIFS)を実装している。これは増分計算において各ステップの正しさを証明するための暗号プロトコルである。
このファイルの主な部分は以下の通り:
1. `NIFS` 構造体:これはSNARKを表す構造体で、増分計算の1ステップの証明を保持する。`comm_T`というフィールドを持ち、これは圧縮されたコミットメント(Compressed Commitment)である。
2. `prove` メソッド:これは緩和されたR1CSインスタンス-証人ペア`(U1, W1)`とR1CSインスタンス-証人ペア`(U2, W2)`を受け取り、同じ形状`shape`を持ち、同じ`ck`に対して定義されている。そして、同じ形状`shape`を持つ折り畳まれた緩和R1CSインスタンス-証人ペア`(U, W)`を出力する。もし`W1`が`U1`を満たし、`W2`が`U2`を満たすならば、折り畳まれた証人`W`は折り畳まれたインスタンス`U`を満たす。
3. `verify` メソッド:これは緩和されたR1CSインスタンス`U1`とR1CSインスタンス`U2`を受け取り、同じ形状を持ち、同じパラメータに対して定義されている。そして、同じ形状を持つ折り畳まれたインスタンス`U`を出力する。もし`U1`と`U2`が充足可能なら、折り畳まれたインスタンス`U`も充足可能である。
4. テストモジュール:このモジュールには`NIFS`構造体の`prove`と`verify`メソッドをテストするためのテスト関数が含まれている。
全体として、このファイルは非対話型折り畳みスキームを実装しており、これは増分計算において各ステップの正しさを証明するための暗号プロトコルである。このスキームの主な利点は、複数の証明を1つの証明に折り畳むことができ、証明のストレージと転送コストを削減できる点にある。
このファイルの名前は "ipa_pc.rs" で、"src/provider/" ディレクトリ内にある。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News













