iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Web 3

以 Python 進入以太坊虛擬機 (EVM) 的幻想境界系列 第 30

虛擬境界30:ZKEVM + 結語

  • 分享至 

  • xImage
  •  

最後來講一下如果要做一個 ZKEVM 要如何去實現,希望可以給大家對 zkEVM (zkRollup)一個認知

主流 ZKEVM

目前主流的 ZK-EVM 可以分成幾類,大概有 Type 0 - 4

  • Type 0: 屬於透過證明 ZKVM (非 ZKEVM)上面執行的 EVM,是最近 RISC-Zero 提出的,非常有趣,他是去證明運算指令集,甚至可以直接讓 go-ethereum 本身的 code 支援,不用重新寫一份 ZK 證明去證明,該方法的優點在於他證明的速度很快,現在可以申請他的 Bonsai API 去做試用,可惜的是目前是用伺服器端產證明,這樣也比較高效。
  • Type 1: 完全等效以太坊 EVM,不需修改 go-ethereum,Keccak256 和 Tree 還有 Pre-compile 的東西都會和現在以太坊 EVM 一致,可以說這次的教學就是往這方向實現。
  • Type 2: 完全等效 EVM,對 go-ethereum 本身做一些修改,可能是做一些狀態證明的處理,或是儲存結構的修改,不過大多數開發工具都能兼容,就我理解現在大多數 ZK-Rollup 都是朝這個方向修改。
  • Type 3: 接近等效 EVM,對 go-ethereum 本身刪除大多數在 ZKEVM 困難實現的功能,使得更好做證明,不過可能在開發工具或 solidity 部分功能就無法成功部署。
  • Type 4: ZKVM,可以說這不是 EVM,但可能高級語言會透過兼容層可以轉換成該 VM 可以執行相對應的功能。

圖源 https://www.risczero.com/news/zeth-release

各 Type 著名項目

那麼接下來可以簡單介紹一下 Type 1 - 4 (2023.10)之間的項目,只能說這分法很難說很公平,這部分有點我的見解,如果有別的看法也可以留言討論

  • Type 4 著名項目 StarkNet: 使用 warp https://github.com/NethermindEth/warp 之類的工具轉換成 Cairo,但,他就不是 EVM 哈哈
  • Type 3.5 著名項目 zkSync (1.0): 他用 LLVM 轉換成他的 ZKVM 可執行,讓他可以兼容 solidity,Zinc zkVM 可說接近以太坊的執行方式了,但做法為了讓 zk 更快產 proof,所以也做了許多取捨.
  • Type 2.5 就是最常看到的 Polygon 和 Scroll 了,現在 zkSync 2.0 也做了類似的方式,這兩個項目在底層的做法不太一致。
    • Polygon 是將 Opcode 透過 zkASM 層做類似 EVM Proof 並做一個模擬 EVM,將這些 OpCode 的執行結果產出證明,因為 Polygon 還有獨立去實現特殊的 zk 共識層,所以他會將 Opcode 分類成好幾個樹,如 Memory, Storage, Stack 之類的樹,再將這些樹拿去做證明,可能會透過 SNARK 或 STARK。因為知識點比較多一點,在這邊不多著墨討論。
    • Scroll 是透過前面教學的兩種 Proof 模擬完整 EVM 執行效果,可說是將 EVM 執行的所有東西重新證明一次,可以說是重寫一個 EVM 執行層
  • Type 1 這目前就是這是教學參考的 EVM 電路,但是,我很難對他說他現在是等效以太坊的,只能說兼容性最好的方式。

個人認為 Scroll 可以接近這個 Type 2 甚至 1 級別但畢竟它本身還是 Layer 2 ,且需要讓排序者或驗證者的角色能更去中心化一點,這點可能會讓這些兼容性和等效的疑慮大幅降低。

圖源 https://immutableblog.medium.com/ground-up-guide-zkevm-evm-compatibility-rollups-787b6e88108e


EVM 組合

