ZK,也就是零知識證明,這個賦能技術目前最常見的應用在於,啟用交易隱私和數據壓縮,也就是 Rollup,然而 ZK 技術不只運用在 Rollup,同時也使用在其他項目,本文將專門來探討 ZK 的程式語言。
(前情提要:科普|零知識證明(ZKP)的 3 類用例:隱私、金融、跨鏈身份)
(背景補充:談起LayerZero和Google Cloud,跨鏈該靠預言機還是ZK?)
零知識證明(ZKP)是一種強大的密碼學工具,它可以在驗證計算的正確性的同時,保護輸入資料的隱私。作為這一關鍵基礎設施的組成部分,領域特定語言(DSL)發揮了至關重要的作用,簡化了 ZKP 電路的開發和驗證過程。它們在將抽象概念與 證明系統 所需的精確電路表示之間扮演了重要的角色,充當了兩者之間重要的橋樑。
證明系統面臨的關鍵挑戰之一是將抽象的高層概念轉化為實際電路。然而,DSL 的出現解決了這一難題,通過促進將這些抽象概念以更具體和可實現的方式結構化表達,從而應對這一挑戰。
在過去的十年裡,我們目睹了 DSL 在數量和多樣性方面都取得了顯著增長。這一領域的活躍表現在多種電路語言的發展中,包括 Noir、Leo、Zinc 等。無論您需要通用性的選項,比如 Circom,還是為特定平臺訂製的解決方案,比如 Cairo,您都可以選擇從眾多語言和框架中挑選,以編寫 ZKP 電路。
在本文中,我們將探討開發者們正在積極利用的主要 ZK 程式語言,並分析每種語言的最佳特點。
TL;DR
Cairo By StarkWare
Cairo ,是支援 STARK 證明的通用計算程式的核心語言,在 StarkNet 和 StarkEx 的成功中扮演了關鍵角色,推動了以太坊主網上應用的可擴充套件性。值得一提的是,Cairo 在支援各種應用方面發揮了重要作用,包括 dYdX、Sorare、Immutable X 等。”Cairo” 這個名字來源於 “CPU 代數中間表示” 的縮寫。在零知識證明領域,它扮演了類似組合語言的角色,使熟悉 C、C++ 或 Solidity 等低階程式語言的開發人員能夠更輕鬆地上手。
受 Rust 的啟發,Cairo 賦予了開發者建立 Starknet 智慧合約的能力,著重關注安全性和使用者友好的開發。Cairo 具有強大的語法,簡化了 ZK 電路的建立,使使用者能夠在 Cairo 程式中執行各種任務。此外,Cairo 的一個顯著優勢在於其可擴充套件性,允許靈活地引入新功能和功能。
在 ZK 系統中,效率和可擴充套件性是至關重要的因素,而 Cairo 通過強調這兩個方面來滿足這一要求。該語言集成了優化策略,包括約束減少和迴圈消除,以減輕通常與 ZK 電路相關的計算負擔。Cairo 對電路設計的優化導致更快的證明生成和驗證,使其成為需要高吞吐量和最小延遲的應用的理想選擇。
Cairo 的擴張發展是非常的令人矚目,在過去兩年裡,全職開發者數量出現了 非凡的激增 。這一激增凸顯了 Cairo 的適應性,因為 Cairo 的用途不僅侷限於區塊鏈,而是在任何需要進行計算驗證的情境中都具有重要意義。因此,我們可以預見開發者對 Cairo 的採用將進一步迎來顯著增長。
2023 年 9 月 28 日,Starknet 推出了其程式語言 Cairo v2.3.0 的重要升級。這個版本標誌著合約更模組化的重大進步,通過引入新功能、儲存選項和事件管理,提升了智慧合約的潛力。這些元件的整合提供了一種靈活的方式,用於擴充套件合約功能,使第三方模組能夠增強合約的功能性。
Zinc by ZkSync
Zinc 是一種專為在 zkSync 平臺上建立智慧合約和 SNARK 電路而設計的程式語言。它採用了 Rust 語法,融合了 Solidity 的元素,並提供了獨特的功能。
Zinc 的獨特之處在於它的使用者友好性。您無需深入瞭解一階約束系統(R1CS)的所有複雜細節就能編寫安全的程式碼。Zinc 強調不可變性,使其天生具備函式式特性。這意味著它優先考慮不可變資料和函式評估,從而減少副作用,促進編寫更乾淨、更少出錯的智慧合約程式碼。
此外,Zinc 還包括安全的數學操作,以防止潛在的溢位,確保所有操作的安全性。儘管它有一些限制,比如沒有無限迴圈和遞迴,但 Zinc 通過控制檯日誌追蹤簡化了除錯過程。這些追蹤可簡化在測試網路或主網路上追蹤和解決問題的交易過程,從而提升了除錯體驗。
Noir By Aztec
Noir 是由 Aztec 開發的開源 DSL,基於 Rust ,旨在簡化 ZK 電路和 ZK 程式的建立,無需深入瞭解加密學知識。它被認為是最易入門的語言之一,適用於編寫與任何證明系統相容的 ZK 應用程式。Noir 注重安全性、簡潔性和效能。它提供了類似 Rust 的高階語法,將加密安全性抽象化,簡化了加密基本原語的使用,同時保持高效能。
Noir 在擴充套件可以利用 ZKP 提供的隱私保護能力的應用範圍方面具有顯著優勢,從而增強了隱私和驗證效率。Noir 編譯成一種稱為 Abstract Circuit Intermediate Representation(Acer)的中間表示,然後可以進一步編譯成 R1CS。將後端證明系統與語言本身分離使 Noir 能夠支援各種證明系統,包括 Aztec Brettenberg、Turbo Plonk 以及潛在的未來整合,如 Groth16 和 Halo2。
該語言提供了一個標準庫,包括高效的功能,如 SHA-256(一個生成固定大小輸出的加密hash函式)和 Pedersen-Merkle 檢查(一種使用 Pedersen 承諾和 Merkle 樹確保資料完整性和一致性的加密驗證技術)。Noir 的設計類似於 Rust,包括應用程式開發人員熟悉的特性,如函式、子模組、使用者定義型別(結構體)、條件語句、迴圈和全域性常量。此外,還在不斷努力開發泛型和一等函式,進一步增強 Noir 的表達能力。
需要注意的是,Noir 仍在不斷完善中,可能存在一些限制和潛在的錯誤。但開發團隊致力於持續改進和優化該語言。
o1js by 0(1) Labs
o1js ,前身為 SnarkyJS,是由 0 (1) Labs 開發的 TypeScript 庫,用於使用 SNARK 程式語言建立智慧合約。它充分利用了已經建立的技術,如 Node.js 和瀏覽器相容性,以確保開發者能夠輕鬆獲取和方便使用。
o1js 能夠與 JavaScript 和 TypeScript 庫和工具無縫整合,為開發者提供了強大的生態系統和廣泛的社群支援。這種整合簡化了開發流程,減少了採用新開發環境所帶來的學習曲線。此外,它完全支援 Visual Studio Code(VS Code),這是一款廣泛使用的程式碼編輯器,可讓開發者充分利用功能,如程式碼補全、語法高亮和除錯,提升開發體驗。
o1js 本質上是一個多功能的 ZK 框架,為您提供了建立 zk 證明所需的關鍵工具。它支援建立多樣化的 ZK 程式,涵蓋了各種內建的可證明操作,包括基本算術、hash、簽名、布林操作、比較等等。藉助 o1js 框架,您可以在 Mina Protocol 上構建 zkApps,這些智慧合約在客戶端執行,具有私有輸入。
值得一提的是,在 2023 年 9 月初,0 (1) Labs 團隊宣佈將從 SnarkyJS 過渡 到 o1js,並強調了他們改進效能的承諾。特別值得注意的是,他們實現了庫載入時間的 3-4 倍減少,這指的是匯入 o1js 所需的時間,這個過程可能會阻塞主執行緒。對於 Web 應用程式而言,載入時間對 JavaScript 執行時機和整個頁面渲染都具有重要意義。此外,該團隊還更新了 Mina zkApp CLI,提升了使用者介面構建體驗,並宣佈將進一步改進 Archive Node API,以增強其可靠性和清晰性。
Leo by Aleo
Aleo 區塊鏈在智慧合約領域獨樹一幟,強調隱私保護。其核心是 Leo 程式語言,這是一種受 Rust 啟發的靜態型別語言。Leo 專為開發私有應用而設計,為那些希望建立安全和保密的分散生態系統的創作者提供了支援。Leo 真正獨特之處在於,它在引入通用零知識應用的全面工具包方面發揮了開創性作用。這個工具包包括測試框架、包登錄檔、匯入解析器、遠端編譯器和定理生成器。
Leo 的構想來自一支由 Howard Wu 領導的開發團隊,他們設想了一種可以賦予開發人員能力,以構建優先考慮隱私和安全性的分散式應用程式。Leo 的設計汲取了 Rust 的原則,同時融入了一些類似 JavaScript 的元素,以促進開發過程中的熟悉感和便捷性。此外,Leo 旨在通過提供整合的測試平臺、包登錄檔和匯入轉換器來加速開發,簡化開發流程。這種整合使開發人員能夠專注於其應用程式的核心邏輯,而不會被基礎設施問題拖累。
Leo 的一個引人注目的特點是其編譯器,該編譯器將程式轉換為低階的 R1CS 證明格式。Leo 編譯器的獨特之處在於其嚴格的正式驗證過程。這種驗證至關重要,因為漏洞可能在多個階段出現,從初始程式設計到審計和編譯。通過進行嚴格的數學檢查,以確保編譯器與程式員的意圖一致,Leo 旨在降低未被察覺的錯誤或潛在的漏洞風險,尤其是在 L2 上下文、ZK-rollups 或 Leo 平臺上的私有程式中。
Circom by iden3
Circom ,一種專為 ZK 電路開發精心設計的 DSL,是由 Jordi Baylina 和 iden3 團隊共同打造的成果。Circom 編譯器採用 Rust 編寫,其主要任務是編譯使用 Circom 語言編寫的電路。值得一提的是,Circom 已成為現實世界中傑出的 ZK 應用程式的首選選擇,例如 Dark Forest 和 Tornado Cash 。它之所以備受歡迎,歸功於其出色的效能表現,包括通過優化的 WASM 證明實現快速的瀏覽器證明時間,通過 rapidsnark 實現高效的伺服器端證明,以及高效的鏈上驗證。
然而,需要認識到 Circom 的功能主要專注於 ZK 電路開發,這可能使其在處理更廣泛的計算任務時不太適用。尋求更多功能、能夠滿足更廣泛開發需求的開發者可能會覺得 Circom 的能力受到一定限制。在這種情況下,開發者可能需要結合其他程式語言或框架來滿足更廣泛的開發需求。
Circom 的相容性主要集中在廣泛使用的 ZKP 系統,如 snarkjs 和 libsnark。雖然這種相容性確保了與這些廣泛使用的系統的無縫整合,但也意味著 Circom 電路繼承了與這些依賴關係相關的特定功能和限制。那些偏好或需要替代 ZKP 系統的開發者可能會面臨相容性挑戰,或需要投入額外的工作來適應和將 Circom 生成的電路整合到他們首選的系統中。
Lurk by Lurk Lab
Lurk 是一種受到 Scheme 和 Common Lisp 影響的靜態作用域 Lisp 方言,具有獨特的特點:它允許使用 zk-SNARKs 直接證明程式執行的正確性,從而實現了緊湊高效的驗證。
Lurk 的主要用途包括:
可驗證計算:Lurk 允許您在零知識條件下證明其表示式的正確性,增強了對計算結果的信任。
零知識:使用者可以證明知識,而無需透露除公共輸入之外的具體資訊,從而保護隱私。
內容定址資料:每個 Lurk 程式都配備有一個唯一的內容識別符號(CID),使其與 IPFS 和 IPLD 相容。
圖靈完備性:Lurk 支援建立和證明任意計算宣告。
高階函式:Lurk 函式可以接受和返回函式,實現了富有表現力的函數語言程式設計。
處理私有資料的計算:Lurk 使得可以處理私有資料,同時確保可以證明的正確輸出,而不會洩露隱私。
在構建通用電路時,Lurk 充分利用了 Lisp 的 「cons」 記憶體分配器。該分配器合併表示式並生成引用通過雜湊。關鍵在於證明兩個表示式確實雜湊成相同的引用。這種驗證使得 Lurk 能夠在 snark 電路內執行計算。
Lurk 的功能非常豐富,包括支援無限遞迴、迴圈、條件控制流以及多個後端證明系統,如 Groth16 與 SnarkPack+ 和 Nova 。這種多功能性為各種應用打開了大門,包括驗證計算、私有資料處理,以及在 snark 電路內執行圖靈完備程式。
總結
隨著 ZK 應用多樣性的增加,DSL 在 ZK 領域的發展前景廣闊。DSL 成功的關鍵在於建立蓬勃發展的社群和豐富的庫,以豐富開發者的體驗。那些將與現有庫相容性置於優先位置的 DSL 可以充分利用更廣泛的開發者社群的知識和資源。這種方法有助於更順暢地整合,加速開發,並在實施 ZK 應用程式時提供更大的靈活性。這種合作努力對於培育 DSL 周圍更為健全的生態系統至關重要,為開發者提供切實的好處,並將進一步推動 ZK 技術的採用和有效性。