編者按:本文系祕猿科技區塊鏈工程師蔣金洋講師,在由掘金技術社群主辦,以太坊社群基金會、以太坊愛好者與 ConsenSys 協辦的《開發者的以太坊入門指南 | Jeth 第二期 - 杭州場》 活動上的分享整理。Jeth 圍繞以太坊技術開發主題的系列線下活動。每期 Jeth 會邀請以太坊開發領域的優秀技術團隊和工程師線上下分享技術乾貨。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
本場分享視訊回放連結(B 站)
我先自我介紹一下,我是祕猿科技區塊鏈工程師蔣金洋,這次的主題是如何實現一個簡單的以太坊。我之前從事 Web 開發和雲端計算的開發,對第一次接觸以太坊是在兩年,作為技術人員不僅是看重以太坊這種貨幣,我們更要看重區塊鏈的這一代技術。
說實話,加密貓最火的時候我是比較失望,以太坊寫的是去中心化的全世界的計算機,但居然有人用來做貓。隨著我深入對以太坊的瞭解和學習,我看到很多 APP 一步一步去履行以太坊的使命,深度使用去中心化的功能,比如 the DAO 這個專案。
DAO 這個專案雖然因為智慧合約有漏洞掛掉了,但它因為使用智慧合約的 DAO 這一功能讓我眼前一亮。DAO 是指去中心化的自治組織。在 the DAO 這個專案上面,我用我的私鑰可以給這個專案轉一筆資金,獲得相應的投票權,投票權來表決我的資金投在哪個地方。雖然 DAO 最後也掛掉了,但是它相較於加密貓在技術上跨出了一大步。
去中心化交易所
去中心化交易所大家或多或少聽說過,但是去中心化的交易所原理是用智慧合約保證其安全性。我們假設現在有一個設計良好、使用了智慧合約的去中心化交易所,理論上面我的資產放在交易所裡面交易,可能這個交易所有一部分的中心化的服務幫助我匹配交易的過程,但是這筆錢永遠是通過我的私鑰以及以太坊智慧合約來控制的,這樣資產永遠在我的手中。
智慧合約和 Web 3.0
通過這些事例來說,我感覺智慧合約和以太坊 Web3.0 的概念名副其實。剛才提及的兩個例子中有兩個特點:
- 資金和機制公開透明,比如 the DAO 這個專案;
- 給使用者更多權力 我身為一個使用者我可以百分之百控制自己的資金的權利,這在當下的 Web 中心化服務裡面是一種奢望。
Web → BlockChain
Blockchain
區塊鏈是一個 Web3.0 的平臺,現在參與到當中,就是在建立下一代開發者使用的平臺,這個對於我來說是最大的吸引力。
祕猿科技
最早聽到祕猿科技時,給我留下了深刻的印象,因為這家公司的專案和主要產品都在 GitHub 上開源,包括錢包和區塊鏈瀏覽器,而且 License 相當得開放。這也意味著我要是使用他們的程式碼,我不需要支付費用,為了瞭解這家公司如何運營,我決定加入進去看看。
還有一點,我聽說祕猿科技他們是被稱之為少林寺,我當時在想為什麼是少林寺,是不是公司裡面沒有妹子,都是男的。這個誤會很快被揭開:少林寺的寓意就是“天下武功出少林”,祕猿也確實在當下的區塊鏈生態中培養出了一大幫像峨眉、武當這樣的門派,為區塊鏈事業做出了自己的貢獻。
面試:Web → 區塊鏈
我去祕猿科技參與面試,當時比較尷尬我是 Web 出身,對區塊鏈中的區塊、共識等概念只是有所耳聞但瞭解不深,所以面試的時候心裡沒有底。當時我應聘的是 Web 開發的職位,好在我們有試用期,我給自己打氣,要是能在試用期內把知識都研究透就可以轉到 BlockChain 的開發方向這是我列舉 Web 開發和 BlockChain 開發在技術棧上的區別,右側的也就是你要進入 Web3.0 平臺需要的技術。
區塊鏈工程師的祕密
在我面試的時候,當時的老闆提醒我,祕猿科技的區塊鏈工程師之前也是很多都是搞 Web 出身的,有個祕密可以讓你很快學會區塊鏈的開發,這個祕密叫做擼鏈。擼鏈就是自己做一條區塊鏈出來,我們很多同事做過一些比特幣和以太坊的實現,在這個過程中相當於你從 Web 技術棧,走了一條很長的路轉到 BlockChain 技術棧,這時你已經做出來區塊鏈了,不必再問自己有沒有資格去做區塊鏈。
擼鏈的權衡
擼鏈的好處在可以成為以太坊的專家,我當初下決心要擼鏈時,選擇了第二代區塊鏈的以太坊而沒選擇第一代的比特幣。
這個是我們公司的擼鏈文化,最早開始擼鏈的是我們的 CEO。我當時問他著手搞以太坊有沒有什麼價值和意義,因為需要兩三個月的時間成本且不一定能搞出來。他告訴我說,擼以太坊是困難模式,他鼓舞我說,如果你能擼出來一塊以太坊,代表著你對區塊鏈的理解能達到我們公司 TOP 5的水平。我的考慮是去做還是不去做。老闆後來又在公司內說到,誰能實現以太坊,工資翻倍。本著幫助領導分憂,幫助老闆花錢的理念,我決定還是要去做以太坊。
我剛開始做到現在過了三個月的時間,三個月時間不到給大家展示一下做成什麼樣子。以下是我的 GitHub 專案主頁(https://github.com/ciri-ethereum/ciri)截圖:
難度曲線
在做的過程當中,我有這樣的一個難度曲線,一開始是以太坊的 Wiki,在 Wiki 上你可以找到所有的以太坊資料的入口。你要實現以太坊核心的話,需要查閱由以太坊的技術合夥人撰寫的以太坊黃皮書,書中你可以看到大量的公式,這個時候你感覺非常非常困難。眾所周知,以太坊是一個仍在開發的專案,它沒有固定的規範,可以理解為以太坊的規範每天都在變,很多情況下你需要除錯你的客戶端,這樣你才能理解當前的實現。黃皮書是一個巨大的門檻,當你把黃皮書看完後,理解現有的以太坊的實現,剩下的事情還有很多,但難度降低了不少,剩下的花時間即可完成。
以太坊測試專案
設定鏈的初始狀態
我介紹一下這個叫做 以太坊 tests 的 GitHub 專案,剛才我們提到以太坊的規範一直在變動,這個專案是唯一一個在追蹤以太坊規範變動的專案。
大家看一下專案的目錄,頻繁更新的也就3-4個目錄左右,裡面集中幾千條測試。下面我簡單介紹一些測試:
- BlockChain 的測試,主要涉及以太坊區塊的驗證、還有一些比如 POW 的其他測試,這是在測試共識演算法。
- RLP 測試,RLP 是以太坊的一個編碼庫,類似於 json 但是以太坊選擇 LP 作為格式。
下面給大家展示 tests 這個庫怎麼執行的,如何確保實現的就是以太坊。
- 設定鏈的初始狀態
它的原理很簡單,一開始給我一個 json 格式檔案,檔案中是它的初始狀態。右邊圖裡就是它的格式了,有我們平時可以看到的錢包的地址;balance 是錢包的餘額;code 為空的地址代表的是一個錢包,而不是一段合約,如果是合約的話他有一段程式碼;storage 是我們合約裡儲存的一些資料。下面這個地址就是真正的一條合約的地址。我會根據這段資料設定鏈的初始狀態,把這一段資料塞進去。
- 輸入塊資料
第二個部分它會提供一些輸入。我舉的這個例子是 BlockChain 的,塊包括塊頭和一大堆的 Transaction,這時輸入到測試中實現,這時它會根據裡面的內容執行相應的合約。
- 檢驗處理完塊後的狀態
轉賬和呼叫合約在以太坊裡面都是以交易的形式呈現的這個過程當中就是相當於一個計算機的初始狀態,這個狀態要變化,我驗證一下變化完的狀態跟測試的時候狀態是不是一致,如果是一致證明通過這個測試。
這樣的測試一共有8000多個,我的專案目前現在通過過了5000多個,還有很多以太坊 fork 的規則沒有處理,所以剩下的測試應該還是比較容易通過的。
其餘成果
我在 GitHub 上釋出了用 Ruby 語言便攜的 RLP 編碼庫,叫做 ciri-rlp。同時我們公司很多後臺是用 Ruby 寫得,同事用 ciri 庫解決了加密問題。
如何實現以太坊
思考與建議
- 關於以太坊的規範
- 開源專案如何吸引開發者的思考
如何瞭解以太坊的規範
正如我前面所講,以太坊目前沒有完整的規範,儘管如此以太坊的規範是非常有用的:第一點,你想要實現一個客戶端你一定要去了解這個東西;第二點,如果不實現客戶端,你想要做以太坊相關的開發,比如說你可能去開發一個 imToken 這樣的錢包、區塊鏈的瀏覽器和其他以太坊周邊的東西,你也需要了解以太坊的規範。有時你只是看了 Wiki 和文章整理上的規範,是不足以讓你實現這個東西。
我以 DevP2P 作為一個例子,它是以太坊的一個底層網路元件,它會以 P2P 的方式跟節點進行連線,與上層應用實現隨意通訊。
我們從這三個地方可能找到尋找 DevP2P 的認證規範。
第一個是 Wiki ,它相當於是一個以太坊所有資料的總入口,但在裡面可能找不到特別詳細的東西。幻燈片右側截圖是 Wiki 上 Libp2p 的介紹,它會告訴你 Libp2p 是什麼東西。但這裡只是告訴你是什麼,沒有詳細告訴你如何實現。
第二張圖是 Devp2p 的協議,Libp2p 其實就是 Devp2p,但它沒有將非常規範的方式告訴你,所以你只看協議是實現不了。黃皮書實質上是以太坊 EVM 的規範,它裡面寫的是 EVM 的東西,但網路部分的話在裡面是無法找到的。
除此之外你還可能找的就是 EIPs,它是一個由社群驅動的以太坊提升提案。如果你發現以太坊做得不好,我可以提升他,你可以先提交一個 EIP,如果官方覺得 EIP不錯 會分配 EIP 的編號,社群裡的其他成員在裡面討論這個東西,並最終實現這個提案。我們現在以太坊大部分的規範是放在這裡,你一定要去找 EIP 的東西。
可惜的是,在 EIP 裡也沒有對 Devp2p 非常詳細的規範,這個時候使用從官方的客戶端裡面去看它的程式碼並且去除錯。
這裡我們可以使用 Geth 來完成,我當時實現就是利用這個方法一段一段把 Geth 收到的資料一點一點列印出來。然後進行對比。
開源專案如何吸引開發者
接下來我想分享的是開源的專案如何吸引開發者。開源專案的關鍵:一堆人做這個專案可以決定這個專案能不能開始,如果想要持續下去,必須讓更多人的力量投入到其中,包括以太坊也是如此。
這是以太坊官方支援的客戶端,py-EVM,另一個是我實現的,Ciri,這個時候我要考慮的是如何增加參與者,這需要各位的幫助。如果各位對實現以太坊感興趣,想多瞭解以太坊的原理,最好的方式是自己去實現一下;第二個好的方式大家參與專案一起來做;還有一個就是大家如果不是想了解以太坊,可以幫忙給我的 ciri 專案點贊,這也是對開源專案的一種幫助。
降低開發者參與門檻
- 開源方式管理專案
我做的過程當中,我對比下來,我發現有很多東西還是缺乏的.在座的各位都是程式設計師,如果自己做專案的時候,自己根本不會去寫文件,自己也不會考慮專案管理。這時如果想要別人參與到這個專案中,需要讓他把你的原始碼看一遍了。想到這一點的時候,我一開始就是在 GitHub 的 issue 裡在管理這個專案。
- README 和 Roadmap
如果別人想要參與,可以看到我做了哪些東西,有的東西為什麼沒有做,現在這個工作進行到哪個地步,包括去寫比較詳細的 README 和 Roadmap 文件。
- 方便開發者 Setup
我覺得已經超越了很多的開源專案,我做了一個 Docker 映象給開發者用,如果你的電腦上有 Docker, 可以拿容器試一下是不是真的有五千多個測試可以通過,省去了安裝依賴檔案的煩惱。
總結
如果你瞭解以太坊的規範,或者你要更深入瞭解以太坊的實現和設計,記住有三個方式:黃皮書,WIKI,EIPs,進一步深入的話還需要用已有的客戶端進行除錯;第二個思考如何去參與開源專案,保括開源方式和管理專案,提供 readme 和 ROADMAP 文件;第三個是儘量方便開發者瞭解這個專案。
- 聯絡方式: jjy@cryptape.com
- 我的部落格: justjjy.com
- Ciri Ethereum: github.com/ciri-ethere…
- 我的微信: fweedm
這是我的聯絡方式,以及我們少林寺的招聘內推,有興趣的同學留意一下。謝謝大家!