一文探討ZK程式語言

零知識證明(ZKP)是一種強大的密碼學工具,它可以在驗證計算的正確性的同時,保護輸入資料的隱私。作為這項關鍵基礎設施的組成部分,領域特定語言(DSL)發揮了至關重要的作用,簡化了ZKP 電路的開發和驗證過程。它們在將抽象概念與證明系統所需的精確電路表示之間扮演了重要的角色,充當了兩者之間重要的橋樑。

證明系統面臨的關鍵挑戰之一是將抽象的高層概念轉化為實際電路。然而,DSL 的出現解決了這個難題,透過促進將這些抽象概念以更具體和可實現的方式結構化表達,從而應對這一挑戰。

在過去的十年裡,我們目睹了DSL 在數量和多樣性方面都取得了顯著增長。這一領域的活躍表現在多種電路語言的發展中,包括Noir、Leo、Zinc 等。無論您需要通用性的選項,例如Circom,還是為特定平台量身定制的解決方案,例如Cairo,您都可以選擇從眾多語言和框架中挑選,以編寫ZKP 電路。

在本文中,我們將探討開發者們正在積極利用的主要ZK程式語言,並分析每種語言的最佳特徵。

TLDR;

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(一個產生固定大小輸出的加密雜湊函數)和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程序,涵蓋了各種內建的可證明操作,包括基本算術、雜湊、簽章、布林操作、比較等等。借助o1js框架,您可以在Mina Protocol 上建立zkApps,這些智能合約在客戶端執行,具有私有輸入。

值得一提的是,在2023年9月初,0(1)Labs 團隊宣布將從SnarkyJS 過渡到o1js,並強調了他們對改進性能的承諾。特別值得注意的是,他們實現了庫載入時間的3-4倍減少,這指的是導入o1js 所需的時間,這個過程可能會阻塞主執行緒。對於網頁應用程式而言,載入時間對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 的能力受到一定限制。在這種情況下,開發者可能需要結合其他程式語言或框架來滿足更廣泛的開發需求。

一文探討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 技術的採用和有效性。

Total
0
Shares
Related Posts