zk-ASM 如何提供安全且無需信任的互聯網
Web3.com Ventures 原始研究分析
0x魚哲學家
注意:本文是一篇技術相當密集的文章,假設您熟悉 zk-Proofs 和/或 zk-Rollups 的基本概念。您可以在此處找到對這些原則的更一般性介紹。

介紹
零知識證明,特別是 zk-SNARK(簡潔的非交互式知識論證)可能是 Web 3 前沿最重要的技術之一。雖然該子領域的大多數媒體和投資注意力都轉向了 zk -Rollups、爲以太坊等 L1 區塊鏈提供大規模可擴展性的擴展解決方案,這絕不是 zk-SNARK 的唯一應用。在本文中,我將深入分析零知識彙編代碼(或 zkASM)的概念,評估其在 zk-Rollups 及其他領域的用例,探索其在重新發明我們所知的互聯網方面的理論可能性。
技術原理
zk-ASM,顧名思義,包含兩個主要技術部分:ZK 和 ASM。ZK 部分指的是 zk-SNARKs,即簡潔的非交互式知識論證,而 ASM 部分指的是彙編代碼。要了解 zk-ASM 的潛力,我們必須首先了解這兩個看似神祕的概念的理論基礎。
zk-SNARKs
zk-SNARK 是 zk-Proof 中的精品:它們是某個陳述爲真的簡潔證明,但證明不會透露任何有關被證明數據的信息。例如,假設有人斷言“我知道一個 m,並且 C(m) = 0”,其中 m 是千兆字節長的消息,而 C 是一個函數。zk-SNARK 是一種非常簡短的證明(< 1GB),可以快速驗證,並且不會透露有關 m 的任何信息(除了公開可用的信息)[1]。
那麼這個“C(m)”是什麼?它有什麼用處?這個函數實際上是一個算術電路,或者是一個有向無環圖 (DAG),表示我們要執行的特定函數,如圖所示 [2]。“m”本質上是進入電路的輸入數據,電路中的特定“節點”是單獨的邏輯門或算術運算。例如,“+”節點可能有“2”和“3”作爲輸入,並將“5”輸出到下一個運算符。因此,任意算術或邏輯運算都可以編碼在“算術電路”中。

一旦我們有了這個算術電路作爲我們想要在其上運行 zk-SNARK 的代碼的表示,我們就可以開始構建這個 zk-SNARK 了。從根本上講,zk-SNARK 之所以成爲可能,是因爲“代數基本定理”,它指出“d”次多項式最多有“d”個根 [3]。數學技巧分爲兩個步驟:(1) 以某種方式將我們想要證明的函數“f(m)”轉換爲多項式(並堅持這樣做);(2) 使用“代數基本定理”與多項式交互並提供簡潔的證明。用技術術語來說,第一部分稱爲“多項式承諾方案”(PCS),第二部分稱爲“多項式交互式預言機證明”(PIOP)[4]。

雖然 PCS 和 PIOP 的具體實現超出了本文的範圍,但到目前爲止,我們已經粗略地概括了 zk-SNARK 的核心步驟:
有一個要運行 zk-SNARK 的函數(代碼函數、數學方程等)
將此函數編碼爲算術電路 C(m)
運行 PCS 以獲得該算術電路的多項式表示
運行 PIOP 以獲得與原始“m”大小成對數的簡潔證明
現在,我們有一個定製的 zk-SNARK,它可以證明某人知道某條消息,而無需透露該消息是什麼。
彙編代碼
zk-ASM 的第二個難題是彙編代碼的概念。彙編代碼是一類包含非常低級語言指令的語言,這些指令對於機器來說很容易讀取,但對於人類來說卻很難破譯。與 Python、Java 甚至 C 等高級語言不同,彙編語言包含非常原始的功能,例如移動、比較、添加和跳轉處理器上的一系列數據寄存器和硬編碼的內存位置。例如,在屏幕上打印數字 1 到 9 的 Python 代碼是 123456789:

很容易理解,對吧?下面是它的 x86 彙編版本 [5]:

