以太坊因為有了智能合約而獲得很大的便利性與彈性,智能合約的出現讓原本單純的金流交易功能延伸出可以發行代幣、鑄造NFT或是利用DApp撰寫一些去中心化遊戲等許多有趣的創意發想。但畢竟EVM的語言還沒完全成熟,若是智能合約的編寫過程出現沒有預期到的漏洞,再加上區塊鏈本身不可修改的性質,這對已經放上鏈的合約而言,就等於整份合約是「報廢」的狀態,連帶著可能影響的一個優秀的作品發想。
假如將智能合約看作是一篇文章
對於合約潛在的漏洞風險,我們不經開始思考,有沒有甚麼辦法可以在合約上鏈之前先檢查一遍,來降低合約出錯的機會。而現有許多合約分析的工具,像是
Slither 、
Securify 等,這些工具是基於已知很固定的編碼方法來很制式的做出判定,例如檢查加減乘除的順序、轉帳時扣款的順序。但是一份合約可能因為功能的需求做出比較複雜的編寫方式,例如在函式中呼叫其他函式、將變數編寫成較複雜的資料格式、甚至呼叫其他合約。這一系列的動作最終會導致超出分析工具的能力範圍。因此將合約視為文章,利用現有的自然語言處理工具來進行機器學習似乎會是一個可行的解決辦法。
甚麼是自然語言處理?
常見的機器學習方法如類神經網路(ANN)、多層感知機(MLP)、卷積神經網路(CNN),藉由輸入資料來進行訓練,經過隱藏層之後,直接在輸出層給出二分類的輸出或是多分類的輸出。對於上述的機器學習方法,自然語言處理不一樣的地方在於更重視輸入資料「上下文」之間的關係,實現方法是將經過訓練的資料,也就是隱藏層或輸出層的結果放回輸入層。也就是將這次輸出的結果作為下一次輸入時額外的參考。這種神經網路架構將前後的資訊連結起來成為一個迴圈狀的結構。他有一個專有的名稱,叫做遞迴神經網路(Recurrent Neural Networks, RNN)。
Recurrent Neural Networks model schematic diagram
上圖是一個簡單的RNN範例。如上圖所示,遞迴神經網路將時間(
t )等於
0 的時候輸入的資料經過隱藏層後,除了輸出
t=0 的輸出值之外,同時也輸出給下一個時間
t=1 的隱藏層當作輸入資料的一部分來一併運算。只要不斷的有資料輸入神經網路,這樣的運算模式就會持續進行,而之前的資料都可能會影響到後續的輸出。這就像我們理解一句話時,不聽到最後的話,就有可能誤解整段句子一樣。不過這個簡單的RNN模型還有一些問題存在,那就是當下這個模型只能接收前一次模型的輸出當作參考,這樣一來,相鄰比較遠的文字的影響就比較難看出來;另外在數學上遞迴模型的輸出每經過一次向後連結,在求解過程中就越容易引發
梯度消失 ,所以後來研究人員有做了一些改進。
為了將長距離(long-distance)或長期(long-term)語句產生的影響,也納入模型的理解範圍,科學家在RNN基礎上進行修改,成為長短記憶網路(long short term memory, LSTM)。機率性的決定這次的要不要加入輸入、輸出的資料。也就是新輸入的資料要不要加入這次運算過程、而運算的結果要不要提供給之後的運算使用。另外再加上能夠儲存資料或遺忘資料的演算法,來加強模型對長距離或長期語句的理解。本篇的重點不在說明LSTM,如果有興趣研究LSTM的讀者可以參考Jimmy Lin翻寫的
遞歸神經網路(RNN)和長短期記憶模型(LSTM)的運作原理 。最後經過自然語言處理,資料受到時序的影響能夠在模型訓練的結果被看見。
自然語言處理應用到智能合約漏洞的檢查
智能合約目前面臨許多種類的漏洞,前些日子在本專題《區塊鏈生存守則》中,另一位作家Alice也列舉並簡介了一些
常見的智能合約漏洞 。自然語言處理能有效的處理時序性資料,但是否能辨識如Reentrancy這類可能是金流轉移過程順序上出問題的漏洞,或是其他可能因為呼叫函數的順序不當等造成的錯誤,都是研究人員可以好好探討的地方,而發展這些漏洞辨識工具,能有助區塊鏈穩定的發展下去。
----------------------------------------------------------------------------
作者阿原目前從事區塊鏈資料分析工作,對區塊鏈的經濟架構、事件發展有很大的興趣,並希望能將相關的區塊鏈知識分析並且統整給大家。如果喜歡我的文章,或是想獲得更多區塊鏈大小事,歡迎關注
我的vocus帳號 !
另外,我已經加入由
趨勢科技防詐達人 所成立的方格子專題-《區塊鏈生存守則》,在那裡我會跟其他優質的創作者一起帶大家深入瞭解區塊鏈,並隨時向大家更新區塊鏈資安事件。