合約漏洞導致市值歸零 迅雷鏈工程師深度解析合約代碼怎麼寫

近年來,智能合約成爲了區塊鏈安全的重災區,從The DAO到BEC,SocialChain,Hexagon,再到EOS漏洞,智能合約安全漏洞頻現令不少開發者和企業對區塊鏈望而卻步。12月8日,在迅雷鏈技術沙龍第六站現場,迅雷鏈底層研發工程師胡登啓,全面、系統地剖析了智能合約安全問題,一一分析了智能合約中存在的典型漏洞和預防措施,並總結出智能合約編程過程中,需要注意的三大安全原則,在現場聽衆間引發了熱烈反響。

合約漏洞導致市值歸零 迅雷鏈工程師深度解析合約代碼怎麼寫

區塊鏈虛擬機工作原理

關於虛擬機的運行原理,胡登啓以EVM爲例,講解了虛擬機底層是如何實現的,讓開發者對虛擬機有了更全面的認識。

區塊鏈的虛擬機應該包含以下6個特性:

1.安全。這也是最重要的,即代碼在沙盒中運行,一旦發生錯誤,可以回滾掉所有更新;
2.結果確定,沒有歧義。在區塊鏈的所有節點執行該邏輯,得到的結果一定是保持一致的;
3.簡單。即操作碼低級,結構簡單;
4.具備特定的能力。虛擬機能處理加密運算,比如支持橢圓曲線算法,能訪問交易與鏈狀態,獲取blockhash,tx相關內容等等;
5.易於優化。支持即時編譯等;
6.節省空間。虛擬機組件緊湊,便於集成到區塊鏈服務中。

通過分析EVM虛擬機,胡登啓總結了一個通用區塊鏈虛擬機應該是如何運作的:開發者編寫合約源代碼,通過編譯器編譯成字節碼,虛擬機在執行過程中會通過代碼加載器將字節碼加載到虛擬機內存裏面。虛擬機的執行引擎會執行一個一個的指令,在執行指令的過程當中會訪問到一些堆棧的數據,同時會訪問運行時的數據區,執行結束後會進行持久化存儲。

一個圖靈完備的虛擬機,能執行各種各樣的智能合約。

區塊鏈虛擬機的執行流程

合約漏洞導致市值歸零 迅雷鏈工程師深度解析合約代碼怎麼寫

迅雷鏈支持圖靈完備的EVM虛擬機,胡登啓以一個簡單的solidity合約爲例,爲現場開發者分析了EVM虛擬機是如何運行的。

EVM虛擬機的執行主流程是在Run函數裏面的,在循環裏面首先會獲取對應的操作碼,將操作碼關聯到對應的指令,這個指令在執行之前會進行一些數據的校驗。執行指令完之後,可以判斷繼續執行指令還是返回退出。

EVM中的操作碼主要分爲四類:

第一類是算術運算,包括最基礎的加減乘除運算指令。
第二類是邏輯運算,包括與、或、非、等於、不等於、大於、小於等。
第三類是與區塊鏈狀態相關指令,具體是指區塊信息如coinbase、區塊時間戳、區塊序號等,還有交易相關的,如交易的發送者,交易轉賬金額等指令。
第四類是跟存儲相關的指令,比如讀取虛擬機運行時內存數據,或者存儲數據到區塊鏈狀態中。

每一個操作碼都對應一個操作指令。操作指令定義了操作碼具體要執行怎樣的操作,操作消耗的gas值,操作需要的參數與返回值的個數,還有操作需要額外空間。同時操作指令中還定義了一些標記位,比如終止運算、跳轉、是否出錯、是否應該返回等。

胡登啓通過展示最簡單的加法操作指令爲例,爲大家分析了指令結構。EVM虛擬機每個操作指令都會消耗一定的gas值,這麼做的目的一方面是爲了避免開發者編寫無限循環的代碼,另一方面是爲了給打包交易的節點一點獎勵。

智能合約開發的安全準則

不過胡登啓指出,EVM只是區塊鏈虛擬機的一種實現方式,而且現行的智能合約還是一個在不斷髮展的技術,要想運用好這個技術並不容易。

事實上,在實踐過程中,合約被爆出了各種安全漏洞,這些漏洞可能給項目發行方造成巨大的損失。因爲區塊鏈是去中心化的自治系統,往往發現漏洞後,發行方很難去修復這個漏洞,只能任由***肆意的***。因此要求開發者在編寫智能合約時,做更加全面的安全測試,儘量避免包含漏洞的代碼發佈到區塊鏈系統中。

胡登啓通過分析智能合約中存在的典型漏洞,向現場聽衆展示了智能合約安全問題的重要性,併爲開發者編寫智能合約提供了一些參考。

他以今年年初轟動一時的BEC合約漏洞爲例,講述了智能合約安全的重要性。BEC是美鏈公司發佈的token,於今年2月上線交易, 4月22日該合約被爆出重大漏洞,導致其token市值幾乎歸零。

其智能合約中有行代碼,是個乘法運算,用以計算一次交易中轉移token的總值,計算結果使用uint256類型保存。按照c或者c++的開發經驗,這裏存在整數溢出的問題。

***正是利用了這個漏洞,進行BEC token的鉅額增發,最終導致其價值接近歸零。

胡登啓以此作爲反面教材,告誡開發者,在合約開發中進行任何數學運算時,都推薦使用SafeMath庫,這樣可以避免溢出的漏洞。比較諷刺的一點是,BEC合約的其他代碼都使用了SafeMath庫,唯獨漏了這一處。可見代碼測試一定要充分,漏了一個點,可能造成巨大損失。

通過對另外數起知名安全漏洞案例的分析,胡登啓總結了智能合約開發的3條安全準則:
1.開發者應深入的理解區塊鏈系統的運行原理。
2.希望開發者熟練掌握一門合約語言的特性。
3.要做全面的代碼測試,不能有僥倖心理。

合約漏洞導致市值歸零 迅雷鏈工程師深度解析合約代碼怎麼寫
胡登啓最後表示,區塊鏈智能合約還是一門比較年輕的技術,需要在開發者的不斷實踐中去完善與提升。因此在目前階段,開發者進行智能合約編程時,尤其需要注意規避漏洞,以保證合約具備足夠的安全性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章