零知識證明

算術電路

算術電路是你把「一項計算」翻譯成證明系統能夠推理之形狀的方式。你不是用 CPU 指令,而是把計算表達成一張在有限體上的閘圖,其中每個閘要嘛是其輸入的加法、要嘛是乘法,導線則在閘之間傳遞有限體元素。原則上,任何在有限時間內執行完畢的程式都能被展開(攤平)成這樣一個電路——迴圈被展開,而分支則化為「兩條路徑各自乘上一個選擇器」——於是證明「我正確地跑了這個程式」就變成證明「我知道一組導線值,能讓這電路裡的每一個閘都自洽」。

加法與乘法之所以就夠用,是因為有限體算術能模擬布林邏輯與整數運算:AND 就是一次乘法,NOT 就是 1 減 x,而比較或雜湊則拆解成由這些閘構成的長鏈。電路的成本模型基本上就是它的乘法閘數量(在 SNARK 中加法通常幾乎免費),而這個閘數正是最終決定證明時間的關鍵。舉例來說,一次 SHA-256 雜湊要花上數萬條約束,這正是電路設計者偏好像 Poseidon 這類「對 SNARK 友善」、在原生有限體算術裡很便宜的雜湊的原因。

電路是「人類可讀的陳述」與「證明的代數」之間的橋樑。往下游走,它被攤平成一個約束系統(R1CS 或 PLONK 式的佈局),再化為多項式,再化為一個簡潔的證明。手寫電路十分痛苦,因此各種領域專用語言與編譯器——Circom、Halo2、Cairo、Noir——讓開發者得以在較高層次描述陳述,再自動產出閘層級的電路。

電路是固定且與資料無關的:在證明的當下,它沒有真正的分支,也沒有長度可變的迴圈。每一條可能的執行路徑都必須被「烤死」在裡面,這正是電路大小受限於最壞情形、而非平均情形的原因——也是證明通用計算之所以昂貴的一大主因。