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

Nova:零知識證明的新篇章

HTX
特邀专栏作者
2023-07-11 05:54
本文約13863字,閱讀全文需要約20分鐘
Nova是微軟開發的一種新型零知識證明系統,它使用了一種名為鬆弛的秩一約束系統(Relaxed Rank-1 Constraint Systems,Relaxed R1CS)的技術,以提高證明的效率和靈活性。
AI總結
展開
Nova是微軟開發的一種新型零知識證明系統,它使用了一種名為鬆弛的秩一約束系統(Relaxed Rank-1 Constraint Systems,Relaxed R1CS)的技術,以提高證明的效率和靈活性。

引言

引言

引言

引言

零知識證明是密碼學中的一種重要技術,它允許一個人向另一個人證明一個陳述是真實的,而無需透露任何其他信息。這種技術在許多領域都有廣泛的應用,包括身份驗證、區塊鍊和安全計算等。 Nova 是微軟開發的一種新型零知識證明系統,它使用了一種名為鬆弛的秩一約束系統(Relaxed Rank-1 Constraint Systems,Relaxed R 1 CS)的技術,以提高證明的效率和靈活性。最後一章節對源碼進行詳細解讀。

Nova 的優點

Nova 的主要優點在於其使用的鬆弛的R1CS 技術。 R1CS 是一種用於構建零知識證明的系統,它可以用於證明一個人知道滿足一組多項式等式的解,而不必透露任何關於解的信息。然而,傳統的R1CS 系統需要在證明過程中使用大量的隨機性,這會導致證明的生成和驗證過程非常複雜和耗時。 Nova 通過使用鬆弛的R1CS 來解決這個問題,它允許在證明中使用更少的隨機性,從而大大提高了證明的效率。

Nova 還具有其他一些優點。例如,它支持增量計算,這意味著可以逐步計算複雜的函數,而不必一次性計算整個函數。這在處理大規模數據或進行複雜計算時非常有用。此外,Nova 還支持多項式計算,這使得它可以處理更複雜的證明任務。

Nova 的缺點

儘管Nova 具有許多優點,但它也有一些缺點。首先,由於Nova 使用的是鬆弛的R1CS,因此它的證明可能不如傳統的R1CS 系統那麼強大。這是因為鬆弛的R1CS 允許在證明中使用更少的隨機性,這可能會降低證明的安全性。然而,Nova 的開發者已經採取了一些措施來解決這個問題,例如使用更強大的密碼學算法和更複雜的證明策略。

其次,Nova 的實現相對複雜,這可能會增加使用和維護的難度。 Nova 使用了許多高級的密碼學技術,如多項式計算、群操作和隨機預言機等,這需要深入理解這些技術才能有效地使用和修改Nova。

https://github.com/microsoft/Nova

Nova 在零知識證明領域的重要地位

Nova 在零知識證明領域中佔據了重要的地位。它的出現,為零知識證明的發展開闢了新的道路。 Nova 採用的鬆弛的R1CS 技術,使得證明的生成和驗證過程更加高效,這對於大規模的零知識證明應用至關重要。此外,Nova 還支持增量計算和多項式計算,這使得它可以處理更複雜的證明任務,進一步擴大了零知識證明的應用範圍。

Nova 的源碼解讀

在src/ 目錄下,有以下幾個重要的子目錄:

bellperson/:這個目錄可能包含了關於Bellman-Ford 算法的代碼。

traits/:這個目錄可能包含了一些Rust traits,用於定義一些公共的行為。

二級標題

二級標題

二級標題

src/bellperson/mod.rs 文件的內容:

這個模塊主要用於生成R1CS(Rank-1 Constraint Systems,一種用於zk-SNARKs 的約束系統)。

它包含了三個子模塊:

在測試部分,它定義了一個函數synthesize_alloc_bit,這個函數接受一個約束系統,然後添加一些約束來檢查輸入的兩個比特是否確實是比特。然後,它定義了一個函數test_alloc_bit_with,這個函數首先創建一個形狀

二級標題

二級標題

二級標題

src/bellperson/r 1 cs.rs 文件的內容:

