CNN+LSTM:智能合約漏洞檢測
????今天記錄一下最近將深度學(xué)習(xí)方法用于智能合約漏洞檢測的第一次實(shí)驗(yàn),順便給研究這方向的同行們提供一點(diǎn)借鑒意義。這個方法跟NLP有點(diǎn)相似,但又不太一樣,因?yàn)椴僮鞔a序列雖然具備一定語義信息,但偏向底層機(jī)器語言,所以剛開始我并不確定最終能不能達(dá)到很好的訓(xùn)練效果。這個實(shí)驗(yàn)的完整過程如下:首先通過插樁在本地鏈上同步當(dāng)前以太坊的部分區(qū)塊交易數(shù)據(jù),借此拿到每筆交易的操作碼序列、合約地址等等原始數(shù)據(jù);接著通過word2vec或one-hot編碼將每個操作碼轉(zhuǎn)成詞向量;最后搭建CNN+LSTM的深度學(xué)習(xí)模型完成多分類訓(xùn)練。

0. 導(dǎo)包
1. 從數(shù)據(jù)庫獲取數(shù)據(jù)
我使用的是MongoDB數(shù)據(jù)庫,因此可以使用可視化軟件MongoDB Compass或Navicat for MongoDB直接查詢獲取,同樣也可以通過python連接數(shù)據(jù)庫獲取,本質(zhì)上都是編寫MongoDB的查詢語句,導(dǎo)出格式一般是csv或txt,csv因?yàn)閿y帶了標(biāo)簽比較容易處理。
2. 訓(xùn)練詞向量
對于文本的向量化其實(shí)有很多方式,包括獨(dú)熱(one-hot),詞袋模型(bag of words),逆文本特征頻率(tf-idf)和word2vec等,在本實(shí)驗(yàn)中我使用現(xiàn)成的word2vec預(yù)訓(xùn)練模型直接訓(xùn)練得到詞向量,同樣也可以用自己搭建的模型訓(xùn)練。word2vec是使用深度學(xué)習(xí)的方式將詞映射為一個多維向量,維度可以自行選擇。
3. 數(shù)據(jù)預(yù)處理
讀取csv或txt格式的原始數(shù)據(jù)并處理成嵌套列表的形式。
4. 根據(jù)詞向量創(chuàng)建詞語字典
加載上面生成的word2vec模型創(chuàng)建出對應(yīng)的詞向量字典(操作碼向量字典)。
5. 將序列文本轉(zhuǎn)成字典索引數(shù)字
將輸入操作碼序列中出現(xiàn)在詞向量字典中的操作碼轉(zhuǎn)換為索引數(shù)字,未出現(xiàn)的轉(zhuǎn)換為0即可。
6. 統(tǒng)一序列長度
定義必要參數(shù),加載詞向量數(shù)據(jù)并填充詞向量矩陣。
將原始數(shù)據(jù)集分為訓(xùn)練集和測試集,把序列操作碼轉(zhuǎn)成對應(yīng)索引并統(tǒng)一長度。
7. 搭建模型并訓(xùn)練
本來我只用了LSTM,但因?yàn)樾蛄虚L度太大,所以只能加上CNN層來對矩陣進(jìn)行降維,這樣訓(xùn)練速度會更快,結(jié)果發(fā)現(xiàn)效果也還行。
8. 輸出可視化訓(xùn)練圖表
可以通過show_train_history函數(shù)打印的訓(xùn)練集曲線來判斷模型是否過擬合。
借鑒項(xiàng)目:https://github.com/sph116/lstm_emotion(大家自行搜索)
部分結(jié)果截圖(僅供參考):

