最後來講一下如果要做一個 ZKEVM 要如何去實現,希望可以給大家對 zkEVM (zkRollup)一個認知
目前主流的 ZK-EVM 可以分成幾類,大概有 Type 0 - 4
圖源 https://www.risczero.com/news/zeth-release
那麼接下來可以簡單介紹一下 Type 1 - 4 (2023.10)之間的項目,只能說這分法很難說很公平,這部分有點我的見解,如果有別的看法也可以留言討論
個人認為 Scroll 可以接近這個 Type 2 甚至 1 級別但畢竟它本身還是 Layer 2 ,且需要讓排序者或驗證者的角色能更去中心化一點,這點可能會讓這些兼容性和等效的疑慮大幅降低。
圖源 https://immutableblog.medium.com/ground-up-guide-zkevm-evm-compatibility-rollups-787b6e88108e
前面 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:
好!當然是要先理解 zkp 囉~因為裡面還牽扯到 plookup 和設計的 prove system,可能要對此做些研究,這部分做為起點我覺得是沒有到很難的門檻,其他地方也很多解釋 r1cs 和 STARK 實現方式。會建議要至少做到下面兩項
現在我這邊是參考 PSE https://github.com/privacy-scaling-explorations/zkevm-specs 去做實現的,如果要做到完整實現,會需要做下面幾項
這邊就是前面的教學了,State Proof 和 EVM Proof 都是裡面相當重要的概念
這邊沒時間做到,只要做到這步,可以說你的 zkEVM 就是完成了!!
請注意,這只是一個大致的指南和建議,如果按造我的 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