BTC
ETH
HTX
SOL
BNB
View Market
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

Nova: ゼロ知識証明の新たな章

HTX
特邀专栏作者
2023-07-11 05:54
この記事は約13863文字で、全文を読むには約20分かかります
Nova は Microsoft によって開発された新しいゼロ知識証明システムであり、Relaxed Rank-1 Constraint Systems (Relaxed R1CS) と呼ばれるテクノロジを使用して証明の効率と柔軟性を向上させています。
AI要約
展開
Nova は Microsoft によって開発された新しいゼロ知識証明システムであり、Relaxed Rank-1 Constraint Systems (Relaxed R1CS) と呼ばれるテクノロジを使用して証明の効率と柔軟性を向上させています。

導入

導入

ゼロ知識証明は、他の情報を明かすことなく、ある人が他の人に対して、あるステートメントが真実であることを証明できるようにする、暗号化における重要な技術です。このテクノロジーは、認証、ブロックチェーン、セキュア コンピューティングなど、多くの分野で広範囲に応用されています。 Nova は Microsoft によって開発された新しいゼロ知識証明システムであり、Relaxed Rank-1 Constraint Systems (Relaxed R 1 CS) と呼ばれる技術を使用して証明の効率と柔軟性を向上させます。最後の章ではソースコードについて詳しく説明します。

ノヴァのメリット

Nova の主な利点は、使用されるリラックスした R1CS 技術です。 R1CS は、ゼロ知識証明を構築するためのシステムであり、解に関する情報を明らかにすることなく、一連の多項方程式の解を知っていることを証明するために使用できます。ただし、従来の R1CS システムは証明プロセスで大量のランダム性を使用する必要があるため、証明の生成と検証プロセスが非常に複雑で時間がかかります。 Nova は、緩和された R1CS を使用してこの問題を解決します。これにより、証明で使用されるランダム性が少なくなり、証明の効率が大幅に向上します。

Nova には他にも利点があります。たとえば、増分計算をサポートしています。これは、関数全体を一度に計算するのではなく、複雑な関数を段階的に計算できることを意味します。これは、大規模なデータを処理する場合や複雑な計算を行う場合に非常に役立ちます。さらに、Nova は多項式計算もサポートしているため、より複雑な証明タスクを処理できます。

ノヴァのデメリット

Novaには多くの利点がありますが、いくつかの欠点もあります。まず、Nova は緩和された R1CS を使用するため、その証明は従来の R1CS システムほど強力ではない可能性があります。これは、緩和された R1CS では証明に使用されるランダム性が低くなり、証明の安全性が低下する可能性があるためです。ただし、Nova の開発者は、より強力な暗号化アルゴリズムやより複雑な証明戦略を使用するなど、この問題を解決するためにいくつかの措置を講じています。

第 2 に、Nova の実装は比較的複雑であるため、使用とメンテナンスが難しくなる可能性があります。 Nova は、多項式コンピューティング、グループ演算、ランダム オラクルなど、多くの高度な暗号化技術を使用します。Nova を効果的に使用および変更するには、これらの技術を深く理解する必要があります。

ゼロ知識証明の分野における Nova の重要な地位

Nova はゼロ知識証明の分野で重要な位置を占めています。その登場により、ゼロ知識証明の開発に新たな道が開かれました。 Nova が採用した緩和 R1CS テクノロジーは、証明の生成と検証のプロセスをより効率的にします。これは、大規模なゼロ知識証明アプリケーションにとって重要です。さらに、Nova はインクリメンタル コンピューティングと多項式コンピューティングもサポートしているため、より複雑な証明タスクを処理でき、ゼロ知識証明の適用範囲がさらに拡大します。

https://github.com/microsoft/Nova

Nova のソースコードの解釈

src/ ディレクトリの下には、いくつかの重要なサブディレクトリがあります。

bellperson/: このディレクトリには、Bellman-Ford アルゴリズムのコードが含まれている可能性があります。

gadgets/: このディレクトリには、zk-SNARK プルーフを構築するためのツールが含まれている場合があります。

Provider/: このディレクトリには、keccak.rs などのプロバイダー コードが含まれる場合があります。これは Keccak ハッシュ関数を実装するコードである可能性があります。

traits/: このディレクトリには、いくつかの一般的な動作を定義するために使用されるいくつかの Rust 特性が含まれる場合があります。

副題

src/bellperson/mod.rs ファイルの内容:

このモジュールは主に R1CS (Rank-1 Constraint Systems、zk-SNARK の制約システム) を生成するために使用されます。

これには 3 つのサブモジュールが含まれています。

r1cs: このモジュールには R1CS のコードが含まれる場合があります。

Shape_cs: このモジュールには、形状制約システムのコードが含まれる場合があります。

テスト セクションでは、制約システムを使用する関数 synthesize_alloc_bit を定義し、いくつかの制約を追加して、2 ビット入力が実際にビットであることを確認します。次に、関数 test_alloc_bit_with を定義します。これは、最初に形状を作成します。

副題

src/bellperson/r 1 cs.rs ファイルの内容:

このファイルは主に 2 つのトレイト、`NovaWitness` と `NovaShape` を定義します。これらはそれぞれ、実装者から `R1 CSInstance` と `R1 CSWitness`、および `R1 CSShape` と `CommitmentKey` を取得するメソッドを提供します。

- `NovaWitness` トレイトには、`R 1 CSShape` と `CommitmentKey` を受け取り、`R 1 CSInstance` と `R 1 CSWitness` を返すメソッド `r1cs_instance_and_witness` があります。この特性は、`SatisfyingAssignment` 構造体に対して実装されます。これは、任意の `SatisfyingAssignment` がこのメソッドを使用して、`R 1 CSInstance` および `R 1 CSWitness` を取得できることを意味します。

- `NovaShape` トレイトには、`R 1 CSSShape` と `CommitmentKey` を返すメソッド `r 1 cs_shape` があります。この特性は `ShapeCS` 構造体に実装されています。つまり、どの `ShapeCS` もこのメソッドを使用して `R 1 CSSShape` と `CommitmentKey` を取得できます。