更加糟糕,特別是對於這樣一個簡單的操作。那麼爲什麼還要使用匯編語言呢?如上所述,雖然這些指令可能不易被人類閱讀,但它們很容易“彙編”成 110011001 字節碼,供機器讀取和執行(這稱爲彙編程序) [6]。相比較而言,Python 和 Java 等高級語言更加人性化,但是用這些語言編寫的程序不能被處理器直接執行。相反,我們需要依靠“編譯器”來處理我們編寫的 Python 或 Java 代碼,並輸出像上面那樣的彙編代碼,由機器彙編和執行。我們可以期望同一段 Python 或 Java 代碼能夠在不同的處理器和不同的操作系統上順利運行,因爲編譯器完成了繁重的工作,將源代碼編譯成特定於該處理器或操作系統的彙編語言。
由於所有語言都會編譯爲彙編代碼(而彙編代碼本身又會編譯爲可執行二進制文件),因此彙編本質上就像是“所有語言之母”。現在假設我們能夠將彙編語言(例如 x86 或 RISC-V)中的所有操作數轉換爲算術電路表示,這樣我們就能夠提供此彙編語言中所有操作數的 zk-SNARK 證明。這意味着我們理論上能夠提供任何用任意高級語言(例如 Python 或 Java)編寫的程序的 zk-SNARK,這些程序可以編譯爲這種彙編語言。這就是我們需要認真考慮 zk-ASM 的原因。
實際應用
zk-EVM 彙總:多邊形 zk-ASM
zk-ASM 最重要的應用之一是創建與以太坊虛擬機兼容的 zk-Rollups 或 zk-EVM。zk-EVM 對區塊鏈可擴展性至關重要,因爲它允許程序員在基於 zk-Rollup 的 L2 鏈上部署,而無需修改太多(如果有的話)代碼 [7]。在這個領域,Polygon 的 zk-EVM 是一個典型的案例研究,展示瞭如何使用 zk-ASM 來實現這一目標。

當程序員在以太坊 L1 區塊鏈上進行開發時,他們通常使用 Solidity 編寫代碼,這是一種類似於 C 的高級語言。這些 Solidity 代碼被編譯成一系列 EVM 操作碼,例如 ADD、SLOAD 和 EQ,然後在 L1 區塊鏈上執行 [8]。默認情況下,此過程顯然不會創建任何類型的零知識證明。Polygon 的訣竅是創建一種方法來將每個 EVM 操作碼解釋爲他們自定義的 zk-ASM,這對 zk-SNARK 非常友好。然後,他們的 L2 zk-EVM 將執行 zk-ASM,同時還會創建 ASM 的 zk-SNARK 電路以創建 zk-SNARK 證明 [9]。例如,EVM 中的 ADD 操作碼將被轉換爲 Polygon 的 zk-ASM,如下所示 [10]:

