零知識證明
鏈上驗證器
鏈上驗證器是真正在區塊鏈上檢查零知識證明的那份智能合約。它是把鏈下密碼學轉化為鏈上信任的關鍵樞紐:一條彙整或一個隱私協議在鏈下完成它昂貴的證明,把一個短短的證明張貼在交易裡,而這份合約則跑驗證演算法,決定要不要接受那個新的狀態根、或那筆屏蔽轉帳。若驗證通過,鏈就把底層那項計算當作確實發生過——而從來沒有任何節點重新執行它。
讓這一切可行的,是簡潔性:驗證者的工作量很小,且無論被證明的計算多麼龐大,都大致固定。舉例來說,一個 Groth16 驗證器只需求值單一一個配對方程式,外加公開輸入的一個短短線性組合,成本約莫在二十幾萬 gas 的等級——之所以負擔得起,是因為以太坊為那些沉重的橢圓曲線運算提供了預編譯合約(位址 0x06 的 ECADD、0x07 的 ECMUL,以及 0x08 的 alt-bn128 配對檢查)。PLONK 與 STARK 的驗證器較大,但遵循同樣的原則:檢查寥寥幾個承諾與開封,而非整條執行軌跡。
驗證器合約通常由證明工具鏈(snarkjs、gnark、Halo2)依電路的驗證金鑰自動產生,這意味著合約的可信程度,僅僅等同於它背後的電路與設置。驗證器裡的一個臭蟲、一把不匹配的驗證金鑰,或一個約束不足的電路,全都可能放無效的證明過關——因此驗證器合約是鏈上被審計得最徹底的程式碼之一。由於驗證便宜且固定、而證明昂貴卻可在鏈下擴展,這份不對稱正是 ZK 彙整全部的經濟基礎。
鏈上驗證器是信任的邊界,但它抓不出有瑕疵的電路。它忠實地檢查一個證明是否滿足電路;若電路對陳述的約束不足,驗證器就會欣然接受假宣稱的證明。安全性是驗證器、加上設置、加上電路,三者一起被審計。
另见