ZK語言調查:Noir、o1js、Circom、Leo、Cairo、Lurk

簡介

領域特定語言(DSL)在零知識(ZK)證明[4] 領域中起著至關重要的作用。 在核心上,ZK 證明解決了在不透露任何附加資訊的情況下證明秘密數據中某些屬性存在的挑戰。 然而,將高層次的想法轉化為具體的證明可能會很複雜。 這就是 DSL 發揮作用的地方,它們將抽象概念與證明系統所需的電路表示橋接起來。

證明系統[5] 是一種允許一方向另一方證明某個陳述或主張的有效性而不透露任何敏感資訊的方法或協定。 它涉及一組規則和程式,使證明者能夠說服驗證者某個陳述的真實性,例如計算的正確性或某些知識的擁有,而不透露任何底層的秘密或數據。

然而,證明系統不能直接處理高層次的概念。 相反,它們需要被轉化為表示所需屬性的電路。 從高層次概念到電路的這種轉變帶來了挑戰。 這就是電路語言發揮作用的地方。 電路語言通過提供一種結構化和形式化的方式來表達高層次的想法來解決這個問題。

在過去的十年中,電路語言的數量和多樣性有了顯著增長。 許多電路語言的發展,如 Noir、Cairo[6] 和 Leo,表明瞭該領域的活躍程度。 這種語言的增多使得我們可以比較和對比它們的特性、相似之處和差異。 通過對這些語言進行綜合考察,可以更深入地了解整個電路語言的格局。

TLDR;

– Noir – 由 Aztec 開發,抽象了密碼學的複雜性,使得任何背景的開發人員都可以編寫 ZK 電路。

– o1js – 由 O(1) Labs 開發的 Type 庫。 允許開發人員編寫智能合約。 與現有的 Java 和 Type 庫和工具很好地整合。

**– **Circom**[7] ** – 專為 ZKP 電路開發而設計。 提供精確性和清晰性,其功能主要集中在這個特定領域。

– Leo – 為開發人員提供了一個使用者友好的環境。 採用了經過形式驗證的編譯器架構,重點是早期錯誤檢測和預防。

**–**開羅**[8] ** – 強調效率和可擴充性。 通過標準介面支援互操作性,可以與區塊鏈平臺、智慧合約和鏈下系統集成。

– Lurk – 通過利用 Lisp 實現通用電路,解決了傳統 SNARK 的局限性。

術語表

由於我們將涉及技術概念,以下是一些可能在後續文本中遇到的複雜術語的術語表:

• 抽象電路中間表示(Acer:Abstract Circuit Intermediate Representation): Noir 使用的 ZK 電路的中間表示,可以編譯成一階約束系統(R1CS)。

• 自定義門(Custom gates): 專為在 ZK 電路中高效且安全地執行密碼操作而設計的專用邏輯門。

• SHA-256: 一種密碼哈希函數,接受一個輸入併產生固定大小的輸出。

• Pedersen-Merkle 檢查: 使用 Pedersen 承諾和默克爾樹的密碼驗證技術,可以驗證數據的完整性和一致性。

**• 圖靈完備性:**計算系統的屬性,可以模擬圖靈機,在足夠的時間和資源下能夠解決任何可計算問題。

**• 過程傳遞風格(CPS:Continuation Passing Style):**一種程式設計技術,將評估過程分解為可管理的步驟,實現統一且高效的執行。

**• 域元素(Field elements):**有限數學域中的元素,常用於密碼學方案和計算中。

黑色

黑[9] 是 Aztec 設計的一種領域特定語言(DSL),旨在簡化 ZK 電路和 ZK 程式的創建,無需廣泛的密碼學知識或成為密碼學家。 其主要目標是使來自任何背景的開發人員能夠編寫 ZK(零知識)電路。 Noir 優先考慮安全性、簡單性和性能。 它提供了一種高級的、類似於 Rust 的語法,抽象了密碼學安全性並簡化了密碼學原語的使用,同時保持高性能。

通過 ZK 證明擴展可能性

Noir 的一個優點是它有潛力擴展可以利用 ZK 證明提供的保護隱私特性的應用範圍。 這些證明增強了隱私並提供了高效的驗證。 Noir 編譯成一種中間表示稱為抽象電路中間表示(Acer),可以進一步編譯成一種稱為 R1CS(rank one constraint )的約束系統。 這種後端證明系統與語言的解耦使得 Noir 可以支援各種證明系統,包括 Aztec Brettenberg、Turbo Plonk 以及潛在的未來集成,如 Groth16 和 Halo 2。

優化和標準庫

開發人員可以在證明系統層面上優化電路,利用自定義門,一種專門設計用於高效和安全執行密碼操作的邏輯門類型,提高速度、安全性和各種應用功能。 該語言提供了一個標準庫,其中包含了優化的函數,如SHA-256和Pedersen-Merkle檢查,這些密碼驗證技術使用Pedersen承諾和梅克爾樹,能夠驗證數據的完整性和一致性。