一般に、このファイルの主な目的は、特定の条件を満たすシステム (`SatisfyingAssignment` や `ShapeCS` など) から R1 CS のインスタンス、証人、シェイプおよびコミットメント シークレットを生成する方法を提供することです。

src/bellperson/shape_cs.rs

副題

このファイルは、「ConstraintSystem」トレイトを実装する「ShapeCS」という名前の構造体を定義します。 `ShapeCS` は、R1CS 形状を作成するための制約システムです。

`ShapeCS` 構造には次のフィールドが含まれます。

- `named_objects`: これは、パスに関連付けられたオブジェクトを格納するマップです。

- `current_namespace`: これは文字列ベクトルであり、現在の名前空間を格納するために使用されます。

- `constraints`: これは `ShapeCS` に追加されたすべての制約を格納するベクトルです。

- `inputs`: これはすべての入力を格納する文字列ベクトルです。

- `aux`: これは、すべての補助入力を格納する文字列ベクトルです。

`ShapeCS` 構造は `ConstraintSystem` トレイトを実装しています。これは、次のメソッドを提供することを意味します。

- `alloc`: このメソッドは、新しい変数を割り当てるために使用されます。

- `alloc_input`: このメソッドは、新しい入力変数を割り当てるために使用されます。

- `enforce`: このメソッドは、新しい制約を追加するために使用されます。

- `push_namespace`: このメソッドは、新しい名前空間をプッシュするために使用されます。

- `pop_namespace`: このメソッドは、現在の名前空間をポップするために使用されます。

- `get_root`: このメソッドはルート制約システムを取得するために使用されます。

一般に、このファイルの主な役割は、特定の条件を満たすシステム (「ShapeCS」など) から R1 CS の形状を生成する方法を提供することです。

src/bellperson/solver.rs

副題

このファイルは、「ConstraintSystem」トレイトを実装する「SatisfyingAssignment」という構造体を定義します。 `SatisfyingAssignment` は、R 1 CS インスタンスと証人を作成するための制約システムです。

- `a_aux_density`, `b_input_density`,`SatisfyingAssignment` 構造には次のフィールドが含まれます。

- `a`, `b`,`b_aux_density`: これらは、クエリの密度を追跡するために使用される `DensityTracker` タイプのフィールドです。

- `input_assignment`,`c`: A、B、C 多項式の評価結果を格納するベクトルです。

`aux_assignment`: これらは変数への代入を保存するベクトルです。

`SatisfyingAssignment` 構造体は `ConstraintSystem` 特性を実装します。これは、次のメソッドを提供することを意味します。

- `new`: このメソッドは、新しい `SatisfyingAssignment` インスタンスを作成するために使用されます。

- `alloc`: このメソッドは、新しい補助変数を割り当てるために使用されます。

- `alloc_input`: このメソッドは、新しい入力変数を割り当てるために使用されます。

- `push_namespace`,- `enforce`: このメソッドは、新しい制約を追加するために使用されます。

`pop_namespace`: これらのメソッドは名前空間を操作するために使用されますが、このコンテキストでは実際には動作しません。

- `is_extensible`,- `get_root`: このメソッドはルート制約システムを取得するために使用されます。

一般に、このファイルの主な目的は、特定の条件 (「SatisfyingAssignment」など) を満たすシステムから R 1 CS インスタンスと監視を生成する方法を提供することです。

"src/circuit.rs"副題

、Nova プロトコルの拡張回路を定義します。この回路には、Nova の非対話型フォールディング スキームのステップ回路とバリデーター回路が含まれています。

次の主な構造とメソッドがファイルで定義されています。

- `NovaAugmentedCircuitParams`: この構造体には、リム幅、リム番号、およびこれがメイン回路であるかどうかを示すブール値を含む、回路のパラメータが含まれています。

- `NovaAugmentedCircuitInputs`: この構造体には、パラメーター i、z 0、zi、U、u、T を含む回路の入力が含まれます。

- `NovaAugmentedCircuit`: この構造は Nova 拡張回路の主な定義であり、回路パラメータ、読み取り専用定数、入力およびステップ回路が含まれます。また、`alloc_witness` (証人を割り当てる)、`synthesize_base_case` (基本ケースを合成する)、および `synthesize_non_base_case` (非基本ケースを合成する) などのメソッドも定義します。