前面 EVM https://ithelp.ithome.com.tw/articles/10331956 完整實現的部分在此,那麼我們既然有一個算是蠻完整的簡單以太坊,我們是不是可以用零知識證明他的執行和我介紹的以太坊是一樣的,還真的可以!但前提是要用 zk 電路去完成這些設計,部分算式複雜讓證明相當困難的部分需要讓他略過並用 bus-mapping 和分開 proof 去完成整個執行。

呀~我本來是這麼想的,想說用另外組 code 來證明說我的 code 就是可以被證明和介紹的一致喔,比如說 pc + 1,和把什麼放進 state 裡,透過 run python evm 和接上 state proof 來完成證明;但是我會在這幾個月再努力將這些教學完整測試並改善的!

那麼接下來就來和說說看我們實現的這個半成品,沒有 zk 的 ZKEVM(zero-knowledge EVM)是一個用於以太坊的零知識證明系統。我們的目的在於實現一種能夠擴展、可驗證的智能合約執行機制。

利用zkevm,你可以在由單一驗證者來驗證交易正確性,省去一些通訊的浪費。以下是我的策略,解釋如何從一般的EVM升級到zkevm:

1. 瞭解零知識證明(Zero-Knowledge Proofs, ZKP)

好!當然是要先理解 zkp 囉~因為裡面還牽扯到 plookup 和設計的 prove system,可能要對此做些研究,這部分做為起點我覺得是沒有到很難的門檻,其他地方也很多解釋 r1cs 和 STARK 實現方式。會建議要至少做到下面兩項

  • 理解 ZKP: zkevm 利用零知識證明來提供私密性和驗證性。在不露出交易細節的前提下,ZKP能證明某些運算是正確的。
  • zk-SNARKs 或 zk-STARKs: 根據需求選擇 zk-SNARKs 或 zk-STARKs 作為證明系統。zk-SNARKs 需要一個可信的設置,而 zk-STARKs 不需要,但後者通常需要更多的計算資源。

2. 執行環境的構建

現在我這邊是參考 PSE https://github.com/privacy-scaling-explorations/zkevm-specs 去做實現的,如果要做到完整實現,會需要做下面幾項

  • 升級 EVM: 原始的 EVM 需要進行某些修改,以支持 ZKP 的生成和驗證,如果要做 type 1 可能要完全自己用手實現。
  • Circuit 設計: 設計一個算術電路,用於表達 EVM 操作的正確性並能夠用於ZKP的生成。
  • Gas 計費機制: 考慮到ZKP的計算成本,可能需要重新調整 gas 計費機制。

3. EVM Proof 和 State Proof 的整合

這邊就是前面的教學了,State Proof 和 EVM Proof 都是裡面相當重要的概念

  • 證明交易正確性: 使用 ZKP 來生成一個證明,表明從一個狀態到另一個狀態的轉換是按照EVM的規則進行的。
  • 證明狀態正確性: 用ZKP證明給定的EVM狀態是由正確執行的交易序列產生的。

4. 驗證層的開發

這邊沒時間做到,只要做到這步,可以說你的 zkEVM 就是完成了!!

  • 交易驗證: 每當用戶提交一個交易,利用 zkevm 驗證交易的正確性,而無需知道具體的交易細節。
  • 合約驗證: 合約的每次調用都應該生成一個 ZKP,用於證明合約邏輯的正確執行。

請注意,這只是一個大致的指南和建議,如果按造我的 30 天教學跑下來,應該可以做到第三步前半段,如果還想再深入研究的話,可以和我一起努力,我們可以一起交流交流~~


鐵人賽心得和結語

為什麼這次要實現 EVM?

主要是自己用手實現 zkEVM,但是又不想在 circom 上受苦,所以就先簡單在賽前完成了基本 EVM 的建構,想說賽中慢慢寫 zk state proof system,再透過 import 把EVM 的執行步驟透過 bus-mapping 做個值的 assert 比對,想想就很酷,所以就腦袋一沖就直接做了,而且因為每天文章幾乎都前一天或當天寫,有夠肝。