! [](https://img-cdn.gateio.im/webp-social/moments-40baef27dd-627b2da8eb-dd1a6f-cd5cc0.webp "! [顯示 Noir 語言語法的圖形“)

顯示 Noir 語言語法的圖形### 代碼組織和表達能力

Noir 通過模組和外部 crate 支援代碼組織,便於創建 Noir 程式的庫。 它提供了數位、元組和結構等複合數據類型,允許開發人員對數據進行分組並實現公共函數。 該語言還支援控制流結構,如 for 迴圈、if 語句以及邏輯和位運算元。 泛型和一級函數正在積極開發中,進一步增強了 Noir 的表達能力。

需要注意的是,Noir 仍然在不斷發展中。 它可能存在一些限制和潛在的錯誤。 開發團隊持續反覆運算語言,並致力於不斷改進。

o1js

O1JS的[10] 是 (0)1Labs 設計的一種 Type 庫,用於使用 Snark 程式設計語言編寫智慧合約。 它利用現有的開放技術,如 Node.js 和瀏覽器,使其對開發人員來說更加易於訪問和方便。 通過構建在 Type 上,o1js 允許開發人員利用他們對 Java 和 Type 庫和工具的現有知識。

集成

o1js 與 Java 和 Type 庫和工具無縫集成,為開發人員提供了強大的功能和廣泛的社區支援。 這種集成提高了生產力,並減少了採用新開發環境的學習曲線。

VS Code 支援

它提供對 Visual Studio Code (VS Code) 的支援,這是一款流行的代碼編輯器。 開發人員可以利用諸如代碼補全、語法高亮和調試等功能,增強整體的開發體驗。

標準庫

o1js 提供了一個全面的標準庫,包括域元素、un-64、un-32、公鑰、私鑰和簽名等基本類型。 這些類型帶有內置方法,簡化了加密方案、可選數據、布爾值和橢圓曲線的處理過程。

Circom

Circom 是 Circuit Compiler 的縮寫,是一種專為零知識證明 (ZKP) 電路開發而設計的強大領域特定語言 (DSL),由 Jordi Balyna 和 iden3 團隊創建。

表達性電路定義

憑藉其表達性的語法,Circom 允許開發人員以精確和清晰的方式定義用於 ZKP 應用的電路。 然而,對於 Circom 的新手和對 DSL 或 ZKP 概念不熟悉的人來說,其語法和語義可能難以理解。 對於新手電路開發者或具有通用程式設計語言背景的開發者來說,可能需要額外的努力和時間。

範圍限制

雖然 Circom 在 ZKP 電路開發方面表現出色,但需要注意的是,它的功能主要集中在這個特定領域。 因此,尋求處理各種計算任務的更通用語言的開發人員可能會發現 Circom 有所限制。 為了滿足更廣泛的開發需求,可能需要將 Circom 與其他程式設計語言或框架結合使用。

Circom 工作原理的解釋。 ### 工具和生態系統限制

Circom 受到各種開發工具的支援,並擁有不斷發展的生態系統,儘管與更成熟的程式設計語言和框架相比,其工具和資源的可用性可能仍然相對有限。 開發人員可能在尋找特定用例或高級功能的全面文檔、庫和社區支援方面遇到挑戰。 這種限制可能會對 Circom 的開發速度和社區採用產生影響。

兼容性考慮

Circom 的相容性主要集中在像 snarkjs 和 libsnark 這樣的流行零知識證明系統上。 雖然這使得它可以與這些系統無縫集成,但也引入了對它們特定功能和限制的依賴。 偏好或需要其他 ZKP 系統的開發人員可能會遇到相容性問題,或需要額外的努力來適應和集成 Circom 生成的電路到他們首選的系統中。

獅子座

獅子座[11] 是一種專門設計用於開發零知識證明應用程式的程式設計語言。 它旨在為開發人員提供一個使用者友好的環境,特別是那些在區塊鏈生態系統中具有先前經驗的開發人員。 LEO 類似於 Rust,並具有一些類似 Java 的元素,旨在在應用程式開發中創建熟悉感和便利性。

Leo 的一個顯著特點是其編譯器,它將程式轉換為一種稱為 R1CS 的低級證明格式。 Leo 編譯器的區別在於它經歷的嚴格形式驗證過程。 這種驗證是必要的,因為錯誤可能在各個階段出現,包括程式設計、審計和編譯。 通過數學上確保編譯器遵循程式師的意圖,Leo 旨在最大程度地減少錯誤被忽視或被利用的風險,特別是在 L2 上下文、ZK-rollups 或 LEO 平臺中的私有程式中。

Leo 語言的語法認識到儘管盡力而為,錯誤是不可避免的,Leo 團隊強調了早期錯誤預防和檢測的重要性,特別是在處理重要價值轉移的系統中。 為了解決這個問題,Leo 的經過正式驗證的編譯器架構注入了額外的信心,降低了意外偏離預期程序行為的可能性。

除了語言和編譯器之外,Leo 還提供了各種開發者體驗工具和功能。 這些元件旨在增強開發過程,簡化任務,提高效率。 借鑒了七年的經驗,並觀察了乙太坊生態系統的發展,Leo 團隊旨在提供一個使用者友好的環境,類似於諸如 explorers、部署框架(如Truffle和Ganache)以及簡化應用程式開發和測試的其他資源的工具演變。

開羅

開羅[12] 提供了一種簡化構建 ZKP 電路過程的語法。 借鑒傳統程式設計語言的靈感,Cairo允許開發人員在設計 ZK 系統時利用他們現有的程式設計技能。 通過其聲明性方法,Cairo使得可以規範邏輯語句和計算,更容易地在零知識證明的背景下表示現實世界的場景。

效率和可擴展性

性能是 ZK 系統的關鍵因素。 Cairo通過關注效率和可擴展性來解決這個問題。 該語言採用了優化技術,如約束減少和迴圈消除,以最小化與 ZKP 電路相關的計算開銷。 通過優化電路設計,Cairo實現了更快的證明生成和驗證,適用於需要高輸送量和低延遲的應用程式。

互操作性和集成性

Cairo 被設計為與現有軟體基礎設施集成,使開發人員能夠將 ZKP 的能力與其他技術相結合。 該語言通過標準介面支援互操作性,允許與區塊鏈平臺、智慧合約和離鏈系統進行集成。 這種靈活性為在去中心化應用、金融系統和數據驗證協定中實現增強隱私功能的可能性打開了大門。

一個例子中的Cairo SNARK CPU 架構### 社區和生態系統

Cairo專案培育了一個由開發人員、研究人員和愛好者組成的社區,他們為其發展做出了貢獻。 文檔、教程和範例代碼的可用性有助於入門過程,使開發人員能夠掌握概念並開始構建 ZK 系統。 此外,Cairo還受益於 StarkWare 更廣泛的生態系統,該生態系統提供支援、工具和研究進展,以增強該語言及其功能。

潛伏

潛伏[13] 旨在通過利用 Lisp(一種函數式程式設計語言)實現通用電路,解決傳統SNARK和電路的局限性。 使用 Lisp,Lurk 引入了一個名為“”的通用函數,可以在 snark 電路中評估任何數據表達式。

代碼即數據,數據即代碼

Lurk 的一個基本原則是將程式表示為內容可尋址的數據。 這種方法可以高效地評估和驗證 Lurk 程式。 內容可尋址性簡化了解析過程,並且生成的數據可以直接在 snark 證明者中使用,而無需單獨的編譯步驟。

在 SNARK 中實現 Lisp

為了創建一個通用電路,Lurk 利用了 Lisp 的記憶體分配器“cons”。 該分配器將兩個運算式組合起來,並通過哈希生成對結果表達式的引用。 通過證明兩個表達式哈希到相同的引用,Lurk 可以在 snark 電路中執行計算。

延續傳遞風格

Lurk 採用了延續傳遞風格(CPS)將評估過程分解為可管理的步驟。 每個評估步驟都變成了可處理的計算,實現了統一且高效的執行。 在SNARK電路中包含顯式的延續,有助於逐步進行評估過程。

賦予圖靈完備性和遞歸能力

通過採用 Lisp,Lurk 實現了圖靈完備性,並支援 SNARK 電路中的無限遞歸。 這一重要能力允許證明複雜計算,並實現能夠執行任意計算的通用電路。

影響和應用

Lurk 的能力具有廣泛的影響。 通過支援無限遞歸、迴圈和條件控制流,Lurk 使得在SNARK 電路中可以進行複雜計算。 這為驗證計算、私有數據處理和執行圖靈完備程序開闢了各種應用。

結論

領域特定語言(DSL)的選擇是多樣的,並且隨著零知識證明(ZK)在各個區塊鏈生態系統中的應用案例不斷擴展,預計將繼續增長。 目前,建立用於構建 ZK 應用程式的主導語言的競爭仍處於早期階段,這表明我們可以預期在這個領域會有進一步的改進。

然而,大多數 DSL 的一個共同限制是缺乏來自龐大社區和強大庫的網路效應。 擁有充滿活力的社區和全面的庫可以極大地提升開發者的體驗。 儘管這個不足可能會隨著時間的推移得到解決,但對於參與 DSL 開發的團隊來說,優先考慮與其他庫的相容性非常重要,可以借鑒 o1js 所採用的方法。

通過確保與現有庫的相容性,DSL 可以利用更廣泛的開發者社區的集體知識和資源,實現更容易的集成、更快的開發,並在實現 ZK 應用程式時具有更大的靈活性。 這種協作的方式將促進圍繞 DSL 的更強大的生態系統的發展,使開發者受益,並最終推動 ZK 技術的採用和效果的提升。

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)