零知識證明(ZKP)是一種強大的密碼學工具,它可以在驗證計算的正確性的同時,保護輸入數據的隱私。作爲這一關鍵基礎設施的組成部分,領域特定語言(DSL)發揮了至關重要的作用,簡化了 ZKP 電路的開發和驗證過程。它們在將抽象概念與證明系統所需的精確電路表示之間扮演了重要的角色,充當了兩者之間重要的橋樑。
證明系統面臨的關鍵挑戰之一是將抽象的高層概念轉化爲實際電路。然而,DSL 的出現解決了這一難題,通過促進將這些抽象概念以更具體和可實現的方式結構化表達,從而應對這一挑戰。
在過去的十年裏,我們目睹了 DSL 在數量和多樣性方面都取得了顯著增長。這一領域的活躍表現在多種電路語言的發展中,包括 Noir、Leo、Zinc 等。無論您需要通用性的選項,比如 Circom,還是爲特定平臺定製的解決方案,比如 Cairo,您都可以選擇從衆多語言和框架中挑選,以編寫ZKP 電路。
在本文中,我們將探討開發人員正在積極利用的主要 ZK編程語言,並分析每種語言的最佳特點。
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 是一種專爲在 zkSync 平臺上創建智能合約和 SNARK 電路而設計的編程語言。它採用了Rust 語法,融合了 Solidity 的元素,並提供了獨特的功能。
Zinc 的獨特之處在於它的用戶友好性。您無需深入瞭解一階約束系統(R1CS)的所有複雜細節就能編寫安全的代碼。Zinc 強調不可變性,使其天生具備函數式特性。這意味着它優先考慮不可變數據和函數評估,從而減少副作用,促進編寫更乾淨、更少出錯的智能合約代碼。
此外,Zinc 還包括安全的數學操作,以防止潛在的溢出,確保所有操作的安全性。儘管它有一些限制,比如沒有無限循環和遞歸,但 Zinc 通過控制檯日誌跟蹤簡化了調試過程。這些跟蹤可簡化在測試網絡或主網絡上跟蹤和解決問題的交易過程,從而提升了調試體驗。
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(一個生成固定大小輸出的加密哈希函數)和 Pedersen-Merkle 檢查(一種使用 Pedersen 承諾和 Merkle 樹確保數據完整性和一致性的加密驗證技術)。Noir 的設計類似於 Rust,包括應用程序開發人員熟悉的特性,如函數、子模塊、用戶定義類型(結構體)、條件語句、循環和全局常量。此外,還在不斷努力開發泛型和一等函數,進一步增強 Noir 的表達能力。
需要注意的是,Noir 仍在不斷完善中,可能存在一些限制和潛在的錯誤。但開發團隊致力於持續改進和優化該語言。
o1js,前身爲 SnarkyJS,是由 0(1)Labs 開發的 TypeScript 庫,用於使用 SNARK 編程語言創建智能合約。它充分利用了已經建立的技術,如 Node.js 和瀏覽器兼容性,以確保開發者能夠輕鬆獲取和方便使用。
o1js 能夠與 JavaScript 和 TypeScript 庫和工具無縫集成,爲開發者提供了強大的生態系統和廣泛的社區支持。這種集成簡化了開發流程,減少了採用新開發環境所帶來的學習曲線。此外,它完全支持 Visual Studio Code(VS Code),這是一款廣泛使用的代碼編輯器,可讓開發者充分利用功能,如代碼補全、語法高亮和調試,提升開發體驗。
o1js 本質上是一個多功能的 ZK 框架,爲您提供了創建zk證明所需的關鍵工具。它支持創建多樣化的ZK程序,涵蓋了各種內置的可證明操作,包括基本算術、哈希、簽名、布爾操作、比較等等。藉助o1js框架,您可以在 Mina Protocol 上構建 zkApps,這些智能合約在客戶端執行,具有私有輸入。
值得一提的是,在2023年9月初,0(1)Labs 團隊宣佈將從 SnarkyJS 過渡到 o1js,並強調了他們改進性能的承諾。特別值得注意的是,他們實現了庫加載時間的3-4倍減少,這指的是導入 o1js 所需的時間,這個過程可能會阻塞主線程。對於Web應用程序而言,加載時間對 JavaScript 執行時機和整個頁面渲染都具有重要意義。此外,該團隊還更新了 Mina zkApp CLI,提升了用戶界面構建體驗,並宣佈將進一步改進 Archive Node API,以增強其可靠性和清晰性。
Aleo 區塊鏈在智能合約領域獨樹一幟,強調隱私保護。其核心是 Leo 編程語言,這是一種受 Rust 啓發的靜態類型語言。Leo 專爲開發私有應用而設計,爲那些希望建立安全和保密的分散生態系統的創作者提供了支持。Leo真正獨特之處在於,它在引入通用零知識應用的全面工具包方面發揮了開創性作用。這個工具包包括測試框架、包註冊表、導入解析器、遠程編譯器和定理生成器。
Leo 的構想來自一支由 Howard Wu 領導的開發團隊,他們設想了一種可以賦予開發人員能力,以構建優先考慮隱私和安全性的分散式應用程序。Leo的設計汲取了Rust的原則,同時融入了一些類似JavaScript的元素,以促進開發過程中的熟悉感和便捷性。此外,Leo旨在通過提供集成的測試平臺、包註冊表和導入轉換器來加速開發,簡化開發流程。這種集成使開發人員能夠專注於其應用程序的核心邏輯,而不會被基礎設施問題拖累。
Leo 的一個引人注目的特點是其編譯器,該編譯器將程序轉換爲低級的 R1CS 證明格式。Leo 編譯器的獨特之處在於其嚴格的正式驗證過程。這種驗證至關重要,因爲漏洞可能在多個階段出現,從初始編程到審計和編譯。通過進行嚴格的數學檢查,以確保編譯器與程序員的意圖一致,Leo 旨在降低未被察覺的錯誤或潛在的漏洞風險,尤其是在 L2 上下文、ZK-rollups 或 Leo 平臺上的私有程序中。
Circom,一種專爲 ZK 電路開發精心設計的 DSL,是由 Jordi Baylina 和 iden3 團隊共同打造的成果。Circom 編譯器採用 Rust 編寫,其主要任務是編譯使用 Circom 語言編寫的電路。值得一提的是,Circom 已成爲現實世界中傑出的 ZK 應用程序的首選選擇,例如 Dark Forest 和 Tornado Cash。它之所以備受歡迎,歸功於其出色的性能表現,包括通過優化的 WASM 證明實現快速的瀏覽器證明時間,通過 rapidsnark 實現高效的服務器端證明,以及高效的鏈上驗證。
然而,需要認識到 Circom 的功能主要專注於 ZK 電路開發,這可能使其在處理更廣泛的計算任務時不太適用。尋求更多功能、能夠滿足更廣泛開發需求的開發者可能會覺得 Circom 的能力受到一定限制。在這種情況下,開發者可能需要結合其他編程語言或框架來滿足更廣泛的開發需求。
圖片來自 Circom
Circom 的兼容性主要集中在廣泛使用的 ZKP 系統,如 snarkjs 和 libsnark。雖然這種兼容性確保了與這些廣泛使用的系統的無縫集成,但也意味着 Circom 電路繼承了與這些依賴關係相關的特定功能和限制。那些偏好或需要替代 ZKP 系統的開發者可能會面臨兼容性挑戰,或需要投入額外的工作來適應和將 Circom 生成的電路集成到他們首選的系統中。
Lurk 是一種受到 Scheme 和 Common Lisp 影響的靜態作用域 Lisp 方言,具有獨特的特點:它允許使用 zk-SNARKs 直接證明程序執行的正確性,從而實現了緊湊高效的驗證。
Lurk 的主要用途包括:
在構建通用電路時,Lurk 充分利用了 Lisp 的 “cons” 內存分配器。該分配器合併表達式並生成引用通過散列。關鍵在於證明兩個表達式確實散列成相同的引用。這種驗證使得 Lurk 能夠在 snark電路內執行計算。
Lurk 的功能非常豐富,包括支持無限遞歸、循環、條件控制流以及多個後端證明系統,如 Groth16 與 SnarkPack+ 和 Nova。這種多功能性爲各種應用打開了大門,包括驗證計算、私有數據處理,以及在 snark 電路內執行圖靈完備程序。
隨着 ZK 應用多樣性的增加,DSL 在 ZK 領域的發展前景廣闊。DSL 成功的關鍵在於建立蓬勃發展的社羣和豐富的庫,以豐富開發者的體驗。那些將與現有庫兼容性置於優先位置的 DSL 可以充分利用更廣泛的開發者社羣的知識和資源。這種方法有助於更順暢地集成,加速開發,並在實施ZK應用程序時提供更大的靈活性。這種合作努力對於培育 DSL 周圍更爲健全的生態系統至關重要,爲開發者提供切實的好處,並將進一步推動 ZK 技術的採用和有效性。