當前位置:
首頁 > 最新 > Jan×Teahour:從頭擼鏈如渡劫,我的大學沒白上

Jan×Teahour:從頭擼鏈如渡劫,我的大學沒白上

時隔兩年,Jan 再次來到了 Teahour.FM 做客,來跟大家談談他這兩年的故事,以及如何從頭擼一條區塊鏈,我們為本期訪談還取了一個副標題,叫做 "我的大學沒白上",具體是為什麼,請到音頻節目中尋找答案 :D

人物介紹

Jan Xie

Nervos 聯合創始人、首席架構師

秘猿科技創始人, 以太坊基金會前研究者和開發者,專註 Casper 和 Sharding 技術, 以太坊愛好者聯合創始人,Peatio 前架構師。

Daniel Lv

Nervos 聯合創始人

全球最大以太坊錢包 imToken 前 CTO,雲幣網前CTO,Ruby-china.org 聯合創始人。

以下為訪談正文,為更好閱讀,略有刪改

D:Hi,大家好,歡迎來到新一期的 Teahour,我是今天的主播 Daniel。現在坐在我旁邊的,算是我們的老朋友了,他曾經來過我們 Teahour 做客,跟大家討論 Blockchain 和 Ethereum 的問題,他就是謝晗劍同學。Jan, 歡迎你。

J:大家好,我是謝晗劍。

D:我相信,很多熟悉 Teahour 的朋友已經很久沒有聽過我的聲音了。我現在能回憶起來的上一次錄製 Teahour 的時間,大概可以追溯到 2015 年 10 月份。為什麼停更這麼久?你們懂的,肯定有很多原因,時間關係大家可以當做我已經把這些原因都講過了,並且大家也都理解了,所以我們先快進這一段。好消息是,現在 Kevin、我和 Terry 我們三個主播現在都在同一家公司工作。既然我們三位聚在一起,肯定要做點什麼,所以我們決定把 Teahour 重新撿起來,也就是說 Teahour 以後正式恢復播出!當然,也因為我們目前在從事 Blockchain 這個行業,所以我們馬上也會開一個 Teahour 的分支—— Forkit,它會專註於區塊鏈相關的話題。那麼今天,我們請到謝晗劍同學來錄製這新一期的 Teahour ,也是希望我們能夠聯合錄製幾期關於區塊鏈的討論,這幾期會同時在 Teahour 和 Forkit 播出。希望大家能一如既往地支持我們,也多多關注 Forkit。

J:這裡我們說的是 Forkit,Forkit 是非常文明的一個名字。

D:Jan 還記得你上一次來 Teahour 錄製的那兩期節目是什麼時候嗎?

J:我記得,應該是在 15 年底的時候,還沒到 16 年。

D:是的,第一期在 15 年底,第二期在 16 年的年初,1 月份。那個時候,以太坊還處於在國內剛剛起步的階段。我們請你錄製了這兩期節目以後,你知道這兩期節目後來有多大的反響嗎?通過我們後台的數據統計,這兩期節目是我們 Teahour 所有的節目中播放和回放次數最多的,而且我在很多場合都聽到別人跟我提起:「嗨,我就是因為聽了你們 Teahour 的那兩期節目,才理解了 Ethereum 是什麼,並且從此正式入坑」。所以你的那兩期節目真的讓很多人進入到了這個行業中。謝謝你,Jan。

J:聽到這個消息我真的非常開心。我想這也是我們一直想做的事情——把區塊鏈和以太坊介紹給大家,讓大家知道世界上有這麼一個很有意思的東西,這麼看來目的是達到了。

D:在區塊內行業里有一句話叫做幣圈一日人間一年。如果我們掐著日子算一下,那兩期節目迄今為止大概已經過去了 27 個月,如果我們假設每個月有 30 天的話,27×30 是810天。 好,Jan,請告訴我,這過去的 800 年都發生了哪些讓你印象很深刻的事情?

J:OK,因為當時那兩期節目是在 15 年 16 年交界的時候,我們當時是用 solidity 去寫合約的,而且那個時候,你根本看不到什麼文檔,也沒有什麼資料告訴你說,以太坊它的工作原理是什麼?它內部是怎樣一個機制?很多事情你都是靠猜,靠摸索。當時給我的感覺特別像是在七八十年代,你手上有一台巨型計算機,而且它已經是最新的計算機了,你需要用打孔的方式進行編程的,還要進行 debug,使用起來各種不方便。尤其是,像我們的背景都是Ruby 程序員, Ruby 本身就是一個特別高級靈活的強大的語言,這種感覺就像是突然從天堂掉到了地獄。原本你在一個很現代的語言環境裡面生活了很久,突然一下被拉到 70 年代。

D:對,我能理解。那個時候,solidity 這個語言剛剛誕生不久還在發展的階段,而 Ruby 在那個時候可能已經有超過 20 年的歷史了,它的完備性也好,它的生態也好,還有它的工具鏈和社區的知識,以及在生產環境中的大量的打磨,都已經趨於一個非常完善的狀態。回過頭來看,兩年前的 solidity 和 Ethereum 確實存在著巨大的不完整性和開發上的一些不便之處。現在兩年過去了,這一點有改觀嗎?

J:我覺得這兩年過去了,這一方面的改觀非常有限。

D:非常有限?

J:對,可能僅僅是從打孔的時代,前進到了用彙編的時代。在以太坊上,我們很多時候還是要直接去面對EVM這樣一個指令集的OPCODE,包括這個級別的編程和優化。所以很多時候你會發現,用solidity寫出來的合約,可能它的gas消耗很大,對吧?那怎麼辦?那只有直接用彙編去寫,在solidity合約里嵌入彙編的代碼。

D:所以說它還是算非常新,非常早期的。

J:對,這也是當時我會想加入 Ethereum 的這個項目的原因。

D:那你當時這樣的考慮,是以開源的方式去貢獻代碼,還是一個學習的目的?

J:這裡的原因有很多,學習的目的肯定是其中之一,因為只有自己動手做過,才會有最深刻的理解。

D:當時你是以怎樣的一個身份,加入 Ethereum 的這個項目的?

J:我是開源運動的支持者,我從大學就開始用 Linux 直到現在,大概有十幾年了。我一直非常熱愛開源運動、開源精神,參與各種各樣的開源項目。包括我在做 Ruby 程序員的時候,我自己也做過一個開源的項目,叫Ruby-pingying,是把漢字翻譯成拼音的形式,這樣一個庫,還有挺多人使用的。我除了自己做一些開源項目,也給Rails 項目貢獻過代碼,也給其他一些項目貢獻過代碼,所以當我看到區塊鏈的時候自然是非常喜歡,因為無論是 Bitcoin 還是 Ethereum ,它們都是開源項目。當時我想要加入 Ethereum 的時候,其實並沒有想過要很正式的加入或者什麼,我只是想著把代碼弄清楚,把整個技術棧弄清楚,然後自己也能做這樣一個事情。我自己是 Ruby 程序員,我就是很自然地想要用 Ruby 去擼鏈。Ethereum 基金會在一開始做 Ethereum 的時候,一共出了三個版本,一個是 Go-ethereum,一個是 Py-ethereum,還有一個 Cpp-ethereum,用三種不同的語言寫,Ethereum 基金會這麼做其實是為了增強一個分散式系統的健壯性,如果大家都遵循同樣的 spec,用不同的語言去實現,那麼每一個版本犯同樣錯誤的概率是很小的,所以他們想通過這種方式來加強整個分散式系統的建設。

