天天看點

如何利用chatgpt入門學習零知識證明?

Rust開源零知識證明算法

有沒有優秀的rust開源的零知識證明算法,

是的,有很多優秀的 Rust 開源的零知識證明算法,以下是其中一些:

bellman: 一個 Rust 實作的零知識證明庫,它支援高效的 Groth16 零知識證明系統,适用于大規模的計算和高度優化的電路。

zkSync: 一個以太坊二層擴充協定,基于零知識證明技術,旨在提高以太坊的吞吐量和交易速度。

Bulletproofs: 一個 Rust 實作的非互動式零知識證明協定,它可以實作非常高效的驗證時間和證明大小,适用于多種應用場景。

Zcash: 一個基于零知識證明技術的隐私保護數字貨币,它的 Rust 實作庫實作了 zk-SNARKS 零知識證明系統,并支援多種優化政策。

這隻是一小部分 Rust 開源的零知識證明算法庫,還有很多其他的庫和協定可以使用。

最好的是哪一種

沒有一種零知識證明算法是最好的,最好的算法取決于具體的應用場景和需求。每種算法都有其獨特的優點和缺點,需要根據具體情況進行選擇。

例如,zk-SNARKS 算法在驗證時間和證明大小方面有很好的表現,适用于需要高效驗證和緊湊證明的應用。而 Bulletproofs 算法雖然在驗證時間和證明大小方面不如 zk-SNARKS,但可以實作非常高的可組合性和隐私性,适用于需要多次證明組合的應用。

是以,需要根據具體的應用場景和需求,結合算法的優點和缺點,選擇最适合自己的零知識證明算法。

如何入門zk-snarks

學習 zk-SNARKS 首先需要了解一些基本的密碼學和數學知識,包括離散對數問題、橢圓曲線密碼學、群論等等。然後可以按照以下步驟入門 zk-SNARKS:

了解 zk-SNARKS 的基本概念和原理,包括可驗證性、零知識性、完備性、可靠性等等。

學習 zk-SNARKS 的構造方法和實作原理,包括 R1CS 限制系統、QAP 映射、多項式求解等等。

學習 zk-SNARKS 的優化技術和工程實作,包括曲線選擇、參數生成、證明生成和驗證算法的優化等等。

掌握一些 zk-SNARKS 的應用場景和實際應用,包括密碼學、隐私保護、智能合約、擴充性協定等等。

對于初學者,可以先學習一些 zk-SNARKS 的基礎知識和理論,然後可以使用一些現成的工具和庫,例如 libsnark、bellman、zokrates 等等,實踐一些簡單的例子和應用。同時,可以參加一些線上課程、研讨會或者社群活動,了解更多關于 zk-SNARKS 的最新進展和應用。

跟我說一下基本概念和原理

zk-SNARKS 是一種零知識證明系統,它的名字是“Zero-Knowledge Succinct Non-Interactive Argument of Knowledge”的縮寫。其基本原理如下:

可驗證性:zk-SNARKS 是一種可驗證的證明系統,即可以被驗證人(Verifier)驗證,且驗證結果可以被公開驗證,任何人都可以驗證證明的有效性。

零知識性:zk-SNARKS 是一種零知識證明系統,即證明人(Prover)可以在不洩露證明的具體資訊的情況下證明某個陳述的真實性。換句話說,證明人可以向驗證人證明自己擁有某些資訊,而不需要洩露這些資訊的具體内容。

完備性:zk-SNARKS 是一種完備的證明系統,即對于任何錯誤的陳述或者不合法的證明,驗證人都能夠檢測到。

可靠性:zk-SNARKS 是一種可靠的證明系統,即對于正确的陳述和合法的證明,驗證人可以确信其真實性。

zk-SNARKS 的基本概念包括:

限制系統(Constraint System):用于表示某個陳述的限制條件,例如密碼學運算、資料比較等等。

QAP 映射(QAP Mapping):将限制系統轉化為多項式形式,友善進行多項式求解和證明。

多項式求解(Polynomial Evaluation):對多項式進行求解,得到對應的解析表達式。

證明生成(Proof Generation):根據多項式求解結果生成對應的 zk-SNARKS 證明。

證明驗證(Proof Verification):驗證 zk-SNARKS 證明的正确性,即驗證證明是否滿足可驗證性、零知識性、完備性和可靠性。