這個文件主要定義了兩個trait:`NovaWitness` 和`NovaShape`,它們分別提供了從實現者獲取`R 1 CSInstance` 和`R 1 CSWitness`,以及獲取`R 1 CSShape` 和`CommitmentKey` 的方法。

總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(如`SatisfyingAssignment` 或`ShapeCS`)中生成R 1 CS 的實例、證人、形狀和承諾密鑰。

src/bellperson/shape_cs.rs

二級標題

二級標題

二級標題

這個文件定義了一個名為`ShapeCS` 的結構體,它實現了`ConstraintSystem` trait。 `ShapeCS` 是用於創建R 1 CS 形狀的約束系統。

`ShapeCS` 結構體包含以下幾個字段:

- `named_objects`: 這是一個映射,用於存儲與路徑關聯的對象。

- `current_namespace`: 這是一個字符串向量,用於存儲當前的命名空間。

- `constraints`: 這是一個向量,用於存儲所有添加到`ShapeCS` 的約束。

- `inputs`: 這是一個字符串向量,用於存儲所有的輸入。

- `aux`: 這是一個字符串向量,用於存儲所有的輔助輸入。

`ShapeCS` 結構體實現了`ConstraintSystem` trait,這意味著它提供了以下幾個方法:

- `alloc`: 這個方法用於分配一個新的變量。

- `alloc_input`: 這個方法用於分配一個新的輸入變量。

- `enforce`: 這個方法用於添加一個新的約束。

- `push_namespace`: 這個方法用於推入一個新的命名空間。

總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(如`ShapeCS`)中生成R 1 CS 的形狀。

src/bellperson/solver.rs

二級標題

二級標題

- `a_aux_density`, `b_input_density`,二級標題

- `a`, `b`,這個文件定義了一個名為`SatisfyingAssignment` 的結構體,它實現了`ConstraintSystem` trait。 `SatisfyingAssignment` 是用於創建R 1 CS 實例和證人的約束系統。

- `input_assignment`,`SatisfyingAssignment` 結構體包含以下幾個字段:

`b_aux_density`: 這些是`DensityTracker` 類型的字段,用於跟踪查詢的密度。

`c`: 這些是向量,用於存儲A、B、C 多項式的評估結果。

`aux_assignment`: 這些是向量,用於存儲變量的賦值。

`SatisfyingAssignment` 結構體實現了`ConstraintSystem` trait,這意味著它提供了以下幾個方法:

- `new`: 這個方法用於創建一個新的`SatisfyingAssignment` 實例。

- `push_namespace`,- `alloc`: 這個方法用於分配一個新的輔助變量。

- `alloc_input`: 這個方法用於分配一個新的輸入變量。

- `is_extensible`,- `enforce`: 這個方法用於添加一個新的約束。

總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(如`SatisfyingAssignment`)中生成R 1 CS 的實例和證人。

"src/circuit.rs"二級標題

二級標題

二級標題

,它定義了Nova 協議中的增強電路(Augmented Circuit)。這個電路包括一個步驟電路(Step Circuit)和Nova 的非交互折疊方案中的驗證器電路。

文件中定義了以下幾個主要的結構體和方法:

- `NovaAugmentedCircuitParams`:這個結構體包含了電路的參數,包括limb 寬度、limb 數量和一個布爾值表示這是否是主電路。

- `NovaAugmentedCircuitInputs`:這個結構體包含了電路的輸入,包括參數、i、z 0、zi、U、u 和T。

總的來說,這個文件的主要作用是定義了Nova 協議中的增強電路,這個電路是Nova 協議的核心部分,它包括了一個步驟電路和一個驗證器電路,並提供了一種方式來合成這個電路。

"src/constants.rs"二級標題

二級標題

二級標題

,它定義了一些常量,這些常量在整個項目中被廣泛使用。以下是這些常量的含義:

- `NUM_CHALLENGE_BITS`: 這個常量定義了挑戰的位數,值為128 。挑戰通常是由證明者生成的隨機數,用於zk-SNARK 證明過程中的交互步驟。

- `NUM_HASH_BITS`: 這個常量定義了哈希的位數,值為250 。哈希函數是一種可以將任意長度的輸入數據映射到固定長度輸出的函數,這裡的輸出長度就是250 位。

