以太坊智能合約開發 | 一個資深技術專家的心路歷程


原創: 楊鎮 一塊鏈習社區

微信號yikuailianxishequ
程序員


本文做者楊鎮, 以太坊黃皮書中譯者,資深以太坊專家。曾獨立中譯了以太坊 Homestead 官方文檔,Solidity 官方文檔中譯項目的貢獻者、校正人以及項目管理員。現專一於區塊鏈技術推廣、中文技術社區貢獻以及智能合約開發和安全審計方向。算法


我是楊鎮,在軟件行業從業17年了,大概在 2016 年下半年因爲工做須要,我開始研究區塊鏈,開始考慮在企業業務中使用這種所謂的「新技術」。編程


也是因爲那次對區塊鏈技術的學習,我發現了區塊鏈技術的潛力,尤爲是以太坊這個項目使我本人受到了很大的觸動。數組


因而我在 2017 年用業餘時間翻譯了以太坊官網的 Homestead 文檔,也對黃皮書的中文版正文全文進行了獨立的校正和增補更新,至此,結合 Solidity 文檔中的相關細節,能夠說我已經掌握了以太坊協議以及Solidity 智能合約開發相關的方方面面的知識,對相關技術細節有了很深的理解。安全


2017 年末,我開始寫一些區塊鏈技術相關的博客文章,到如今爲止也陸陸續續作了線上線下大大小小 20 屢次的區塊鏈技術分享。性能優化


                                               掘金 · 北京線下分享會現場微信


在這段期間有不少同窗經過公衆號、文章、微信等給我留言,常常諮詢我關於在區塊鏈行業怎樣找工做、轉行等相關事情,常見的會有這樣幾種問題:網絡


一、應該如何深刻地學習以太坊智能合約開發,有沒有什麼好的學習路徑?數據結構


二、看了一些入門教程,能使用開發工具,寫一些簡單 DApp,可是想開發一個產品級的 DAPP,又感受能力不夠,沒有信心,如何進一步提升本身?app


三、怎麼樣從全局去思考「以太坊智能合約開發」?以爲無從着手怎麼辦?


這些都是很是值得探討的話題,區塊鏈、智能合約開發是一個新領域,我本人也是從零開始一步步學習,不斷升級打怪,一直走到如今。


坦白來說,對於智能合約開發從業者來講,入門很簡單,但深刻也很難。


簡單的點在於:他們進入了一個全新的高速發展行業,這個行業之下不斷涌現出各類新潮的看似能賺快錢的方式(例如 ICO、Fomo3D 遊戲),引起了一波波的紅利,以助於有時候你只是能本身看一些 tutorial,下載工具一步步操做,就能夠很快寫一個 HelloWorld,甚至簡單的 demo。


而難的點又在於:在這個高速發展行業的巨輪之下的衆多智能合約開發從業者,其實大多不曾經歷過系統的學習和訓練,他們腦海中大量的工做方法都是零散和片斷式的,長期來當作長龜速,甚至有的開發者入門後就放棄了。


我也曾經無數次在交流時聽到有人跟我說:「我想學習/作智能合約開發。」


但若是你要問起你們,到底他們理解的「智能合約開發」是什麼,獲得的答案每每五花八門,或者說,那些答案都只是「智能合約開發」的冰山一角,並不是全貌。


做爲一名合格的智能合約開發者,必須更深地瞭解Solidity語言、以太坊平臺。


這就涉及到一些所謂的「高級話題」。在傳統開發語言裏,「高級」每每是「奢侈品」,僅用基本語言特性也能寫出可用的代碼。可是智能合約開發涉及到安全、性能等不少因素,這些「高級話題」屬於必須掌握的知識,是「必需品」,不誇張地說,是業餘開發者和專業開發者的分水嶺。


做爲一名智能合約開發者該如何進階?


若是問我做爲一名智能合約開發者該如何進階,也許能夠從如下幾個方面來看。

一、Solidity語言基礎


初學以太坊只能合約開發的人,會以爲 Solidity 很簡單。


可是 Solidity 真的簡單嗎?Solidity是一種結合了 C++、Python 和 Javascript 語言創造出來的爲智能合約開發而定製的語言,它在事實上簡化了智能合約的開發,是一種上手很容易、對初學者「很友好的」開發語言。只要你稍有編程經驗,就能夠很快寫出一些簡單的智能合約。


