零知識證明
ZK 電路
ZK 電路是「零知識證明所要證明之陳述」的精確、可由機器檢查的編碼。在你能證明「這是真的,卻不洩漏為何」之前,你必須把那個「這」精確地釘成一個在有限體上的算術約束系統——也就是「祕密輸入(見證)與公開輸入必須共同滿足」的那組方程式。電路就是那個約束系統;一個有效的證明,認證了證明者知道一組讓每一條約束都成立的賦值。
設計電路,正是大部分工程與大部分臭蟲所棲身之處。一條太鬆的約束是 ZK 的頭號罪過:一個「約束不足」的電路會接受它本該拒絕的見證,讓惡意的證明者得以為某件假事產出一個完全有效的證明——而由於該證明能通過驗證,下游沒有人察覺。反過來,每多一條約束都耗費證明時間,因此設計者拚命想用盡可能少的乘法閘來表達邏輯,偏好對 SNARK 友善的基本元件(Poseidon 雜湊、以查表做範圍檢查),而非像 Keccak 那樣的 EVM 原生元件。
開發者鮮少手寫約束。各種較高階的語言與框架——Circom、Halo2、Noir、Cairo、gnark——讓你用更接近一般程式碼的東西來描述陳述,再編譯成電路,同時產出證明者與驗證者。同一個電路會被該陳述的每一次證明所重複使用:一條隱私池提款電路、一條 ZK 彙整的狀態轉移電路,或一條身分證明電路,都是寫一次、狠狠審計過,再以許多不同的私密見證去實例化。
最可怕的 ZK 臭蟲不在密碼學裡,而在電路裡。一套可靠的證明系統,若忠實地證明一個約束不足的電路,就會忠實地證明出假陳述——數學是對的,錯的是規格。
另見