由於 Polygon zk-EVM 的花招發生在 Assembly 級別,因此它與普通以太坊程序員接觸的代碼“Solidity”級別相差兩個級別。這就是爲什麼大多數開發人員可以將爲以太坊主網構建的 EVM 代碼直接移植到 Polygon zk-EVM 上的原因。此外,由於 Polygon zk-EVM 將以太坊的技術棧“保留”到操作碼級別,因此所有依賴於分析編譯操作碼的調試基礎設施都將保持可用和完整。這與其他一些 zk-EVM 設計不同,例如 zk-Sync,它不提供操作碼級別的零知識證明。因此,即使 Polygon 發明並證明了自己的 Assembly 語言,Vitalik 寫道“它仍然可以驗證 EVM 代碼,只是使用了一些不同的內部邏輯來完成它”[11]。
超越 Rollups:zk-WASM
zk-EVM 絕不是 zk-ASM 的唯一應用。回想一下我們之前的斷言,彙編語言本質上是“所有語言之母”,並且 zk-ASM 的創建將爲用任何可編譯爲該彙編語言的語言編寫的通用程序解鎖 zk-Proof。Web Assembly(或 WASM)是最重要的新興彙編語言之一。WASM 於 2018 年首次發佈,其目的是創建一種彙編語言,以提高 Web 應用程序的執行速度,併爲 Web 背後的主要編碼語言 Javascript 提供執行補充 [12]。
從本質上講,隨着 Web 多年來的發展,Web 應用的規模和複雜性不斷增長,這意味着瀏覽器編譯用 JavaScript 編寫的所有內容通常非常慢,並且必須依賴複雜的編譯-優化-重新加載循環 [12]。另一方面,WebAssembly 通過提供可移植、模塊化且易於執行的彙編語言,消除了對複雜瀏覽器執行引擎的依賴。此外,作爲一種彙編語言,WASM 允許程序員直接用 C、C++、Rust、Java 或 Ruby 編寫可在瀏覽器中本地運行的代碼片段。因此,WASM 已成爲“提供分佈式無服務器功能”的首選技術 [13]。
那麼 zk-SNARK 爲何會出現?它是如何出現的?WASM 的獨特之處在於它是一種客戶端技術,能夠直接與用戶輸入和數據交互。因爲這通常包括密碼和個人信息等敏感數據,所以我們需要一種技術來 (1) 確保程序正確執行,並且 (2) 我們的敏感信息不會泄露。如上所述,zk-SNARK 是解決這兩個問題的完美解決方案,因此是確保 WASM 安全的重要一塊拼圖 [14]。
雖然 zk-WASM 的開發工作還處於早期階段,但最近已經有一些項目發佈了針對 WebAssembly 的 zk-SNARK 電路原型。例如,Delphinus Lab 的“ZAWA”zk-SNARK 模擬器提出了一種將 WASM 虛擬機的操作數和語義編碼到算術電路中的方法,從而使其能夠進行 zk-SNARK 證明 [13]。隨着時間的推移,zk-WASM 電路無疑會不斷得到優化,從而允許用通用語言(例如 C、C++、Rust 和 Ruby)編寫的程序採用 zk-Proofs 的範式。
結論
在本文中,我們探討了 zk-ASM 的理論基礎,並研究了 zk-ASM 的兩個典型案例:Polygon 使用 zk-ASM 創建操作碼級 zk-EVM,以及將 zk-SNARKs 應用於 WebAssembly 以創建 zk-WASM。最終,zk-ASM 的承諾是將 Web 2 的互操作性和可擴展性與 Web 3 的無信任性和安全性結合起來。
一方面,區塊鏈越來越多地尋求超越其當前的吞吐量瓶頸並可能支持執行,而另一方面,Web 2 方法因保護用戶數據和隱私不足而受到越來越多的攻擊。隨着程序員能夠在他們的 Web 2 代碼中採用 Web 3 設計範例並將 Web 2 語言和代碼引入區塊鏈,通用 zk-ASM 可能代表 Web 2 和 Web 3 世界的融合點 [15]。從這個意義上講,zk-ASM 可能讓我們重新構想一個更安全、更無需信任的互聯網。
🐦@0xfishylosopher
📅 2022 年 12 月 17 日
免責聲明:以上信息僅供參考,不構成財務建議,僅代表作者的觀點。Delphinus Lab 是 Web3.com Ventures 的投資組合公司。
參考
[1] https://z.cash/technology/zksnarks/
[2] https://cs251.stanford.edu/lectures/lecture14.pdf
[3] https://www.britannica.com/science/fundamental-theorem-of-algebra
[4] 構建高效的 SNARK:https://cs251.stanford.edu/lectures/lecture15.pdf
[5] 示例來自:https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm
[6] https://en.wikipedia.org/wiki/Assembly_language
[7] https://www.alchemy.com/overviews/zkevm
[8] 操作碼列表:https://ethereum.org/en/developers/docs/evm/opcodes/
[9] https://wiki.polygon.technology/docs/zkEVM/zkASM/introduction
[10] https://wiki.polygon.technology/docs/zkEVM/zkASM/some-examples
[11] https://vitalik.ca/general/2022/08/04/zkevm.html
[12] https://blog.developer.adobe.com/understanding-webassembly-wasm-d5b592208ecc
[13] https://jhc.sjtu.edu.cn/~hongfeifu/manuscriptb.pdf
[14] https://hyperoracle.medium.com/zkwasm-the-next-chapter-of-zk-and-zkvm-471038b1fba6
[15] https://delphinuslab.com/zk-wasm/