不過,這種看起來「很簡單的」語言,其實並不簡單,由於有太多不那麼直觀的因素會影響 Solidity 程序的運行;而大部分開發者也許並不那麼理解智能合約的運行環境——以太坊虛擬機(EVM)的各類各樣的技術細節,各類各樣的大坑小坑。


  • 好比 private 函數和 public 函數在調用時到底有什麼不一樣,僅僅是可見性麼?

  • 好比數據在內存和存儲(storage)中的結構有什麼區別,爲何我能夠對存儲中的動態數組使用 push 和 pop,而對內存中的就不行?

  • 好比 fallback 函數是如何運做的,它真的不能接收參數也不能有返回值麼?好比 transfer、send 和帶 value 的 call 有什麼區別?


顯然,這些問題並非咱們學習傳統的編程語言能夠了解到的,因此對於大多數初學者來說,這些細節極可能會妨礙他們真正掌握合約開發或者影響他們處理一些相對複雜邏輯的能力。因此讓智能合約開發者都真正搞懂 Solidity 與其餘開發語言的區別就是首先要進行的重要工做。


二、智能合約安全與最佳實踐


智能合約安全嗎?我想這個問題的答案已經衆所周知。其實自以太坊誕生以來,各類各樣的合約漏洞、安全問題已經屢次出如今技術社區乃至公衆視野中。因此合約安全問題早已不是小衆的話題。


好比 2016 年的 DAO 事件,由於當時價值數千萬美圓的以太幣被盜取的問題,最終致使以太坊網絡的硬分叉;又好比今年初的美鏈合約整數溢出漏洞,致使其幣價歸零等等。


    


    要真的作好有效防範,還真不是一件簡單的事情。


除了熟悉以太坊工做原理,智能合約語言設計,你還須要知道常見的安全漏洞類型,理解這些漏洞產生的緣由以及規避的方法,這不管是對開發者自己仍是實際業務安全都極其關鍵。


以太坊智能合約中常見的安全漏洞類型包括:重入、函數可見性、算術溢出、隨機數錯覺、外部合約引用、拒絕服務等等。


在熟悉安全漏洞以及背後的原理的基礎上,最佳實踐能夠幫助你開發出更加可靠的代碼。


你須要知道智能合約安全開發的通常原則,好比牢記區塊鏈特性、使合約儘可能簡單等等;你還須要知道 Solidity 智能合約開發中的一些最佳實踐,好比必定要謹慎處理外部合約調用、處理錯誤和意外、仔細處理 fallback 函數、注意 Solidity 的一些獨特的語言特性等等。


最後就是學習一些軟件工程上的經驗,從工程實踐上進一步保證合約的正常運轉、響應意外狀況,儘量確保項目/用戶的資金安全。


三、gas 優化

以太坊是一個很「昂貴」的計算平臺,本質上是由於每次 transaction 帶來的合約運算,都要在全部的全節點上運行。


可是昂貴並不意味着開發者無能爲力。


對於咱們作合約開發的人來講,有不少技術方法能夠減小 gas 的消耗,這對項目的成功是相當重要的,也是開發者應該作到的事情。這就是所謂的性能優化問題。


要充分掌握性能優化的方法,大概須要知道一些基礎知識,包括 gas 機制和彙編等等。


  • 好比, EVM 中複雜的費用設計(尤爲是存儲的使用費)和 gas 返還機制是如何影響合約的 gas 消耗(也就是運行費用)的?

  • 怎樣經過彙編來減小 gas 的消耗?

  • 在優化和代碼可讀性、可維護性上如何取捨?


四、彙編


上面在性能優化裏已經提到了彙編。彙編的做用遠不止這些。


在以太坊協議中,智能合約的本質就是 EVM(以太坊虛擬機)字節碼加上合約狀態數據所組成的所謂「自主對象(Autonomous Object)」。


因此,內聯彙編就是咱們的終極武器。瞭解了內聯彙編,你就知道了智能合約到底都能作什麼、不能作什麼。


由於無論咱們用什麼高級語言來寫合約,最終都是要反映爲 EVM 字節碼的,也就是 EVM 彙編指令,它們就是以太坊智能合約的所有能力。


同時,瞭解 EVM 指令也是進行終極 gas 優化的基礎。這些相對的高級話題,也是合約開發者必須瞭解的。


上面我列舉的是屬於所謂高級話題其中一部分,除此以外,你還須要知道以太坊的基礎數據結構。以太坊基礎數據結構和智能合約開發不直接相關,但對幾乎全部「高級話題」的理解,都創建在你對以太坊基礎數據結構的理解之上。