D:所以你當時作為一個 Ruby 程序員,看到基金會在同時支持一個 Go 版本、一個 C 版本,還有一個 Python 版本的時候,你就義無反顧地選擇為基金會貢獻一個 Ruby 版本。

J:對,因為 Ethereum 基金會非常鼓勵做出不同語言的版本,但他們也沒有很多人手和資金去支持,所以我自己花了很多時間去做。

D:好的,這就切入到正題了。這也是今天請 Jan 來和我們一起探討的主題,他當時用 Ruby 去實現了一個 Ethereum 客戶端,這個事情很有意思。我想先問一下,在實現了 Ethereum 的客戶端之後,你是不是就加入了 Ethereum 的 foundation,也就是以太坊基金會?

J:沒錯,在我完成 Ethereum 大概百分之八九十的時候,恰好 Vitalik 在找人支持他做 Py-ethereum 的開發,就是 Python 那個版本。我們都知道,以太坊的一些最新想法,包括 Vitalik 最新的想法、研究的東西都是在 Py-ethereum 上做原型的,所以 Vitalik 其實缺少人手幫他把想法實現出來。

D:所以,你就拿著你做的這個 ruby 版本的實現給 Vitalik 看了。

J:對,我主要跟 Vitalik 說,我願意來做 Py-ethereum 的開發,但我目前也還在做 Ruby-ethereum,所以希望能多給我一點時間,讓我把 Ruby-ethereum 擼完,之後再來加入 Py-ethereum。Vitalik 覺得很好,沒問題。所以我當時是先把 Ruby-ethereum 整個做完了,做完的意思是說當時的 Ruby-ethereum 能夠通過 Ethereum 完整的測試框架。這個測試框架,其實是由大量的測試用例,去保證幾乎完整(99.9%)地符合黃皮書的 spec。所以只要你通過那個測試,就可以證明說你的項目可以 cover 各種 Edge Case。

D:所以,你最後就是拿著這樣一個完整的測試用例的實現版給 Vitalik 看,說我這個 Ruby-ethereum 已經完整實現了,我現在希望能加入到社區,然後 Vitalik 怎麼說的?

J:我印象中,Vitalik 也沒怎麼說,但他應該覺得不錯。至少是很認可我,覺得我對 Ethereum 很懂,很歡迎我加入 Py-ethereum。Vitalik 當時在做Casper的設計,一些早期的POC設計。正好我們之前也做了 Casper,所以我從 Ruby 切到 Py-ethereum 以後,就去做 Casper 了。

D:OK,可以簡單介紹一下 Casper 這個項目嗎?

J:Casper 是以太坊下一代的共識演算法。我們都知道,以太坊最終的目標是 POS 的共識,proof of stake,對吧?但是由於時間問題,包括其他各種各樣的問題,導致以太坊的團隊難以在短時間內形成一個成熟而且安全的 POS 演算法設計。所以,以太坊一開始上線的時候,用的是工作量證明(POW,Proof of work)的演算法;以太坊上線之後,POS 的工作一直在持續地進行和持續地研究,Casper 就是這個 POS 演算法的名字。

D:如果我沒猜錯的話,你 2016 年加入 Ethereum 合作基金會的時候,就已經開始跟 Vitalik 做 Casper 的這個原型的實現了。

J:沒錯。

D:那現在這個代碼,包括當時 Casper 的實現,實際上都可以在 GitHub 上查到?

J:是的,這些都在 GitHub 上。當然 Casper 現在也經歷了很多很多的變化,如果大家去翻以前的關於 Casper 的文章,再和現在的 Casper 比較,你會發現之前的其實是一個過渡版本。我們現在把這個 Casper 叫做 Hybrid Consensus(混合共識),它是 POW 和 POS 兩層疊加起來的共識。而 16 年早期的Casper,是 POC-3、POC-4,其實是純粹的 POS 共識。

D:你有這 一段跟 Vitalik 合作做 Casper 的經歷,肯定能從他身上學到一些東西,和他有很多有趣的討論,這個過程中肯定發生了一些故事,我相信這絕對是個非常值得深聊的話題。先留個懸念,我們可以放在下一次討論。我現在特別想問的問題是,你是唯一一個加入 Ethereum 核心開發團隊的中國工程師嗎?

J:當時肯定是的。現在應該不是了,據我所知,現在應該還有其他的中國工程師在 Ethereum 這個團隊里。

D:嗯,不錯不錯。這也說明了,越來越多的優秀中國工程師開始為國際的頂級區塊鏈項目貢獻代碼,這是好事。但當時很長一段時間內,是不是就只有你一個人?

J:當時的確只有我一個人。在這個領域的中國人還是太少了,所以我也希望大家能夠多參與開源項目,多貢獻代碼,多去參與這些項目,這對你們非常有幫助。至於過去 800 年發生的事情,除了我加入了以太坊,其實還有另外一個關於我自己的。那期節目之後沒多久,我就從原來的公司離職,開始自己創業,成立了一家自己的區塊鏈基礎技術公司,叫 Cryptape,秘猿科技。相信很多區塊鏈行業的朋友都聽說過。現在回想起來,這也是一件非常有意思的事情,當你對區塊鏈有所了解之後,你不僅僅能看到公有鏈很多不成熟的地方,你也能看到區塊鏈並不是整個未來的全部。我們看到的那個未來除了公有鏈,還有很多其他的東西。

D:比如說?

J:比如我們現在大家都很熟悉的許可鏈聯盟鏈。 但是在 16 年初的時候,我覺得大部分人對它是沒有概念的。我記得當時是Tim Swanson,他寫的一篇 paper 詳細地分析了各種公有鏈的項目、金融行業的想法、他們需要怎樣的區塊鏈。你看了之後,你會發現他分析地非常有道理。金融行業或者說我們的社會,有很多記名的資產。

D:記名的資產?

J:也就是說,資產所有權的確定是通過登記的方式來實現的,比如說房產。還有一大類這樣的場景:金融資產、房產債券股票都是記名資產。但是,比特幣給我們呈現的是另一種資產——無記名的資產(Bearertoken),相當於如果你撿到這樣的資產,那它就是你的,比如你在路上掉了十塊錢,被誰撿了這十塊錢就是誰的。

D:對,那這十塊錢就是他的。