- `BN_LIMB_WIDTH`: 這個常量定義了大數(Big Number)的肢寬,值為64 。在計算機科學中,大數是那些超出了標準數據類型能夠表示的範圍的數,它們通常被分解為多個“肢”進行存儲和操作。

這些常量在Nova 協議的實現中起著關鍵的作用,它們定義了一些重要的參數,如挑戰的位數、哈希的位數、大數的肢寬和肢數等。

"src/errors.rs"二級標題

二級標題

二級標題

,它定義了Nova 庫可能返回的錯誤類型。這些錯誤類型被封裝在一個名為`NovaError` 的枚舉中。以下是這些錯誤類型的含義:

- `InvalidIndex`: 如果提供的行或列在(row, col, val) 元組中超出範圍,將返回此錯誤。

- `OddInputLength`: 如果提供的輸入長度不是偶數,將返回此錯誤。

- `InvalidInputLength`: 如果提供的輸入長度不正確,將返回此錯誤。

- `InvalidWitnessLength`: 如果提供的證人長度不正確,將返回此錯誤。

- `UnSat`: 如果提供的證人不滿足給定的形狀和實例,將返回此錯誤。

- `DecompressionError`: 如果無法解壓提供的壓縮承諾,將返回此錯誤。

- `ProofVerifyError`: 如果證明驗證失敗,將返回此錯誤。

- `InvalidNumSteps`: 如果提供的步驟數為零,將返回此錯誤。

- `InvalidIPA`: 如果提供了無效的內積參數,將返回此錯誤。

- `InvalidSumcheckProof`: 如果提供了無效的求和檢查證明,將返回此錯誤。

- `InvalidInitialInputLength`: 如果增量計算的初始輸入與先前聲明的元數不符,將返回此錯誤。

- `InvalidStepOutputLength`: 如果步驟執行產生的輸出長度與先前聲明的元數不符,將返回此錯誤。

- `InternalTranscriptError`: 如果轉錄引擎遇到輪數溢出,將返回此錯誤。

這些錯誤類型覆蓋了Nova 庫中可能遇到的各種問題,包括輸入錯誤、證明錯誤、內部錯誤等。當Nova 庫的函數遇到問題時,它們會返回這些錯誤,以便調用者可以了解出了什麼問題並採取相應的行動。

"ecc.rs"二級標題

二級標題

二級標題

,它是Rust 語言編寫的。這個文件主要包含了Nova 框架中的橢圓曲線密碼學(ECC)相關的實現。

總的來說,這個文件是Nova 框架中實現ECC 功能的關鍵部分。

"src/gadgets/mod.rs"二級標題"gadgets"。

二級標題"gadget"二級標題

,它是Nova 框架中的一個模塊,主要用於實現各種對Nova 和使用Nova 構建的應用程序必要的

在密碼學中,

是一個通用術語,用於描述實現特定功能的代碼塊。在zk-SNARKs(零知識簡潔非交互式論證)中,gadget 通常指的是實現特定算法或協議的證明系統。

在這個文件中,你會看到以下幾個子模塊:

- `ecc`: 這個模塊可能包含了關於橢圓曲線密碼學(Elliptic Curve Cryptography)的gadget。

這些子模塊一起提供了Nova 框架所需的各種功能。

"bignat.rs"二級標題

二級標題

二級標題

,它是Nova 項目中的一部分,主要用於實現大整數(BigNat)的操作。

在計算機科學中,大整數(或稱為任意精度整數)是可以表示並操作超過常規整數類型(如int 或long)能夠表示的範圍的整數。這在許多領域都非常有用,包括密碼學、計算機圖形學、大數計算等。

讓我們來詳細看一下這個文件中的一些主要部分:

1. `use super::super::gadgets::GadgetCaller;`:這行代碼導入了GadgetCaller,這是一個用於調用其他gadget 的trait。

5. `pub fn from(&self, val: u 64) ->2. `pub struct BigNatGadget;`:這行代碼定義了一個名為BigNatGadget 的結構體。在Rust 中,結構體是用來創建複雜的數據類型的。

6. `pub fn to_u 64(&self) ->3. `impl GadgetCaller for BigNatGadget`:這是對BigNatGadget 結構體的實現,它實現了GadgetCaller trait。這意味著BigNatGadget 必須提供GadgetCaller trait 所需的所有方法的實現。

