編者按:本文系祕猿科技區塊鏈工程師蔣金洋講師,在由掘金技術社區主辦,以太坊社區基金會、以太坊愛好者與 ConsenSys 協辦的《開發者的以太坊入門指南 | Jeth 第二期 - 杭州場》 活動上的分享整理。Jeth 圍繞以太坊技術開發主題的系列線下活動。每期 Jeth 會邀請以太坊開發領域的優秀技術團隊和工程師在線下分享技術乾貨。旨在爲開發者提供線下技術交流互動機會,幫助開發者成長。git
我先自我介紹一下,我是祕猿科技區塊鏈工程師蔣金洋,此次的主題是如何實現一個簡單的以太坊。我以前從事 Web 開發和雲計算的開發,對第一次接觸以太坊是在兩年,做爲技術人員不只是看重以太坊這種貨幣,咱們更要看重區塊鏈的這一代技術。程序員
說實話,加密貓最火的時候我是比較失望,以太坊寫的是去中心化的全世界的計算機,但竟然有人用來作貓。隨着我深刻對以太坊的瞭解和學習,我看到不少 APP 一步一步去履行以太坊的使命,深度使用去中心化的功能,好比 the DAO 這個項目。github
DAO 這個項目雖然由於智能合約有漏洞掛掉了,但它由於使用智能合約的 DAO 這一功能讓我眼前一亮。DAO 是指去中心化的自治組織。在 the DAO 這個項目上面,我用個人私鑰能夠給這個項目轉一筆資金,得到相應的投票權,投票權來表決個人資金投在哪一個地方。雖然 DAO 最後也掛掉了,可是它相較於加密貓在技術上跨出了一大步。面試
去中心化交易所你們或多或少據說過,可是去中心化的交易所原理是用智能合約保證其安全性。咱們假設如今有一個設計良好、使用了智能合約的去中心化交易所,理論上面個人資產放在交易所裏面交易,可能這個交易全部一部分的中心化的服務幫助我匹配交易的過程,可是這筆錢永遠是經過個人私鑰以及以太坊智能合約來控制的,這樣資產永遠在個人手中。算法
經過這些事例來講,我感受智能合約和以太坊 Web3.0 的概念名副其實。剛纔說起的兩個例子中有兩個特色:json
區塊鏈是一個 Web3.0 的平臺,如今參與到當中,就是在建立下一代開發者使用的平臺,這個對於我來講是最大的吸引力。瀏覽器
最先聽到祕猿科技時,給我留下了深入的印象,由於這家公司的項目和主要產品都在 GitHub 上開源,包括錢包和區塊鏈瀏覽器,並且 License 至關得開放。這也意味着我要是使用他們的代碼,我不須要支付費用,爲了瞭解這家公司如何運營,我決定加入進去看看。安全
還有一點,我據說祕猿科技他們是被稱之爲少林寺,我當時在想爲何是少林寺,是否是公司裏面沒有妹子,都是男的。這個誤會很快被揭開:少林寺的寓意就是「天下武功出少林」,祕猿也確實在當下的區塊鏈生態中培養出了一大幫像峨眉、武當這樣的門派,爲區塊鏈事業作出了本身的貢獻。微信
我去祕猿科技參與面試,當時比較尷尬我是 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個目錄左右,裏面集中幾千條測試。下面我簡單介紹一些測試:
下面給你們展現 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 文檔。
我以爲已經超越了不少的開源項目,我作了一個 Docker 鏡像給開發者用,若是你的電腦上有 Docker, 能夠拿容器試一下是否是真的有五千多個測試能夠經過,省去了安裝依賴文件的煩惱。
若是你瞭解以太坊的規範,或者你要更深刻了解以太坊的實現和設計,記住有三個方式:黃皮書,WIKI,EIPs,進一步深刻的話還須要用已有的客戶端進行調試;第二個思考如何去參與開源項目,保括開源方式和管理項目,提供 readme 和 ROADMAP 文檔;第三個是儘可能方便開發者瞭解這個項目。
這是個人聯繫方式,以及咱們少林寺的招聘內推,有興趣的同窗留意一下。謝謝你們!