J:這樣的資產只需要持有就確權了,它不需要登記。這種不記名資產用公有鏈是挺適合的,因為公有鏈強調匿名性。如果你想要記名資產的話,這時候會有一個很有意思的問題:如果資產都是需要名字的,那就說明這個體系里,我們需要的不是匿名而是身份,只有擁有身份才可能進行記名。這樣的話,我們是否需要為了保證匿名這個設計目標,做很多的妥協,比如我用 PoW 去實現共識,做各種各樣的考慮,對吧? 如果你選擇放棄掉匿名這個性質,去擁抱記名的資產,擁抱 KYCF,擁抱 AML,從根本上來說目標已經發生了變化,區塊鏈的設計思路也應該隨之發生變化。這個時候我需要的不是一個開放的匿名的共識協議,而是一個封閉的記名共識協議。我覺得,聯盟鏈和許可鏈的出現最直接的原因在於,金融行業發現他們現在的很多需求跟公有鏈、跟 cash 其實是不一樣的。

D:很有意思,在 2016 年的時候就已經開始從這個角度去考慮公有鏈和聯盟鏈的場景和關係,算是非常非常早了。

J:是的。那個時候最主要的話題還是比特幣,是我們創造的這一種點對點的支付方式,其實後面的很多東西大家還沒有發現。這也是為什麼我們在創立秘猿科技的時候從聯盟鏈入手,到現在我們依然這樣認為:聯盟鏈或者說許可鏈,它始終是著非常重要的地位。一個是剛才說到的這種原因,因為在很多場景裡面確實需要身份,這非常重要。另外一個原因是聯盟鏈的共識範圍更小,因為公有鏈是一個全球範圍的共識,而我們希望構建的這個網路里有不同範圍的共識,我們希望這個共識的範圍是靈活的,並不是所有東西都要用全球範圍的共識去實現。

D:在過去「800年」的時間裡,你不光是擼了一條用 Ruby 完整實現的 Ethereum,成功加入以太坊的核心開發團隊,並且還創立了自己的 startup,一家提供基於聯盟鏈的解決方案的公司——秘猿科技。哇!真的是幣圈一日一年。

J:是的。

D:我今天想跟你聊的其實是一切的原點。2016 年的時候,是你剛剛開始研究以太坊的時候,你走出的這第一步,就是去擼一條鏈。我們先定一下「擼」這個詞,你怎麼定義「我要擼一條鏈」,這個「擼」是什麼意思?什麼叫擼?

J:什麼叫擼?我覺得程序員應該都能理解這個詞,你每天晚上……這一部分是不是要剪掉?

D:好的,我能用造輪子來?

J:但是我覺得造輪子是個好事情。

D:我比較疑惑,其實區塊鏈是認知門檻極高的。用一個把它完整實現的方式,作為一個切入點去學習,這種方式非常 Hardcode,那你現在還認為它是對的方式嗎?

J:其實有兩個方面,我覺得一個是因為當時那個環境,在 2016 年初的時候以太坊的資料是非常少的,甚至你可以認為當時是沒有資料的。在這種情況下,你想去弄明白它是怎麼工作的,那麼只有一條路——看代碼。但是你看代碼不可能每一行都琢磨很久,一個上午最多看 500 行代碼吧?可能看完就看完了,你不會理解為什麼代碼這麼寫。你只知道最後的結果是這樣,但並不知道為什麼。而且你不會意識到會不會有其他的寫法,對吧?那麼我寫代碼的時候,面臨著 ABC 三條路。

D:如果你沒有意識到他為什麼這麼寫,甚至你覺得你有更好的寫法,然後當你做了一番努力和嘗試之後,大多數情況下你會發現其實現成版本的代碼是非常有道理的,並且可能是最好的或者說最折中的實現。

J:你說的沒錯。如果你不去寫的話,你並不知道為什麼當前的代碼是有道理的。

D:但是在那個時候,你有沒有去評估過,你要掌握 Ethereum 的一些比較內核比較底層的東西,要用 Ruby 重新實現它的工程難度或者工程量?你有沒有在做這件事之前先想明白它大概是什麼樣的體量?畢竟只有你一個人。

J:其實沒有評估。

D:好直接。

J:這就是年輕的好處,我可以什麼都不想,我就覺得:唉呀,我這麼 NB 肯定能搞定它。

D:那你為什麼不挑一個小一點的目標,或者說簡單的目標?

J:比如說?

D:比如 Ethereum 這條鏈包含了很多東西,像 EVM 本身就包含很多。那你為什麼沒考慮先擼一條比特幣?

J:這個也對。主要也是因為我當時對比特幣已經挺了解了。我們之前是做交易所的,也就是貔貅,這是一個開源的交易所。想要做好,你必須對各種各樣的鏈都有一些理解,這樣你才能做deposit 和 withdraw這兩個模塊,你才知道什麼樣的情況下幣算是真的確定地充值到交易所,什麼樣的情況下才是取走了,對吧?這裡面需要記賬,也涉及到資金的管理風險,這就要求你必須對鏈有比較深刻的理解,才會對自己設計的這部分東西有信心。而且比特幣是 09 年的項目,到 2016 年的時候已經發展很久了,它的資料相對齊全,我覺得我對比特幣的理解是相當有信心的。本身比特幣也是相對簡單的,因為它的設計目標很窄——做點對點的現金支付, 這是一個很清晰的一個定位,它只需要 focus 在這一點上,並不複雜。

D:我明白了,結合當時的環境和你的想法,就是要想找一個大的目標來挑戰,而比特幣這個目標有點小。

J:沒有,不敢,我其實非常喜歡比特幣,非常喜歡它的設計。無論哪個方面,Satoshi 還是它的設計本身,都是傳奇。

D:這一點毋庸置疑啦。但是,就算你一開始沒有評估這個工作的工作量,沒有評估實現這麼一個目標需要的規劃,等你真的開始做了,比方說做了一段時間之後,我相信你慢慢地就會有一個清楚輪廓,告訴你正在做的這件事情是怎樣一個體量,或者是怎樣一個規模,對不對?

J:對。其實你做了之後就會發現,這個工作量確實有點龐大,跟我們以前做的各種項目都不太一樣。

D:有沒有沮喪過,萬一做不完怎麼辦?

J:有過,過程中肯定有的。因為這個項目花了我很久的時間,說實話最後也的確沒有完全做完。因為最後的網路協議總是有這樣或者那樣的問題。在一個比較良好的網路環境中它可以工作,但是當你把它放到公網上的時候,你總是會遇到各種各樣奇怪的網路狀況。你也會發現其實網路上有很多奇怪的節點,它不是標準的客戶端,而是改造過的客戶端,總是會給你發各種奇怪的網路消息,你的節點就會因為各種奇怪的原因崩潰,當然你也就很崩潰。另外這個項目也沒有 spec,對吧?你不知道正確的做法是什麼。當時我主要參考的是 Py-ethereum 的實現,當你按照它實現已有的東西之後,你會發現還有很多參考實現之外的東西,你要去 handle 那些複雜的情況,你要花大量的時間去抓那些情況。

D:那假如說從 1 到 10 來去評估你的工作量或者說完整程度,你會給它打幾分?