7. `pub fn eq(&self, other: &Self) ->4. 在這個實現中,我們可以看到一些方法,如`add`, `sub`, `mul`, `div`, `rem` 等,這些都是大整數運算的基本操作。

總的來說,這個文件提供了一個用於處理大整數的工具,包括創建大整數、將大整數轉換為其他類型的值,以及執行大整數的基本運算。

"mod.rs"二級標題"src/gadgets/nonnative/"二級標題

二級標題

,它位於

目錄下。這個文件主要用於實現非本地字段的算術運算。

在密碼學中,非本地字段通常指的是那些不直接由硬件支持的字段。例如,某些密碼學算法可能需要在大於64 位的字段上進行運算,但是大多數現代計算機硬件只直接支持最多64 位的運算。在這種情況下,我們就需要使用非本地字段的算術運算。

在這個文件中,你會看到以下幾個主要部分:

1. `OptionExt` trait:這個trait 為`Option` 類型添加了兩個方法,`grab` 和`grab_mut`,它們嘗試獲取`Option` 中的值,如果`Option` 是`None`,則返回一個錯誤。

總的來說,這個文件提供了一種在非本地字段上進行算術運算的方法,這對於實現某些密碼學算法是非常重要的。

"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` 方法:這個方法將一個數分解為一個位向量。

總的來說,這個文件提供了一些實用函數,這些函數可以在非本地字段上進行各種運算,如分配變量、檢查一個數是否可以用給定數量的位表示、將一個數分解為一個位向量等。

"r 1 cs.rs"二級標題"src/gadgets/"二級標題

二級標題

,它位於

目錄下。這個文件主要用於實現Rank-1 Constraint Systems (R 1 CS) 的各種gadget。

R 1 CS 是一種用於描述算法或協議的證明系統,它是許多零知識證明系統的基礎,包括zk-SNARKs。

以下是這個文件中的一些主要部分:

1. `AllocatedR 1 CSInstance` 結構體:這個結構體表示一個已分配的R 1 CS 實例,包含一個點`W` 和兩個數`X 0 ` 和`X 1 `。

2. `AllocatedR1CSInstance::alloc` 方法:這個方法用於在約束系統中分配一個R 1 CS 實例。

3. `AllocatedR1CSInstance::absorb_in_ro` 方法:這個方法用於將R 1 CS 實例吸收到隨機預言機(RO) 中。

4. `AllocatedRelaxedR1CSInstance` 結構體:這個結構體表示一個已分配的鬆弛R 1 CS 實例,包含兩個點`W` 和`E`,一個數`u`,和兩個大整數`X 0 ` 和`X 1 `。

5. `AllocatedRelaxedR1CSInstance::alloc` 方法:這個方法用於在約束系統中分配一個鬆弛R 1 CS 實例。

6. `AllocatedRelaxedR1CSInstance::default` 方法:這個方法用於在約束系統中分配一個默認的鬆弛R 1 CS 實例。

7. `AllocatedRelaxedR1CSInstance::from_r 1 cs_instance` 方法:這個方法用於將一個R 1 CS 實例轉換為一個鬆弛R 1 CS 實例。

總的來說,這個文件提供了一些用於處理R 1 CS 的工具,包括創建R 1 CS 實例、將R 1 CS 實例轉換為鬆弛R 1 CS 實例、將R 1 CS 實例吸收到隨機預言機中、將鬆弛R 1 CS 實例與一個R 1 CS 實例折疊等。

二級標題"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` 函數:這個函數用於檢查兩個數是否相等,並返回一個位。

7. `conditionally_select` 函數:這個函數用於根據一個條件選擇兩個數中的一個。

8. `conditionally_select_vec` 函數:這個函數用於根據一個條件選擇兩個數數組中的一個。

9. `conditionally_select_bignat` 函數:這個函數用於根據一個條件選擇兩個大整數中的一個。

10. `conditionally_select2` 函數:這個函數用於根據一個條件選擇兩個數中的一個,這個條件是一個已分配的數。

