上海計算機軟件技術(shù)開發(fā)中心 陶平
隨著區(qū)塊鏈技術(shù)的蓬勃發(fā)展以及不斷推出的鼓勵發(fā)展并使用區(qū)塊鏈技術(shù)的國家政策,越來越多的傳統(tǒng)企業(yè)和互聯(lián)網(wǎng)企業(yè)也逐漸開始嘗試將現(xiàn)有的業(yè)務(wù)與區(qū)塊鏈技術(shù)相融合。通過區(qū)塊鏈的獨有的特性來補足或是完善現(xiàn)有業(yè)務(wù)的不足。最常見的方式便是通過使用智能合約來實現(xiàn)并代替原有的業(yè)務(wù)處理系統(tǒng)。以太坊中為用戶提供了一種名為EVM(Ethereum Virtual Machinecode)的腳本語言來構(gòu)建智能合約。智能合約是以太坊中核心的核心。我們通常將智能合約看作是區(qū)塊鏈上的一段代碼,與以太坊賬戶類似,它同樣在以太坊中擁有自己唯一的地址。當(dāng)用戶向合約的地址里發(fā)起一筆交易后,該合約就被執(zhí)行,然后根據(jù)合約中事先定義好的代碼及交易發(fā)起時攜帶的信息,最終返回執(zhí)行結(jié)果。本研究通過將以太坊智能合約驗證工具Mythx與傳統(tǒng)的基于Springboot架構(gòu)的系統(tǒng)相結(jié)合以此提供操作便捷、便于查看的基于以太坊的智能合約評估系統(tǒng)。
開發(fā)環(huán)境:Windows10,JAVA JDK1.8,Node v10, Go。
服務(wù)器環(huán)境:CentOS 7.3。
WEB服務(wù)器:前端Nginx,后端Tomcat。
數(shù)據(jù)庫服務(wù)器:MySQL 5.7。
開發(fā)工具:IntelliJ IDEA 2020.3,Visual Studio Code。
開發(fā)技術(shù):Springboot 3.2、MyBatis、Vuejs、ElementUI、Mythx。
Springboot框架是Java平臺上的一個開源應(yīng)用框架,它提供了一整套的技術(shù)解決方案,比如通過利用控制反轉(zhuǎn)(IOC)的核心特性結(jié)合依賴注入的方式實現(xiàn)控制反轉(zhuǎn),來達到管理對象生命周期容器化的目的;又比如通過面向切面編程(AOP)的方式進行聲明式的事務(wù)管理,同時整合多種數(shù)據(jù)持久化的方式對赤計劃數(shù)據(jù)訪問進行管控;它的數(shù)據(jù)訪問框架解決了開發(fā)人員在應(yīng)用程序中使用數(shù)據(jù)庫時遇到的常見困難,同時還可以與原Spring的事務(wù)管理一起使用,為數(shù)據(jù)訪問提供了靈活的抽象方式。
在SpringBoot框架中有兩個非常重要的宗旨:一是開箱即用,二是約定優(yōu)于配置。所謂開箱即用,就是指在研發(fā)中,開發(fā)人員可以在項目的pom定義文件中增加所需要的依賴包,之后使用對應(yīng)的注解方式來取代原先復(fù)雜的配置文件。這一特性使得開發(fā)人員極大程度地丟掉了復(fù)雜的配置工作以及依賴的管理工作的包袱,更加專注于實際的業(yè)務(wù)功能。而約定優(yōu)于配置,是一種由SpringBoot本身來配置目標(biāo)結(jié)構(gòu),由開發(fā)者在結(jié)構(gòu)中添加信息的軟件設(shè)計的方式。這一特性盡管降低了程序開發(fā)過程中的靈活性,也增加了不少故障定位的難度,但總體來說還是利大于弊,減少了開發(fā)人員需要做出決定的數(shù)量,同時極大地減少了的XML文件的配置及管理,而且還將代碼編譯、測試和打包等環(huán)節(jié)工作實現(xiàn)了自動化。
Mythx是一個基于符號執(zhí)行技術(shù)的以太坊智能合約安全工具,其預(yù)置的檢測模塊對于以太坊和其他基于EVM的區(qū)塊鏈智能合約中的一些SWC(Smart Contract Weakness Classification)安全漏洞能夠有效地檢測出來,為智能合約的安全性提供了安全保障及深入的分析報告。
符號執(zhí)行使用不執(zhí)行程序使用符號值來代替具體變量,來模擬每個路徑來產(chǎn)生每一個執(zhí)行的可能性,將執(zhí)行語句的結(jié)果整合成若干條數(shù)學(xué)表達式。對某結(jié)果的數(shù)學(xué)表達式進行求解,就能獲得到達該結(jié)果的路徑。將產(chǎn)生漏洞的條件設(shè)置為程序執(zhí)行的結(jié)果,降低分析程序的難度。
基于以太坊的智能合約評估系統(tǒng)主要分為前臺、后臺以及數(shù)據(jù)三個層面。在后臺系統(tǒng)中角色又主要分為了管理員及用戶,兩種不同的角色分別對應(yīng)不同功能。系統(tǒng)架構(gòu)圖如圖1所示。
圖1 系統(tǒng)架構(gòu)圖
其中合約審計模塊的功能模塊包括了:
合約審計:以太坊Solidity智能合約的安全審計。
TPS測試:針對以太坊公鏈的TPS進行測試。
合約審計模塊作為該系統(tǒng)中核心的功能模塊,通過基于Springboot所構(gòu)建的后臺主系統(tǒng)與基于Go語言及Mythx驗證工具所構(gòu)建的HTTP服務(wù)進行內(nèi)部通信調(diào)用。
合約審計流程如下:
(1)后臺系統(tǒng)通過前端頁面?zhèn)魅氲腟olidity智能合約文本或者是文件,創(chuàng)建審計記錄并保存在MySQL中,同時調(diào)用Go服務(wù)將所需審計的智能合約內(nèi)容交由其進行處理。
(2)Go服務(wù)通過調(diào)用CMD命令使用Mythx命令行工具對進行智能合約的安全監(jiān)測,同時Go服務(wù)會將Mythx工具輸出的結(jié)果保存至Redis中。并將保存驗證結(jié)果所使用的Redis Key提前返回給后臺主系統(tǒng)。
(3)后臺系統(tǒng)會定時輪詢Redis,根據(jù)Go服務(wù)返回的Redis Key查看當(dāng)前Mythx驗證是否已經(jīng)完成。
合約設(shè)計流程圖如圖2所示。
圖2 合約審計流程圖
本系統(tǒng)的所使用的數(shù)據(jù)庫分別是關(guān)系型數(shù)據(jù)庫MySQL和Redis緩存數(shù)據(jù)庫。其中MySQL數(shù)據(jù)庫作為后臺系統(tǒng)的核心數(shù)據(jù)庫,保存所有業(yè)務(wù)實體數(shù)據(jù)。Redis保存臨時的合約檢測結(jié)果。
為了實現(xiàn)該系統(tǒng)各類數(shù)據(jù)的持久化存儲,設(shè)計MySQL數(shù)據(jù)庫主要包括了:評估維度表、評估類型表、評估標(biāo)準(zhǔn)表、評估范疇表、評估范疇與評估維度關(guān)聯(lián)關(guān)系表、評估文件表、評估報告表、評估報告詳情表、合約審計表。
(1)前后端數(shù)據(jù)通信實現(xiàn)。本系統(tǒng)采用Ajax請求的形式作為前后端數(shù)據(jù)通信的主要方式。數(shù)據(jù)傳輸?shù)母袷浇y(tǒng)一采用json格式,便于前后端處理。前端Vuejs構(gòu)建的頁面通過調(diào)用axios組件,并對其進行一定程度的封裝處理,以滿足對后端系統(tǒng)接口返回的數(shù)據(jù)進行業(yè)務(wù)處理和異常處理。后端系統(tǒng)通過內(nèi)置Tomcat服務(wù)器進行部署,并結(jié)合Servlet實現(xiàn)Http的數(shù)據(jù)接口請求調(diào)用。
(2)Go服務(wù)功能實現(xiàn)。合約審計功能作為相對獨立的業(yè)務(wù)功能,主要通過命令行形式對Mythx工具進行調(diào)用,由于Mythx工具對于Linux系統(tǒng)環(huán)境的依賴,為了便于系統(tǒng)整體的部署,避免不必要的沖突,將合約審計功能單獨通過Go服務(wù)部署在Linux環(huán)境下。Go服務(wù)同樣提供Http形式的接口,便于后臺系統(tǒng)進行調(diào)用,同時調(diào)用本地的Mythx命令,傳入相關(guān)參數(shù),完成智能合約的審計功能。
調(diào)用Mythx代碼如下:
針對目前現(xiàn)有的智能合約驗證工具的使用便捷性存在的不足,本文通過研究Springboot框架以及Mythx智能合約驗證工具設(shè)計并開發(fā)了基于Web的以太坊智能合約評估系統(tǒng),詳細(xì)討論了如何將Springboot框架技術(shù)、Go服務(wù)、Mythx工具、MySQL數(shù)據(jù)庫、Redis緩存數(shù)據(jù)庫和Vuejs等技術(shù)進行融合構(gòu)建、設(shè)計并實現(xiàn)一個操作便捷并且便于查看的智能合約評估系統(tǒng)。后續(xù)系統(tǒng)還可以進行改進:增加其他更多類型的智能合約驗證工具,如基于形式化驗證,靜態(tài)分析等,完善智能合約的審計全面性及可靠性。