J:我覺得是 8,我主要對網路協議那部分不太滿意。後來我也沒有太多時間再去一個個跑節點,這很耗時間,而且你需要等。

D:80% 的完成量,我覺得已經非常可觀了。

J:對,其實整個過程非常艱難,遇到了很多坑。這整個項目我估計做了有三個月,這三個月是非常高強度的開發,幾乎是 7×24 小時。我印象特別深刻,那三個月還橫跨了春節,你們可以看我 github 上那個小格子。

D:那個我知道,就是每日的 active.

J:對,那段時間是沒有空白的,包括春節。

D:就是說這三個月的時間,每天都有代碼提交,包括春節?

J:包括春節,那時候是很瘋狂地在做這個事情。

D:我想了解一下當時是一個怎樣的工作狀態,能不能描繪一下?你是全天候在寫代碼,還是說會花很多時間去研究一個具體的問題,找到方案,然後用編碼實現出來。

J:都有,寫代碼是一部分,同時你也得看別人是怎麼做的,還得設計從哪個點開始切入,這是一個很龐大的工程。我記得我最早做的是RLP 的實現,RLP 是以太坊裡面一個序列化的格式。我先做的是 RLP 一個非常基礎的庫,然後用它去序列化反序列化以太坊上所有的數據。RLP 本身是比較簡單的,但是你做 RLP 的時候,你要去考慮怎麼能夠讓上面的組建更好地使用 RLP。比如我可以很方便地序列化一個Ruby object,而不僅僅是做 Ethereum 的一個模塊,很機械地去序列化indeger、stream,導致上層寫應用的時候會很麻煩。因為上層我是用 Ruby 寫的,會有很多高級的抽象,結果在序列化的時候強迫我去用一些低級的抽象進行序列化反序列化。為了解決這個問題,就需要把 RLP 的庫變得更複雜。但是後來回想起來,我發現 RLP 其實是最簡單的,這也是我印象中比較坑的地方,除了我之前提到的網路層。

D:就是你現在最不滿意的這個。

J:對,這個網路層確實遇到了很多問題,Ethereum 也沒有很好的 spec,沒有經驗可以借鑒。

D:網路層也只是其中一點,還有若干其他的?

J:沒錯。第二個我覺得比較坑的地方是,我覺得 Ruby 是有缺陷的,很多密碼學的庫是缺乏的。密碼學的庫,比如說以太坊用的是 secp256K1 這個橢圓曲線演算法,還有那個 sha3,但應該是 Keccak-256 不是sha3。

D:對,Keccak-256。

J:這個地方也很坑,因為在代碼裡面名字都叫 sha3,sha3 是基於 keccak 的一個演算法。但它和 keccak 又不太一樣,實際上以太坊用的是 keccak,不是 sha3。

D:從實現層面上看,keccak 和sha3 其實是等同實現,從安全度和強度來看,基本是差不多的。沒有任何的證據表明哪種更好,但 sha3 的版本經過了一個標準委員會認證,變成了一個語言內置的標準哈希摘要庫,而不是 keccak。但是 Ethereum 好像在選擇使用 keccak 的時候是比較激進的,它所在的那個歷史時間點剛好是sha3成為標準庫之前。Ethereum 選擇了這個演算法,所以就錯過了後面使用正式標準庫的那個版本。

J:對,我也覺得當時應該已經確定sha3,因為它是一個公開的標準嘛,已經確定是走 keccak 這條路了,但當時finallines的標準還沒有出來,而以太坊又必須往前走。所以它選了一個未來大概率會成為標準的一個演算法,其實是並沒有什麼區別。

D:但是 sha3 庫和 kaccak 庫還是不能互換呀?

J:不能互換,但是演算法是一樣的,主要是一些參數上的區別。因為當時標準沒出來,所以沒辦法。也不能算什麼缺陷。但問題在於代碼里的名字都叫 sha3,而實際上用的是 kaccak,所以我在寫代碼的時候很自然地覺得我應該用 sha3 的庫來做,最終你會發現怎麼做都不對。因為它不是 sha3,而是 keccak。

D:當你意識到這一點之後,你會發現那個時候的 Ruby,對於不管是標準還是非標準的密碼學庫的支持是非常有限的。

J:剛才說到兩個問題,一個是以太坊很坑,它其實用的是 kaccak,但所有的命名都是 sha3,你也找不到任何文章,不管 Google 上還是文檔上,在任何地方你都看不到任何提示,告訴你這裡其實是 keccak。這是一個很玄幻的事情。

D:所以當你說 sha3 的時候,我腦子裡第一時間就會彈出來 keccak 這個詞,因為我在這個坑裡面踩了很久。

J:對,後來我記得你在 imtoken 的時候還是其他什麼時候,來問過我這個事情。另外一個事情就是說 Ruby 本身的問題,它的這個密碼學的庫不夠豐富。

D:那怎麼辦?

J:最後我的解決方法有兩種,我兩種路都走了,一種是用 Ruby 實現,我印象中是 Ruby 實現的那個庫,性能不是很好。

D:這我能理解。

J:對,性能不是很好。後來我就又用 FFI 封裝了一個 C 的庫。我把 Bitcoin 倉庫里的 secp,它應該已經是一個單獨的倉庫、一個帶獨立的 C 庫了,然後我再用 Ruby 來 FFI 給它包裝一層。

D:對,我記得關於 Ruby 分裝和基於 Ruby 如何去調用 secp256K1 的這個庫的問題,其實裡面有大量的坑,這個坑又來自於 Bitcoin 的這個庫自己的實現過程。 如果你不是它的核心開發者,你不太會了解這些坑。我記得我在做 imtoken 的時候也在這個層面上跟你談論過很多,但這個是後話啦。反正就感覺你做 Ethereum 的開發,從做應用的開發開始是一步一個坑,對吧?bug drive development,你在做底層實現的時候也依然是一步一個坑。

J:對,非常非常多的坑。我記得當時我試過很多種方案,Ruby 也能夠做。我也封裝過OpenSSL裡面的那個曲線,我記得 OpenSSL 裡面是有 secp 這個曲線的,最後都封裝好了,又發現另外一個比較有趣的地方:Ethereum 用了 secp 的 recovery 的模式,就是把這個 pubkey 給封裝到一個簽名里,在 transaction 裡面是不存 pubkey,只存一個簽名,然後通過簽名來 recover 這個 pubkey。這個事情我不知道有沒有記錯,反正我有這麼個印象,就是說我記得 OpenSSL 裡面是沒有這個功能,然後你如果要……

D:還有一個神奇的 magic number,我記得很清楚,就是當用 recover 模式的時候,你要創建公鑰的話,你要傳入一個 cipher 的 number,當你 recover 的時候也要用同樣的一個 number,用了這個之後你才能正常地把 publicKey 給 recover 出來。我很清楚那是 16 年的事情,因為 16 年的時候我當時也在創業,在跟何斌一起做 imtoken。我們也在這個地方踩了無數的坑,因為 imtoken 做的是錢包,跟 SECP256 這個庫打了很多交道,其實也沒有遇到太多的密碼學的其他的大坑,整體情況還算好。但是遠遠沒有想到,你在做 Ethereum 核心實現的時候,會有遇到這麼多的問題。