給我一個簡單的例子

一個簡單的例子可以是證明你知道一組數字 x 和 y,使得 x 和 y 滿足以下方程:

x * y = 15

你可以使用 zk-SNARKS 來證明你知道 x 和 y 的值,而不需要洩露這些具體的值。具體步驟如下:

建構限制系統:将方程 x * y = 15 轉化為限制系統,即限制 x 和 y 滿足方程的條件。

QAP 映射:将限制系統轉化為多項式形式,得到多項式 P(x,y) 和 Q(x,y),使得 P(x,y) * Q(x,y) = T(x,y) + H(x,y)。

多項式求解:使用多項式求解算法求解 T(x,y) 的值,得到一個解析表達式 f(x,y)。

證明生成:根據多項式求解結果生成對應的 zk-SNARKS 證明,包括多項式 f(x,y) 的系數和一些随機數。

證明驗證:驗證 zk-SNARKS 證明的正确性,包括驗證多項式 f(x,y) 的系數是否滿足多項式求解結果,以及驗證證明是否滿足可驗證性、零知識性、完備性和可靠性。

通過這個例子,你可以證明自己知道 x 和 y 的值,而不需要洩露這些具體的值,同時驗證人也可以驗證證明的有效性,但并不能推斷出 x 和 y 的值。

如何通過代碼實作

要通過代碼實作 zk-SNARKS,需要使用特定的加密庫和程式設計語言。這裡提供一個簡單的示例,使用 Rust 程式設計語言和 bellman-crypto 中的庫來實作 zk-SNARKS,該庫是一個 Rust 編寫的 zk-SNARKS 庫,提供了一套完整的工具鍊,包括限制系統的建構、QAP 映射、多項式求解、證明生成和驗證等功能。

假設要實作的例子是上一個問題中提到的證明 x 和 y 滿足方程 x * y = 15,具體代碼如下:

rust

Copy code

use bellman::groth16::{generate_random_parameters, prepare_verifying_key, create_random_proof, verify_proof};

use bellman::pairing::bn256::{Bn256, Fr};

use bellman::Circuit;

use rand::{thread_rng, Rng};

struct MulCircuit {

x: Option<Fr>,

y: Option<Fr>,

}

impl Circuit<Bn256> for MulCircuit {

fn synthesize<CS: bellman::ConstraintSystem<Bn256>>(self, cs: &mut CS) -> Result<(), bellman::SynthesisError> {

let x = cs.alloc(|| "x", || self.x.ok_or_else(|| bellman::SynthesisError::AssignmentMissing))?;

let y = cs.alloc(|| "y", || self.y.ok_or_else(|| bellman::SynthesisError::AssignmentMissing))?;

let res = cs.alloc(|| "res", || {

let x_val = self.x.ok_or_else(|| bellman::SynthesisError::AssignmentMissing)?;

let y_val = self.y.ok_or_else(|| bellman::SynthesisError::AssignmentMissing)?;

Ok(x_val * y_val)

})?;

cs.enforce(|| "mul", |lc| lc + x, |lc| lc + y, |lc| lc + res);

Ok(())

}

}

fn main() {

let rng = &mut thread_rng();

let circuit = MulCircuit {

x: Some(Fr::from(5u64)),

y: Some(Fr::from(3u64)),

};

let params = generate_random_parameters::<Bn256, _, _>(circuit, rng).unwrap();

let pvk = prepare_verifying_key(&params.vk);

let proof = create_random_proof(circuit, &params, rng).unwrap();

assert!(verify_proof(&pvk, &proof, &[Fr::from(15u64)]).unwrap());

}

這段代碼的實作過程分為五個步驟:

定義電路(Circuit):在這裡,電路的定義使用了 MulCircuit 結構體,并實作了 Circuit<Bn256> trait,其中的 synthesize 方法用于定義電路的限制條件。

生成參數:使用 generate_random_parameters 函數生成證明系統的公私鑰對,其中的 rng 參數是用于生成随機數的随機數生成器。

準備驗證密鑰:使用 prepare_verifying_key 函數準備驗證密鑰,以便進行證明驗證。

生成證明:使用 create_random_proof 函數生成證明,其中的 rng 參數同樣是用于生成随機數的

繼續閱讀