總的來說,這個文件提供了一些實用函數,這些函數可以在約束系統中分配變量、檢查兩個數是否相等、根據一個條件選擇兩個數中的一個等。

二級標題"lib.rs"二級標題

二級標題"ast"這是一個名為"ast"的Rust 語言源代碼文件,它是Nova 項目的主要組成部分。這個文件主要定義了Nova 庫的公共接口和一些核心功能。以下是對該文件的詳細解讀:"Abstract Syntax Tree"1. `pub mod ast`:這行代碼導入了一個名為"ast"的模塊。

是"parser"(抽象語法樹)的縮寫,這是一種用於表示源代碼結構的數據結構。在Nova 項目中,"parser"模塊可能包含了用於解析和處理Nova 語言源代碼的各種數據結構和函數。"的模塊。"解析器

是"codegen"解析器"codegen"的意思,這個模塊可能包含了用於解析Nova 語言源代碼的函數和類。"code generation"3. `pub mod codegen`:這行代碼導入了一個名為

的模塊。"types"是

(代碼生成)的縮寫,這個模塊可能包含了用於將Nova 語言的抽象語法樹轉換為目標代碼(例如LLVM IR 或機器代碼)的函數和類。"util"4. `pub mod types`:這行代碼導入了一個名為"util"的模塊。這個模塊可能包含了Nova 語言的類型系統,包括各種內建類型和用戶定義類型的表示和處理。"utilities"5. `pub mod util`:這行代碼導入了一個名為

的模塊。"driver"是"driver"(實用程序)的縮寫,這個模塊可能包含了各種實用的函數和類,例如錯誤處理、日誌記錄、文件讀寫等。

6. `pub mod driver`:這行代碼導入了一個名為"error"的模塊。在編譯器項目中,

通常是指控制整個編譯過程的模塊,包括源代碼的讀取、解析、類型檢查、代碼生成、優化和輸出等步驟。"config"7. `pub mod error`:這行代碼導入了一個名為

這個文件的主要作用是將Nova 語言的各個組成部分(例如解析器、代碼生成器、類型系統、錯誤處理系統等)組織在一起,形成一個完整的編譯器庫。

二級標題"nifs.rs"二級標題"src/"二級標題

這個文件名為

,它位於

目錄下。這個文件實現了一個非交互式折疊方案(Non-Interactive Folding Scheme,NIFS)。這是一種密碼學協議,用於在增量計算中證明每一步的正確性。

以下是這個文件中的一些主要部分:

1. `NIFS` 結構體:這個結構體表示一個SNARK,它保存了增量計算的一步的證明。它包含一個名為`comm_T` 的字段,這是一個壓縮的承諾(Compressed Commitment)。

總的來說,這個文件實現了一個非交互式折疊方案,這是一種密碼學協議,用於在增量計算中證明每一步的正確性。這個方案的主要優點是它可以將多個證明折疊成一個證明,從而減少了存儲和傳輸證明的開銷。

二級標題"ipa_pc.rs"二級標題"src/provider/"二級標題

這個文件名為

,它位於

目錄下。這個文件實現了一個使用基於IPA(Inner Product Argument)的多項式承諾方案的評估引擎。

以下是這個文件中的一些主要部分:

1. `ProverKey` 結構體:這個結構體表示一個證明者密鑰,它包含一個承諾密鑰`ck_s`。

2. `VerifierKey` 結構體:這個結構體表示一個驗證者密鑰,它包含兩個承諾密鑰`ck_v` 和`ck_s`。

3. `EvaluationArgument` 結構體:這個結構體表示一個多項式評估參數,它包含一個內積參數`ipa`。

4. `EvaluationEngine` 結構體:這個結構體表示一個使用IPA 的多項式評估引擎。5. `EvaluationEngineTrait` trait 的實現:這個trait 的實現提供了多項式評估引擎的主要功能,包括設置、證明和驗證。

6. `inner_product` 函數:這個函數計算兩個向量的內積。