J:因為主要是用 Ruby 在做,我覺得就這方面來講 Python 真的比 Ruby 強很多。Python 的庫非常豐富。

D:這個得認,有一說一。回過頭來看的話,你花了這麼多的時間精力在做這個事,那我現在問你個問題,就是手動地去擼一條鏈出來,都需要哪些知識、哪些技術儲備,才有可能保證你有這個能力一步一步地把這條鏈給擼出來。

J:我覺得我擼這條鏈最大的感受就是,大學的時候學的課包括操作系統編譯原理,這些知識好像都能用上,還有像離散數學。甚至說密碼學裡面全是一些數學的知識,需要算來算去。

D:哇!我一開始後背發涼,這個都還給老師了,怎麼辦?

J:雖說遇到了很多困難,但整個感覺太贊了,確實是覺得大學沒有白學。 因為大學畢業之後,花很多時間做的那些事情,並沒有多難,也沒有用到很深的東西。

D:我知道你在做這件事之前,你已經做了很多年的互聯網應用、web 應用的全棧工程師,突然轉到做一個底層的事情,而且三個月就能把 Ethereum 的客戶端擼出來,這個過程是不是覺得很酸爽。

J:肯定是很酸爽。但是我覺得其實我是做好準備的。我之前是有很多 C 和 C++ 的經驗,Java 的經驗我也有,我在大學的時候最喜歡的語言是 C++,我當時還做過很長一段時間的學校BBS 上 C++ 版主,對 C++ 有很多研究。後來工作之後就去用 Java,又慢慢地轉成 Ruby。既然我能用 Ruby 解決問題,我為什麼不用,寫起來又方便。我覺得這個其實是工作所限,工作並沒有給你很多機會,讓你去觸及一些需要的更底層的知識、底層的語言去解決的問題,對,所以這個是……

D:所以你的工作經歷和工作經驗可能沒有太多的儲備或者說積累,能幫助你去做這件事情。

J:對,工作儲備沒有太多幫助。

D:反而大學的時候打下的基礎,和自己在之前做過一些 C 和 C++ 的經驗,會給你帶來一些幫助。我猜可能主要的東西還是你在整個過程中自己邊做邊學掌握的, 而不是事先積累好的。

J:沒錯。主要密碼學這方面可以給大家推薦一下,我相信現在 coursera 上面還有 Stanford 密碼學的課,就叫 Cryptography。還有 Dan Boneh,密碼學大神。當時也是學習這些,確實是覺得很有意思,還把課都做完了。

D:你的這一段經歷確實非常有意思,不管你之前有沒有工作經驗的積累,如果你願意去做 lowlevel,邊做邊學,只要足夠努力並且堅持下來,這件事情依然是可以做到的。至少我覺得對我來說也是可以做到的。你從第一行代碼開始擼,是直到三個月後這個代碼才跑起來嗎?

J:那倒不是,我覺得這個方面其實是得益於十幾年的工作經驗了。工作給你帶來的其實是工程方面的專業度,就是你如何工程化的去推進和實現,這個是大學教不了你的。咱們做 Rbuy 的,就是 TDD 啊,BDD 啊,敏捷開發這些,那一套東西都玩得還挺溜的,對吧?我在做 Ruby-ethereum 的時候,也是把這些工程化的經驗靈活運用。從小的東西開始不停的迭代,不是說我敲完代碼三個月之後才跑幾個東西。是一開始先做到一個它自己能run的某一個狀態,然後再持續的把它變得越來越模塊化。

D:是這樣做。那你回頭來講這個事的話,有沒有大概幾個里程碑的事件?

J:這個,我可能記不得了。

D:那我就問,你是什麼時候做到可以跟主網做數據同步?

J:跟主網做數據同步,是比較後期的事情了。因為網路是最後去做的。

D:一旦你能正常地跟主網做數據同步(大多數的節點只能實現跟主網去同步數據,不需要參與共識。因為能參與共識只有礦池才能做到),它就已經走到了一個相對完備的狀態。那已經是相對後期的事情,我覺得做到這一點上來講的話,應該是一個非常大的里程碑。

J:對,這個其實是比較後期的。前期的里程碑,首先肯定是網路層 mock 掉,就是內存裡面的幾個進程,或者說幾個線程相互之間能通訊就行,模擬幾個節點把網路上給 mark 掉,比如之前提到的 RLP,最早的里程碑可能是你輸入一個 transaction,看它這個序列化之後的格式能不能對上,然後再後面就是去實現這個數據結構,實現這個 block 實現 transaction。然後這些數據結構系列化之後,首先是 RLP 的這個格式的數據都對的上,然後第二就是簽名,交易的簽名,這個牽出來的簽名都沒問題,然後也可以驗簽也可以 recover。 這個 pubkey,然後各種各樣的事情都能做。再然後我覺得應該就是 EVM,就是說你怎麼去處理這些交易?怎麼樣去 process 一個 log,怎麼樣去 process 是一個 transaction,然後這裡面必然會涉及到你要去實現 EVM,然後實現 EVM 就是說必須得力贊一下這個以太坊這個測試框架,以太坊有一個倉庫叫 tests。就在 ethereum 這個 orgnazetion 下面有個倉庫叫 tests,它裡面是包含了可能有至少是萬這個數量級的吧,萬還是幾十萬,還是多少,幾十萬的這種 future。就是測試的這個用例。ethereum tests 也是一個就是說跟語言無關的一個測試庫,它測試用例都是用 json 寫的,然後會詳細的說明就是輸入是什麼?輸出是什麼?然後交易是什麼?所以如果你去實現 EVM 的時候,你就是說把輸入丟給這個 EVM,把當前的這個 workstep 丟給 EVM,然後對比最後產生的新的 workstep,然後你就可以知道你的這個實現是否能夠通過這個測試或者說是通不過這個測試。這套東西是非常有幫助的,對你實現 EVM。到這個階段的時候,其實你就是不停的去死磕那些測試一個一個的過,我可能改一點東西。過了一百個測試,再改一點,過了 1000 個,再改一點過了 1 萬個,再改一點,只能過 5000 個了。

那很有意思,這個 progragh 的話通過測試反饋是有可以感覺到的,它是個進度條,到最後的話把所有的測試全部都能過去,我們 EVM 就是 fully compatible.我記得就是百分之百通過的時候我是非常非常興奮,然後還發了條 twitter。 然後我另外一個很興奮的是說我的 Ruby-EVM 的實現比 Py-ethereum 的 EVM 快很多。

D:為什麼?是因為你做了很多的優化嗎?

J:為什麼?我覺得跟程序,跟代碼的寫法有一些關係。肯定有優化,有各種各樣的原因。

