在我寫這遍文章的時候,距離EOS曝出漏洞已經有三天時間,區塊鏈行業熱點來的快去的也快,往往出現安全相關問題,都會給整個行業帶來震盪。自從我開始關注區塊鏈行業以來,安全事故有增無減,交易平臺、智能合約、共識機制等等都成了安全事故的中心。git
可是近年來,智能合約明顯已經被黑客死死盯上了。從前年的THE DAO再到今年的BEC。與此同時網上也出現了不少不一樣的聲音,有人爲智能合約的巧妙性叫好,有人也爲智能合約的安全性唱衰。本文不會對智能合約自己優劣進行探討,只針對如何保證智能合約安全來進行深刻,歡迎留言討論。安全
智能合約本質是一段運行在區塊鏈網絡中的代碼,它完成用戶所賦予的業務邏輯。通俗的來講,至關因而一個「不可改變」且「公正」的「中間人」。舉一個例子,我跟你打一個賭,若是明天下雨,算我贏,若是明天沒下雨,就是你贏了。而後咱們在打賭的時候就把錢放進一個智能合約控制的帳戶內,次日過去了,賭博的結果出來了之後,智能合約就能夠根據收到的指令自動判斷輸贏,並進行轉帳。這個過程是高效,透明的執行過程,不須要公正等第三方介入。網絡
好比咱們熟悉的以太坊,它的智能合約業務邏輯就是代幣發幣和交易。以太坊在設計之初,將智能合約設計成了一旦部署就不能修改的模式。這種設計是爲了提升智能合約的可信性。可是隻要是人編寫的程序,不可避免的就會產生漏洞。因此,當有漏洞出現時,想要再挽回損失就很大了。函數
前面講到,智能合約本質就是一段代碼,而且發佈以後不可修改。若在發佈以後發現了嚴重的漏洞,就只能從新部署新的合約,這對廠商來講代價太大了。那麼要想這段保證代碼的安全,就必定要在發佈以前對智能合約進行代碼審計。除開須要第三方的代碼審計以外,團隊在開發的過程當中,也是有方法能夠用來提升智能合約的安全。區塊鏈
1. 代碼必定要測試!測試
2. 代碼必定要review!ui
不要看小看這簡單的兩點,絕大多數的代碼問題都能在這個過程當中發現。下面我將白帽安全研究院給出的如何避免開發業務層代碼安全問題放在下面。有須要的能夠一一對應對本身的代碼作一個審覈。spa
1. 儘可能避免外部調用 .net
2. 仔細權衡再發生重要操做時的代碼邏輯,避免邏輯陷阱設計
3. 處理外部調用錯誤
4. 不要假設你知道外部調用的控制流程
5. 標記不受信任的業務內容
6. 正確的使用斷言
7. 當心整數除法的四捨五入
8. 不要假設業務建立時餘額爲零
9. 記住鏈上的數據是公開的
10. 在雙方或多方參與的業務應用中,參與者可能會「脫機離線」後再也不返回
11. 明確標明函數和狀態變量的可見性
12. 將程序鎖定到特定的編譯器版本
13. 當心分母爲零
14. 區分函數和事件
15. 避免死循環
16. 升級有問題的業務層代碼
除了本身對代碼的審覈外,請第三方安全機構進行審覈也是很必要的。智能合約審計嚴格意義上上來講,是應該有個很是規範的流程。一半狀況至少會對如下四點進行審覈:
1. 函數可見性審覈
2. 合約限制繞過審覈
3. 調用棧耗盡審覈
4. 拒絕服務審覈
經過這四點的審覈,至少能把隱私泄露、交易溢出與異常、合約故障和拒絕服務的問題解決。大大減小智能合約帶來的安全風險。
目前有提供智能合約審計和代碼審計的安全公司還不太多,我從平時看的一些快訊裏收集到,列出目前比較出名的幾家在作智能合約審計的安全廠商,供你們參考。
本文只是對智能合約和智能合約審計作了一個很是淺薄的分析。而且區塊鏈行業安全問題牽扯到了方方面面。智能合約只是裏面的一小部分,後續會繼續寫一些區塊鏈行業其餘的安全問題,歡迎一塊兒探討。