原文標(biāo)題:《 Nova:零知識證明的新篇章 》原文來源:Huobi Research引言零知識證明是密碼學(xué)中的一種重要技術(shù),它允許一個人向另一個人證明一個陳述是真實的,而無需透露任何其他信息。這種技術(shù)在許多領(lǐng)域都有廣泛的 ...
原文標(biāo)題:《 Nova:零知識證明的新篇章 》 原文來源:Huobi Research 引言零知識證明是密碼學(xué)中的一種重要技術(shù),它允許一個人向另一個人證明一個陳述是真實的,而無需透露任何其他信息。這種技術(shù)在許多領(lǐng)域都有廣泛的應(yīng)用,包括身份驗證、區(qū)塊鏈和安全計算等。Nova 是微軟開發(fā)的一種新型零知識證明系統(tǒng),它使用了一種名為松弛的秩一約束系統(tǒng)(Relaxed Rank-1 Constraint Systems,Relaxed R 1 CS)的技術(shù),以提高證明的效率和靈活性。最后一章節(jié)對源碼進行詳細(xì)解讀。 Nova 的優(yōu)點Nova 的主要優(yōu)點在于其使用的松弛的 R1CS 技術(shù)。R1CS 是一種用于構(gòu)建零知識證明的系統(tǒng),它可以用于證明一個人知道滿足一組多項式等式的解,而不必透露任何關(guān)于解的信息。然而,傳統(tǒng)的 R1CS 系統(tǒng)需要在證明過程中使用大量的隨機性,這會導(dǎo)致證明的生成和驗證過程非常復(fù)雜和耗時。Nova 通過使用松弛的 R1CS 來解決這個問題,它允許在證明中使用更少的隨機性,從而大大提高了證明的效率。 Nova 還具有其他一些優(yōu)點。例如,它支持增量計算,這意味著可以逐步計算復(fù)雜的函數(shù),而不必一次性計算整個函數(shù)。這在處理大規(guī)模數(shù)據(jù)或進行復(fù)雜計算時非常有用。此外,Nova 還支持多項式計算,這使得它可以處理更復(fù)雜的證明任務(wù)。 Nova 的缺點盡管 Nova 具有許多優(yōu)點,但它也有一些缺點。首先,由于 Nova 使用的是松弛的 R1CS,因此它的證明可能不如傳統(tǒng)的 R1CS 系統(tǒng)那么強大。這是因為松弛的 R1CS 允許在證明中使用更少的隨機性,這可能會降低證明的安全性。然而,Nova 的開發(fā)者已經(jīng)采取了一些措施來解決這個問題,例如使用更強大的密碼學(xué)算法和更復(fù)雜的證明策略。 其次,Nova 的實現(xiàn)相對復(fù)雜,這可能會增加使用和維護的難度。Nova 使用了許多高級的密碼學(xué)技術(shù),如多項式計算、群操作和隨機預(yù)言機等,這需要深入理解這些技術(shù)才能有效地使用和修改 Nova。 Nova 在零知識證明領(lǐng)域的重要地位Nova 在零知識證明領(lǐng)域中占據(jù)了重要的地位。它的出現(xiàn),為零知識證明的發(fā)展開辟了新的道路。Nova 采用的松弛的 R1CS 技術(shù),使得證明的生成和驗證過程更加高效,這對于大規(guī)模的零知識證明應(yīng)用至關(guān)重要。此外,Nova 還支持增量計算和多項式計算,這使得它可以處理更復(fù)雜的證明任務(wù),進一步擴大了零知識證明的應(yīng)用范圍。 Nova 的源碼解讀https://github.com/microsoft/Nova 在 src/ 目錄下,有以下幾個重要的子目錄: bellperson/:這個目錄可能包含了關(guān)于 Bellman-Ford 算法的代碼。 gadgets/:這個目錄可能包含了一些用于構(gòu)建 zk-SNARK 證明的工具。 provider/:這個目錄可能包含了一些提供者的代碼,如 keccak.rs 可能是實現(xiàn) Keccak 哈希函數(shù)的代碼。 spartan/:這個目錄可能包含了關(guān)于 Spartan 協(xié)議的代碼。 traits/:這個目錄可能包含了一些 Rust traits,用于定義一些公共的行為。 src/bellperson/mod.rs 文件的內(nèi)容:這個模塊主要用于生成 R1CS(Rank-1 Constraint Systems,一種用于 zk-SNARKs 的約束系統(tǒng))。 它包含了三個子模塊: r1cs:這個模塊可能包含了關(guān)于 R1CS 的代碼。 shape_cs:這個模塊可能包含了關(guān)于形狀約束系統(tǒng)的代碼。 solver:這個模塊可能包含了關(guān)于解決約束系統(tǒng)的代碼。 在測試部分,它定義了一個函數(shù) synthesize_alloc_bit,這個函數(shù)接受一個約束系統(tǒng),然后添加一些約束來檢查輸入的兩個比特是否確實是比特。然后,它定義了一個函數(shù) test_alloc_bit_with,這個函數(shù)首先創(chuàng)建一個形狀 src/bellperson/r 1 cs.rs 文件的內(nèi)容:這個文件主要定義了兩個 trait:`NovaWitness` 和 `NovaShape`,它們分別提供了從實現(xiàn)者獲取 `R 1 CSInstance` 和 `R 1 CSWitness`,以及獲取 `R 1 CSShape` 和 `CommitmentKey` 的方法。 - `NovaWitness` trait 有一個方法 `r1cs_instance_and_witness`,它接受一個 `R 1 CSShape` 和一個 `CommitmentKey`,然后返回一個 `R 1 CSInstance` 和一個 `R 1 CSWitness`。這個 trait 為 `SatisfyingAssignment` 結(jié)構(gòu)體實現(xiàn),這意味著任何 `SatisfyingAssignment` 都可以使用這個方法來獲取一個 `R 1 CSInstance` 和一個 `R 1 CSWitness`。 - `NovaShape` trait 有一個方法 `r 1 cs_shape`,它返回一個 `R 1 CSShape` 和一個 `CommitmentKey`。這個 trait 為 `ShapeCS` 結(jié)構(gòu)體實現(xiàn),這意味著任何 `ShapeCS` 都可以使用這個方法來獲取一個 `R 1 CSShape` 和一個 `CommitmentKey`。 這個文件還定義了一個函數(shù) `add_constraint`,它接受一個約束系統(tǒng)和三個線性組合,然后在約束系統(tǒng)中添加一個新的約束。這個函數(shù)被 `NovaShape` 的實現(xiàn)者在生成 `R 1 CSShape` 時使用。 總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(tǒng)(如 `SatisfyingAssignment` 或 `ShapeCS`)中生成 R 1 CS 的實例、證人、形狀和承諾密鑰。 src/bellperson/shape_cs.rs這個文件定義了一個名為 `ShapeCS` 的結(jié)構(gòu)體,它實現(xiàn)了 `ConstraintSystem` trait。`ShapeCS` 是用于創(chuàng)建 R 1 CS 形狀的約束系統(tǒng)。 `ShapeCS` 結(jié)構(gòu)體包含以下幾個字段: - `named_objects`: 這是一個映射,用于存儲與路徑關(guān)聯(lián)的對象。 - `current_namespace`: 這是一個字符串向量,用于存儲當(dāng)前的命名空間。 - `constraints`: 這是一個向量,用于存儲所有添加到 `ShapeCS` 的約束。 - `inputs`: 這是一個字符串向量,用于存儲所有的輸入。 - `aux`: 這是一個字符串向量,用于存儲所有的輔助輸入。 `ShapeCS` 結(jié)構(gòu)體實現(xiàn)了 `ConstraintSystem` trait,這意味著它提供了以下幾個方法: - `alloc`: 這個方法用于分配一個新的變量。 - `alloc_input`: 這個方法用于分配一個新的輸入變量。 - `enforce`: 這個方法用于添加一個新的約束。 - `push_namespace`: 這個方法用于推入一個新的命名空間。 - `pop_namespace`: 這個方法用于彈出當(dāng)前的命名空間。 - `get_root`: 這個方法用于獲取根約束系統(tǒng)。 這個文件還定義了一些輔助函數(shù),如 `proc_lc` 和 `compute_path`,它們分別用于處理線性組合和計算路徑。 總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(tǒng)(如 `ShapeCS`)中生成 R 1 CS 的形狀。 src/bellperson/solver.rs這個文件定義了一個名為 `SatisfyingAssignment` 的結(jié)構(gòu)體,它實現(xiàn)了 `ConstraintSystem` trait。`SatisfyingAssignment` 是用于創(chuàng)建 R 1 CS 實例和證人的約束系統(tǒng)。 `SatisfyingAssignment` 結(jié)構(gòu)體包含以下幾個字段: - `a_aux_density`, `b_input_density`, `b_aux_density`: 這些是 `DensityTracker` 類型的字段,用于跟蹤查詢的密度。 - `a`, `b`, `c`: 這些是向量,用于存儲 A、B、C 多項式的評估結(jié)果。 - `input_assignment`, `aux_assignment`: 這些是向量,用于存儲變量的賦值。 `SatisfyingAssignment` 結(jié)構(gòu)體實現(xiàn)了 `ConstraintSystem` trait,這意味著它提供了以下幾個方法: - `new`: 這個方法用于創(chuàng)建一個新的 `SatisfyingAssignment` 實例。 - `alloc`: 這個方法用于分配一個新的輔助變量。 - `alloc_input`: 這個方法用于分配一個新的輸入變量。 - `enforce`: 這個方法用于添加一個新的約束。 - `push_namespace`, `pop_namespace`: 這些方法用于操作命名空間,但在這個上下文中并沒有實際的操作。 - `get_root`: 這個方法用于獲取根約束系統(tǒng)。 - `is_extensible`, `extend`: 這些方法用于擴展約束系統(tǒng)。 總的來說,這個文件的主要作用是提供了一種方式,使得可以從一個滿足特定條件的系統(tǒng)(如 `SatisfyingAssignment`)中生成 R 1 CS 的實例和證人。 "src/circuit.rs",它定義了 Nova 協(xié)議中的增強電路(Augmented Circuit)。這個電路包括一個步驟電路( Step Circuit)和 Nova 的非交互折疊方案中的驗證器電路。文件中定義了以下幾個主要的結(jié)構(gòu)體和方法: - `NovaAugmentedCircuitParams`:這個結(jié)構(gòu)體包含了電路的參數(shù),包括 limb 寬度、limb 數(shù)量和一個布爾值表示這是否是主電路。 - `NovaAugmentedCircuitInputs`:這個結(jié)構(gòu)體包含了電路的輸入,包括參數(shù)、i、z 0、zi、U、u 和 T。 - `NovaAugmentedCircuit`:這個結(jié)構(gòu)體是 Nova 增強電路的主要定義,它包含了電路的參數(shù)、只讀常量、輸入和步驟電路。它還定義了一些方法,如 `alloc_witness`(分配證人)、`synthesize_base_case`(合成基礎(chǔ)案例)和 `synthesize_non_base_case`(合成非基礎(chǔ)案例)。 - `synthesize` 方法:這是 Nova 增強電路的主要合成方法,它首先分配所有的證人,然后根據(jù)是否是基礎(chǔ)案例來合成電路,并最后輸出計算的哈希值和 u.X[ 1 ]。 這個文件還包含了一些測試代碼,用于測試遞歸電路的功能。 總的來說,這個文件的主要作用是定義了 Nova 協(xié)議中的增強電路,這個電路是 Nova 協(xié)議的核心部分,它包括了一個步驟電路和一個驗證器電路,并提供了一種方式來合成這個電路。 "src/constants.rs",它定義了一些常量,這些常量在整個項目中被廣泛使用。以下是這些常量的含義:- `NUM_CHALLENGE_BITS`: 這個常量定義了挑戰(zhàn)的位數(shù),值為 128 。挑戰(zhàn)通常是由證&
免責(zé)聲明:本文不構(gòu)成投資建議,用戶應(yīng)考慮本文中的任何意見、觀點或結(jié)論是否符合其特定狀況,及遵守所在國家和地區(qū)的相關(guān)法律法規(guī)。
歡迎轉(zhuǎn)載分享!
轉(zhuǎn)載請注明本文地址: 如有文章侵犯了您的權(quán)利,請聯(lián)系本站站長,我們將在第一時間刪除相關(guān)內(nèi)容,謝謝! |