在掌握了這些「高級話題」以後,你還須要多閱讀源代碼


好比 OpenZeppling 是很是值得閱讀和學習的代碼庫,其中包含了大量優秀的代碼示例,都是社區反覆審計優化的成果。此外,solidity-stringutils 也是個很值得學習的工具合約庫。在咱們掌握了基礎知識以後,閱讀代碼能夠開拓咱們的眼界和思路,也給咱們作本身的項目提供了可靠的參考和借鑑。


總的來講,我認爲智能合約開發學習分兩個階段,一是入門,二是進階。


這就好像造一個房子,若是隻是造一個茅草屋,你大概只須要知道什麼是磚頭、瓦片,什麼是門窗,經過簡單的建造就能夠弄出一個能夠居住的小屋。可是若是造一個十幾層的樓房,你就須要回答地基打多深,是10米仍是15米,鋼筋設計多粗,是否是要抗風,等等。


入門更多地是普遍粗淺地認識,進階則須要瞭解一些所謂的關鍵細節,對關鍵細節的理解,會使得你開發DApp的時候可以做出最優的選擇/取捨,follow最佳實踐。


以咱們所見,若是能有一門課程能幫這部分智能合約開發的從業者,創建系統認知且經過訓練的方式幫他們提高諸如Solidity語言基礎、智能合約安全審計、性能優化等關鍵性的基礎能力,就能解決這個問題。


但,遺憾的是,在咱們探索的過程中,並未發現市面上有完美符合咱們期待的以太坊智能合約開發課程。目前行業內現有的課程,要麼是過於強調認知而不夠實操落地,要麼只是案例分享而概念缺少體系化方法論的支撐。


甚至在整個區塊鏈行業內一直以來這都是每個項目CTO 都致力於搞明白,卻歷來沒有人系統梳理和成功講解過,也歷來沒有一套成型的方法,長久困擾着許多開發者的問題。以致於,整個區塊鏈行業內,可以經過智能合約來作好優質合約的開發者,其實特別特別稀缺。


在這樣的背景下,我和一塊鏈習將近20位教研團隊,從0開始,但願能夠作一門面向於智能合約開發者符合咱們期待的智能合約開發進階課程。不管是從市場需求仍是行業責任的角度,咱們都想要作好這門課,即使一開始就知道它很難。


到今天,歷時多月以後,經歷內測、第一期公測兩輪優化、視頻所有從新錄製更新後,咱們終於能夠說——


一塊鏈習的一門重量級課程:《以太坊智能合約開發(進階)實戰訓練營》系列課程第二期即將於12月2日開班,等待你的檢驗。



這門課將解決什麼問題?


本課程重點圍繞着「以太坊開發+案例」幫你們解決以下問題——


1.從Solidty語言基礎開始帶你走進智能合約的世界


這門課程將首先將介紹 Solidity 語言基礎(Solidity 做爲智能合約開發語言的一些特殊之處) 並結合數個合約實例,帶你走進智能合約的世界。本課程的第一週就將爲你講解其中的核心內容,幫助你快速抓住Solidity語言重點,走進智能合約的世界。


2.幫你掌握一套方法,經過實際案例瞭解並理解重要的可複用合約代碼庫


詳細解讀OpenZeppelin項目中的重要基礎合約和 Token 合約樣例,對於初學者而言,理解某些模版合約的精巧設計或者使用上的注意點乃至侷限就成了一樣很是重要的事情。因此在課程第二章節中,教研團隊精心設計了兩個編寫合約的做業,帶領你們嘗試使用這些可複用的合約模版。


3.幫助你掌握智能合約安全編碼的原則、最佳實踐和實操要點


第三週咱們將經過詳細介紹目前已知的絕大部分可能的攻擊或者協議、語言上的限制和漏洞,這裏也會涉及一些以太坊和 Solidity 語言設計上的艱深細節而深刻到智能合約開發的場景中,而且會從編碼原則和最佳實踐的角度講解智能合約安全開發的要點。


4.帶你瞭解 EVM 的指令設計和 gas 優化的要點,帶你認識那些 Solidity 開發中最困難的實戰內容


最後一週,咱們將詳細講解以太坊的費用設計和指令設計,據此分析 gas 優化的原則和要點,最後以三個合約實例做爲講解 Solidity 高級開發的實戰總結。


