安比實驗室創始人郭宇:ZK 技術的學習心得和經驗分享
發表於 2023-04-26 15:25 作者: 區塊鏈情報速遞pro
演講:郭宇,安比實驗室創始人兼 CEO
整理:Amber,Foresight News
今天我主要是跟大家分享一下關於 ZK 的學習心得和一點體會。因爲在以太坊接下來的幾個升級中,都包含了很多最新的 ZKP 或者是 zkSNARK 的技術。最近有很多人在學習這些知識,我們也參加了一些公學的小組,在這裏深度講一下其中很共性的問題。
Why ZKP or zkSNARK?
首先我們能感受到 ZK 的項目是很 FOMO 的,我更想從技術層面講一下我們爲什么要有 ZKP 和 zkSNARK。當然,它自身本來就是密碼學裏一個非常重要的分支,但我認爲它在以太坊的發展過程中發現這個東西異常強大,包括 Vitalik 自身也做過一些布道的工作,所以說得到了非常長足的發展,也解決了以太坊未來的發展途徑。
從最早期的 Sharding 發展到現在以 Rollup 爲中心的新方向上,我認爲 zkSNARK 或 ZKP 在其中起到了非常重要的作用。在我看來,首先它是「產生信任的機制」。比特幣爲我們帶來的,像共識協、POW 協議和一些分布式算法,能夠產生一些信任,但這種信任是有存在 51% 誠實的前提假設的。另一種是我在從事區塊鏈相關研究之前,做了十幾年的 formal logic 和 formal verification 的工作,本質上是通過 formal logic 保證代碼的執行滿足某種預期,但我認爲這也是一種信任,只不過它的假設是通過邏輯系統本身的一致性去保證信任。ZKP 和 zkSNARK 是我第一眼看到的時候,就覺得和我研究了很長時間的領域不一樣的信任創造方式,因爲他們從另外一個角度,幾乎正交地提供了另外一種創造信任的方式,就是通過交互進行概率性證明,同時提供信任。正如 Vitalik 所說,他們是正交於共識協議的另外一種非常重要的區塊鏈核心技術。
第二點我覺得可能很少有人提到,但是我認爲是非常重要的,就是可組合性。我們聽到這個詞大概是 19 年,以太坊還處在 DeFi 早期探索過程中的時候,大家提出來的概念。因爲以太坊上的所有智能合約都部署在一個平台上,這些合約之間可以沒有任何調用的障礙和壁壘,就像沒有農田裏沒有橫亙在裏面的籬笆一樣。正是這種可以無障礙調用的可組合性讓 DeFi 有了現在這樣的繁榮。雖然可組合性不是一個特定的編程語言,但它是一種更高維度的編程,是一種可編程的手段,本質上是更抽象的編程。其實在 zkSNARK 裏,可組合性是肉眼可見的。且不用說最近兩年 zkSNARK 技術本身的發展,當我們去看 paper 的時候,我們已經可以非常清晰地看到一個協議,是通過很多子協議的排列組合構造出來的,並且這種可組合性以肉眼可見的速度擴大,這也就意味着 zkSNARK 不再是我們想象中的某一種算法,比如 Groth16 或者 PlonK。它們本身也很復雜,拆开來看,每個算法都由一些精巧的小組件構成,這些精妙的算法之間又可以構成一個更大一點的協議,甚至比我的描述更加復雜,它不是嚴格的、有層級的劃分,它甚至更靈活一些。
這些可組合性的發展、爆炸很有可能帶來新的空間。而且這個空間能有多大?我覺得基本上可以說大到無法想象,尤其是最近一兩年關於遞歸零知識證明技術的一些突破,帶來了非常大的創新空間。而至於它是不是下一個「big thing」,我覺得冠上「之一」,可能是一個比較穩妥保守的說法,但我仍然覺得這是一個非常讓人激動的領域,尤其是在 Blockchain 或 Crypto 的圈子之外,目前注意到的人還很少,因此我覺得這是非常好的機會。
說到體會,我先談一談我自己是如何入坑开始做 ZK 研究的。首先,我在 17 年买了很多 Zcash(ZEC),當然,從投資回報角度來看,這就是非常糟糕的一筆投資。但我覺得也正是這個舉動讓我深入地了解 zkSNARK,並不務正業地用業余時間讀了一些東西,但我發現非常難懂。當時網上也很少這樣的文章能作參考。同時當我去翻傳統密碼學的書時,也失望地發現幾乎都沒有提及到這類知識。
在一些國外的教材裏面,可能在整個教科書的最後一章會花兩三頁講解一下,就已經很不錯了。但很幸運的是,我在 2017 年年底發現了 Dan Boneh 和 Victor Shuop 寫的教材,雖然還沒有完全寫完,卻已經出現了一部分關於 zkSNARK 的講解。我覺得如獲至寶,因爲在資料很少的情況下,居然有一本書能從最簡單的概念講起,這本教材我認爲是非常好的密碼學入門教材。於是在 18 年的時候,我就开始慢慢讀那本書,學習一些基本概念。
然後在 18 年年底到 19 年的一整年中,我們創立了安比實驗室,早期我們一直在做 smart contract audit,去幫一些朋友解決智能合約的安全問題,但是我們同時還是用了大量的時間去學習基礎的密碼學知識。在 19 年我們开始着手做一個用於 data trading 的協議,叫做 zkPoD。20 年,我們講之前的工作總結了一下並發表在了 CCS2021 上,也得到了一些密碼學學者的幫助。而在 2021 年之後,因爲整個密碼學領域發展太快了,我們的很多想法跟不上整個領域的理論工具的發展速度,所以我們之前的工作就暫停了。那時候真的特別感慨,我們之前面臨的很多技術困難,很快就會被人解決,甚至還有好多種解決辦法,我們就不得不去看全這些解決方案,可能還沒有完全理解,又有新的工具被創造出來。所以說我們這幾年基本上都在不斷學習,學習速度還遠遠趕不上創新的速度,說這是一個寒武紀大爆炸,我覺得一點都不誇張。我覺得它的威力可能不亞於 ChatGPT 對整個社會的影響,只是說現在還沒有那么明顯,沒有特別殺手級應用出來,但我覺得這個是必然的。
另一點感想就是,在早期的時候,我們讀的資料都是來源於學術界,來自於專門長期從事密碼學理論研究的教授和專家學者的論文。但是從 2020 年往後,我們其實發現大量資料來源於工業界的工程師。因爲在 Crypto 領域,大家迫切的想要使用密碼學去解決 Blockchain 和 Crypto 中非常核心的問題,有些快速的工程應用甚至領先了理論的發展。我就舉幾個例子,首先是 Halo,Halo 最早是由 Zcash 團隊創造出來的,然後學術界從中獲得了啓發發展出了 accumulation scheme,包括最新的在遞歸零知識證明裏非常重要的技術。它最早的起點就是在工程實踐中發現的一些一开始不起眼的一些小規律。
第二個就是 PlonKish Arithmetization,最早也是在工業應用領域從 Aztec 團隊慢慢發展起來的,之前有很多 code,但是它真正的理論研究是後來逐步補上的。但現在爲止基本上以 PlonKish Arithmetization 爲主導的很多學術研究已經慢慢擴散开來了。很像我右邊圖上的幾棵樹,當然這幾棵樹我只是借用了 slides 中的,zkSNARK 就像一棵很大的樹,並且在不斷成長,於是就有了 zkEVM 和 zkVM 這樣的概念。我經常感慨在 19 年,預想 zkEVM 或者 zkRollup 之類的概念,都要是 10 年之後才有可能出現的東西,因爲在當時我們能感受到 zkSNARK 能做的應用是非常有限的。但是沒想到這三年來,Halo 和 PlonKish 的發展能夠讓 zkEVM 基本上成爲現實。這是非常恐怖的,包括像 Lookup Arugment 還有一些很有意思的技術,反過來對學術界都有很大的推動能力。
第三點就是這整個過程是非常愉悅的,不管裏面遇到了多大的困難,或者是解決了一些小問題所帶來的成就感,都讓我們感到非常有趣。
我覺得絕大多數人對這個東西的印象就是特別難學的月球數學,但實際上從我們的經歷來看其實也不是那樣。
它其實要求的前置數學基礎並不多,但它最難的部分其實是關鍵概念超級多,而且這些概念還在隨着時間演化,也就是說你可能從別人嘴裏聽來了,或者在某個地方講到的,或者是在一個文檔裏看到的東西,過了 3 年之後可能需要重新去審視它,它又可能表述都不一定准確,或者是它在表達另外一層意思。
第二個就是協議相對復雜,因爲它屬於密碼學協議,可以說密碼學這個分支,整個大方向上都是屬於內部協議比較復雜的這類,於是它的形式化定義特別多。不同的學者去寫形式化定義使用的符號體系也不盡相同,公式也是量多且復雜,即使背了也記不住,可能睡一覺醒來就忘。
第三點是,核心代碼很短,但內部結構足夠復雜,密碼學有一個很有意思的點,就是你無法通過看代碼去學習算法,因爲你看他弄來弄去,都不知道他想幹什么,還是需要一些理論的指引才能讀懂代碼。
第四點就是,很多朋友還是會按照論文上的算法去實現一遍,但能實現就證明真的懂了嗎?這顯然還是相去甚遠的,這個我們會稍後討論的。
零知識證明的學習曲线還是相對陡峭的,陡峭的原因並不在於 zkSNARK 或 ZKP 有多難,而是在於,首先开發工具很缺乏,也就是說想直觀地體驗一下並不容易,還需要做很多工作,去搜去看相關理論知識之後才能下手。第二就是學習資料其實更缺乏,現在跟 4 年前相比還是多了很多資料的,但要知道資料的增加速度遠遠趕不上創新的速度,也就是說有大量新的理論技術並沒有被總結成文章,有的甚至都沒有行文寫下來,它們存在一些系統的角落裏,或者說它只有代碼但沒有理論。因爲是寒武紀大爆發,導致了學習資料相對更少,即便是需要的數學基礎並不多,前置知識覆蓋秒依然很廣。所以有些朋友認爲自己數學不好,並不是根本性問題。還有一點是論文挺難看懂的,這是我在早期學習時的感觸,有些套路需要慢慢適應。
一些心得和經驗
下面想給各位朋友再講一些心得和經驗。
首先給第一類想要快速入門的新手朋友,或者說看過一些非常簡單的概念,無論出於哪種目的想要快速入門的朋友們。首先,有訣竅嗎?誠實一點說時沒有的,但確實可以把幾個地方作爲切入點。其一,寫代碼是一件很重要的事,這裏的代碼可以分很多種,我認爲現在很多可用的 library 都是很不錯的。比如 Circum,可以在網頁端試着寫一些電路代碼。第二類的 Halo2,我認爲如果想要深入學習的話,可以用 Rust 嗎,Halo2 也恰好是 Rust 的一個 library,也是在社區中廣泛使用的。現在以太坊基金會也在基於 Halo2 進行一些工作,可以去看一下這個 library,並根據它去寫一些基礎的 demo 或者例子。第三個是 Gnark,是 Consensys 开發的用 go 語言寫的庫。如果你對 Rust 不熟悉或者沒有寫過 Rust 的話,可以優先選擇 Gnark,因爲它是用 Golang 寫的,上手更簡單一些。最後,還有 zkSNARK 社區的 Cairo,雖然我自己沒有寫過 Cairo,但我已經看到不少人已經成功啓動了,所以我認爲 Cairo 的效果應該是不錯的。
關於代碼圍繞什么去寫,我認爲可以基於 KZG 多樣式承諾、IPA、Baby SNARK、Sumcheck 等非常簡單的密碼學協議,是可以做一些實現的。因爲,實現了之後,可能會獲得一些教科書上所不能提供的很直觀的概念。比如,代碼運行的速度,對稍大一點的例子電路是否能夠正常使用,瀏覽器最大能承受的電路等等。
我覺得手動寫代碼這一方面,首先有助於大家理解很多概念,比如,到底什么是電路。相信不少朋友都聽說過電路,就是挺難寫的,如果動手寫一下電路就會發現,它其實不算是在寫正常的程序,而是在寫一個證明過程,因爲本身零知識證明就是一個證明過程,因此寫電路其實就是寫證明,而非寫計算。寫證明的過程有一些特定的套路和經驗模式,這個需要慢慢熟悉和思考的。
第二個我覺得是有助於對運營效率有所感知,就是知道運行的速度能有多快,以及假如說你想去 build 一個應用,他大概能用在什么地方。比如說你在以太坊一層的合約裏做一個電路的 verify,你大概需要多少 gas。事實上這些都是需要你實際操作完之後才能有的一個初步印象。
第三個就是對協議借口、協議流程有一個基礎的了解和大概的感覺。
第四個就是你能對基礎的數學原理有初步的認識,但不需要去學很多,不需要去重新找一本代數的書去翻,因爲一本完整的教材包含太多內容了。我覺得通常情況下是沒有必要的,但是可以通過 Google 或者 ChatGPT 去快速學習一下基礎的數據原理。直接通過編程學習的話,感覺是完全不同的,特別是對於使用的參數、輸出的結果,以及如何在代碼中 encode,用什么樣的數據結構,都會有非常直接的認識和理解。
這裏我想要推薦 zkiap.com 的課程,它是一個注重實踐的簡單代碼學習課程,每周花點時間就基本上可以慢慢明白是怎么一回事,推薦給所有能寫代碼的朋友們。
但有些朋友可能會問,假如說我不會寫代碼,或者說我沒有時間寫代碼,但是我仍然想快速入門,那該怎么辦呢。我認爲第一點就是要准確地理解相關概念,所謂的准確理解就不是一些模模糊糊的理解,比如,我們說零知識有 zero-knowledge,那么到底什么是 knowledge?我覺得是需要搞很清楚的,這些關鍵概念搞得越清楚,看文章就會越順利,包括還有像 witness 這種概念。還有像 Random Oracle 還有 Commitment 之類的概念。爲了搞懂 Random Oracle 是什么,我前後可能花了一年時間去看各種東西,慢慢嘗試理解,但但是的資料很少,我覺得現在的資料已經足夠豐富了,已經有一些教科書能夠吧這些概念講的相當清楚了。然後還有一些概念,像 CRS、SRS 是什么,如何用 Polynomial IOP 做一些 plunk 應用。其次像 extractability 還有 preprocessing,這個適合具體應用开發相關的。我認爲對這些基礎概念有必要有非常精確的理解,如果不是很理解或者模糊的話,我的建議是先去看這些概念,Google 和 ChatGPT 能夠在這裏起到很大的作用。對於基本概念的掌握程度,我認爲首先需要能看懂科普文章中的一些密碼,一些黑話。
第二個是能夠對 zkSNARK 有一個清晰的抽象的認識,也就是說能大概知道它是什么,能用一句話去講一下什么是 zkSNARK,而不是只是將它描述爲一個 library,或者用一個方式函數調用一下,或者說就是一段代碼,真正的掌握是要比這些都再深入一層。
第三個就是如果好奇的同學或者有更多時間的朋友可以去看一下學術論文,如果第一節能看懂的話,我覺得已經是相當不錯了,這意味着很多密碼學黑話都已經理解了。如果有一些頻繁出現的黑話不理解,就可以去 Google 或者 ChatGPT 弄明白,有些實在很難懂了就可以先放一放。最後就是能初步理解 zkSNARK 的一些應用,如果能做到這一點的話,對一個不會寫代碼的人,已經是對 zkSNARK 已經又了相當深的認識了。
接下來我說的這一類朋友,他們不滿足於一些基礎概念的理解,始終對內部工作原理感到好奇,關於黑盒如何運行,爲什么能 work,爲什么能提供信任,他的信任又基於哪些東西,應用條件是什么,等等。我這邊的建議是,需要先充分理解一個算法代碼,就是先把一個算法喫透,其實非常重要。因爲在算法之間就好比再學一個編程語言一樣,如果 Java 用得很熟練了,再去切換到其他語言,其實並沒有很復雜。前提是,這個語言需要用得特別熟練,如果只是淺淺地能寫一些 Hello World,可能差距還比較大。我覺得可以先針對一個算法,比如說我覺得像 PlonK 是首選的,因爲它比 Groth16 簡單很多。PlonK 是我認爲我見過的所有算法裏最簡單的,雖然 Groth16 的科普文章更多,但事實上它是一個復雜難懂的算法。然後還可以選擇 zkSTARK,Marlin,Spartan,他們的對看論文的要求可能會更高一些。總之,我推薦先學 PlonK。
第二個就是去閱讀一些 Github 上的开源代碼,現在有非常非常多的有意思的項目,幾乎每兩三天都能發現一個很不錯的开源項目,並且代碼質量不錯,我在這裏就不給大家推薦了。
第三個點就是如果你想了解內部工作原理的話,你不可避免地要去理解這些公式,但對於初學者的最大問題是,公式無法理解或者並不能記住。我認爲這裏的核心竅門就是,多抄公式。不停地重復抄公式,同時再思考,在這個過程中就會有神奇的力量,能讓人不知不覺中就明白了一些東西。
在這裏推薦一個 MOOC,叫做 zk-learning.org,他們的課程深度不錯,也會涉及到內部的工作原理,也會用非常簡單的語言去抽象地解釋一個或者一類算法是如何工作的。我認爲如果能看懂並實現一個最簡版本的代碼並且能看懂 70% 的相關論文,且能不需要任何輔助地手推公式,並能夠大致理解 Soundness 思路,我覺得已經達到了理解 zkSNARK 的要求了,但在這個階段還是不要自行修改和優化協議,這是非常危險的動作,除非有非常多的經驗,否則千萬不要自行修改優化協議,因爲密碼學協議中有非常多沒有寫出來的東西。相關的反面教材有很多,我覺得最著名的就是 BCTV14,它是 14 年的一篇論文,他們的論文在做了一次修改優化之後出了一個 bug,然後修了 bug 之後又是一個 bug,而且都是非常嚴重的 bug,也就是說這些頂尖的密碼學家都會犯這樣的問題,那更不要說一個初學者。對初學者而言,你可以自己去設計一個協議,但是你一旦去修改別人的時候,你還要確保對這個東西有足夠清晰的理解。
接下來對於更高階的朋友,可能你是在 build 自己的項目,想用 ZK 去解決一些必要性的問題,需要自己設計協議。首先,我覺得你需要反反復復地讀大量的論文。第二個就是需要補最基礎的計算理論,而不是代數或者射影幾何,或是那些數學概念。我覺得這裏面其實最重要的是計算理論,我在這裏推薦兩本書,一本是《Computational Complexity: A Modern Approach》,另一本是《Computational Complexity: A Conceptual Perspective by Oded Goldreich》。第三點就是要跳出兔子洞,關注基本問題。因爲有些算法還是很深、很燒腦的,有時候需要在一個非常小的細節卡上好幾個月。但我覺得這裏面的核心點是爲了理解它爲什么 work,有些時候你要跳到最外面來問一些最簡單、最直接也最基礎的問題,再去反思這個細節。就是你需要不斷進到一個非常小的細節,同時又要不斷地跳到外面去反復對比思考,這樣就很容易弄懂這一點細枝末節的東西。第四個就是逆向思考,因爲很多協議的設計是非常精巧的,有時候需要我們去理解而不是簡單地 follow。但事實上理解又是一件很困難的事,多數情況下我在理解算法的過程中所用到的方法論是逆向思考,也就是說如果將原來的算法換成另外一種,又會產生怎樣的效果。大多數情況下,它是不 work 的,那么它爲什么不 work?這是很重要的。
最後,給大家說一下讀論文的心得,因爲論文確實比較難讀,都是些非常學術的文章。第一,請務必反復仔細閱讀論文第一節,因爲論文第一節通常是論文最精華的部分,他通常描述了這篇論文最主要的貢獻,包括他和前人的不同以及他的新協議或者新算法最重要的特點。通過讀很多論文的第一節,能夠快速找到一個知識網絡。
第二點就是,你需要把論文的參考文獻這幾頁,特地打出來,有助於形成一個知識網絡,就可以沿着參考文獻,找到更多的資料,而不單純是通過 Google 或者 ChatGPT,而是通過這個論文所依賴的前置論文,形成一套理解體系。
第三點是要從歷史的角度看概念的變遷、算法的演化和技巧的組合,這裏面能發現非常非常有意思的故事。我覺得也可以找機會和大家分享一下,但這需要很多時間去准備。雖然密碼學已經歷經了 40 年的發展,但是從歷史的角度看,它經過了一個非常快速的發展與變遷的過程。
第四點是,一篇論文需要反復看,大概看懂其中的 90%,需要好幾個星期甚至好幾個月。我最开始去學習這個東西的時候,一开始非常難受,非常有挫敗感的一點是有篇論文我看了半年都還看不懂。但突然有一天,我看到一個密碼學家他的分享裏面說他看論文也是要幾個星期才能看完,這時候我才如釋重負,我才覺得原來他們也是這樣。所以說一篇論文看不懂其實是非常正常的一件事。
第五個是,我認爲參與社區討論特別有用。
最後一點,找一個 Crypto 領域的問題點,找一個你覺得有意義的工作,然後 get hands dirty,這個能驅動你把關注點集中到一些點上面,更容易做出一些突破性的工作成績。
標題:安比實驗室創始人郭宇:ZK 技術的學習心得和經驗分享
地址:https://www.coinsdeep.com/article/12791.html
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。