零知識證明
Groth16
Groth16 以 Jens Groth 在 2016 年提出的構造命名,是樹立「簡潔」標竿的那套 SNARK:一個證明只是三個群元素——大約 128 到 200 位元組——而驗證只是固定的寥寥幾次配對運算,無論底層計算多麼龐大。多年來它一直是鏈上驗證的預設選擇,正因其證明極小、驗證的 gas 成本既低且固定。Zcash 的 Sapling 屏蔽交易與許多早期的 ZK 彙整,驗證的都是 Groth16 證明。
這份簡潔的代價,是一個電路專屬的可信設置。Groth16 吃進以 R1CS 表達的電路,透過二次算術程式編譯它,再把那個確切的電路烤進它的結構化參考字串。驗證歸結為檢查單一一個形如 e(A, B) = e(α, β) · e(C, δ) · e(vk_x, γ) 的配對方程式,其中 A、B、C 是證明、其餘來自驗證金鑰;唯有當證明者確實知道一組滿足的見證時,該方程式才成立。由於 SRS 被綁死在一個電路上,對程式的任何更動——哪怕只是修個臭蟲——都需要重辦一場全新的儀式,這正是它最核心的不便之處。
它與 PLONK 之間的取捨既鮮明又眾所周知:Groth16 給你最小的證明與最便宜的驗證,PLONK 則給你一個可重複使用的通用設置。部署單一、穩定、高流量電路(一條屏蔽付款陳述、一個固定的彙整驗證器)的專案,往往仍偏好 Groth16;而持續迭代邏輯、或要支援任意電路的專案,則偏好通用設置的系統。如同所有以配對為基礎的 SNARK,Groth16 仰賴的困難性假設並非抗量子的。
verify: e(A, B) = e(α, β) · e(C, δ) · e(Σ aᵢ·Lᵢ, γ) — A, B, C are the 3-element proof
Groth16 那三元素的證明,可被證明大致已是「以配對為基礎之 SNARK」所能達到的最小,但這份優雅是以最不靈活的設置換來的。「最小的證明、最痛苦的設置」,就是你選它時所接受的交換。
另见