這四周的教學內容有很大的相關性,將幫助咱們系統性理解以太坊智能合約開發的絕大多數細節問題,課程的難度也是逐步遞進的。以下附上本門課程大綱,可進一步參考。

                                             

這門課程已經爲區塊鏈行業培養出50位合格且優秀的以太坊智能合約開發者,他們是這樣評價這門課程的:


@王大錘:資深區塊鏈遊戲開發者,有豐富的智能合約代碼審計和大型項目經驗。現爲區塊鏈大型沙盤類遊戲evolutionland的負責人。

          

@劉虹男:DOS Network核心開發者,京東金融區塊鏈工程師,北京郵電大學研究生,參與過企業級區塊鏈應用開發以及以太坊DApp的項目開發,是區塊鏈技術的深度參與者。



@郭斌:AbleCloud汽車金融工程師,北航區塊鏈研究生,以太坊技術愛好者,曾參與多項以太坊Dapp開發,對監管沙盒、分佈式交易全部必定的研究。



@John:前Lots Foundation區塊鏈Tech Lead,ARPA合夥人,東京大學地球物理博士。



@史遠:北航軟件工程碩士,有十年以上開發經驗,帶領20人以上團隊作過服務幾百萬人的移動醫療App。

                                                                                          


在這裏,咱們第二課正式開啓報名模式了,也已經有多名同窗經過層層篩選進入第二期班級,在這裏分享幾位名單給你:


@海賊王:慢霧科技安全研究員,智能合約開發老手,但願經過此次課程進修一些細節或者安全方向的問題。


@張啓煊:上海科技大學CS專業在讀學生,GeekPie PR-VIC實驗室的LipIME課題組成員,從接觸區塊鏈到參加BitRun Hackathon並取得第二名1個月都不到。


@KryptoHenry:祕猿科技工程師,但願經過這門課程能夠寫出一個有人用並且受歡迎的 DApp。


@平健:上海交通大學電子信息與電氣工程專業博士在讀,但願可以經過這門課程學習以太坊智能合約安全、高效的編碼原則,豐富智能合約實戰經驗。


@孟祥劍:okex 區塊鏈開發高級工程師,目前負責基於以太坊的公鏈開發中的智能合約部分,熟悉以太坊黃皮書以及合約執行的底層以太坊代碼。


這是一個精心設計、打磨的包含了很是多技術細節的課程,須要你耐心地學習、理解和積累,是能夠反覆咀嚼消化的,它毫不是那種只須要看一次的實操課或者簡單地對社區文檔的搬運和重複。

想要報名的同窗,建議趕快掃描下方二維碼前去搶座,動做請快!


                                                                掃碼報名👇👇👇

      


全部填寫完報名表的同窗,請記得添加微信號:yikuailianxi,獲取錄取信息。


也許部分同窗還想繼續瞭解下這門以太坊智能合約進階開發課程,那我再簡單介紹下吧——


1.課程名稱:《以太坊智能合約進階開發實戰訓練營》


2.課程導師:

楊鎮老師,資深軟件工程師、區塊鏈技術佈道者。擁有17年+的軟件行業從業經驗,2016年開始學習以太坊,獨立中譯了以太坊Homestead官方文檔、對以太坊黃皮書中文版進行了獨立校正和增補更新、獨立中譯了以太坊分片技術說明。


3.課程時間:12月2日正式開班,預計正常學時1個月,每週更新2節視頻內容。


4.人數:第二期限額50人


5.課程適合對象:已經有 Solidity 初級開發經驗但又作得沒那麼好的開發者;當前以及在從事區塊鏈開發相關工做,但願進一步深造和系統學習以太坊開發相關的程序員;考慮到部份內容對程序設計、數據結構和算法有必定的基礎要求,建議有計算機軟件或相關專業學歷的開發者學習。


6.學習形式:

在線錄播課程+全程強化訓練+1對1導師批改做業點評輔助學習+7名助教帶小組學習+微信班級羣交流。


7.課程價格:3599元,按時完成所有做業的同窗返還一半的學費!


想要報名的同窗,建議趕快掃描下方二維碼前去搶座啦,楊老師和一批優秀的小夥伴等你來挑戰。


                                                         掃碼報名👇👇👇




【戰略合做】




                                                一塊鏈習更多好課等你來看哦

                                                                    ↓↓↓


                                                                  關注「一塊鏈習」

                                                          與全球區塊鏈開發者一塊學習

相關文章
相關標籤/搜索