7. `InnerProductInstance` 結構體:這個結構體表示一個內積實例,它包含一個向量`a` 的承諾`comm_a_vec`,另一個向量`b_vec`,以及一個聲稱`c =

總的來說,這個文件實現了一個使用基於IPA 的多項式承諾方案的評估引擎,這是一種密碼學協議,用於在零知識證明中證明多項式在某個點的評估值。這個方案的主要優點是它可以在不洩露多項式本身的情況下證明多項式的評估值,從而保護了多項式的隱私。

二級標題"keccak.rs"二級標題"src/provider/"二級標題

這個文件名為

,它位於

目錄下。這個文件實現了一個使用Keccak 256 哈希函數的TranscriptEngineTrait。 TranscriptEngineTrait 是一個用於處理零知識證明過程中的transcript 的trait,transcript 是一個記錄了證明過程中所有的交互步驟的數據結構。

以下是這個文件中的一些主要部分:

1. `Keccak 256 Transcript` 結構體:這個結構體實現了TranscriptEngineTrait,它使用Keccak 256 哈希函數來處理transcript。它包含一個round 字段來記錄當前的輪數,一個state 字段來保存當前的哈希狀態,一個transcript 字段來保存transcript,以及一個_p 字段來保存類型信息。

總的來說,這個文件實現了一個使用Keccak 256 哈希函數的TranscriptEngineTrait,這是一種用於處理零知識證明過程中的transcript 的工具。這個工具的主要優點是它可以在不洩露證明過程中的交互步驟的情況下處理transcript,從而保護了證明過程的隱私。

二級標題"mod.rs"二級標題"src/provider/"二級標題

這個文件名為

,它位於"ipa_pc"目錄下。這個文件主要用於導入Nova 項目中的各種實現模塊,這些模塊提供了Nova 項目所需的各種功能。

以下是這個文件中的一些主要部分:"keccak"1. `pub mod ipa_pc;`:這行代碼導入了一個名為

的模塊。這個模塊實現了一個使用基於IPA(Inner Product Argument)的多項式承諾方案的評估引擎。"pasta"2. `pub mod keccak;`:這行代碼導入了一個名為

的模塊。這個模塊實現了一個使用Keccak 256 哈希函數的TranscriptEngineTrait。"pedersen"3. `pub mod pasta;`:這行代碼導入了一個名為

的模塊。這個模塊可能包含了一些使用Pasta 曲線的函數和類。"poseidon"4. `pub mod pedersen;`:這行代碼導入了一個名為

總的來說,這個文件的主要作用是將Nova 項目的各個組成部分(例如評估引擎、TranscriptEngineTrait、Pasta 曲線、Pedersen 承諾、Poseidon 哈希函數等)組織在一起,形成一個完整的密碼學庫。

二級標題

二級標題

二級標題

1. `R 1 CS文件名:`src/r 1 cs.rs`

2. `R 1 CSShape這個文件定義了與Rank-1 Constraint System (R 1 CS)相關的類型和方法。 R 1 CS 是一種廣泛用於零知識證明系統的約束系統。

3. `R 1 CSWitness主要定義了以下幾個結構和它們的方法:

4. `R 1 CSInstance`:這個結構體表示一個R 1 CS 的公共參數。它包含一個方法`commitment_key`用於生成R 1 CS 的公共參數。

5. `RelaxedR 1 CSWitness`:這個結構體表示R 1 CS 矩陣的形狀,包含了約束的數量、變量的數量、輸入/輸出的數量以及A、B、C 三個矩陣。它包含了一些方法,如`new`用於從顯式指定的R 1 CS 矩陣創建一個`R 1 CSShape`對象,`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`用於填充R 1 CSShape 使得變量的數量是2 的冪,並重新編號變量以適應填充的變量。

6. `RelaxedR 1 CSInstance二級標題

二級標題

文件名:`src/spartan/math.rs`

二級標題

   - `pow 2(self) ->文件名:`src/spartan/math.rs`

   - `get_bits(self, num_bits: usize) -> Vec這個文件定義了一個名為`Math`的特質(trait),以及對`usize`類型的實現。這個特質定義了一些數學操作,包括求2 的冪、獲取二進制位以及計算對數。

   - `log_ 2(self) ->1. `Math`特質定義了以下幾個方法:

usize`:計算2 的self 次冪。

   - `pow 2(self) ->`:獲取self 的二進製表示的前num_bits 位。

   - `get_bits(self, num_bits: usize) -> Vecusize`:計算以2 為底的self 的對數。

   - `log_ 2(self) ->2. 對於`usize`類型,實現了`Math`特質的所有方法:

