卷積神經網路在智慧合約審計中的應用
引言
傳統智慧合約程式碼審計,多使用純人工或者形式化驗證等切片窮舉的方式,而且涉及到程式碼審計審計人員水平高低不一樣,容易導致審計結果出現偏差。人工方式受到個人能力所限,質量無法保證,且人力疏忽的可能性遠高於自動化程式。
傳統自動化程式又無法發現邏輯、業務範疇的風險。
背景
以太坊支援圖靈完備的智慧合約協議,整個生態有許多人基於以太坊開發自己的Dapp,生態得到了蓬勃發展。這其中,絕大部分被廣泛使用的合約,均為Token代幣合約。這些合約,為使用者的資產在區塊鏈網路中流通提供了極大的助力。
基於以太坊生態的合約代幣,價值已相當客觀,甚至有個別幣種達到數億美金。
同時,也不乏很多“問題幣”,這些“問題幣”在程式碼層面上實現的時候,開發人員由於自身水平問題或者限於專案開發時間制約,導致程式碼部署到以太坊之後,存在風險,所有的合約程式碼或opcode,都公開在區塊鏈上,這就容易遭受到黑客的定向攻擊,一旦黑客們開始嘗試利用這些問題合約的漏洞,對很多專案來說,幾乎就是滅頂之災,交易所和使用者損失慘重,所以一個合約部署之前,或者合約部署之後,安全專家可以對部署程式碼做安全審計,發現其中隱藏問題。目前僅以太坊上的合約專案,遠大於全球安全專家數量,每一名安全專家在合約程式碼審計上所付出的精力太多,這就迫切需要一個自動化,智慧化的系統,能自動審計日益增長的合約程式碼,同時要能保障其審計能力不會低於專家水平。
近年來,機器學習迅速發展,而其中的深度學習更是獨領風騷,已經在視覺計算和自然語言處理等方向取得了顯著的成績,解決了眾多場景下難題,我們研究人員借力深度學習技術,藉助安全專家已經審計的大量合約做標籤資料,研發了一套專門適用於智慧合約程式碼審計的引擎,經過資料測試,其審計能力比肩人工審計,但是效率遠超過人工。
模型結構
整個模型結構簡要如下所示。
方法
預處理階段
通過專家的指導瞭解到,由於應用層程式碼裡面大量人為定義的變數,如果選擇原始碼作為輸入的時候,會有很多不可預知的因素在裡面,比如兩個合約,A合約函式宣告function transfer(address _to, uint256 _value),B合約函式宣告function transfer(address to, uint256 token)從原始碼層面上來說,是有很大區別的,但是對程式碼解析器來說,這兩者幾乎沒有區別的,所以我們選取編譯後的opcode 作為整個模型的原始輸入,收集到原始的opcode的之後,我們仍然需要人工處理,比如運算元,簡單的統一處理,以一個特殊的字串來替代,有特殊含義的立即數,則原樣保留,在送到整個模型之前,採用詞嵌入方法,得到資料的向量形式,來表徵我們的樣本資料。
卷積核的選擇:
由於文字的資料表示與圖片在形式上完全不同,所以核的大小需要與輸入層的寬保持一致,經過計算後得到feature map。
池化操作:
文字的表徵和圖片相比,不存在通道概念,同時,也需要避免在batch上做池化操作,視窗滑動時候,按照步長1來滑動。
中間層特徵合併:
我們把多類不同核之後的的特徵,合併起來,作為下一層的輸入,同時為了防治過擬合,引入dropout ,概率取0.5來操作。
全聯接層:
經過dropout 的操作後,通過全聯接層,我們計算特徵潛在的權重,最後通過softmax 來輸出最大可能性標籤,用來預測結果。
訓練表現:
訓練準確率如下圖所示:
橙色線條代表測試樣本的準確率,可以看到隨著訓練迭代次數的增加,準確率在緩慢攀升。目前由於積累的樣本不夠完善,可以看到訓練過程中模型loss的波動比較大,但可以期待的是,隨著樣本的完善和積累,整體效果會愈發明顯。
總結:
在特定場景下,深度神經網路展現了不俗的表現能力,我們希望藉助深度學習模型強大的泛化能力,切實解決一些合約程式碼的安全問題,同時也在不斷探索深度學習技術在區塊鏈行業的新應用方向。
來源:降維區塊鏈安全資訊
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”