本文是Teahour.fm第92期的文字版,音頻版本可以戳這里。
D:Hi,大家好,歡迎來到新一期的 Teahour,我是今天的主播 Daniel?,F(xiàn)在坐在我旁邊的,算是我們的老朋友了,他曾經(jīng)來過我們 Teahour 做客,跟大家討論 Blockchain 和 Ethereum 的問題,他就是謝晗劍同學(xué)。Jan, 歡迎你。
J:大家好,我是謝晗劍。
D:我相信,很多熟悉 Teahour 的朋友已經(jīng)很久沒有聽過我的聲音了。我現(xiàn)在能回憶起來的上一次錄制 Teahour 的時(shí)間,大概可以追溯到 2015 年 10 月份。為什么停更這么久?你們懂的,肯定有很多原因,時(shí)間關(guān)系大家可以當(dāng)做我已經(jīng)把這些原因都講過了,并且大家也都理解了,所以我們先快進(jìn)這一段。好消息是,現(xiàn)在 Kevin、我和 Terry 我們?nèi)齻€(gè)主播現(xiàn)在都在同一家公司工作。既然我們?nèi)痪墼谝黄?,肯定要做點(diǎn)什么,所以我們決定把 Teahour 重新?lián)炱饋?,也就是說 Teahour 以后正式恢復(fù)播出!當(dāng)然,也因?yàn)槲覀兡壳霸趶氖?Blockchain 這個(gè)行業(yè),所以我們馬上也會開一個(gè) Teahour 的分支—— Forkit,它會專注于區(qū)塊鏈相關(guān)的話題。那么今天,我們請到謝晗劍同學(xué)來錄制這新一期的 Teahour ,也是希望我們能夠聯(lián)合錄制幾期關(guān)于區(qū)塊鏈的討論,這幾期會同時(shí)在 Teahour 和 Forkit 播出。希望大家能一如既往地支持我們,也多多關(guān)注 Forkit。
J:這里我們說的是 Forkit,F(xiàn)orkit 是非常文明的一個(gè)名字。
D:Jan 還記得你上一次來 Teahour 錄制的那兩期節(jié)目是什么時(shí)候嗎?
J:我記得,應(yīng)該是在 15 年底的時(shí)候,還沒到 16 年。
D:是的,第一期在 15 年底,第二期在 16 年的年初,1 月份。那個(gè)時(shí)候,以太坊還處于在國內(nèi)剛剛起步的階段。我們請你錄制了這兩期節(jié)目以后,你知道這兩期節(jié)目后來有多大的反響嗎?通過我們后臺的數(shù)據(jù)統(tǒng)計(jì),這兩期節(jié)目是我們 Teahour 所有的節(jié)目中播放和回放次數(shù)最多的,而且我在很多場合都聽到別人跟我提起:“嗨,我就是因?yàn)槁犃四銈?Teahour 的那兩期節(jié)目,才理解了 Ethereum 是什么,并且從此正式入坑”。所以你的那兩期節(jié)目真的讓很多人進(jìn)入到了這個(gè)行業(yè)中。謝謝你,Jan。
J:聽到這個(gè)消息我真的非常開心。我想這也是我們一直想做的事情——把區(qū)塊鏈和以太坊介紹給大家,讓大家知道世界上有這么一個(gè)很有意思的東西,這么看來目的是達(dá)到了。
D: 在區(qū)塊內(nèi)行業(yè)里有一句話叫做幣圈一日人間一年。如果我們掐著日子算一下,那兩期節(jié)目迄今為止大概已經(jīng)過去了 27 個(gè)月,如果我們假設(shè)每個(gè)月有 30 天的話,27×30 是810天。 好,Jan,請告訴我,這過去的 800 年都發(fā)生了哪些讓你印象很深刻的事情?
J: OK,因?yàn)楫?dāng)時(shí)那兩期節(jié)目是在 15 年 16 年交界的時(shí)候,我們當(dāng)時(shí)是用 solidity 去寫合約的,而且那個(gè)時(shí)候,你根本看不到什么文檔,也沒有什么資料告訴你說,以太坊它的工作原理是什么?它內(nèi)部是怎樣一個(gè)機(jī)制?很多事情你都是靠猜,靠摸索。當(dāng)時(shí)給我的感覺特別像是在七八十年代,你手上有一臺巨型計(jì)算機(jī),而且它已經(jīng)是最新的計(jì)算機(jī)了,你需要用打孔的方式進(jìn)行編程的,還要進(jìn)行 debug,使用起來各種不方便。尤其是,像我們的背景都是 Ruby 程序員, Ruby 本身就是一個(gè)特別高級靈活的強(qiáng)大的語言,這種感覺就像是突然從天堂掉到了地獄。原本你在一個(gè)很現(xiàn)代的語言環(huán)境里面生活了很久,突然一下被拉到 70 年代。
D: 對,我能理解。那個(gè)時(shí)候,solidity 這個(gè)語言剛剛誕生不久還在發(fā)展的階段,而 Ruby 在那個(gè)時(shí)候可能已經(jīng)有超過 20 年的歷史了,它的完備性也好,它的生態(tài)也好,還有它的工具鏈和社區(qū)的知識,以及在生產(chǎn)環(huán)境中的大量的打磨,都已經(jīng)趨于一個(gè)非常完善的狀態(tài)?;剡^頭來看,兩年前的 solidity 和 Ethereum 確實(shí)存在著巨大的不完整性和開發(fā)上的一些不便之處?,F(xiàn)在兩年過去了,這一點(diǎn)有改觀嗎?
J: 我覺得這兩年過去了,這一方面的改觀非常有限。
D: 非常有限?
J: 對,可能僅僅是從打孔的時(shí)代,前進(jìn)到了用匯編的時(shí)代。在以太坊上,我們很多時(shí)候還是要直接去面對 EVM 這樣一個(gè)指令集的 OPCODE,包括這個(gè)級別的編程和優(yōu)化。所以很多時(shí)候你會發(fā)現(xiàn),用 solidity 寫出來的合約,可能它的 gas 消耗很大,對吧?那怎么辦?那只有直接用匯編去寫,在 solidity 合約里嵌入?yún)R編的代碼。
D: 所以說它還是算非常新,非常早期的。
J:對,這也是當(dāng)時(shí)我會想加入 Ethereum 的這個(gè)項(xiàng)目的原因。
D:那你當(dāng)時(shí)這樣的考慮,是以開源的方式去貢獻(xiàn)代碼,還是一個(gè)學(xué)習(xí)的目的?
J: 這里的原因有很多,學(xué)習(xí)的目的肯定是其中之一,因?yàn)橹挥凶约簞邮肿鲞^,才會有最深刻的理解。
D:當(dāng)時(shí)你是以怎樣的一個(gè)身份,加入 Ethereum 的這個(gè)項(xiàng)目的?
J:我是開源運(yùn)動的支持者,我從大學(xué)就開始用 Linux 直到現(xiàn)在,大概有十幾年了。我一直非常熱愛開源運(yùn)動、開源精神,參與各種各樣的開源項(xiàng)目。包括我在做 Ruby 程序員的時(shí)候,我自己也做過一個(gè)開源的項(xiàng)目,叫 Ruby-pingying,是把漢字翻譯成拼音的形式,這樣一個(gè)庫,還有挺多人使用的。我除了自己做一些開源項(xiàng)目,也給 Rails 項(xiàng)目貢獻(xiàn)過代碼,也給其他一些項(xiàng)目貢獻(xiàn)過代碼,所以當(dāng)我看到區(qū)塊鏈的時(shí)候自然是非常喜歡,因?yàn)闊o論是 Bitcoin 還是 Ethereum ,它們都是開源項(xiàng)目。當(dāng)時(shí)我想要加入 Ethereum 的時(shí)候,其實(shí)并沒有想過要很正式的加入或者什么,我只是想著把代碼弄清楚,把整個(gè)技術(shù)棧弄清楚,然后自己也能做這樣一個(gè)事情。我自己是 Ruby 程序員,我就是很自然地想要用 Ruby 去擼鏈。Ethereum 基金會在一開始做 Ethereum 的時(shí)候,一共出了三個(gè)版本,一個(gè)是 Go-ethereum,一個(gè)是 Py-ethereum,還有一個(gè) Cpp-ethereum,用三種不同的語言寫,Ethereum 基金會這么做其實(shí)是為了增強(qiáng)一個(gè)分布式系統(tǒng)的健壯性,如果大家都遵循同樣的 spec,用不同的語言去實(shí)現(xiàn),那么每一個(gè)版本犯同樣錯(cuò)誤的概率是很小的,所以他們想通過這種方式來加強(qiáng)整個(gè)分布式系統(tǒng)的建設(shè)。
D:所以你當(dāng)時(shí)作為一個(gè) Ruby 程序員,看到基金會在同時(shí)支持一個(gè) Go 版本、一個(gè) C 版本,還有一個(gè) Python 版本的時(shí)候,你就義無反顧地選擇為基金會貢獻(xiàn)一個(gè) Ruby 版本。
J:對,因?yàn)?Ethereum 基金會非常鼓勵(lì)做出不同語言的版本,但他們也沒有很多人手和資金去支持,所以我自己花了很多時(shí)間去做。
D:好的,這就切入到正題了。這也是今天請 Jan 來和我們一起探討的主題,他當(dāng)時(shí)用 Ruby 去實(shí)現(xiàn)了一個(gè) Ethereum 客戶端,這個(gè)事情很有意思。我想先問一下,在實(shí)現(xiàn)了 Ethereum 的客戶端之后,你是不是就加入了 Ethereum 的 foundation,也就是以太坊基金會?
J:沒錯(cuò),在我完成 Ethereum 大概百分之八九十的時(shí)候,恰好 Vitalik 在找人支持他做 Py-ethereum 的開發(fā),就是 Python 那個(gè)版本。我們都知道,以太坊的一些最新想法,包括 Vitalik 最新的想法、研究的東西都是在 Py-ethereum 上做原型的,所以 Vitalik 其實(shí)缺少人手幫他把想法實(shí)現(xiàn)出來。
D:所以,你就拿著你做的這個(gè) ruby 版本的實(shí)現(xiàn)給 Vitalik 看了。
J:對,我主要跟 Vitalik 說,我愿意來做 Py-ethereum 的開發(fā),但我目前也還在做 Ruby-ethereum,所以希望能多給我一點(diǎn)時(shí)間,讓我把 Ruby-ethereum 擼完,之后再來加入 Py-ethereum。Vitalik 覺得很好,沒問題。所以我當(dāng)時(shí)是先把 Ruby-ethereum 整個(gè)做完了,做完的意思是說當(dāng)時(shí)的 Ruby-ethereum 能夠通過 Ethereum 完整的測試框架。這個(gè)測試框架,其實(shí)是由大量的測試用例,去保證幾乎完整(99.9%)地符合黃皮書的 spec。所以只要你通過那個(gè)測試,就可以證明說你的項(xiàng)目可以 cover 各種 Edge Case。
D:所以,你最后就是拿著這樣一個(gè)完整的測試用例的實(shí)現(xiàn)版給 Vitalik 看,說我這個(gè) Ruby-ethereum 已經(jīng)完整實(shí)現(xiàn)了,我現(xiàn)在希望能加入到社區(qū),然后 Vitalik 怎么說的?
J:我印象中,Vitalik 也沒怎么說,但他應(yīng)該覺得不錯(cuò)。至少是很認(rèn)可我,覺得我對 Ethereum 很懂,很歡迎我加入 Py-ethereum。Vitalik 當(dāng)時(shí)在做 Casper 的設(shè)計(jì),一些早期的 POC 設(shè)計(jì)。正好我們之前也做了 Casper,所以我從 Ruby 切到 Py-ethereum 以后,就去做 Casper 了。
D:OK,可以簡單介紹一下 Casper 這個(gè)項(xiàng)目嗎?
J:Casper 是以太坊下一代的共識算法。我們都知道,以太坊最終的目標(biāo)是 POS 的共識,proof of stake,對吧?但是由于時(shí)間問題,包括其他各種各樣的問題,導(dǎo)致以太坊的團(tuán)隊(duì)難以在短時(shí)間內(nèi)形成一個(gè)成熟而且安全的 POS 算法設(shè)計(jì)。所以,以太坊一開始上線的時(shí)候,用的是工作量證明(POW,Proof of work)的算法;以太坊上線之后,POS 的工作一直在持續(xù)地進(jìn)行和持續(xù)地研究,Casper 就是這個(gè) POS 算法的名字。
D:如果我沒猜錯(cuò)的話,你 2016 年加入 Ethereum 合作基金會的時(shí)候,就已經(jīng)開始跟 Vitalik 做 Casper 的這個(gè)原型的實(shí)現(xiàn)了。
J:沒錯(cuò)。
D:那現(xiàn)在這個(gè)代碼,包括當(dāng)時(shí) Casper 的實(shí)現(xiàn),實(shí)際上都可以在 GitHub 上查到?
J:是的,這些都在 GitHub 上。當(dāng)然 Casper 現(xiàn)在也經(jīng)歷了很多很多的變化,如果大家去翻以前的關(guān)于 Casper 的文章,再和現(xiàn)在的 Casper 比較,你會發(fā)現(xiàn)之前的其實(shí)是一個(gè)過渡版本。我們現(xiàn)在把這個(gè) Casper 叫做 Hybrid Consensus(混合共識),它是 POW 和 POS 兩層疊加起來的共識。而 16 年早期的Casper,是 POC-3、POC-4,其實(shí)是純粹的 POS 共識。
D:你有這 一段跟 Vitalik 合作做 Casper 的經(jīng)歷,肯定能從他身上學(xué)到一些東西,和他有很多有趣的討論,這個(gè)過程中肯定發(fā)生了一些故事,我相信這絕對是個(gè)非常值得深聊的話題。先留個(gè)懸念,我們可以放在下一次討論。我現(xiàn)在特別想問的問題是,你是唯一一個(gè)加入 Ethereum 核心開發(fā)團(tuán)隊(duì)的中國工程師嗎?
J:當(dāng)時(shí)肯定是的?,F(xiàn)在應(yīng)該不是了,據(jù)我所知,現(xiàn)在應(yīng)該還有其他的中國工程師在 Ethereum 這個(gè)團(tuán)隊(duì)里。
D:嗯,不錯(cuò)不錯(cuò)。這也說明了,越來越多的優(yōu)秀中國工程師開始為國際的頂級區(qū)塊鏈項(xiàng)目貢獻(xiàn)代碼,這是好事。但當(dāng)時(shí)很長一段時(shí)間內(nèi),是不是就只有你一個(gè)人?
J:當(dāng)時(shí)的確只有我一個(gè)人。在這個(gè)領(lǐng)域的中國人還是太少了,所以我也希望大家能夠多參與開源項(xiàng)目,多貢獻(xiàn)代碼,多去參與這些項(xiàng)目,這對你們非常有幫助。至于過去 800 年發(fā)生的事情,除了我加入了以太坊,其實(shí)還有另外一個(gè)關(guān)于我自己的。那期節(jié)目之后沒多久,我就從原來的公司離職,開始自己創(chuàng)業(yè),成立了一家自己的區(qū)塊鏈基礎(chǔ)技術(shù)公司,叫 Cryptape,秘猿科技。相信很多區(qū)塊鏈行業(yè)的朋友都聽說過。現(xiàn)在回想起來,這也是一件非常有意思的事情,當(dāng)你對區(qū)塊鏈有所了解之后,你不僅僅能看到公有鏈很多不成熟的地方,你也能看到區(qū)塊鏈并不是整個(gè)未來的全部。我們看到的那個(gè)未來除了公有鏈,還有很多其他的東西。
D:比如說?
J:比如我們現(xiàn)在大家都很熟悉的許可鏈聯(lián)盟鏈。 但是在 16 年初的時(shí)候,我覺得大部分人對它是沒有概念的。我記得當(dāng)時(shí)是 Tim Swanson,他寫的一篇 paper 詳細(xì)地分析了各種公有鏈的項(xiàng)目、金融行業(yè)的想法、他們需要怎樣的區(qū)塊鏈。你看了之后,你會發(fā)現(xiàn)他分析地非常有道理。金融行業(yè)或者說我們的社會,有很多記名的資產(chǎn)。
D:記名的資產(chǎn)?
J:也就是說,資產(chǎn)所有權(quán)的確定是通過登記的方式來實(shí)現(xiàn)的,比如說房產(chǎn)。還有一大類這樣的場景:金融資產(chǎn)、房產(chǎn)債券股票都是記名資產(chǎn)。但是,比特幣給我們呈現(xiàn)的是另一種資產(chǎn)——無記名的資產(chǎn)(Bearertoken),相當(dāng)于如果你撿到這樣的資產(chǎn),那它就是你的,比如你在路上掉了十塊錢,被誰撿了這十塊錢就是誰的。
D:對,那這十塊錢就是他的。
J:這樣的資產(chǎn)只需要持有就確權(quán)了,它不需要登記。這種不記名資產(chǎn)用公有鏈?zhǔn)峭m合的,因?yàn)楣墟湉?qiáng)調(diào)匿名性。如果你想要記名資產(chǎn)的話,這時(shí)候會有一個(gè)很有意思的問題:如果資產(chǎn)都是需要名字的,那就說明這個(gè)體系里,我們需要的不是匿名而是身份,只有擁有身份才可能進(jìn)行記名。這樣的話,我們是否需要為了保證匿名這個(gè)設(shè)計(jì)目標(biāo),做很多的妥協(xié),比如我用 POW 去實(shí)現(xiàn)共識,做各種各樣的考慮,對吧? 如果你選擇放棄掉匿名這個(gè)性質(zhì),去擁抱記名的資產(chǎn),擁抱 KYCF,擁抱 AML,從根本上來說目標(biāo)已經(jīng)發(fā)生了變化,區(qū)塊鏈的設(shè)計(jì)思路也應(yīng)該隨之發(fā)生變化。這個(gè)時(shí)候我需要的不是一個(gè)開放的匿名的共識協(xié)議,而是一個(gè)封閉的記名共識協(xié)議。我覺得,聯(lián)盟鏈和許可鏈的出現(xiàn)最直接的原因在于,金融行業(yè)發(fā)現(xiàn)他們現(xiàn)在的很多需求跟公有鏈、跟 cash 其實(shí)是不一樣的。
D: 很有意思,在 2016 年的時(shí)候就已經(jīng)開始從這個(gè)角度去考慮公有鏈和聯(lián)盟鏈的場景和關(guān)系,算是非常非常早了。
J:是的。那個(gè)時(shí)候最主要的話題還是比特幣,是我們創(chuàng)造的這一種點(diǎn)對點(diǎn)的支付方式,其實(shí)后面的很多東西大家還沒有發(fā)現(xiàn)。這也是為什么我們在創(chuàng)立秘猿科技的時(shí)候從聯(lián)盟鏈入手,到現(xiàn)在我們依然這樣認(rèn)為:聯(lián)盟鏈或者說許可鏈,它始終是著非常重要的地位。一個(gè)是剛才說到的這種原因,因?yàn)樵诤芏鄨鼍袄锩娲_實(shí)需要身份,這非常重要。另外一個(gè)原因是聯(lián)盟鏈的共識范圍更小,因?yàn)楣墟準(zhǔn)且粋€(gè)全球范圍的共識,而我們希望構(gòu)建的這個(gè)網(wǎng)絡(luò)里有不同范圍的共識,我們希望這個(gè)共識的范圍是靈活的,并不是所有東西都要用全球范圍的共識去實(shí)現(xiàn)。
D:在過去“800年”的時(shí)間里,你不光是擼了一條用 Ruby 完整實(shí)現(xiàn)的 Ethereum,成功加入以太坊的核心開發(fā)團(tuán)隊(duì),并且還創(chuàng)立了自己的 startup,一家提供基于聯(lián)盟鏈的解決方案的公司——秘猿科技。哇!真的是幣圈一日一年。
J:是的。
D:我今天想跟你聊的其實(shí)是一切的原點(diǎn)。2016 年的時(shí)候,是你剛剛開始研究以太坊的時(shí)候,你走出的這第一步,就是去擼一條鏈。我們先定一下“擼”這個(gè)詞,你怎么定義“我要擼一條鏈”,這個(gè)“擼”是什么意思?什么叫擼?
J:什么叫擼?我覺得程序員應(yīng)該都能理解這個(gè)詞,你每天晚上……這一部分是不是要剪掉?
D:好的,我能用造輪子來?
J:但是我覺得造輪子是個(gè)好事情。
D:我比較疑惑,其實(shí)區(qū)塊鏈?zhǔn)钦J(rèn)知門檻極高的。用一個(gè)把它完整實(shí)現(xiàn)的方式,作為一個(gè)切入點(diǎn)去學(xué)習(xí),這種方式非常 Hardcode,那你現(xiàn)在還認(rèn)為它是對的方式嗎?
J:其實(shí)有兩個(gè)方面,我覺得一個(gè)是因?yàn)楫?dāng)時(shí)那個(gè)環(huán)境,在 2016 年初的時(shí)候以太坊的資料是非常少的,甚至你可以認(rèn)為當(dāng)時(shí)是沒有資料的。在這種情況下,你想去弄明白它是怎么工作的,那么只有一條路——看代碼。但是你看代碼不可能每一行都琢磨很久,一個(gè)上午最多看 500 行代碼吧?可能看完就看完了,你不會理解為什么代碼這么寫。你只知道最后的結(jié)果是這樣,但并不知道為什么。而且你不會意識到會不會有其他的寫法,對吧?那么我寫代碼的時(shí)候,面臨著 ABC 三條路。
D:如果你沒有意識到他為什么這么寫,甚至你覺得你有更好的寫法,然后當(dāng)你做了一番努力和嘗試之后,大多數(shù)情況下你會發(fā)現(xiàn)其實(shí)現(xiàn)成版本的代碼是非常有道理的,并且可能是最好的或者說最折中的實(shí)現(xiàn)。
J: 你說的沒錯(cuò)。如果你不去寫的話,你并不知道為什么當(dāng)前的代碼是有道理的。
D: 但是在那個(gè)時(shí)候,你有沒有去評估過,你要掌握 Ethereum 的一些比較內(nèi)核比較底層的東西,要用 Ruby 重新實(shí)現(xiàn)它的工程難度或者工程量?你有沒有在做這件事之前先想明白它大概是什么樣的體量?畢竟只有你一個(gè)人。
J:其實(shí)沒有評估。
D:好直接。
J:這就是年輕的好處,我可以什么都不想,我就覺得:唉呀,我這么 NB 肯定能搞定它。
D:那你為什么不挑一個(gè)小一點(diǎn)的目標(biāo),或者說簡單的目標(biāo)?
J:比如說?
D:比如 Ethereum 這條鏈包含了很多東西,像 EVM 本身就包含很多。那你為什么沒考慮先擼一條比特幣?
J: 這個(gè)也對。主要也是因?yàn)槲耶?dāng)時(shí)對比特幣已經(jīng)挺了解了。我們之前是做交易所的,也就是貔貅,這是一個(gè)開源的交易所。想要做好,你必須對各種各樣的鏈都有一些理解,這樣你才能做 deposit 和 withdraw 這兩個(gè)模塊,你才知道什么樣的情況下幣算是真的確定地充值到交易所,什么樣的情況下才是取走了,對吧?這里面需要記賬,也涉及到資金的管理風(fēng)險(xiǎn),這就要求你必須對鏈有比較深刻的理解,才會對自己設(shè)計(jì)的這部分東西有信心。而且比特幣是 09 年的項(xiàng)目,到 2016 年的時(shí)候已經(jīng)發(fā)展很久了,它的資料相對齊全,我覺得我對比特幣的理解是相當(dāng)有信心的。本身比特幣也是相對簡單的,因?yàn)樗脑O(shè)計(jì)目標(biāo)很窄——做點(diǎn)對點(diǎn)的現(xiàn)金支付, 這是一個(gè)很清晰的一個(gè)定位,它只需要 focus 在這一點(diǎn)上,并不復(fù)雜。
D: 我明白了,結(jié)合當(dāng)時(shí)的環(huán)境和你的想法,就是要想找一個(gè)大的目標(biāo)來挑戰(zhàn),而比特幣這個(gè)目標(biāo)有點(diǎn)小。
J: 沒有,不敢,我其實(shí)非常喜歡比特幣,非常喜歡它的設(shè)計(jì)。無論哪個(gè)方面,Satoshi 還是它的設(shè)計(jì)本身,都是傳奇。
D: 這一點(diǎn)毋庸置疑啦。但是,就算你一開始沒有評估這個(gè)工作的工作量,沒有評估實(shí)現(xiàn)這么一個(gè)目標(biāo)需要的規(guī)劃,等你真的開始做了,比方說做了一段時(shí)間之后,我相信你慢慢地就會有一個(gè)清楚輪廓,告訴你正在做的這件事情是怎樣一個(gè)體量,或者是怎樣一個(gè)規(guī)模,對不對?
J: 對。其實(shí)你做了之后就會發(fā)現(xiàn),這個(gè)工作量確實(shí)有點(diǎn)龐大,跟我們以前做的各種項(xiàng)目都不太一樣。
D: 有沒有沮喪過,萬一做不完怎么辦?
J: 有過,過程中肯定有的。因?yàn)檫@個(gè)項(xiàng)目花了我很久的時(shí)間,說實(shí)話最后也的確沒有完全做完。因?yàn)樽詈蟮木W(wǎng)絡(luò)協(xié)議總是有這樣或者那樣的問題。在一個(gè)比較良好的網(wǎng)絡(luò)環(huán)境中它可以工作,但是當(dāng)你把它放到公網(wǎng)上的時(shí)候,你總是會遇到各種各樣奇怪的網(wǎng)絡(luò)狀況。你也會發(fā)現(xiàn)其實(shí)網(wǎng)絡(luò)上有很多奇怪的節(jié)點(diǎn),它不是標(biāo)準(zhǔn)的客戶端,而是改造過的客戶端,總是會給你發(fā)各種奇怪的網(wǎng)絡(luò)消息,你的節(jié)點(diǎn)就會因?yàn)楦鞣N奇怪的原因崩潰,當(dāng)然你也就很崩潰。另外這個(gè)項(xiàng)目也沒有 spec,對吧?你不知道正確的做法是什么。當(dāng)時(shí)我主要參考的是 Py-ethereum 的實(shí)現(xiàn),當(dāng)你按照它實(shí)現(xiàn)已有的東西之后,你會發(fā)現(xiàn)還有很多參考實(shí)現(xiàn)之外的東西,你要去 handle 那些復(fù)雜的情況,你要花大量的時(shí)間去抓那些情況。
D: 那假如說從 1 到 10 來去評估你的工作量或者說完整程度,你會給它打幾分?
J: 我覺得是 8,我主要對網(wǎng)絡(luò)協(xié)議那部分不太滿意。后來我也沒有太多時(shí)間再去一個(gè)個(gè)跑節(jié)點(diǎn),這很耗時(shí)間,而且你需要等。
D: 80% 的完成量,我覺得已經(jīng)非常可觀了。
J: 對,其實(shí)整個(gè)過程非常艱難,遇到了很多坑。這整個(gè)項(xiàng)目我估計(jì)做了有三個(gè)月,這三個(gè)月是非常高強(qiáng)度的開發(fā),幾乎是 7×24 小時(shí)。我印象特別深刻,那三個(gè)月還橫跨了春節(jié),你們可以看我 github 上那個(gè)小格子。
D: 那個(gè)我知道,就是每日的 active.
J: 對,那段時(shí)間是沒有空白的,包括春節(jié)。
D:就是說這三個(gè)月的時(shí)間,每天都有代碼提交,包括春節(jié)?
J: 包括春節(jié),那時(shí)候是很瘋狂地在做這個(gè)事情。
D: 我想了解一下當(dāng)時(shí)是一個(gè)怎樣的工作狀態(tài),能不能描繪一下?你是全天候在寫代碼,還是說會花很多時(shí)間去研究一個(gè)具體的問題,找到方案,然后用編碼實(shí)現(xiàn)出來。
J: 都有,寫代碼是一部分,同時(shí)你也得看別人是怎么做的,還得設(shè)計(jì)從哪個(gè)點(diǎn)開始切入,這是一個(gè)很龐大的工程。我記得我最早做的是 RLP 的實(shí)現(xiàn),RLP 是以太坊里面一個(gè)序列化的格式。我先做的是 RLP 一個(gè)非常基礎(chǔ)的庫,然后用它去序列化反序列化以太坊上所有的數(shù)據(jù)。RLP 本身是比較簡單的,但是你做 RLP 的時(shí)候,你要去考慮怎么能夠讓上面的組建更好地使用RLP。比如我可以很方便地序列化一個(gè) Ruby object,而不僅僅是做 Ethereum 的一個(gè)模塊,很機(jī)械地去序列化 indeger、stream,導(dǎo)致上層寫應(yīng)用的時(shí)候會很麻煩。因?yàn)樯蠈游沂怯?Ruby 寫的,會有很多高級的抽象,結(jié)果在序列化的時(shí)候強(qiáng)迫我去用一些低級的抽象進(jìn)行序列化反序列化。為了解決這個(gè)問題,就需要把 RLP 的庫變得更復(fù)雜。但是后來回想起來,我發(fā)現(xiàn) RLP 其實(shí)是最簡單的,這也是我印象中比較坑的地方,除了我之前提到的網(wǎng)絡(luò)層。
D:就是你現(xiàn)在最不滿意的這個(gè)。
J:對,這個(gè)網(wǎng)絡(luò)層確實(shí)遇到了很多問題,Ethereum 也沒有很好的 spec,沒有經(jīng)驗(yàn)可以借鑒。
D:網(wǎng)絡(luò)層也只是其中一點(diǎn),還有若干其他的?
J: 沒錯(cuò)。第二個(gè)我覺得比較坑的地方是,我覺得 Ruby 是有缺陷的,很多密碼學(xué)的庫是缺乏的。密碼學(xué)的庫,比如說以太坊用的是 secp256K1 這個(gè)橢圓曲線算法,還有那個(gè) sha3,但應(yīng)該是 Keccak-256 不是sha3。
D: 對,Keccak-256。
J: 這個(gè)地方也很坑,因?yàn)樵诖a里面名字都叫 sha3,sha3 是基于 keccak 的一個(gè)算法。但它和 keccak 又不太一樣,實(shí)際上以太坊用的是 keccak,不是 sha3。
D: 從實(shí)現(xiàn)層面上看,keccak 和sha3 其實(shí)是等同實(shí)現(xiàn),從安全度和強(qiáng)度來看,基本是差不多的。沒有任何的證據(jù)表明哪種更好,但 sha3 的版本經(jīng)過了一個(gè)標(biāo)準(zhǔn)委員會認(rèn)證,變成了一個(gè)語言內(nèi)置的標(biāo)準(zhǔn)哈希摘要庫,而不是 keccak。但是 Ethereum 好像在選擇使用 keccak 的時(shí)候是比較激進(jìn)的,它所在的那個(gè)歷史時(shí)間點(diǎn)剛好是sha3成為標(biāo)準(zhǔn)庫之前。Ethereum 選擇了這個(gè)算法,所以就錯(cuò)過了后面使用正式標(biāo)準(zhǔn)庫的那個(gè)版本。
J: 對,我也覺得當(dāng)時(shí)應(yīng)該已經(jīng)確定 sha3,因?yàn)樗且粋€(gè)公開的標(biāo)準(zhǔn)嘛,已經(jīng)確定是走 keccak 這條路了,但當(dāng)時(shí) finallines 的標(biāo)準(zhǔn)還沒有出來,而以太坊又必須往前走。所以它選了一個(gè)未來大概率會成為標(biāo)準(zhǔn)的一個(gè)算法,其實(shí)是并沒有什么區(qū)別。
D: 但是 sha3 庫和 kaccak 庫還是不能互換呀?
J: 不能互換,但是算法是一樣的,主要是一些參數(shù)上的區(qū)別。因?yàn)楫?dāng)時(shí)標(biāo)準(zhǔn)沒出來,所以沒辦法。也不能算什么缺陷。但問題在于代碼里的名字都叫 sha3,而實(shí)際上用的是 kaccak,所以我在寫代碼的時(shí)候很自然地覺得我應(yīng)該用 sha3 的庫來做,最終你會發(fā)現(xiàn)怎么做都不對。因?yàn)樗皇?sha3,而是 keccak。
D: 當(dāng)你意識到這一點(diǎn)之后,你會發(fā)現(xiàn)那個(gè)時(shí)候的 Ruby,對于不管是標(biāo)準(zhǔn)還是非標(biāo)準(zhǔn)的密碼學(xué)庫的支持是非常有限的。
J:剛才說到兩個(gè)問題,一個(gè)是以太坊很坑,它其實(shí)用的是 kaccak,但所有的命名都是 sha3,你也找不到任何文章,不管 Google 上還是文檔上,在任何地方你都看不到任何提示,告訴你這里其實(shí)是 keccak。這是一個(gè)很玄幻的事情。
D: 所以當(dāng)你說 sha3 的時(shí)候,我腦子里第一時(shí)間就會彈出來 keccak 這個(gè)詞,因?yàn)槲以谶@個(gè)坑里面踩了很久。
J: 對,后來我記得你在 imtoken 的時(shí)候還是其他什么時(shí)候,來問過我這個(gè)事情。另外一個(gè)事情就是說 Ruby 本身的問題,它的這個(gè)密碼學(xué)的庫不夠豐富。
D: 那怎么辦?
J:最后我的解決方法有兩種,我兩種路都走了,一種是用 Ruby 實(shí)現(xiàn),我印象中是 Ruby 實(shí)現(xiàn)的那個(gè)庫,性能不是很好。
D: 這我能理解。
J: 對,性能不是很好。后來我就又用 FFI 封裝了一個(gè) C 的庫。我把 Bitcoin 倉庫里的 secp,它應(yīng)該已經(jīng)是一個(gè)單獨(dú)的倉庫、一個(gè)帶獨(dú)立的 C 庫了,然后我再用 Ruby 來 FFI 給它包裝一層。
D: 對,我記得關(guān)于 Ruby 分裝和基于 Ruby 如何去調(diào)用 secp256K1 的這個(gè)庫的問題,其實(shí)里面有大量的坑,這個(gè)坑又來自于 Bitcoin 的這個(gè)庫自己的實(shí)現(xiàn)過程。 如果你不是它的核心開發(fā)者,你不太會了解這些坑。我記得我在做 imtoken 的時(shí)候也在這個(gè)層面上跟你談?wù)撨^很多,但這個(gè)是后話啦。反正就感覺你做 Ethereum 的開發(fā),從做應(yīng)用的開發(fā)開始是一步一個(gè)坑,對吧?bug drive development,你在做底層實(shí)現(xiàn)的時(shí)候也依然是一步一個(gè)坑。
J: 對,非常非常多的坑。我記得當(dāng)時(shí)我試過很多種方案,Ruby 也能夠做。我也封裝過 OpenSSL 里面的那個(gè)曲線,我記得 OpenSSL 里面是有 secp 這個(gè)曲線的,最后都封裝好了,又發(fā)現(xiàn)另外一個(gè)比較有趣的地方:Ethereum 用了 secp 的 recovery 的模式,就是把這個(gè) pubkey 給封裝到一個(gè)簽名里,在 transaction 里面是不存 pubkey,只存一個(gè)簽名,然后通過簽名來 recover 這個(gè) pubkey。這個(gè)事情我不知道有沒有記錯(cuò),反正我有這么個(gè)印象,就是說我記得 OpenSSL 里面是沒有這個(gè)功能,然后你如果要……
D: 還有一個(gè)神奇的 magic number,我記得很清楚,就是當(dāng)用 recover 模式的時(shí)候,你要?jiǎng)?chuàng)建公鑰的話,你要傳入一個(gè) cipher 的 number,當(dāng)你 recover 的時(shí)候也要用同樣的一個(gè) number,用了這個(gè)之后你才能正常地把 publicKey 給 recover 出來。我很清楚那是 16 年的事情,因?yàn)?16 年的時(shí)候我當(dāng)時(shí)也在創(chuàng)業(yè),在跟何斌一起做 imtoken。我們也在這個(gè)地方踩了無數(shù)的坑,因?yàn)?imtoken 做的是錢包,跟 SECP256 這個(gè)庫打了很多交道,其實(shí)也沒有遇到太多的密碼學(xué)的其他的大坑,整體情況還算好。但是遠(yuǎn)遠(yuǎn)沒有想到,你在做 Ethereum 核心實(shí)現(xiàn)的時(shí)候,會有遇到這么多的問題。
J: 因?yàn)橹饕怯?Ruby 在做,我覺得就這方面來講 Python 真的比 Ruby 強(qiáng)很多。Python 的庫非常豐富。
D: 這個(gè)得認(rèn),有一說一?;剡^頭來看的話,你花了這么多的時(shí)間精力在做這個(gè)事,那我現(xiàn)在問你個(gè)問題,就是手動地去擼一條鏈出來,都需要哪些知識、哪些技術(shù)儲備,才有可能保證你有這個(gè)能力一步一步地把這條鏈給擼出來。
J: 我覺得我擼這條鏈最大的感受就是,大學(xué)的時(shí)候?qū)W的課包括操作系統(tǒng)編譯原理,這些知識好像都能用上,還有像離散數(shù)學(xué)。甚至說密碼學(xué)里面全是一些數(shù)學(xué)的知識,需要算來算去。
D: 哇!我一開始后背發(fā)涼,這個(gè)都還給老師了,怎么辦?
J: 雖說遇到了很多困難,但整個(gè)感覺太贊了,確實(shí)是覺得大學(xué)沒有白學(xué)。 因?yàn)榇髮W(xué)畢業(yè)之后,花很多時(shí)間做的那些事情,并沒有多難,也沒有用到很深的東西。
D: 我知道你在做這件事之前,你已經(jīng)做了很多年的互聯(lián)網(wǎng)應(yīng)用、web 應(yīng)用的全棧工程師,突然轉(zhuǎn)到做一個(gè)底層的事情,而且三個(gè)月就能把 Ethereum 的客戶端擼出來,這個(gè)過程是不是覺得很酸爽。
J: 肯定是很酸爽。但是我覺得其實(shí)我是做好準(zhǔn)備的。我之前是有很多 C 和 C++ 的經(jīng)驗(yàn),Java 的經(jīng)驗(yàn)我也有,我在大學(xué)的時(shí)候最喜歡的語言是 C++,我當(dāng)時(shí)還做過很長一段時(shí)間的學(xué)校 BBS 上 C++ 版主,對 C++ 有很多研究。后來工作之后就去用 Java,又慢慢地轉(zhuǎn)成 Ruby。既然我能用 Ruby 解決問題,我為什么不用,寫起來又方便。我覺得這個(gè)其實(shí)是工作所限,工作并沒有給你很多機(jī)會,讓你去觸及一些需要的更底層的知識、底層的語言去解決的問題,對,所以這個(gè)是……
D: 所以你的工作經(jīng)歷和工作經(jīng)驗(yàn)可能沒有太多的儲備或者說積累,能幫助你去做這件事情。
J: 對,工作儲備沒有太多幫助。
D: 反而大學(xué)的時(shí)候打下的基礎(chǔ),和自己在之前做過一些 C 和 C++ 的經(jīng)驗(yàn),會給你帶來一些幫助。我猜可能主要的東西還是你在整個(gè)過程中自己邊做邊學(xué)掌握的, 而不是事先積累好的。
J: 沒錯(cuò)。主要密碼學(xué)這方面可以給大家推薦一下,我相信現(xiàn)在 coursera 上面還有 Stanford 密碼學(xué)的課,就叫 Cryptography。還有 Dan Boneh,密碼學(xué)大神。當(dāng)時(shí)也是學(xué)習(xí)這些,確實(shí)是覺得很有意思,還把課都做完了。
D: 你的這一段經(jīng)歷確實(shí)非常有意思,不管你之前有沒有工作經(jīng)驗(yàn)的積累,如果你愿意去做 lowlevel,邊做邊學(xué),只要足夠努力并且堅(jiān)持下來,這件事情依然是可以做到的。至少我覺得對我來說也是可以做到的。你從第一行代碼開始擼,是直到三個(gè)月后這個(gè)代碼才跑起來嗎?
J: 那倒不是,我覺得這個(gè)方面其實(shí)是得益于十幾年的工作經(jīng)驗(yàn)了。工作給你帶來的其實(shí)是工程方面的專業(yè)度,就是你如何工程化的去推進(jìn)和實(shí)現(xiàn),這個(gè)是大學(xué)教不了你的。咱們做 Rbuy 的,就是 TDD 啊,BDD 啊,敏捷開發(fā)這些,那一套東西都玩得還挺溜的,對吧?我在做 Ruby-ethereum 的時(shí)候,也是把這些工程化的經(jīng)驗(yàn)靈活運(yùn)用。從小的東西開始不停的迭代,不是說我敲完代碼三個(gè)月之后才跑幾個(gè)東西。是一開始先做到一個(gè)它自己能run的某一個(gè)狀態(tài),然后再持續(xù)的把它變得越來越模塊化。
D: 是這樣做。那你回頭來講這個(gè)事的話,有沒有大概幾個(gè)里程碑的事件?
J: 這個(gè),我可能記不得了。
D: 那我就問,你是什么時(shí)候做到可以跟主網(wǎng)做數(shù)據(jù)同步?
J: 跟主網(wǎng)做數(shù)據(jù)同步,是比較后期的事情了。因?yàn)榫W(wǎng)絡(luò)是最后去做的。
D: 一旦你能正常地跟主網(wǎng)做數(shù)據(jù)同步(大多數(shù)的節(jié)點(diǎn)只能實(shí)現(xiàn)跟主網(wǎng)去同步數(shù)據(jù),不需要參與共識。因?yàn)槟軈⑴c共識只有礦池才能做到),它就已經(jīng)走到了一個(gè)相對完備的狀態(tài)。那已經(jīng)是相對后期的事情,我覺得做到這一點(diǎn)上來講的話,應(yīng)該是一個(gè)非常大的里程碑。
J: 對,這個(gè)其實(shí)是比較后期的。前期的里程碑,首先肯定是網(wǎng)絡(luò)層 mock 掉,就是內(nèi)存里面的幾個(gè)進(jìn)程,或者說幾個(gè)線程相互之間能通訊就行,模擬幾個(gè)節(jié)點(diǎn)把網(wǎng)絡(luò)上給 mock 掉,比如之前提到的 RLP,最早的里程碑可能是你輸入一個(gè) transaction,看它這個(gè)序列化之后的格式能不能對上,然后再后面就是去實(shí)現(xiàn)這個(gè)數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)這個(gè) block 實(shí)現(xiàn) transaction。然后這些數(shù)據(jù)結(jié)構(gòu)系列化之后,首先是 RLP 的這個(gè)格式的數(shù)據(jù)都對的上,然后第二就是簽名,交易的簽名,這個(gè)牽出來的簽名都沒問題,然后也可以驗(yàn)簽也可以 recover。 這個(gè) pubkey,然后各種各樣的事情都能做。再然后我覺得應(yīng)該就是 EVM,就是說你怎么去處理這些交易?怎么樣去 process 一個(gè) log,怎么樣去 process 是一個(gè) transaction,然后這里面必然會涉及到你要去實(shí)現(xiàn) EVM,然后實(shí)現(xiàn) EVM 就是說必須得力贊一下這個(gè)以太坊這個(gè)測試框架,以太坊有一個(gè)倉庫叫 tests。就在 ethereum 這個(gè) organization 下面有個(gè)倉庫叫 tests,它里面是包含了可能有至少是萬這個(gè)數(shù)量級的吧,萬還是幾十萬的fixtures。就是測試的用例。ethereum tests 也是一個(gè)就是說跟語言無關(guān)的一個(gè)測試庫,它測試用例都是用 json 寫的,然后會詳細(xì)的說明就是輸入是什么?輸出是什么?然后交易是什么?所以如果你去實(shí)現(xiàn) EVM 的時(shí)候,你就是說把輸入丟給這個(gè) EVM,把當(dāng)前的這個(gè) world state 丟給 EVM,然后對比最后產(chǎn)生的新的 world state,然后你就可以知道你的這個(gè)實(shí)現(xiàn)是否能夠通過這個(gè)測試或者說是通不過這個(gè)測試。這套東西是非常有幫助的,對你實(shí)現(xiàn) EVM。到這個(gè)階段的時(shí)候,其實(shí)你就是不停的去死磕那些測試一個(gè)一個(gè)的過,我可能改一點(diǎn)東西。過了一百個(gè)測試,再改一點(diǎn),過了 1000 個(gè),再改一點(diǎn)過了 1 萬個(gè),再改一點(diǎn),只能過 5000 個(gè)了。
那很有意思,這個(gè) progragh 的話通過測試反饋是有可以感覺到的,它是個(gè)進(jìn)度條,到最后的話把所有的測試全部都能過去,我們 EVM 就是 fully compatible.我記得就是百分之百通過的時(shí)候我是非常非常興奮,然后還發(fā)了條 twitter。 然后我另外一個(gè)很興奮的是說我的 Ruby-EVM 的實(shí)現(xiàn)比 Py-ethereum 的 EVM 快很多。
D: 為什么?是因?yàn)槟阕隽撕芏嗟膬?yōu)化嗎?
J: 為什么?我覺得跟程序,跟代碼的寫法有一些關(guān)系。肯定有優(yōu)化,有各種各樣的原因。
D: 所以性能好不好,主要看架構(gòu),而不是看語言。
J: 對,架構(gòu)非常重要。
D: 架構(gòu)非常重要。
J: 其實(shí)語言程度上 Ruby 可能還慢一點(diǎn)。
D: 那共識協(xié)議這一塊呢?當(dāng)時(shí)在做的時(shí)候有沒有遇到什么問題,或者有什么坑在里面?
J: 共識協(xié)議還好,我猜應(yīng)該是在 EVM 之后去實(shí)現(xiàn)的,這個(gè)是 POW 那部分,那是一個(gè)單獨(dú)的倉庫,叫 Ethash,那個(gè)算法叫 Dagger Hashimoto 算法,然后我記得我是先用 Ruby 實(shí)現(xiàn)一遍,生成 DAG,一個(gè)大的文件,再用各種各樣的方法去生成,去找到 nonce,然后用 Ruby 實(shí)現(xiàn)了一遍,發(fā)現(xiàn) Ruby 還挺慢的,感覺我最后做出來的這個(gè)東西可能不太實(shí)用,所以后來就把 Ruby 擱到一邊了。后來又去封裝了一下,C++ 里面實(shí)現(xiàn)的 Ethash 算法,用 Ruby 封裝之后我發(fā)現(xiàn)這個(gè)效率還可以。所以當(dāng)時(shí)確實(shí)是奔著希望做成一個(gè)實(shí)際可用的客戶端去的。 最后在 Ruby-ethereum 里面,其實(shí)這兩個(gè)實(shí)現(xiàn)都支持,為了這個(gè)實(shí)現(xiàn)我還把接口抽象了,你可以指定用 Ruby 的 ethash,還是要用 cpp 的 Ethash。
D: 也就是說,你選擇了兩個(gè)實(shí)現(xiàn)都支持的方式,一個(gè)出于研究目的,一個(gè)充分考量生產(chǎn)環(huán)境?
J: 對,不只是研究目的,我是真的想讓它跑起來。
D: OK,因?yàn)樵谝恍┎渴瓠h(huán)境和生態(tài)環(huán)境的時(shí)候,最少的對于 C 啊或者說是對于其他類型的庫,外部依賴最容易方便你部署,那整個(gè)過程聽起來從頭到尾都是 Hardcode,是非常 hard 的模式。
J: 對,其實(shí)遇到挺多問題的。
D: 讓你覺得最難的就是網(wǎng)絡(luò)層。
J: 對,這是一個(gè)很有意思的現(xiàn)象,在整個(gè)分布式系統(tǒng)中這個(gè)領(lǐng)域都是成立的,網(wǎng)絡(luò)會帶給你很多不確定的驚喜。因?yàn)槲覀冎白龅亩疾皇欠植际较到y(tǒng),它們都是一個(gè)受控網(wǎng)絡(luò)環(huán)境內(nèi)的系統(tǒng),你其實(shí)是在跟大概率確定的事情打交道。當(dāng)你在一個(gè)分布式系統(tǒng)中,尤其是在公有鏈這樣一個(gè)開放的環(huán)境里,你是在跟不確定的事情打交道,這是一個(gè)非常有意思的轉(zhuǎn)變。很多以前做互聯(lián)網(wǎng)服務(wù)的開發(fā)者,當(dāng)他轉(zhuǎn)到區(qū)塊鏈的時(shí)候,很多人的 Mindset 可能會有一段時(shí)間轉(zhuǎn)不過來,因?yàn)槟阋呀?jīng)習(xí)慣了,習(xí)慣了假設(shè)大家都是好人,但其實(shí)我們現(xiàn)在的編程環(huán)境里大家都是壞人,你必須適應(yīng)公有鏈的這個(gè)環(huán)境。這里不僅僅有 51% 攻擊那種高成本的事情,在網(wǎng)絡(luò)層在你們看不到的地方更是暗流涌動,有各種奇怪的事情。想象一下,在 16 年還是很早期的時(shí)候已經(jīng)是這樣,那現(xiàn)在更是這樣了。 所以你能看到各種各樣黑客事件的發(fā)生,這個(gè)絕對不是偶然。不是偶然。不是偶然。
D: 經(jīng)歷這么一個(gè) Hardcode 模式,你在整個(gè)實(shí)現(xiàn)過程中會不會有 depletion、壓力甚至?xí)殡S著沮喪。然后少有的完成了里程碑以后,讓自己非常非常開心。
J: 沒有沮喪,這個(gè)我記得很清楚,整個(gè)過程我都很興奮。
D: 整個(gè)都很興奮?
J: 對,全程都是很興奮的,否則我也會覺得沒有動力,否則我也不會大過年的時(shí)候非得去擼代碼。這個(gè)事情我印象特別深刻,就是那種特別值得的感覺,你知道嗎?覺得自己的大學(xué)四年沒白活,終于找到有意義的事情。
D: 為了給大學(xué)四年一個(gè)交代,這也太……
J: 我覺得這跟個(gè)人性格有關(guān)吧。我覺得我做很多事情沒有太多特別的目的,可能人生有意義的地方就是在于你做的那些沒有什么目的的事情。它常常會帶給你很多驚喜。這是我自己的一個(gè)看法。
D: 嗯,收獲肯定是蠻多的。
J: 收獲很多。
D: 那我們講講,你現(xiàn)在能深刻體會到的做這樣一個(gè)事情最大的收獲和最大的改變。
J: 我覺得最大的收獲是對創(chuàng)業(yè)的幫助吧。
D: 對創(chuàng)業(yè)的幫助?
J: 對,這個(gè)過程讓我看到了一個(gè)未來的世界。首先你去擼這個(gè)鏈的時(shí)候,你會做大量的研究,不僅僅是擼代碼,你會看很多很多的東西,包括你會去思考很多事情的本質(zhì),也會去跟別人交流。在這個(gè)過程中我也很幸運(yùn)地認(rèn)識了 Vitalik,很幸運(yùn)地碰到了以太坊那個(gè)團(tuán)隊(duì)的人,和他們交流,了解他們的想法,他們怎么看待未來。這一點(diǎn)對我的幫助非常非常大,也讓我非常開心。
D: 認(rèn)知升級了。
J: 前面說大學(xué)沒白學(xué),因?yàn)槟銜吹揭粋€(gè)技術(shù)占有非常重要地位的未來。通過技術(shù)、通過科技能夠改變很多事情,能夠?qū)崿F(xiàn)很多事情,你會對此很有信心,你也會去很堅(jiān)定地往那個(gè)方向去走。
D: 我現(xiàn)在決定把這一期的 podcast 放出去之后,它的標(biāo)題就叫作:我是如何擼出一條以太坊的區(qū)塊鏈的。
J: 我是如何擼的?
D: 對,“我是如何擼的”,副標(biāo)題是“我大學(xué)真沒白學(xué)”。整個(gè)這個(gè)過程你是在一種很微觀的層面上,在非常 detail 的 lowlevel 上跟代碼打交道,跟協(xié)議打交道,把整個(gè)這一部分走了一遍。最后跑通之后,你告訴我,你的結(jié)論是你看到了一個(gè)更好的或者說更理想的技術(shù)的世界。這讓我覺得挺不可思議的,非常有意思。
J: 因?yàn)閰^(qū)塊鏈真的是一個(gè)非常大的概念,里面涵蓋的學(xué)科和知識很多。就計(jì)算機(jī)方面,分布式系統(tǒng)、密碼學(xué)、P2P 網(wǎng)絡(luò),編譯原理、編譯器,各種各樣的東西你都能涉及到,還有經(jīng)濟(jì)學(xué)博弈論等等。你研究得越多,你會發(fā)現(xiàn)其實(shí)它研究的是我們的整個(gè)社會,研究我們的人類社會系統(tǒng)是怎么運(yùn)作的,這把你的視野變得非常開闊。還告訴你,這個(gè)世界上有這么多很好玩的東西,而且他們在某種程度上是相通的,比如計(jì)算機(jī)系統(tǒng)架構(gòu)方面的設(shè)計(jì),你可以對應(yīng)這個(gè)人類社會的系統(tǒng)的設(shè)計(jì),它們之間有哪些是相同的,有哪些是不同的。這樣一整套東西混在一起,你會發(fā)現(xiàn):哇,還有這么多有意思的事情。還有另外一點(diǎn),當(dāng)你能夠看清楚那個(gè)未來、了解底層的很多細(xì)節(jié)和現(xiàn)狀的時(shí)候,你就能夠明白,未來和現(xiàn)在之間的 gap 有多大?未來非常美好,但它離我們真的挺遠(yuǎn)的,中間有很多很多事情要去做,那么這個(gè)未來會是你一個(gè)很堅(jiān)定的目標(biāo),它是你要去實(shí)現(xiàn)的那個(gè)東西,你必須得想出一條可行的路徑出來,你必須一步一步走過去,甚至中間會有一百步一千步一萬步。我們現(xiàn)在離那個(gè)未來還很遠(yuǎn)。這個(gè)對創(chuàng)業(yè)的幫助是非常大的,我就會很實(shí)際地去找那條路徑。
D:作為一個(gè)曾經(jīng)的創(chuàng)業(yè)者,我對這一點(diǎn)感受非常深刻。尤其是對技術(shù)型創(chuàng)業(yè),在一個(gè)有很多不確定性的環(huán)境下,如果你是認(rèn)真地扎進(jìn)去,探索得很深的時(shí)候,對底層的理解很深刻的時(shí)候,你再浮出水面,再看一下未來,你對之前走過的道路感觸會尤其深刻,這個(gè)很難去解釋。我們做技術(shù)創(chuàng)業(yè)的時(shí)候,這種情況真的是一而再再而三地發(fā)生。
J: 其實(shí)這個(gè)也決定了,為什么我們會選擇從許可鏈到公有鏈這樣一條路徑。當(dāng)我去參與 Ethereum 的開發(fā),參與各個(gè)層面的開發(fā)之后,會很容易認(rèn)識到:許可鏈,從技術(shù)上來說確實(shí)容易很多。畢竟許可鏈?zhǔn)窃谝粋€(gè)許可的環(huán)境里面,它的不確定性沒有那么大。那么很多事情做起來就方便很多,包括架構(gòu)的設(shè)計(jì)、細(xì)節(jié)的設(shè)計(jì)方案。但是公有鏈其實(shí)非常難,它各個(gè)方面涉及的東西遠(yuǎn)遠(yuǎn)超過很多人的想象。在你準(zhǔn)備不足的情況下,貿(mào)然去做這樣一個(gè)事情,是很難、風(fēng)險(xiǎn)很高的。所以,我們會選擇一個(gè)相對簡單的點(diǎn)、一個(gè)場景去切入,通過這樣一個(gè)事情去培養(yǎng)我們的工程團(tuán)隊(duì),加深我們對區(qū)塊鏈的理解。等準(zhǔn)備充分之后,再去做公有鏈,這是一個(gè)更加可行的路徑。
D: 我非常認(rèn)同這一點(diǎn)。你通過擼鏈獲得的感觸,影響了很多人,包括我們自己的工程師,和那些希望在區(qū)塊鏈這個(gè)領(lǐng)域中做點(diǎn)事情的廣大的優(yōu)秀工程師,鼓勵(lì)他們試著從擼鏈的角度去學(xué)習(xí)和認(rèn)知區(qū)塊鏈這樣一個(gè)嶄新的事物,我覺得這點(diǎn)非常好。如果,讓你重新做一遍的話,基于你現(xiàn)在的這個(gè)工作,還有什么地方你覺得可以改進(jìn)和提升?
J: 我覺得網(wǎng)絡(luò)肯定是一個(gè),再說我滿意的部分,我對 EVM 這個(gè)部分是挺滿意,因?yàn)橛泻芏鄿y試。
D: 還有很好的性能。
J: 對,還有很好的性能,我覺得挺開心的。如果說要改進(jìn)的地方,讓我再做一遍的話,我希望架構(gòu)上有一些新的東西放進(jìn)去,怎么說呢?因?yàn)楹髞砦野l(fā)現(xiàn)一個(gè)問題,以太坊的哲學(xué)其實(shí)是通過硬分叉來升級。那么硬分叉以太坊里面,硬分叉這個(gè)模式基本的一個(gè)設(shè)計(jì)模式是什么?是說我指定一個(gè)區(qū)塊號。在這個(gè)區(qū)塊號之前,我是怎么樣一個(gè)處理邏輯,在這個(gè)區(qū)塊號之后區(qū)塊高度之后是怎么樣一個(gè)處理邏輯,代碼里面有不少if...else 這樣硬編碼的東西,這個(gè)是我當(dāng)時(shí)很受不了的,但是又沒有想到很好的方法就沖上去了。如果我再做一遍 Ruby-ethereum,我一定會想辦法把它處理掉,避免這些 if...else,用一個(gè)比較優(yōu)雅的方式去處理。
D: 我能明白。其實(shí) ethereum 每一次大的版本升級,從 Frontier 到 Homestead,再從 Homestead 走到下一個(gè)階段的 Serenity 都是有這樣的 if...else,在那個(gè)區(qū)劃版本號之后的話,完全轉(zhuǎn)那一套新的代碼,但是在高度沒有到那一塊或者投訴的時(shí)候,它要去執(zhí)行老的代碼,就說老的代碼、新代碼向兩份拷貝通過 if...else 把它給去隔開,確實(shí)是一個(gè)在看代碼的過程中非常非常覺得有點(diǎn)不舒服的地方。我明白你的意思。
J: 所以我們現(xiàn)在做底層也會反過來想,就是說如果我們以后要硬分叉,或者如果我們要有一些其他不同的一些 Carments 方面的設(shè)計(jì)的話,底層需要去怎么樣做一些比較漂亮的支持,就是說不是每次 if...else 這種方式,然后可以用一個(gè)比較優(yōu)雅的方式來處理這些問題。其實(shí)現(xiàn)在也會反過來這樣想。
D: 其實(shí)有一點(diǎn)我是知道的,但是可能很多聽眾不知道,可能聽到現(xiàn)在很多聽眾只是覺得你用 Ruby 把以太坊的客戶端重新擼了一遍,但其實(shí)你應(yīng)該說是做鏈這件事的話,你擼了不止一遍,對不對?到底擼過幾遍?
J: 對,Ruby 是一遍,然后最后確實(shí)還有做過一些其他的事情,但至少說在python 那邊,就是加 入ethereum 之后,用 python 其實(shí)就寫很多,包括寫 Casper 很多東西。就三四遍吧!
D: 三四遍。Ruby、Python,還有秘猿的CITA這個(gè)產(chǎn)品的技術(shù)架構(gòu)主要是 Rust 的語言,對吧?然后也就相當(dāng)于,其實(shí)已經(jīng)是不管是 Ruby、Python 都做一遍,其實(shí)你是最有資格的去評判不同的語言在做這件事情或者一些差別,為什么沒有 Go?
J: 我說一下,就是說我們選擇這種語言的考慮吧,其實(shí) Python 和 Ruby 非常好理解。Ruby 是因?yàn)槲易约旱谋尘?,然后覺得需要有一種新的一個(gè)實(shí)現(xiàn),然后Python 其實(shí)很好理解,就是 Ruby 和 Python 其實(shí)都一樣,就是說做原型很方便,然后反正功能有了,功能可以很快的實(shí)現(xiàn)出來。這個(gè)就是它最大的一個(gè)目的,就是用 Ruby 和 Python 最大的目的,然后用 Rust 沒有用 Go。我覺得有幾個(gè)方面的原因,就是說可能 Go 是一種有 GC 的語言,我們希望追求的是最極致的一個(gè)性質(zhì)。這個(gè) GC 和最極致的性能是有沖突的。我希望的是不僅僅在架構(gòu)上,我們可以去實(shí)現(xiàn)高性能。我們在這個(gè)架構(gòu)的每個(gè)具體實(shí)現(xiàn)的細(xì)節(jié)里面,我們也去追求最高的性能,我們想做的是一個(gè)最極致的東西,就是世界第一。我們做 CITA 的時(shí)候,目標(biāo)就是世界第一。然后我們也覺得我們能做到這一點(diǎn)。然后我覺得現(xiàn)在 CITA 確實(shí)是性能,我沒有覺得有誰性能比它好。我覺得其實(shí)這方面是有影響。然后另外一個(gè)原因是說,Rust 是一種比較現(xiàn)代的,吸收了很多現(xiàn)在語言特性的語言,我非常喜歡它的設(shè)計(jì),就是因?yàn)槲以谧?Ruby 程序員的時(shí)候,其實(shí)花了很多時(shí)間去研究 haskell。非常喜歡 haskell,haskell 是一種非常數(shù)學(xué)非常純粹的一種語言,它是 funtional,然后追求 pure funtional program。haskell 的這個(gè)哲學(xué)就是說 avoid success at all costs,它是一個(gè)很學(xué)術(shù)派的語言,我不想成功,我就是要美,我就是要漂亮,這就是我的哲學(xué),所以說haskell就是它的美是讓你震撼的那種,就說哇你太美了。但是你要我用到工程里面,我會覺得好像有點(diǎn)過了,對吧?因?yàn)檫@不是你追求的東西,但是 rust 出現(xiàn)就讓你覺得這個(gè)東西就是我想要。就是我把 haskell 還有 ocaml,就是說是近 10 年 20 年這個(gè)類型系統(tǒng)這方面的進(jìn)展,研究成果都吸收過來,然后我又去追求 C++ 的這種性能,我又去結(jié)合一些 funtional 的東西,這個(gè)我覺得,哇,完全就是你怎么知道我是怎么想的,就這種感覺,我想的就是這個(gè)東西,你把我想的東西全都做進(jìn)去了,這東西太牛逼了。當(dāng)你看到就是說你在 Rust 里面是可以寫非常高階的一些語法,然后你看到它看起來像 Ruby。通過編譯器的一些技巧,把它編譯成一種非常高性能的匯編代碼的時(shí)候,你會覺得這個(gè)東西太 nb 了。所以我覺得這是為什么 Ruby 社區(qū)有很多人轉(zhuǎn)向 Rust,包括我們認(rèn)識的 Yehuda,超級大神,直接去搞 Rust。
D: 反正我自己也非常非常喜歡,然后最近也把自己就是,我說這話有點(diǎn)政治不正確,因?yàn)槲冶救诉€是 Ruby 社區(qū)的一個(gè)管理員,這一段我不能放。
J: 反正我是覺得我肯定是個(gè) Rust 吹了,但是我覺得 Rust 和 Ruby 是這個(gè)非常有血緣關(guān)系的語言。為什么呢?
D: 因?yàn)樗麄兌夹?R。
J: 說對了一半:因?yàn)樗麄兦皟蓚€(gè)字母是都是 RU(笑)。是不是說對了一半。然后這是一個(gè)方面吧,就是我覺得 rust 它非常好。然后第三個(gè)方面是我覺得它非常有潛力,這個(gè)有潛力是幾個(gè)方面,首先 rust 本身是有一個(gè)社區(qū)推動的一個(gè)語言,這個(gè)事情本身和區(qū)塊鏈?zhǔn)欠浅F鹾系?。區(qū)塊鏈的項(xiàng)目其實(shí)也是社區(qū)推動,然后通過比如說 EIP 啊 BIP 啊這些提案去推動,Rust 其實(shí)也是 Mozilla 基金會支持的一個(gè)項(xiàng)目。然后它有一個(gè) Rust 社區(qū),然后有在 Rust 里面叫 rust-RFC 吧,也是各種提案去推動這個(gè)語言的演化,通過社區(qū)的力量去推動,對這個(gè)我非常喜歡,我覺得就是說開源項(xiàng)目還有就是社區(qū)的力量是非常非常強(qiáng)大的。雖然說它一開始可能給你的感覺很弱小,就是它的這個(gè)產(chǎn)品給人感覺很弱小,但是它的生命力是非常旺盛。它是個(gè)開放的語言,它有一個(gè)開放的社區(qū),它的整個(gè)的這個(gè) Rust 背后的這套工程上的東西,流程上的東西,我覺得做得非常好。
D: 你們在秘猿通過用 rust 重新實(shí)現(xiàn)了這一套叫做 CITA 的這一套聯(lián)盟鏈的blockchain solution,這一整套的代碼和這個(gè)產(chǎn)品的話,在 GitHub 上都是開源的都非常好,那如果要是在這一點(diǎn)感興趣的聽眾的話,也可以線下的去 GitHub 上做學(xué)習(xí)和研究,我覺得這個(gè)非常好。我們以前談了這么多,從你們當(dāng)時(shí)做鏈的這一段經(jīng)歷和收獲,從 Ruby 到 Python,再到 Rust,然后三遍到四遍做鏈,哇,你真是一個(gè)做鏈方面的專業(yè)戶,anyway,這是一個(gè)褒義詞,我們今天這個(gè) podcast 的話也要接近尾聲了,其實(shí)我還有最后一個(gè)問題,通過自己手?jǐn)]一條鏈出來,然后讓它能 work 能 function,去跨界的一個(gè)非常好的方式。那么如果我們都相信這一點(diǎn)的話,能不能給一些后面如果還想通過這種方式去學(xué)習(xí)的這些人和一些工程師們一些建議和一些意見?
J: 我覺得其實(shí)現(xiàn)在來說,擼一個(gè)鏈其實(shí)確實(shí)是比較 Hardcode 過程,就是說時(shí)間成本是比較高的。但是我覺得學(xué)習(xí)的效果是最好的。這個(gè)我覺得看在于每個(gè)人自己的取舍,所以我前面也說了,你如果要是擼一個(gè)完整的一個(gè)實(shí)現(xiàn)的話,我覺得現(xiàn)在可能還是會需要當(dāng)初那么多時(shí)間。因?yàn)橐粋€(gè)方面來說,你能獲得的資料更多,能參考的東西更多,但是另外一個(gè)方面來說,以太坊和不管什么鏈,它其實(shí)都是在一直發(fā)展的,就是說我如果那個(gè)時(shí)候是在兩年前,它后面又比如說硬分叉,又加進(jìn)很多東西,又有各種各樣的東西,然后網(wǎng)絡(luò)上有各種各樣的進(jìn)化,這個(gè)網(wǎng)絡(luò)協(xié)議層,當(dāng)時(shí)的比如說什么什么版本,現(xiàn)在跳到什么什么版本。
D: 它的黃皮書也是在更新。
J: 對,其實(shí)你要做的事情是越來越多的,那么我覺得工作量可能不會差太多,可能不會差太多。所以這個(gè)還是比較花時(shí)間的。那么另外一個(gè)簡單一點(diǎn)的事情可能就是說,你可以擼一個(gè)簡單版本的鏈,就是它不一定是說要走向生產(chǎn)要完全兼容的,而是說大致的一個(gè)區(qū)塊鏈的概念,它是一個(gè)原型,對吧?它麻雀雖小五臟俱全的那種感覺的原型,就是有挖礦,有交易,有 block,有幾個(gè)節(jié)點(diǎn)可以連在一起,然后連起來之后就可以不停地挖礦出塊,然后各種各樣的東西,做到這一步也是很有意義。然后還有一點(diǎn)就是說你不一定要做一個(gè)完整的東西,但是你可以在里面選一小塊出來,寫一寫。我覺得這種也是挺有意義的一種練習(xí)吧,比如說 RLP,或者說我要實(shí)現(xiàn)這個(gè) merkeltree,或者說我去實(shí)現(xiàn) Local Patricia-Tree,就需要去做這種小的點(diǎn),其實(shí)你弄明白之后,也是很有意義的。我能想到的剛才講的還有就比如說錢包里面的這個(gè)私鑰的加密。
D: 那個(gè) ethereum 的這個(gè) keystore V3 這個(gè)協(xié)議加密。
J: 有很多小的點(diǎn),就有點(diǎn)像小的編程挑戰(zhàn)那樣。
D: 對,而且其實(shí)這幾個(gè)點(diǎn)的話,如果我要是猜的沒錯(cuò)的話,大概也就是四個(gè)點(diǎn)、五個(gè)點(diǎn),不超過六個(gè)點(diǎn),都玩一圈的話,整個(gè)這條鏈的底層的知識框架的概念就打通了, 最后是能連起來。
J: 對,最后也起來了。
D: 非常好,非常好,非常感謝 Jan 今天跟我們分享了這么多有趣的故事和經(jīng)歷。太有意思了。非常開心能跟大家分享,我們T eahour有一個(gè)傳統(tǒng)環(huán)節(jié),每次邀請的嘉賓到最后的環(huán)節(jié)都要有一個(gè)叫 pick 環(huán)節(jié),讓嘉賓給大家?guī)硪粋€(gè)他推薦的一個(gè)什么東西,一本書,一部電影,一段音樂,或者說一個(gè)他覺得好玩的東西,帶給大家作為一個(gè)臨別的一個(gè)小小的禮物送給大家,那Jan今天你會給大家?guī)硪粋€(gè)怎樣的 pick?
J: 我就推薦一下。一個(gè)特別好的最好的一個(gè)資料吧,就是說大家有興趣的話可以去看一看 Nervos 的白皮書。那應(yīng)該嚴(yán)格來說應(yīng)該是 Nervos-CKB 的白皮書,是我們現(xiàn)在在做的一個(gè)公有鏈的項(xiàng)目。CKB 的白皮書其實(shí)談到了很多我對PDC 還有 ethereum 的看法,然后也有一些就是說區(qū)塊鏈設(shè)計(jì)上的思考,架構(gòu)上的思考,NervosCKB 其實(shí)就是凝結(jié)了我在這兩年對區(qū)塊鏈思考想出來的一個(gè)設(shè)計(jì),然后包括你們也提到一些有意思的想法,比如說 Common Knowledge Base 這樣一個(gè)東西。
D: 對,我知道這是一個(gè)非常非常厲害的東西。
J: 我覺得這個(gè)我就不多說了,就推薦大家,有興趣可以看一下。
D: 好,那我們要在這賣個(gè)關(guān)子留一個(gè)懸念,因?yàn)樵谖业囊?guī)劃當(dāng)中的話,未來都會給大家錄制一到兩期關(guān)于這個(gè)項(xiàng)目的一些內(nèi)容,我相信也會非常精彩, 非常有趣。那輪到我了,那今天我給大家?guī)淼?pick 其實(shí)是一個(gè)小東西,我有點(diǎn)后知后覺,就是我原來沒有意識到降噪耳機(jī)這個(gè)東西能給我的生活帶來如此大的一個(gè)改善和提升。因?yàn)樵诔霾畹囊粋€(gè)間隙的時(shí)候,突然有一天,我在機(jī)場,在逛一個(gè)像數(shù)碼玩具的一個(gè)商店,然后突然看到有賣 Bose 的 QC30 的一個(gè)降噪耳機(jī),我買了這個(gè)耳機(jī)之后,在我的出行和我的生活中突然發(fā)現(xiàn),我可以隨時(shí)隨地找到一個(gè)讓我的心靈馬上達(dá)到 harmony 的那種境界的一種道具。所以我突然就有一種發(fā)自內(nèi)心的想要去推薦這么一款產(chǎn)品,雖然我知道 Jan 一定會嘲笑我,因?yàn)楫?dāng)時(shí)我說 Jan,你看這個(gè)耳機(jī)非常非常贊,然后 Jan 立馬來了一句,哇,這個(gè)做工實(shí)在是太矬了太丑了,但是它真的很好用 ,真的很容易讓你很快的達(dá)到一種安靜和內(nèi)心的平衡,所以我要強(qiáng)烈的推薦 Bose 的 QC30 這款藍(lán)牙無線降噪耳機(jī),這是我今天的 pick,你要是有反對意見可以保留。好,謝謝大家,再一次感謝大家來給我們 Teahour 節(jié)目,下期再見,謝謝大家!