D:所以性能好不好,主要看架構,而不是看語言。

J:對,架構非常重要。

D:架構非常重要。

J:其實語言程度上 Ruby 可能還慢一點。

D:那共識協議這一塊呢?當時在做的時候有沒有遇到什麼問題,或者有什麼坑在裡面?

J:共識協議還好,我猜應該是在 EVM 之後去實現的,這個是 POW 那部分,那是一個單獨的倉庫,叫 Ethash,那個演算法叫Dagger Hashimoto 演算法,然後我記得我是先用 Ruby 實現一遍,生成 DAG,一個大的文件,再用各種各樣的方法去生成,去找到 nonce,然後用 Ruby 實現了一遍,發現 Ruby 還挺慢的,感覺我最後做出來的這個東西可能不太實用,所以後來就把 Ruby 擱到一邊了。後來又去封裝了一下,C++ 裡面實現的Ethash 演算法,用 Ruby 封裝之後我發現這個效率還可以。所以當時確實是奔著希望做成一個實際可用的客戶端去的。 最後在 Ruby-ethereum 裡面,其實這兩個實現都支持,為了這個實現我還把介面抽象了,你可以指定用 Ruby 的 ethash,還是要用 cpp 的 Ethash。

D:也就是說,你選擇了兩個實現都支持的方式,一個出於研究目的,一個充分考量生產環境?

J:對,不只是研究目的,我是真的想讓它跑起來。

D:OK,因為在一些部署環境和生態環境的時候,最少的對於 C 啊或者說是對於其他類型的庫,外部依賴最容易方便你部署,那整個過程聽起來從頭到尾都是 Hardcode,是非常 hard 的模式。

J:對,其實遇到挺多問題的。

D:讓你覺得最難的就是網路層。

J:對,這是一個很有意思的現象,在整個分散式系統中這個領域都是成立的,網路會帶給你很多不確定的驚喜。因為我們之前做的都不是分散式系統,它們都是一個受控網路環境內的系統,你其實是在跟大概率確定的事情打交道。當你在一個分散式系統中,尤其是在公有鏈這樣一個開放的環境里,你是在跟不確定的事情打交道,這是一個非常有意思的轉變。很多以前做互聯網服務的開發者,當他轉到區塊鏈的時候,很多人的 Mindset 可能會有一段時間轉不過來,因為你已經習慣了,習慣了假設大家都是好人,但其實我們現在的編程環境里大家都是壞人,你必須適應公有鏈的這個環境。這裡不僅僅有 51% 攻擊那種高成本的事情,在網路層在你們看不到的地方更是暗流涌動,有各種奇怪的事情。想像一下,在 16 年還是很早期的時候已經是這樣,那現在更是這樣了。 所以你能看到各種各樣黑客事件的發生,這個絕對不是偶然。不是偶然。不是偶然。

D:經歷這麼一個 Hardcode 模式,你在整個實現過程中會不會有 depletion、壓力甚至會伴隨著沮喪。然後少有的完成了里程碑以後,讓自己非常非常開心。

J:沒有沮喪,這個我記得很清楚,整個過程我都很興奮。

D:整個都很興奮?

J:對,全程都是很興奮的,否則我也會覺得沒有動力,否則我也不會大過年的時候非得去擼代碼。這個事情我印象特別深刻,就是那種特別值得的感覺,你知道嗎?覺得自己的大學四年沒白活,終於找到有意義的事情。

D:為了給大學四年一個交代,這也太……

J:我覺得這跟個人性格有關吧。我覺得我做很多事情沒有太多特別的目的,可能人生有意義的地方就是在於,你做的那些沒有什麼目的的事情,而它常常會帶給你很多驚喜。這是我自己的一個看法。

D:嗯,收穫肯定是蠻多的。

J:收穫很多。

D:那我們講講,你現在能深刻體會到的做這樣一個事情最大的收穫和最大的改變。

J:我覺得最大的收穫是對創業的幫助吧。

D:對創業的幫助?

J:對,這個過程讓我看到了一個未來的世界。首先你去擼這個鏈的時候,你會做大量的研究,不僅僅是擼代碼,你會看很多很多的東西,包括你會去思考很多事情的本質,也會去跟別人交流。在這個過程中我也很幸運地認識了 Vitalik,很幸運地碰到了以太坊那個團隊的人,和他們交流,了解他們的想法,他們怎麼看待未來。這一點對我的幫助非常非常大,也讓我非常開心。

D:認知升級了。

J:前面說大學沒白學,因為你會看到一個技術佔有非常重要地位的未來。通過技術、通過科技能夠改變很多事情,能夠實現很多事情,你會對此很有信心,你也會去很堅定地往那個方向去走。

D:我現在決定把這一期的 podcast 放出去之後,它的標題就叫作:我是如何擼出一條以太坊的區塊鏈的。

J:我是如何擼的?

D:對,「我是如何擼的」,副標題是「我大學真沒白學」。整個這個過程你是在一種很微觀的層面上,在非常 detail 的 lowlevel 上跟代碼打交道,跟協議打交道,把整個這一部分走了一遍。最後跑通之後,你告訴我,你的結論是你看到了一個更好的或者說更理想的技術的世界。這讓我覺得挺不可思議的,非常有意思。

J:因為區塊鏈真的是一個非常大的概念,裡面涵蓋的學科和知識很多。就計算機方面,分散式系統、密碼學、P2P 網路,編譯原理、編譯器,各種各樣的東西你都能涉及到,還有經濟學博弈論等等。你研究得越多,你會發現其實它研究的是我們的整個社會,研究我們的人類社會系統是怎麼運作的,這把你的視野變得非常開闊。還告訴你,這個世界上有這麼多很好玩的東西,而且他們在某種程度上是相通的,比如計算機系統架構方面的設計,你可以對應這個人類社會的系統的設計,它們之間有哪些是相同的,有哪些是不同的。這樣一整套東西混在一起,你會發現:哇,還有這麼多有意思的事情。還有另外一點,當你能夠看清楚那個未來、了解底層的很多細節和現狀的時候,你就能夠明白,未來和現在之間的 gap 有多大?未來非常美好,但它離我們真的挺遠的,中間有很多很多事情要去做,那麼這個未來會是你一個很堅定的目標,它是你要去實現的那個東西,你必須得想出一條可行的路徑出來,你必須一步一步走過去,甚至中間會有一百步一千步一萬步。我們現在離那個未來還很遠。這個對創業的幫助是非常大的,我就會很實際地去找那條路徑。

D:作為一個曾經的創業者,我對這一點感受非常深刻。尤其是對技術型創業,在一個有很多不確定性的環境下,如果你是認真地扎進去,探索得很深的時候,對底層的理解很深刻的時候,你再浮出水面,再看一下未來,你對之前走過的道路感觸會尤其深刻,這個很難去解釋。我們做技術創業的時候,這種情況真的是一而再再而三地發生。