二級標題

二級標題

文件名:src/spartan/mod.rs

二級標題

文件名:src/spartan/mod.rs

這個模塊實現了使用Spartan 的RelaxedR1CSSNARKTrait,該Trait 是通用的多項式承諾和評估參數(即PCS)。

以下是一些主要的結構和函數:

1. `PolyEvalWitness`:這是一個結構體,它包含一個多項式的證明。

2. `PolyEvalInstance`:這是一個結構體,它包含一個多項式評估的實例。

3. `ProverKey` 和`VerifierKey`:這兩個結構體分別代表證明者的密鑰和驗證者的密鑰。

4. `RelaxedR 1 CSSNARK`:這個結構體表示了一個對鬆弛的R 1 CS 實例的知識的簡潔證明。該證明使用Spartan 的sum-check 和向量視為多項式承諾的組合產生。

二級標題

二級標題

文件名:src/spartan/polynomial.rs

二級標題

文件名:src/spartan/polynomial.rs

這個文件定義了與多項式相關的一些基本類型和操作。這些類型和操作用於實現Spartan 協議中的多項式計算。

以下是這個文件中的一些主要部分:

這個文件中的代碼主要涉及到了密碼學中的多項式計算,特別是關於多線性多項式和稀疏多項式的計算。這些計算在零知識證明系統中扮演了重要的角色,因為它們可以用於構造複雜的證明,而不必透露任何關於證明的信息。

二級標題

二級標題

二級標題

`src/spartan/pp.rs` 是Nova 項目中的一個Rust 語言文件。這個文件主要實現了Nova 中的預處理器(Preprocessor)的功能。預處理器是編譯過程中的一個階段,它在實際編譯之前對代碼進行一些處理。

3. `fn new(source: String) ->這個文件中的主要結構和函數包括:

4. `fn preprocess(&mut self) -> Result<(), Error>1. `struct Preprocessor`:這是一個預處理器的結構體,它包含了預處理器需要的一些狀態和數據。

5. `fn next_token(&mut self) -> Result2. `impl Preprocessor`:這是對`Preprocessor` 結構體的實現,包含了一些方法。

Self`:這是`Preprocessor` 的構造函數,用於創建一個新的`Preprocessor` 實例。

7. `fn skip_comment(&mut self) -> Result<(), Error>`:這是預處理器的主要函數,它對輸入的源代碼進行預處理,並返回處理結果。如果處理過程中出現錯誤,它會返回一個錯誤。

8. `fn read_number(&mut self) -> Result`:這個函數用於從源代碼中獲取下一個token。如果處理過程中出現錯誤,它會返回一個錯誤。

