以太坊虛擬機 (EVM) 是在以太坊區塊鏈上管理狀態和執行智能合約的虛擬機。 zkEVMs 旨在通過零知識電路來證明 EVM 的執行,這個領域在過去的一年裡已經有了顯著的增長並擴張為一個行業。在該領域湧現了許多不同的項目和社區,每個項目和社區都採取了自己獨特的方案來應對這兩種技術交叉帶來的挑戰和機遇。
對比不同 zkEVM 項目的一個維度是 EVM 的兼容程度。雖然 EVM 兼容是一個連續介質,但有兩種主要的方案:語言層面的兼容和字節碼層面的兼容。
要理解這些方案之間的區別,很重要的一點是了解 EVM 如何執行用 Solidity 或 Vyper 等高級語言編寫的代碼。
為了使 EVM 能夠運行智能合約所指定的行為,有這樣一個過程:高級語言被編譯成字節碼,與 EVM 相連接。對於 Solidity,典型的流程如下:
- 首先,合約是用 Solidity 編程語言編寫的,並保存為一個 .sol 文件。這個文件包含合約的函數、變量和其他元素。 Solidity 代碼通常使用集成開發環境 (IDE) 編寫,並遵循特定的語法和結構。
- 接下來,使用 Solidity 編譯器將 .sol 文件編譯成字節碼[1]。字節碼是一種有效存儲的、機器可讀的操作碼表示,可以在 EVM 上執行。操作碼 是 EVM 能夠直接解釋和執行的低層級指令。編譯過程包括幾個步驟,如語法檢查、類型檢查和優化,以確保字節碼的正確和有效的。
- 一旦合約被編譯成字節碼,它就可以被部署到以太坊。這通常涉及到向交易池發送一個帶有合約字節碼的交易。該交易最終被納入以太坊區塊,然後合約被創建。
- 合約部署後,它可以與以太坊上的其他合約和用戶進行互動。
上述流程描述了合約如何被部署到以太坊。部署到 zkEVM 的流程將根據它是字節碼層面兼容的還是語言層面兼容的而有所不同。

執行和證明具有與 EVM 相同的字節碼的 zkEVM 被稱為「字節碼層面兼容」。在字節碼兼容的 zkEVM 中,除了合約部署地方的不同,對開發者的體驗沒有任何改變。這種 zkEVM 上可以使用同樣的 Solidity 代碼、編譯器和字節碼。開發者可以繼續使用他們往常使用的編程語言和工具,同時還可以利用零知識電路的可擴展性和加密安全性。這類 zkEVM 需要能夠通過處理相同的低層級操作碼和復制相同的結果來複製 EVM 的行為。這涉及到將操作碼映射到自定義的 ZK 電路上。從工程的角度來看,這種映射是具有挑戰性的,而且操作碼的映射導致更龐大的電路和更高的證明生成成本。然而,它最終會給開發者帶來更簡單的體驗。
語言層級兼容性是指 zkEVM 與高級代碼 ( 如 Solidity) 一起運行的能力。開發者仍然可以用 Solidity 或其他高級語言編寫代碼,但這種高級代碼必須被編譯成與 EVM 不同的字節碼。這需要一個特定於部署合約的 zkEVM 網絡的編譯步驟。非 EVM 的字節碼可以被設計為更加電路友好,從而使證明生成更高效。