這篇報名的時候還是介紹 EVM 各個 OpCode 而已,結果發現地表上最好的教學平台 WTFAcademy 的 0xAA 開始寫 OpCode 的教學了!!https://github.com/WTFAcademy/WTF-EVM-Opcodes ,我只能說推薦去看他的教學,比我寫的好太多了嘿,然後看了他的一篇後,覺得自己寫的太爛了得加點料,就把 ZKEVM 塞進教學裡面,不過也讓我這個月非常充實捏!(自虐成癮)

但 zkEVM 這東西真的太新了,我看了好幾遍文檔,還有找幾個實現的方法,找找看有沒有什麼方法最簡單可以做到,嘿還真的沒有,最簡單的只有規格書而已,真正實現起來難的跟什麼一樣,原本我還想說,用個酷 rust halo 做證明,然後介紹 zkEVM circuits 怎麼寫可以簡單證明,這件事做了 60% 覺得我根本沒辦法用中文解釋,我把 code 摳過來他就跑起來了,然後再串接,還真的就產證明了,我最後決定,不要教別人我不會的東西!所以就把 spec 內部介紹一遍,還蠻有趣的,我也在這機會更認識這組電路,非常猛設計!

但衝動改成 zk 主題好像也不是好事,最後事情變得非常多,原本規劃好的 EVM 教學從 20 幾篇壓縮成 10 幾篇,所以就把很多概念的東西刪掉啦!對不起我的概念也不一定全對,所以很多乾脆就不寫不要誤導大家,如果有寫錯的也多多包涵,我很菜 XD

為什麼要叫虛擬境界?

因為我很宅,這樣看起來比較酷,之後看會覺得很羞恥,就會努力寫新的蓋過!

心得

因為我是一個很不會寫文檔的人,這次也想要磨練一下自己。所以堅持庫存文章不要寫太多,每天認真地給我寫!喔不過這樣下場是 超!級!累!

我是一種自虐會超快樂的,但最近因為還參加了其他工作坊快把時間壓死了,有時候很趕的就把文章發出去沒有認真校稿,但是說實在那就是那天的日記啦,所以我也懶得改,之後如果寫得更完整的話,會想順便架個網站來把我的 zk 小讀書會的東西放上去,前提是我突然心血來潮啦!

這邊也要感謝 iThome 有那麼有趣的平台,可以把工程師逼文檔,這裡大家分享的文章都很讚很有趣。而且我發現 SEO 效果好像也不錯,可能是繁體中文圈 web3 寫文檔的不太多,所以常常也能直接查到 day 幾:solidity 教學。受益良多,回饋平台發些廢文XD

啊你的原始碼呢?

在這邊 https://github.com/zinzoukyo/zkevm-tutorial ,不過可以說沒有到相當完整,因為我只推 main branch 上來,後面 zkEVM 的實現對照因為能力不夠沒有完全完成,但是主要文章還是寫完了哈哈,會在之後自己的腎臟讀書會繼續完成~

最主要的證明系統太難實現啦! PSE 真的太牛逼,我小小區塊鏈工程師還是乖乖寫合約和膜拜大神們就好,再次感謝大家能看到這邊,我要回去寫我酷酷地別的小項目了。

聯絡資料

我是 Kidney ,目前是個區塊鏈 RD,主要對 zk 和 protocol 底層感興趣;如果想要聯繫我,或有其他需求和問題可以透過以下幾個管道找到我,記得備註由甚麼管道認識我的~也歡迎大家交流交流。

目前我是有 blog : https://kidneyweakx.com/ 不過年久失修

Github : https://github.com/kidneyweakx

Email: kidneyweakx@gmail.com


上一篇
虛擬境界29:ZKEVM Proof 小結
系列文
以 Python 進入以太坊虛擬機 (EVM) 的幻想境界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言