J:其實這個也決定了,為什麼我們會選擇從許可鏈到公有鏈這樣一條路徑。當我去參與 Ethereum 的開發,參與各個層面的開發之後,會很容易認識到:許可鏈,從技術上來說確實容易很多。畢竟許可鏈是在一個許可的環境裡面,它的不確定性沒有那麼大。那麼很多事情做起來就方便很多,包括架構的設計、細節的設計方案。但是公有鏈其實非常難,它各個方面涉及的東西遠遠超過很多人的想像。在你準備不足的情況下,貿然去做這樣一個事情,是很難、風險很高的。所以,我們會選擇一個相對簡單的點、一個場景去切入,通過這樣一個事情去培養我們的工程團隊,加深我們對區塊鏈的理解。等準備充分之後,再去做公有鏈,這是一個更加可行的路徑。

D:我非常認同這一點。你通過擼鏈獲得的感觸,影響了很多人,包括我們自己的工程師,和那些希望在區塊鏈這個領域中做點事情的廣大的優秀工程師,鼓勵他們試著從擼鏈的角度去學習和認知區塊鏈這樣一個嶄新的事物,我覺得這點非常好。如果,讓你重新做一遍的話,基於你現在的這個工作,還有什麼地方你覺得可以改進和提升?

J:我覺得網路肯定是一個,再說我滿意的部分,我對 EVM 這個部分是挺滿意,因為有很多測試。

D:還有很好的性能。

J:對,還有很好的性能,我覺得挺開心的。如果說要改進的地方,讓我再做一遍的話,我希望架構上有一些新的東西放進去,怎麼說呢?因為後來我發現一個問題,以太坊的哲學其實是通過硬分叉來升級。那麼硬分叉以太坊裡面,硬分叉這個模式基本的一個設計模式是什麼?是說我指定一個區塊號。在這個區塊號之前,我是怎麼樣一個處理邏輯,在這個區塊號之後區塊高度之後是怎麼樣一個處理邏輯,代碼裡面有不少if...else 這樣硬編碼的東西,這個是我當時很受不了的,但是又沒有想到很好的方法就衝上去了。如果我再做一遍 Ruby-ethereum,我一定會想辦法把它處理掉,避免這些 if...else,用一個比較優雅的方式去處理。

D:我能明白。其實 ethereum 每一次大的版本升級,從 Frontier 到 Homestead,再從 Homestead 走到下一個階段的 Serenity 都是有這樣的 if...else,在那個區劃版本號之後的話,完全轉那一套新的代碼,但是在高度沒有到那一塊或者投訴的時候,它要去執行老的代碼,就說老的代碼、新代碼向兩份拷貝通過 if...else 把它給去隔開,確實是一個在看代碼的過程中非常非常覺得有點不舒服的地方。我明白你的意思。

J:所以我們現在做底層也會反過來想,就是說如果我們以後要硬分叉,或者如果我們要有一些其他不同的一些 Carments 方面的設計的話,底層需要去怎麼樣做一些比較漂亮的支持,就是說不是每次 if...else 這種方式,然後可以用一個比較優雅的方式來處理這些問題。其實現在也會反過來這樣想。

D:其實有一點我是知道的,但是可能很多聽眾不知道,可能聽到現在很多聽眾只是覺得你用 Ruby 把以太坊的客戶端重新擼了一遍,但其實你應該說是做鏈這件事的話,你擼了不止一遍,對不對?到底擼過幾遍?

J:對,Ruby 是一遍,然後最後確實還有做過一些其他的事情,但至少說在python 那邊,就是加 入ethereum 之後,用 python 其實就寫很多,包括寫 Casper 很多東西。就三四遍吧!

D:三四遍。Ruby、Python,還有秘猿的CITA這個產品的技術架構主要是 Rust 的語言,對吧?然後也就相當於,其實已經是不管是 Ruby、Python 都做一遍,其實你是最有資格的去評判不同的語言在做這件事情或者一些差別,為什麼沒有 Go?

J:我說一下,就是說我們選擇這種語言的考慮吧,其實 Python 和 Ruby 非常好理解。Ruby 是因為我自己的背景,然後覺得需要有一種新的一個實現,然後Python 其實很好理解,就是 Ruby 和 Python 其實都一樣,就是說做原型很方便,然後反正功能有了,功能可以很快的實現出來。這個就是它最大的一個目的,就是用 Ruby 和 Python 最大的目的,然後用 Rust 沒有用 Go。我覺得有幾個方面的原因,就是說可能 Go 是一種有 GC 的語言,我們希望追求的是最極致的一個性質。這個 GC 和最極致的性能是有衝突的。我希望的是不僅僅在架構上,我們可以去實現高性能。我們在這個架構的每個具體實現的細節裡面,我們也去追求最高的性能,我們想做的是一個最極致的東西,就是世界第一。我們做 CITA 的時候,目標就是世界第一。然後我們也覺得我們能做到這一點。然後我覺得現在 CITA 確實是性能,我沒有覺得有誰性能比它好。我覺得其實這方面是有影響。然後另外一個原因是說,Rust 是一種比較現代的,吸收了很多現在語言特性的語言,我非常喜歡它的設計,就是因為我在做 Ruby 程序員的時候,其實花了很多時間去研究 haskell。非常喜歡 haskell,haskell 是一種非常數學非常純粹的一種語言,它是 funtional,然後追求 pure funtional program。haskell 的這個哲學就是說 avoid success at all costs,它是一個很學術派的語言,我不想成功,我就是要美,我就是要漂亮,這就是我的哲學,所以說haskell就是它的美是讓你震撼的那種,就說哇你太美了。但是你要我用到工程裡面,我會覺得好像有點過了,對吧?因為這不是你追求的東西,但是 rust 出現就讓你覺得這個東西就是我想要。就是我把 haskell 還有 ocaml,就是說是近 10 年 20 年這個類型系統這方面的進展,研究成果都吸收過來,然後我又去追求 C++ 的這種性能,我又去結合一些 funtional 的東西,這個我覺得,哇,完全就是你怎麼知道我是怎麼想的,就這種感覺,我想的就是這個東西,你把我想的東西全都做進去了,這東西太牛逼了。當你看到就是說你在 Rust 裡面是可以寫非常高階的一些語法,然後你看到它看起來像 Ruby。通過編譯器的一些技巧,把它編譯成一種非常高性能的彙編代碼的時候,你會覺得這個東西太 nb 了。所以我覺得這是為什麼 Ruby 社區有很多人轉向 Rust,包括我們認識的 Yehuda,超級大省神,直接去搞 Rust。

D:反正我自己也非常非常喜歡,然後最近也把自己就是,我說這話有點政治不正確,因為我本人還是 Ruby 社區的一個管理員,這一段我不能放

J:反正我是覺得我肯定是個 Rust 吹了,但是我覺得 Rust 和 Ruby 是這個非常有血緣關係的語言。為什麼呢?

D:因為他們都姓 R。

