零知識證明(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 技術的採用和有效性。
零知識證明(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 技術的採用和有效性。