- `synthesize` メソッド: これは Nova 拡張回路の主要な合成メソッドです。最初にすべての証人を割り当て、次に基本ケースかどうかに基づいて回路を合成し、最後に計算されたハッシュ値と uX[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 です。

これらの定数は、Nova プロトコルの実装において重要な役割を果たし、チャレンジの桁数、ハッシュの桁数、大きな数値の四肢の幅と四肢の数など、いくつかの重要なパラメータを定義します。 。

"src/errors.rs"副題

、Nova ライブラリが返す可能性のあるエラーの種類を定義します。これらのエラー タイプは、「NovaError」と呼ばれる列挙型にカプセル化されます。これらのエラーの種類の意味は次のとおりです。

- `InvalidIndex`: 指定された行または列が (row,col,val) タプルの範囲外である場合、このエラーが返されます。

- `OddInputLength`: 指定された入力長が偶数でない場合、このエラーが返されます。

- `InvalidInputLength`: 間違った入力長が指定された場合、このエラーが返されます。

- `InvalidWitnessLength`: 不正な証人長が指定された場合、このエラーが返されます。

- `UnSat`: 指定された監視が指定された形状とインスタンスを満たさない場合、このエラーが返されます。

- `DecompressionError`: 指定された圧縮約束を解凍できない場合、このエラーが返されます。

- `ProofVerifyError`: 証明の検証が失敗した場合、このエラーが返されます。

- `InvalidNumSteps`: 指定されたステップ数が 0 の場合、このエラーが返されます。

- `InvalidIPA`: 無効な内積引数が指定された場合、このエラーが返されます。

- `InvalidSumcheckProof`: 無効なサムチェック証明が提供された場合、このエラーが返されます。

- `InvalidInitialInputLength`: このエラーは、増分計算の初期入力が以前に宣言されたアリティと一致しない場合に返されます。

- `InvalidStepOutputLength`: ステップ実行によって生成された出力の長さが、以前に宣言されたアリティと一致しない場合、このエラーが返されます。

- `InternalTranscriptError`: このエラーは、文字起こしエンジンでラウンド数のオーバーフローが発生した場合に返されます。

- `InvalidMultisetProof`: マルチセット チェックが失敗した場合、このエラーが返されます。

- `InvalidProductProof`: 製品プルーフ チェックが失敗した場合、このエラーが返されます。

これらのエラー タイプは、タイプミス、校正エラー、内部エラーなど、Nova ライブラリで発生する可能性のあるさまざまな問題をカバーします。 Nova ライブラリの関数で問題が発生すると、これらのエラーが返されるため、呼び出し元は何が問題だったのかを理解し、それに応じて対処できます。

"ecc.rs"副題

、Rust言語で書かれています。このファイルには主に、Nova フレームワークの楕円曲線暗号 (ECC) に関連する実装が含まれています。

楕円曲線暗号 (ECC) は公開キー暗号化技術であり、その主な利点は、同じセキュリティを提供しながら短いキーを使用できることです。これは、ECC がより少ないコンピューティング リソースと電力を使用できることを意味します。これは、多くのデバイス、特にモバイル デバイスや組み込みシステムにとって非常に重要です。

このファイルには、ECC 関数の実装に使用されるいくつかの Rust 構造体 (struct) と実装 (impls) の定義が表示されます。たとえば、ECC の主要な実装である `struct EccGadget` が表示されます。これには、ECC および関連変数の状態を保存するために使用される、`value` や `pb_variable` などのいくつかのフィールドが含まれています。

一般に、このファイルは、ECC 機能を実装するための Nova フレームワークの重要な部分です。

"src/gadgets/mod.rs"副題"gadgets"。

は、Nova フレームワークのモジュールであり、主に Nova および Nova で構築されたアプリケーションに必要なさまざまな機能を実装するために使用されます。"gadget"暗号化では、

は、特定の機能を実装するコードのブロックを説明するために使用される一般的な用語です。 zk-SNARK (Zero-Knowledge Succinct Non-Interactive Arguments) では、ガジェットは通常、特定のアルゴリズムまたはプロトコルを実装する証明システムを指します。

このファイルには、次のサブモジュールが含まれています。

- `ecc`: このモジュールには、楕円曲線暗号化用のガジェットが含まれる場合があります。

- `nonnative`: このモジュールには、非ネイティブ フィールド用のガジェットが含まれる場合があります。

- `r 1 cs`: このモジュールには、いくつかの R 1 CS (Rank-1 Constraint Systems) ガジェットが含まれる場合があります。

これらのサブモジュールを組み合わせることで、Nova フレームワークに必要なさまざまな機能が提供されます。

"bignat.rs"副題

これは Nova プロジェクトの一部であり、主に大きな整数 (BigNat) に対する演算を実装するために使用されます。

コンピューター サイエンスでは、大きな整数 (または任意精度の整数) は、int やlong などの通常の整数型で表現できる範囲を超えて表現および操作できる整数です。これは、暗号化、コンピュータ グラフィックス、大規模計算など、多くの分野で非常に役立ちます。

このファイルの主要な部分のいくつかを詳しく見てみましょう。

1. `use super::super::gadgets::GadgetCaller;`: このコード行は、他のガジェットを呼び出すために使用されるトレイトである GadgetCaller をインポートします。

2. `pub struct BigNatGadget;`: このコード行は、BigNatGadget という名前の構造体を定義します。 Rust では、構造体は複雑なデータ型を作成するために使用されます。

3. `impl GadgetCaller for BigNatGadget`: これは、GadgetCaller トレイトを実装する BigNatGadget 構造の実装です。これは、BigNatGadget が GadgetCaller トレイトで必要なすべてのメソッドの実装を提供する必要があることを意味します。

5. `pub fn from(&self, val: u 64) ->4. この実装では、大きな整数演算の基本演算である `add`、`sub`、`mul`、`div`、`rem` などのいくつかのメソッドを見ることができます。

6. `pub fn to_u 64(&self) ->Self`: このメソッドは、u64 型の値から BigNatGadget を作成するために使用されます。

7. `pub fn eq(&self, other: &Self) ->u64`: このメソッドは、BigNatGadget を u64 型の値に変換するために使用されます。

一般に、このファイルは、大きな整数の作成、大きな整数の他のタイプの値への変換、大きな整数に対する基本操作の実行など、大きな整数を操作するためのツールを提供します。

"mod.rs"副題"src/gadgets/nonnative/"、にある

内容の下。このファイルは主に、非ローカル フィールドで算術演算を実装するために使用されます。

暗号化では、非ネイティブ フィールドは通常、ハードウェアによって直接サポートされていないフィールドを指します。たとえば、一部の暗号化アルゴリズムでは 64 ビットを超えるフィールドの操作が必要になる場合がありますが、最新のコンピューター ハードウェアのほとんどは最大 64 ビットまでの操作のみを直接サポートします。この場合、非ローカルフィールドを使用した算術演算が必要になります。

このファイルには、次の主要なセクションが含まれています。

1. `OptionExt` トレイト: このトレイトは、`Option` タイプに 2 つのメソッド、`grab` と `grab_mut` を追加します。これらは、`Option` の値を取得しようとし、`Option` が `None` の場合は、間違いを返します。 。

2. `BitAccess` トレイト: このトレイトは、インデックス `i` を受け取り、そのインデックス位置のビットが `1` であるかどうかを返すメソッド `get_bit` を提供します。

3. `impl BitAccess for Scalar`: これは、`Scalar` 型の `BitAccess` トレイトの実装です。`Scalar` は素数フィールドを表す型です。

一般に、このファイルは、非ネイティブ フィールドで算術演算を実行する方法を提供します。これは、特定の暗号化アルゴリズムを実装するために非常に重要です。

"util.rs"副題"src/gadgets/nonnative/"、にある

内容の下。このファイルは主に、非ローカル フィールドで動作するいくつかのユーティリティ関数を実装するために使用されます。

このファイルの主なセクションをいくつか示します。

1. 「ビット」構造: この構造はビットを表し、線形結合と値が含まれ、監視時に埋められます。

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` 関数: この関数はフィールド要素を自然数に変換します。

全体として、このファイルは、変数の割り当て、数値が指定されたビット数で表現できるかどうかの確認、数値のビット ベクトルへの分解など、非ローカル フィールドに対してさまざまな操作を実行するユーティリティ関数を提供します。

"r 1 cs.rs"副題"src/gadgets/"、にある

内容の下。このファイルは主に Rank-1 Constraint Systems (R1 CS) のさまざまなガジェットを実装するために使用されます。

R1 CS は、アルゴリズムまたはプロトコルを記述するための証明システムであり、zk-SNARK を含む多くのゼロ知識証明システムの基礎です。

このファイルの主なセクションをいくつか示します。

1.「AllocatedR1CSInstance」構造:この構造は、点「W」と2つの数値「X0」および「X1」を含む、割り当てられたR1CSインスタンスを表す。

2.「AllocatedR1CSInstance::alloc」メソッド:このメソッドは、制約システム内でR1CSインスタンスを割り当てるために使用される。

3. 「AllocatedR1CSInstance::absorb_in_ro」メソッド: このメソッドは、R1CS インスタンスをランダム オラクル (RO) に吸収するために使用されます。

4. 「AllocatedRelaxedR1CSInstance」構造: この構造は、2 つの点「W」および「E」、数値「u」、および 2 つの大きな整数「X 0」および「X1」を含む、割り当てられた緩和された R1 CS インスタンスを表します。

5. `AllocatedRelaxedR1CSInstance::alloc` メソッド: このメソッドは、制約システムに緩和された R1 CS インスタンスを割り当てるために使用されます。

6. `AllocatedRelaxedR1CSInstance::default` メソッド: このメソッドは、制約システムにデフォルトの緩和された R1 CS インスタンスを割り当てるために使用されます。

7. `AllocatedRelaxedR1CSInstance::from_r 1 cs_instance` メソッド: このメソッドは、R1 CS インスタンスをリラックスした R1 CS インスタンスに変換するために使用されます。

8. 「AllocatedRelaxedR1CSInstance::absorb_in_ro」メソッド: このメソッドは、リラックスした R1 CS インスタンスをランダム オラクル (RO) に吸収するために使用されます。

9. `AllocatedRelaxedR 1 CSInstance::fold_with_r 1 cs` メソッド: このメソッドは、リラックスした R 1 CS インスタンスを R 1 CS インスタンスでフォールドし、結果を返すために使用されます。

全体として、このドキュメントでは、R 1 CS インスタンスの作成、R 1 CS インスタンスの緩和された R1 CS インスタンスへの変換、R 1 CS インスタンスのランダム オラクルへの吸収、緩和された R 1 CS インスタンスのフォールドなど、R 1 CS を操作するためのツールをいくつか提供します。 1 つの R1 CS インスタンスなど。

副題"utils.rs"このファイルは次のように呼ばれます"src/gadgets/"、にある

内容の下。このファイルは主に、高レベルの暗号プロトコルとアルゴリズムを構築する際に非常に役立つ、いくつかの低レベルのユーティリティ関数を実装するために使用されます。

このファイルの主なセクションをいくつか示します。

1. `le_bits_to_num` 関数: この関数はリトルエンディアンのビット配列を受け取り、対応する値を返します。

2. `alloc_zero` および `alloc_one` 関数: これら 2 つの関数は、制約システム内でそれぞれ値 0 および値 1 を持つ変数を割り当てるために使用されます。

3. `alloc_scalar_as_base` 関数: この関数は、制約システムのベースとしてスカラーを割り当てるために使用されます。

4. `scalar_as_base` 関数: この関数は、スカラーを基底として解釈するために使用されます。

5. `alloc_bignat_constant` 関数: この関数は、制約システムに大きな整数定数を割り当てるために使用されます。

6. `alloc_num_equals` 関数: この関数は 2 つの数値が等しいかどうかをチェックするために使用され、ビットを返します。

7. `conditionally_select` 関数: この関数は、条件に基づいて 2 つの数値のうち 1 つを選択するために使用されます。

8. `conditionally_select_vec` 関数: この関数は、条件に基づいて 2 つの数値配列の 1 つを選択するために使用されます。

9. `conditionally_select_bignat` 関数: この関数は、条件に基づいて 2 つの大きな整数の 1 つを選択するために使用されます。

10. 「conditionally_select2」関数: この関数は、割り当てられた番号である条件に基づいて 2 つの番号のうち 1 つを選択するために使用されます。

11. `select_zero_or_num 2` および `select_num_or_zero 2` 関数: これら 2 つの関数は、割り当てられた数値である条件に従って数値をゼロに設定するか、変更しないままにするために使用されます。

12. `select_num_or_zero` 関数: この関数は、条件 (ブール値) に従って数値をゼロに設定するか、変更しないようにするために使用されます。

一般に、このファイルには、制約システムで変数を割り当てたり、2 つの数値が等しいかどうかを確認したり、条件に基づいて 2 つの数値のうちの 1 つを選択したりできるいくつかのユーティリティ関数が提供されます。

副題"lib.rs"という名前のプログラムです

Nova プロジェクトの主要コンポーネントである の Rust 言語ソース コード ファイル。このファイルは主に、Nova ライブラリのパブリック インターフェイスといくつかのコア関数を定義します。以下はこの文書の詳細な解釈です。"ast"1. `pub mod ast`: このコード行は、"ast"モジュール。"Abstract Syntax Tree"はい"ast"(抽象構文ツリー)、ソース コードの構造を表すために使用されるデータ構造。ノヴァプロジェクトでは、

モジュールには、Nova 言語ソース コードを解析して処理するためのさまざまなデータ構造と関数が含まれる場合があります。"parser"2. `pub mod parser`: このコード行は、"parser"モジュール。"はい"パーサー

つまり、このモジュールには、Nova 言語のソース コードを解析するための関数とクラスが含まれている可能性があります。"codegen"3. `pub mod codegen`: このコード行は、"codegen"モジュール。"code generation"はい

(コード生成)、このモジュールには、Nova 言語の抽象構文ツリーをオブジェクト コード (LLVM IR やマシン コードなど) に変換するための関数とクラスが含まれる場合があります。"types"4. `pub mod tables`: このコード行は、

モジュール。このモジュールには、さまざまな組み込み型やユーザー定義型の表現と処理を含む、Nova 言語の型システムが含まれる場合があります。"util"5. `pub mod util`: このコード行は、"util"モジュール。"utilities"はい

(ユーティリティ)、このモジュールには、エラー処理、ログ記録、ファイルの読み取りと書き込みなどのさまざまなユーティリティ関数とクラスが含まれる場合があります。"driver"6. `pub mod driver`: このコード行は、"driver"モジュール。コンパイラプロジェクトでは、

通常、ソース コードの読み取り、解析、型チェック、コード生成、最適化、出力などのステップを含むコンパイル プロセス全体を制御するモジュールを指します。"error"7. `pub mod error`: このコード行は、

モジュール。このモジュールには、さまざまなコンパイル エラーや実行時エラーの表現と処理を含む、Nova 言語のエラー処理システムが含まれる場合があります。"config"8. `pub mod config`: このコード行は、

このファイルの主な機能は、Nova 言語のさまざまなコンポーネント (パーサー、コード ジェネレーター、型システム、エラー処理システムなど) を編成して完全なコンパイラー ライブラリを形成することです。

副題"nifs.rs"このファイルは次のように呼ばれます"src/"、にある

内容の下。このファイルは、非対話型折りたたみスキーム (非対話型折りたたみスキーム、NIFS) を実装します。これは、増分計算の各ステップの正確性を証明するために使用される暗号化プロトコルです。

このファイルの主なセクションをいくつか示します。

1. `NIFS` 構造: この構造は SNARK を表し、増分計算の 1 ステップの証明を保存します。これには、圧縮されたコミットメントである「comm_T」というフィールドが含まれています。

2. `prove` メソッド: このメソッドは、緩やかな R 1 CS インスタンスと監視のペア `(U 1, W 1)` と R 1 CS インスタンスと監視のペア `(U 2, W 2)` を受け入れます。同じ構造 `shape` であり、同じ `ck` 定義に関連しています。次に、同じ構造 'shape' を持つ、フォールデッド ルーズ R 1 CS インスタンスと証人のペア '(U, W)' を出力します。 「W 1」が「U 1」を満たし、「W 2」が「U 2」を満たす場合、折り畳まれたウィットネス「W」は折り畳まれたインスタンス「U」を満たす。

3.「verify」メソッド:このメソッドは、同じ構造を有し、同じパラメータに関して定義される、ルーズR1CSインスタンス「U1」およびR1CSインスタンス「U2」を受け入れる。次に、同じ構造を持つ折りたたまれたインスタンス `U` を出力します。折り畳まれたインスタンス「U」は、「U 1」と「U 2」が満たされる場合に満たされます。

全体として、このファイルは、増分計算の各ステップの正しさを証明するための暗号化プロトコルである非対話型フォールディング スキームを実装しています。このスキームの主な利点は、複数のプルーフを 1 つのプルーフにまとめることができるため、プルーフの保存と送信のオーバーヘッドが削減されることです。

副題"ipa_pc.rs"このファイルは次のように呼ばれます"src/provider/"、にある

内容の下。このファイルは、IPA (内積引数) に基づく多項式コミットメント スキームを使用して評価エンジンを実装します。

このファイルの主なセクションをいくつか示します。

1. `ProverKey` 構造: この構造は、コミットメント キー `ck_s` を含む証明者キーを表します。

2. `VerifierKey` 構造: この構造は、2 つのコミットメント キー `ck_v` および `ck_s` を含む検証キーを表します。

3. `EvaluationArgument` 構造体: この構造体は、内積パラメーター `ipa` を含む多項式評価パラメーターを表します。

4. `EvaluationEngine` 構造: この構造は、IPA を使用した多項式評価エンジンを表します。

5. `EvaluationEngineTrait` トレイトの実装: このトレイトの実装は、セットアップ、証明、検証を含む多項式評価エンジンの主要な機能を提供します。

6. `inner_product` 関数: この関数は 2 つのベクトルの内積を計算します。7. `InnerProductInstance` 構造: この構造は内積インスタンスを表します。これには、ベクトル `a` に対するプロミス `comm_a_vec`、別のベクトル `b_vec`、およびプロミス `c = が含まれます。

` `c`の値。

8. `InnerProductWitness` 構造: この構造は、ベクトル `a_vec` を含む内積監視を表します。

一般に、この文書は、IPA ベースの多項式コミットメント スキーム、つまりゼロ知識証明の特定の時点での多項式の評価値を証明するための暗号プロトコルを使用する評価エンジンを実装します。この方式の主な利点は、多項式自体を明らかにすることなく多項式の評価値を証明できるため、多項式のプライバシーが保護されることです。

副題"keccak.rs"このファイルは次のように呼ばれます"src/provider/"、にある

内容の下。このファイルは、Kecck 256 ハッシュ関数を使用する TranscriptEngineTrait を実装します。 TranscriptEngineTrait は、ゼロ知識証明プロセスでトランスクリプトを処理するために使用される特性です。トランスクリプトは、証明プロセスのすべてのインタラクティブなステップを記録するデータ構造です。

このファイルの主なセクションをいくつか示します。

1. 「Keccak 256 Transcript」構造: この構造は、Keccak 256 ハッシュ関数を使用してトランスクリプトを処理する TranscriptEngineTrait を実装します。これには、現在のラウンド番号を記録するラウンド フィールド、現在のハッシュ状態を保持する状態フィールド、トランスクリプトを保持するトランスクリプト フィールド、およびタイプ情報を保持する _p フィールドが含まれます。

2. `compute_updated_state` 関数: この関数は入力を受け取り、更新されたハッシュ状態を計算します。

3. `TranscriptEngineTrait` の実装: このトレイトの実装は、新しいトランスクリプトの作成、トランスクリプトからのチャレンジの抽出、トランスクリプトへの要素の追加、ドメイン セパレーターの追加など、トランスクリプトを処理するための主な機能を提供します。

全体として、このファイルは、ゼロ知識証明中にトランスクリプトを処理するツールである Keccak 256 ハッシュ関数を使用する TranscriptEngineTrait を実装しています。このツールの主な利点は、校正プロセスのインタラクティブなステップを明らかにすることなくトランスクリプトを処理できるため、校正プロセスのプライバシーが保護されることです。

副題"mod.rs"このファイルは次のように呼ばれます"src/provider/"、にある

内容の下。このファイルは主に、Nova プロジェクトに必要なさまざまな機能を提供するさまざまな実装モジュールを Nova プロジェクトにインポートするために使用されます。

このファイルの主なセクションをいくつか示します。"ipa_pc"1. `pub mod ipa_pc;`: このコード行は、

モジュール。このモジュールは、IPA (内積引数) に基づく多項式コミットメント スキームを使用して評価エンジンを実装します。"keccak"2. `pub mod keccak;`: このコード行は、

モジュール。このモジュールは、Kecck 256 ハッシュ関数を使用する TranscriptEngineTrait を実装します。"pasta"3. `pub mod pasta;`: このコード行は、

モジュール。このモジュールには、Pasta カーブを操作する関数とクラスが含まれる場合があります。"pedersen"4. `pub mod pedersen;`: このコード行は、

モジュール。このモジュールには、Pedersen Promise を使用する関数とクラスが含まれる場合があります。"poseidon"5. `pub mod poseidon;`: このコード行は、

一般に、このファイルの主な役割は、Nova プロジェクトのさまざまなコンポーネント (評価エンジン、TranscriptEngineTrait、Pasta 曲線、Pedersen コミットメント、Poseidon ハッシュ関数など) を整理して、完全な暗号ライブラリを形成することです。

副題

ファイル名: `src/r 1 cs.rs`

このファイルは、Rank-1 Constraint System (R1 CS) に関連するタイプとメソッドを定義します。 R1CS は、ゼロ知識証明システムで広く使用されている制約システムです。

1. `R 1 CS主に次の構造とそのメソッドが定義されています。

2. `R 1 CSShape`: この構造体は、R1CS の公開パラメータを表します。これには、R1 CS の公開パラメータを生成するために使用されるメソッド「commitment_key」が含まれています。

3. `R 1 CSWitness`: この構造は、制約の数、変数の数、入力/出力の数、および 3 つの行列 A、B、C を含む R 1 CS 行列の形状を表します。これには、明示的に指定された R 1 CS 行列から `R 1 CSShape` オブジェクトを作成するための `new`、行列とベクトルの積を計算するための `multiply_vec`、チェック用の `is_sat_relaxed` および `is_sat` などのメソッドが含まれています。指定された証人およびその形状が Relaxed R 1 CS インスタンスおよび R 1 CS インスタンスを満たすかどうか、「commit_T」を使用して、指定された Relaxed R 1 CS インスタンスと証人のペアおよび R 1 CS インスタンスと証人のペアの交差項を計算します。 `T` の場合、`pad` を使用して、変数の数が 2 の累乗になるように R 1 CSSShape を埋め、埋められた変数に適合するように変数の番号を付け直します。

4. `R 1 CSInstance`: この構造は、特定の R 1 CS インスタンスの監視を表し、スカラー ベクトルを使用して監視オブジェクトを作成するための `new` や、提供されたジェネレーターを使用して監視にコミットするための `commit` などのメソッドが含まれています。

5. `RelaxedR 1 CSWitness`: この構造は R1 CS のインスタンスを表し、構成要素を使用してインスタンス オブジェクトを作成するために使用される「new」などのいくつかのメソッドを含みます。

6. `RelaxedR 1 CSInstance`: この構造体は、Relaxed R 1 CS インスタンスを表します。これには、デフォルトの Relaxed R 1 CSInstance を生成するために `default` が使用され、R から新しい Relaxed R 1 CSInstance を初期化するために `from_r 1 cs_instance` が使用されます。 1 CSInstance、`from_r1cs_instance_unchecked` は R 1 CSInstance から新しい RelaxedR 1 CSInstance を初期化するために (チェックなしで) 使用され、`fold` は受信した RelaxedR 1 CSInstance をフォールドするために使用されます。

副題

ファイル名: `src/spartan/math.rs`

このファイルは、`Math` と呼ばれる特性と、`usize` タイプの実装を定義します。この特性は、2 のべき乗、バイナリ ビットの取得、対数の計算など、いくつかの数学演算を定義します。

   - `pow 2(self) ->1. `Math` トレイトは次のメソッドを定義します。

   - `get_bits(self, num_bits: usize) -> Vecuse`: 2 の自分自身乗を計算します。

   - `log_ 2(self) ->`: self のバイナリ表現の最初の num_bits ビットを取得します。

use`: self の底 2 の対数を計算します。

   - `pow 2(self) ->2. `usize` タイプの場合、`Math` トレイトのすべてのメソッドが実装されます。

   - `get_bits(self, num_bits: usize) -> Vecuse`: 組み込みの `pow` 関数を使用して 2 の自分自身の乗を計算します。

   - `log_ 2(self) ->`: ビットシフトとビットごとの AND 演算により、self のバイナリ表現の最初の num_bits ビットを取得します。

このファイルは、より複雑な関数を実装するためにコードの他の部分で使用できるいくつかの基本的な数学演算を提供します。

副題

ファイル名: src/spartan/mod.rs

このモジュールは、汎用多項式コミットメントおよび評価パラメーター (つまり PCS) である Spartan の RelaxedR1CSSNARKTrait を実装します。

主な構造と機能をいくつか示します。

1. `PolyEvalWitness`: これは、多項式の証明を含む構造体です。

2. `PolyEvalInstance`: これは、多項式評価のインスタンスを含む構造体です。

3. `ProverKey` と `VerifierKey`: これら 2 つの構造は、それぞれ証明者の鍵と検証者の鍵を表します。

4. 「RelaxedR 1 CSSNARK」: この構造は、緩和された R1 CS インスタンスの知識の簡潔な証明を表します。証明は、Spartan のサムチェックとベクトル表示の多項式コミットメントを組み合わせて使用​​して生成されます。

5. `setup`: この関数は、認証キーと検証キーをセットアップするために使用されます。

6. 「prove」: この関数は、緩和された R1 CS インスタンスの充足可能性の簡潔な証明を生成するために使用されます。

このモジュールのコードには、主に暗号におけるゼロ知識証明、特に R 1 CS (Rank-1 Constraint Systems) の証明が含まれます。 R1 CS は、ゼロ知識証明を構築するためのシステムであり、解に関する情報を明らかにすることなく、一連の多項方程式の解を知っていることを証明するために使用できます。 Spartan は、「緩和された」R 1 CS と呼ばれるものを使用する特定のゼロ知識証明システムです。これにより、証明にランダム性を使用できるようになり、効率が向上します。

副題

ファイル名: src/spartan/polynomial.rs

このファイルは、多項式に関連するいくつかの基本的な型と演算を定義します。これらの型と演算は、Spartan プロトコルで多項式計算を実装するために使用されます。

このファイルの主なセクションをいくつか示します。

1. `EqPolynomial`: この構造は等式多項式を表します。これには、新しい多項式を作成するためのメソッド `new`、指定された点で多項式を評価するためのメソッド `evaluate`、およびすべてのブール入力の多項式評価を計算するためのメソッド `evals` が含まれています。

2. `MultilinearPolynomial`: この構造は多重線形多項式を表します。新しい多項式を作成するメソッド `new`、多項式の変数の数を取得するメソッド `get_num_vars`、多項式の変数を先頭にバインドするメソッド `bound_poly_var_top`、およびメソッド `evaluate` が含まれます。指定された点で多項式を評価するために使用されます。

このファイルのコードには、主に暗号化における多項式の計算、特に多重線形多項式とスパース多項式の計算が含まれます。これらの計算は、証明に関する情報を明らかにすることなく複雑な証明を構築するために使用できるため、ゼロ知識証明システムにおいて重要な役割を果たします。

副題

`src/spartan/pp.rs` は、Nova プロジェクトの Rust 言語ファイルです。このファイルは主に Nova のプリプロセッサの機能を実装します。プリプロセッサは、コードが実際にコンパイルされる前に、コードに対して何らかの処理を実行するコンパイル プロセスの段階です。

このファイルの主な構造と機能は次のとおりです。

1. `struct Preprocessor`: これはプリプロセッサ構造体であり、プリプロセッサに必要な状態とデータが含まれています。

3. `fn new(source: String) ->2. `impl Preprocessor`: これは、いくつかのメソッドを含む `Preprocessor` 構造の実装です。

4. `fn preprocess(&mut self) -> Result<(), Error>Self`: これは、新しい `Preprocessor` インスタンスを作成するために使用される `Preprocessor` コンストラクターです。

5. `fn next_token(&mut self) -> Result`: 入力されたソースコードを前処理し、処理結果を返すプリプロセッサの主要な機能です。処理中にエラーが発生した場合はエラーを返します。

`: この関数は、ソース コードから次のトークンを取得するために使用されます。処理中にエラーが発生した場合はエラーを返します。

7. `fn skip_comment(&mut self) -> Result<(), Error>6. `fn stop_whitespace(&mut self)`: この関数は、ソース コード内の空白文字をスキップするために使用されます。

8. `fn read_number(&mut self) -> Result`: この関数はソースコード内のコメントをスキップするために使用されます。処理中にエラーが発生した場合はエラーを返します。

9. `fn read_identifier(&mut self) -> Result`: この関数は、ソースコードから数値を読み取るために使用されます。処理中にエラーが発生した場合はエラーを返します。

10. `fn read_string(&mut self) -> Result`: この関数は、ソースコードから識別子を読み取るために使用されます。処理中にエラーが発生した場合はエラーを返します。

一般に、`src/spartan/pp.rs` ファイルは Nova のプリプロセッサを実装しており、空白文字やコメントのスキップ、数値、識別子、文字列の読み取りなど、ソース コードを前処理します。

副題

ファイル名: src/spartan/sumcheck.rs

このファイルは、Spartan プロトコルの Sumcheck アルゴリズムを実装します。 Sumcheck アルゴリズムは、多項式の和​​を検証するアルゴリズムであり、ゼロ知識証明システムで広く使用されています。

このファイルの主なセクションをいくつか示します。

1. `SumcheckProof`: この構造は Sumcheck 証明を表します。これには、新しいプルーフを作成するためのメソッド `new`、プルーフを検証するためのメソッド `verify`、およびプルーフを生成するためのいくつかの `prove` メソッドが含まれています。

2. `UniPoly` と `CompressedUniPoly`: これら 2 つの構造は、単項多項式と圧縮された単項多項式を表します。これらには、多項式の作成、多項式の評価、指定された点での多項式の評価、および多項式の圧縮および解凍のためのメソッドが含まれています。

このファイルのコードには、主に暗号化における Sumcheck アルゴリズム、特に多項式の計算と証明が含まれています。これらの計算は、証明に関する情報を明らかにすることなく複雑な証明を構築するために使用できるため、ゼロ知識証明システムにおいて重要な役割を果たします。

副題

ファイル名: src/traits/circuit.rs

このファイルは、「StepCircuit」という名前の特性と、その特性を実装する「TrivialTestCircuit」構造体を定義します。この特性と構造は両方とも、増分計算のステップ関数に関連しています。

このファイルの主なセクションをいくつか示します。

1. `StepCircuit` トレイト: このトレイトは、増分計算のステップ関数が実装する必要があるメソッドを定義します。これらの方法には次のものが含まれます。

- `arity`: 各ステップの入力または出力の数を返します。

- `synthesize`: 計算ステップを合成し、ステップの出力に対応する変数を返します。

- `output`: ステップへの入力が提供されると、ステップの出力を返します。

このファイルのコードには主に増分計算のステップ関数が含まれています。暗号化における増分計算は、関数全体を一度に計算することなく、複雑な関数を段階的に計算するために使用できる一般的な手法です。この手法は、証明全体を一度に生成する必要がなく、複雑な証明を構築するために使用できるため、ゼロ知識証明システムで特に役立ちます。

副題

ファイル名: src/traits/commitment.rs

このファイルは、コミットメントに関連するいくつかの特性を定義します。暗号化におけるコミットメントとは、値をすぐに明らかにせずに値をコミットできるようにするメカニズムです。これは、ゼロ知識証明などの多くの暗号プロトコルで必要です。

このファイルの主なセクションをいくつか示します。

1. `CommitmentOps` トレイト: このトレイトは、追加および追加の割り当てを含む、コミットメントの基本操作を定義します。

2. `CommitmentOpsOwned` 特性: この特性は、コミットメントを所有する参照の基本操作を定義します。

3. `ScalarMul` トレイト: このトレイトは、Promise とスカラーの乗算演算を定義します。

4. `CommitmentTrait` トレイト: このトレイトは、クローン、コピー、デフォルト、比較、送信、同期、シリアル化、逆シリアル化、吸収、操作、圧縮、解凍などを含むコミットメントの動作を定義します。

このファイルのコードは主に暗号化におけるコミットメントを扱います。これらのコミットメントは、証明に関する情報を明らかにすることなく複雑な証明を構築するために使用できるため、ゼロ知識証明システムにおいて重要な役割を果たします。

副題

ファイル名: src/traits/evaluation.rs

このファイルは、「EvaluationEngineTrait」という名前の特性を定義します。この特性は、セットアップ、証明、検証を含む多項式評価エンジンの動作を定義します。

このファイルの主なセクションをいくつか示します。

1. `EvaluationEngineTrait` トレイト: このトレイトは、多項式評価エンジンが実装する必要があるメソッドを定義します。これらの方法には次のものが含まれます。

- `setup`: このメソッドは、評価プルーフを生成するために必要な追加のセットアップに使用されます。

- `prove`: このメソッドは、多線形多項式の評価を証明するために使用されます。

- `verify`: このメソッドは、多線形多項式の評価の証明を検証するために使用されます。

この特性は、次のような多数の関連タイプも定義します。

- `CE`: これは、Promise エンジンに関連付けられたタイプです。

- `ProverKey`: これは証明者キーのタイプです。

- `VerifierKey`: これは検証キーのタイプです。

このファイルのコードは主に、暗号化における多項式評価に関係しています。これは、解に関する情報を明らかにすることなく、一連の多項式方程式の解を知っていることを証明するために使用できるため、ゼロ知識証明システムでは重要なステップです。

副題

ファイル名: src/traits/mod.rs

このファイルは、Nova プロジェクトの特性モジュールのメイン エントリ ポイントです。これは主に、暗号化操作のいくつかの特性を定義します。トレイトは、さまざまな具象型で実装できる抽象型を定義する Rust の重要な機能です。これにより、特定の特性を実装する任意の型の値を処理できる汎用コードを作成できます。

このファイルの主なセクションをいくつか示します。

1. 「グループ」トレイト: このトレイトは、クローン作成、コピー、デフォルト化、比較、送信、同期、シリアル化、逆シリアル化、吸収、操作、圧縮、解凍などを含む、グループの基本操作を定義します。

2. `CompressedGroup` トレイト: このトレイトは、クローン作成、コピー、比較、送信、同期、シリアル化、逆シリアル化などを含む、圧縮グループの基本操作を定義します。

3. `AbsorbInROTrait` トレイト: このトレイトは、オブジェクトをランダム Oracle に吸収するためのメソッド `absorb_in_ro` を定義します。

4. 「ROTrait」トレイト: このトレイトは、初期化、吸収、押し出しなどのランダム オラクルの動作を定義します。

5. `ROConstantsTrait` トレイト: このトレイトは、ランダム オラクルの定数を定義します。

6. `GroupOps` トレイト: このトレイトは、加算、減算、加算代入、減算代入などのグループ操作を定義します。

7. `ScalarMul` トレイト: このトレイトはスカラー乗算演算を定義します。

8. `TranscriptReprTrait` トレイト: このトレイトは、オブジェクトをバイト シーケンスに変換するためのメソッド `to_transcript_bytes` を定義します。

このファイルのコードには主に、暗号化、ランダム オラクル、および転写エンジンでのグループ操作が含まれます。これらは、証明に関する情報を明らかにすることなく複雑な証明を構築するために使用できるため、ゼロ知識証明システムで重要な役割を果たします。

副題

ファイル名: src/traits/snark.rs

このファイルは、「RelaxedR1CSSNARKTrait」という名前の特性を定義します。このプロパティは、特に緩和されたランク 1 制約システム (緩和された R 1 CS) のゼロ知識簡潔な非対話型引数 (zkSNARK) の動作を定義します。

このファイルの主なセクションをいくつか示します。

1. `RelaxedR1CSSNARKTrait` トレイト: このトレイトは、zkSNARK が実装する必要があるメソッドを定義します。これらの方法には次のものが含まれます。

- `setup`: このメソッドは証明者と検証者の鍵を生成するために使用されます。

- `prove`: このメソッドは、緩和された R 1 CS インスタンスの充足可能性の簡潔な証明を生成するために使用されます。

- `verify`: このメソッドは、緩和された R 1 CS インスタンスの充足可能性の証明を検証するために使用されます。

この特性は、次のような多数の関連タイプも定義します。

- `ProverKey`: これは証明者キーのタイプです。

このファイルのコードは主に暗号におけるゼロ知識証明、特に R 1 CS の証明に関連しています。 R 1 CS は、ゼロ知識証明を構築するためのシステムであり、解に関する情報を明らかにすることなく、一連の多項方程式の解を知っていることを証明するために使用できます。 zkSNARK は、証明を生成および検証する効率的な方法を提供する特定のゼロ知識証明システムです。

最初のレベルのタイトル

Huobi Ventures について:

Huobi Ventures
オラクル
テクノロジー
Odaily公式コミュニティへの参加を歓迎します
購読グループ
https://t.me/Odaily_News
チャットグループ
https://t.me/Odaily_CryptoPunk
公式アカウント
https://twitter.com/OdailyChina
チャットグループ
https://t.me/Odaily_CryptoPunk