J:說對了一半。還有因為他們前兩個字母是都是 RU,是不是說對了一半。然後這是一個方面吧,就是我覺得 rust 它非常好。然後第三個方面是我覺得它非常有潛力,這個有潛力是幾個方面,首先 rust 本身是有一個社區推動的一個語言,這個事情本身和區塊鏈是非常契合的。區塊鏈的項目其實也是社區推動,然後通過比如說 EIP 啊 BIP 啊這些提案去推動,Rust 其實也是Mozilla 基金會支持的一個項目。然後它有一個 Rust 社區,然後有在 Rust 裡面叫 rust-RFC 吧,也是各種提案去推動這個語言的演化,通過社區的力量去推動,對這個我非常喜歡,我覺得就是說開源項目還有就是社區的力量是非常非常強大的。雖然說它一開始可能給你的感覺很弱小,就是它的這個產品給人感覺很弱小,但是它的生命力是非常旺盛。它是個開放的語言,它有一個開放的社區,它的整個的這個 Rust 背後的這套工程上的東西,流程上的東西,我覺得做得非常好。

D:你們在秘猿通過用 rust 重新實現了這一套叫做 CITA 的這一套聯盟鏈的blockchain solution,這一整套的代碼和這個產品的話,在 GitHub 上都是開源的都非常好,那如果要是在這一點感興趣的聽眾的話,也可以線下的去 GitHub 上做學習和研究,我覺得這個非常好。我們以前談了這麼多,從你們當時做鏈的這一段經歷和收穫,從 Ruby 到 Python,再到 Rust,然後三遍到四遍做鏈,哇,你真是一個做鏈方面的專業戶,anyway,這是一個褒義詞,我們今天這個 podcast 的話也要接近尾聲了,其實我還有最後一個問題,通過自己手擼一條鏈出來,然後讓它能 work 能 function,去跨界的一個非常好的方式。那麼如果我們都相信這一點的話,能不能給一些後面如果還想通過這種方式去學習的這些人和一些工程師們一些建議和一些意見?

J:我覺得其實現在來說,擼一個鏈其實確實是比較 Hardcode 過程,就是說時間成本是比較高的。但是我覺得學習的效果是最好的。這個我覺得看在於每個人自己的取捨,所以我前面也說了,你如果要是擼一個完整的一個實現的話,我覺得現在可能還是會需要當初那麼多時間。因為一個方面來說,你能獲得的資料更多,能參考的東西更多,但是另外一個方面來說,以太坊和不管什麼鏈,它其實都是在一直發展的,就是說我如果那個時候是在兩年前,它後面又比如說硬分叉,又加進很多東西,又有各種各樣的東西,然後網路上有各種各樣的進化,這個網路協議層,當時的比如說什麼什麼版本,現在跳到什麼什麼版本。

D:它的黃皮書也是在更新。

J:對,其實你要做的事情是越來越多的,那麼我覺得工作量可能不會差太多,可能不會差太多。所以這個還是比較花時間的。那麼另外一個簡單一點的事情可能就是說,你可以擼一個簡單版本的鏈,就是它不一定是說要走向生產要完全兼容的,而是說大致的一個區塊鏈的概念,它是一個原型,對吧?它麻雀雖小五臟俱全的那種感覺的原型,就是有挖礦,有交易,有 block,有幾個節點可以連在一起,然後連起來之後就可以不停地挖礦出塊,然後各種各樣的東西,做到這一步也是很有意義。然後還有一點就是說你不一定要做一個完整的東西,但是你可以在裡面選一小塊出來,寫一寫。我覺得這種也是挺有意義的一種練習吧,比如說 RLP,或者說我要實現這個 merkeltree,或者說我去實現 Local Patricia-Tree,就需要去做這種小的點,其實你弄明白之後,也是很有意義的。我能想到的剛才講的還有就比如說錢包裡面的這個私鑰的加密。

D:那個 ethereum 的這個 keystore V3 這個協議加密。

J:有很多小的點,就有點像小的編程挑戰那樣。

D:對,而且其實這幾個點的話,如果我要是猜的沒錯的話,大概也就是四個點、五個點,不超過六個點,都玩一圈的話,整個這條鏈的底層的知識框架的概念就打通了, 最後是能連起來。

J:對,最後也起來了。

D:非常好,非常好,非常感謝 Jan 今天跟我們分享了這麼多有趣的故事和經歷。太有意思了。非常開心能跟大家分享,我們 Teahour 有一個傳統環節,每次邀請的嘉賓到最後的環節都要有一個叫 pick 環節,讓嘉賓給大家帶來一個他推薦的一個什麼東西,一本書,一部電影,一段音樂,或者說一個他覺得好玩的東西,帶給大家作為一個臨別的一個小小的禮物送給大家,那Jan今天你會給大家帶來一個怎樣的 pick?

J:我就推薦一下。一個特別好的最好的一個資料吧,就是說大家有興趣的話可以去看一看 Nervos 的白皮書。那應該嚴格來說應該是Nervos-CKB 的白皮書,是我們現在在做的一個公有鏈的項目。CKB 的白皮書其實談到了很多我對PDC 還有 ethereum 的看法,然後也有一些就是說區塊鏈設計上的思考,架構上的思考,NervosCKB 其實就是凝結了我在這兩年對區塊鏈思考想出來的一個設計,然後包括你們也提到一些有意思的想法,比如說 Common Knowledge Base 這樣一個東西。

D:對,我知道這是一個非常非常厲害的東西。

J:我覺得這個我就不多說了,就推薦大家,有興趣可以看一下。

D:好,那我們要在這賣個關子留一個懸念,因為在我的規劃當中的話,未來都會給大家錄製一到兩期關於這個項目的一些內容,我相信也會非常精彩, 非常有趣。那輪到我了,那今天我給大家帶來的 pick 其實是一個小東西,我有點後知後覺,就是我原來沒有意識到降噪耳機這個東西能給我的生活帶來如此大的一個改善和提升。因為在出差的一個間隙的時候,突然有一天,我在機場,在逛一個像數碼玩具的一個商店,然後突然看到有賣 Bose 的 QC30 的一個降噪耳機,我買了這個耳機之後,在我的出行和我的生活中突然發現,我可以隨時隨地找到一個讓我的心靈馬上達到 harmony 的那種境界的一種道具。所以我突然就有一種發自內心的想要去推薦這麼一款產品,雖然我知道 Jan 一定會嘲笑我,因為當時我說 Jan,你看這個耳機非常非常贊,然後 Jan 立馬來了一句,哇,這個做工實在是太矬了太丑了,但是它真的很好用 ,真的很容易讓你很快的達到一種安靜和內心的平衡,所以我要強烈的推薦 Bose 的 QC30 這款藍牙無線降噪耳機,這是我今天的 pick,你要是有反對意見可以保留。好,謝謝大家,再一次感謝大家來給我們 Teahour 節目,下期再見,謝謝大家!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 以太坊愛好者 的精彩文章:

權益證明,私鑰攻擊與無法偽造的奢侈
以太坊 Mist 瀏覽器的未來:分層節點及其它

TAG:以太坊愛好者 |