9. `fn read_identifier(&mut self) -> Result6. `fn skip_whitespace(&mut self)`:這個函數用於跳過源代碼中的空白字符。

10. `fn read_string(&mut self) -> Result`:這個函數用於跳過源代碼中的註釋。如果處理過程中出現錯誤,它會返回一個錯誤。

二級標題

二級標題

文件名:src/spartan/sumcheck.rs

二級標題

文件名:src/spartan/sumcheck.rs

這個文件實現了Spartan 協議中的Sumcheck 算法。 Sumcheck 算法是一種用於驗證多項式求和的算法,它在零知識證明系統中有著廣泛的應用。

以下是這個文件中的一些主要部分:

二級標題

二級標題

文件名:src/traits/circuit.rs

二級標題

文件名:src/traits/circuit.rs

這個文件定義了一個名為`StepCircuit`的特質(trait),以及一個實現了這個特質的`TrivialTestCircuit`結構體。這個特質和結構體都與增量計算的步驟函數有關。

以下是這個文件中的一些主要部分:

1. `StepCircuit`特質:這個特質定義了一個增量計算的步驟函數必須實現的方法。這些方法包括:

- `arity`:返回每個步驟的輸入或輸出的數量。

這個文件中的代碼主要涉及到了增量計算的步驟函數。在密碼學中,增量計算是一種常見的技術,它可以用於逐步計算複雜的函數,而不必一次性計算整個函數。這種技術在零知識證明系統中尤其有用,因為它可以用於構造複雜的證明,而不必一次性生成整個證明。

二級標題

二級標題

二級標題

文件名:src/traits/commitment.rs

這個文件定義了一些與承諾(commitment)相關的特質(traits)。在密碼學中,承諾是一種機制,使得一個人可以承諾一個值,而不立即揭示它。這在許多密碼學協議中都是必要的,例如零知識證明。

以下是這個文件中的一些主要部分:

1. `CommitmentOps`特質:這個特質定義了承諾的基本操作,包括加法和加法賦值。

2. `CommitmentOpsOwned`特質:這個特質為擁有承諾的引用定義了基本操作。

二級標題

二級標題

文件名:src/traits/evaluation.rs

二級標題

文件名:src/traits/evaluation.rs

這個文件定義了一個名為`EvaluationEngineTrait`的特質(trait)。這個特質定義了一個多項式評估引擎的行為,包括設置、證明和驗證。

以下是這個文件中的一些主要部分:

1. `EvaluationEngineTrait`特質:這個特質定義了一個多項式評估引擎必須實現的方法。這些方法包括:

- `setup`:這個方法用於進行任何需要生成評估證明的額外設置。

- `prove`:這個方法用於證明一個多線性多項式的評估。

- `verify`:這個方法用於驗證一個多線性多項式的評估的證明。

這個特質還定義了一些關聯類型,包括:

- `CE`:這是與承諾引擎相關聯的類型。

二級標題

二級標題

文件名:src/traits/mod.rs

二級標題

文件名:src/traits/mod.rs

這個文件是Nova 項目中traits 模塊的主要入口點。它主要定義了一些用於密碼學操作的特質(traits)。特質是Rust 中的一個關鍵特性,它定義了一種抽像類型,這種類型可以被多種不同的具體類型實現。這使得我們可以編寫通用的代碼,這些代碼可以處理實現了特定特質的任何類型的值。

以下是這個文件中的一些主要部分:

1. `Group`特質:這個特質定義了一個群的基本操作,包括克隆、複製、默認、比較、發送、同步、序列化、反序列化、吸收、操作、壓縮、解壓縮等。

2. `CompressedGroup`特質:這個特質定義了一個壓縮群的基本操作,包括克隆、複製、比較、發送、同步、序列化、反序列化等。

3. `AbsorbInROTrait`特質:這個特質定義了一個方法`absorb_in_ro`,用於將對象吸收到隨機預言機(Random Oracle)中。

4. `ROTrait`特質:這個特質定義了隨機預言機的行為,包括初始化、吸收和擠壓。

5. `ROConstantsTrait`特質:這個特質定義了隨機預言機的常量。

6. `GroupOps`特質:這個特質定義了群操作,包括加法、減法、加法賦值和減法賦值。

二級標題

二級標題

文件名:src/traits/snark.rs

二級標題

文件名:src/traits/snark.rs

這個文件定義了一個名為`RelaxedR1CSSNARKTrait`的特質(trait)。這個特質定義了一個零知識簡潔非交互式論證(zkSNARK)的行為,特別是對於鬆弛的秩一約束系統(Relaxed Rank-1 Constraint Systems,Relaxed R 1 CS)。

以下是這個文件中的一些主要部分:

1. `RelaxedR1CSSNARKTrait`特質:這個特質定義了一個zkSNARK 必須實現的方法。這些方法包括:

- `setup`:這個方法用於生成證明者和驗證者的密鑰。

- `prove`:這個方法用於生成一個鬆弛的R 1 CS 實例的滿足性的簡潔證明。

- `verify`:這個方法用於驗證一個鬆弛的R 1 CS 實例的滿足性的證明。

這個文件中的代碼主要涉及到了密碼學中的零知識證明,特別是關於R 1 CS 的證明。 R 1 CS 是一種用於構建零知識證明的系統,它可以用於證明一個人知道滿足一組多項式等式的解,而不必透露任何關於解的信息。 zkSNARK 是一種特定的零知識證明系統,它提供了一種生成和驗證證明的有效方法。

一級標題

一級標題

Huobi Ventures
預言機
技術
歡迎加入Odaily官方社群