基于以太坊的智能合约评估系统设计与实现
2021-07-03上海计算机软件技术开发中心陶平
上海计算机软件技术开发中心 陶平
一、引言
随着区块链技术的蓬勃发展以及不断推出的鼓励发展并使用区块链技术的国家政策,越来越多的传统企业和互联网企业也逐渐开始尝试将现有的业务与区块链技术相融合。通过区块链的独有的特性来补足或是完善现有业务的不足。最常见的方式便是通过使用智能合约来实现并代替原有的业务处理系统。以太坊中为用户提供了一种名为EVM(Ethereum Virtual Machinecode)的脚本语言来构建智能合约。智能合约是以太坊中核心的核心。我们通常将智能合约看作是区块链上的一段代码,与以太坊账户类似,它同样在以太坊中拥有自己唯一的地址。当用户向合约的地址里发起一笔交易后,该合约就被执行,然后根据合约中事先定义好的代码及交易发起时携带的信息,最终返回执行结果。本研究通过将以太坊智能合约验证工具Mythx与传统的基于Springboot架构的系统相结合以此提供操作便捷、便于查看的基于以太坊的智能合约评估系统。
二、开发技术与工具
开发环境:Windows10,JAVA JDK1.8,Node v10, Go。
服务器环境:CentOS 7.3。
WEB服务器:前端Nginx,后端Tomcat。
数据库服务器:MySQL 5.7。
开发工具:IntelliJ IDEA 2020.3,Visual Studio Code。
开发技术:Springboot 3.2、MyBatis、Vuejs、ElementUI、Mythx。
三、关键技术研究
(一)Springboot框架研究
Springboot框架是Java平台上的一个开源应用框架,它提供了一整套的技术解决方案,比如通过利用控制反转(IOC)的核心特性结合依赖注入的方式实现控制反转,来达到管理对象生命周期容器化的目的;又比如通过面向切面编程(AOP)的方式进行声明式的事务管理,同时整合多种数据持久化的方式对赤计划数据访问进行管控;它的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难,同时还可以与原Spring的事务管理一起使用,为数据访问提供了灵活的抽象方式。
在SpringBoot框架中有两个非常重要的宗旨:一是开箱即用,二是约定优于配置。所谓开箱即用,就是指在研发中,开发人员可以在项目的pom定义文件中增加所需要的依赖包,之后使用对应的注解方式来取代原先复杂的配置文件。这一特性使得开发人员极大程度地丢掉了复杂的配置工作以及依赖的管理工作的包袱,更加专注于实际的业务功能。而约定优于配置,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计的方式。这一特性尽管降低了程序开发过程中的灵活性,也增加了不少故障定位的难度,但总体来说还是利大于弊,减少了开发人员需要做出决定的数量,同时极大地减少了的XML文件的配置及管理,而且还将代码编译、测试和打包等环节工作实现了自动化。
(二)Mythx智能合约验证工具
Mythx是一个基于符号执行技术的以太坊智能合约安全工具,其预置的检测模块对于以太坊和其他基于EVM的区块链智能合约中的一些SWC(Smart Contract Weakness Classification)安全漏洞能够有效地检测出来,为智能合约的安全性提供了安全保障及深入的分析报告。
符号执行使用不执行程序使用符号值来代替具体变量,来模拟每个路径来产生每一个执行的可能性,将执行语句的结果整合成若干条数学表达式。对某结果的数学表达式进行求解,就能获得到达该结果的路径。将产生漏洞的条件设置为程序执行的结果,降低分析程序的难度。
四、系统设计
(一)系统架构图
基于以太坊的智能合约评估系统主要分为前台、后台以及数据三个层面。在后台系统中角色又主要分为了管理员及用户,两种不同的角色分别对应不同功能。系统架构图如图1所示。
图1 系统架构图
其中合约审计模块的功能模块包括了:
合约审计:以太坊Solidity智能合约的安全审计。
TPS测试:针对以太坊公链的TPS进行测试。
(二)合约审计模块设计
合约审计模块作为该系统中核心的功能模块,通过基于Springboot所构建的后台主系统与基于Go语言及Mythx验证工具所构建的HTTP服务进行内部通信调用。
合约审计流程如下:
(1)后台系统通过前端页面传入的Solidity智能合约文本或者是文件,创建审计记录并保存在MySQL中,同时调用Go服务将所需审计的智能合约内容交由其进行处理。
(2)Go服务通过调用CMD命令使用Mythx命令行工具对进行智能合约的安全监测,同时Go服务会将Mythx工具输出的结果保存至Redis中。并将保存验证结果所使用的Redis Key提前返回给后台主系统。
(3)后台系统会定时轮询Redis,根据Go服务返回的Redis Key查看当前Mythx验证是否已经完成。
合约设计流程图如图2所示。
图2 合约审计流程图
(三)数据库的设计
本系统的所使用的数据库分别是关系型数据库MySQL和Redis缓存数据库。其中MySQL数据库作为后台系统的核心数据库,保存所有业务实体数据。Redis保存临时的合约检测结果。
为了实现该系统各类数据的持久化存储,设计MySQL数据库主要包括了:评估维度表、评估类型表、评估标准表、评估范畴表、评估范畴与评估维度关联关系表、评估文件表、评估报告表、评估报告详情表、合约审计表。
五、系统实现
(1)前后端数据通信实现。本系统采用Ajax请求的形式作为前后端数据通信的主要方式。数据传输的格式统一采用json格式,便于前后端处理。前端Vuejs构建的页面通过调用axios组件,并对其进行一定程度的封装处理,以满足对后端系统接口返回的数据进行业务处理和异常处理。后端系统通过内置Tomcat服务器进行部署,并结合Servlet实现Http的数据接口请求调用。
(2)Go服务功能实现。合约审计功能作为相对独立的业务功能,主要通过命令行形式对Mythx工具进行调用,由于Mythx工具对于Linux系统环境的依赖,为了便于系统整体的部署,避免不必要的冲突,将合约审计功能单独通过Go服务部署在Linux环境下。Go服务同样提供Http形式的接口,便于后台系统进行调用,同时调用本地的Mythx命令,传入相关参数,完成智能合约的审计功能。
调用Mythx代码如下:
六、结语
针对目前现有的智能合约验证工具的使用便捷性存在的不足,本文通过研究Springboot框架以及Mythx智能合约验证工具设计并开发了基于Web的以太坊智能合约评估系统,详细讨论了如何将Springboot框架技术、Go服务、Mythx工具、MySQL数据库、Redis缓存数据库和Vuejs等技术进行融合构建、设计并实现一个操作便捷并且便于查看的智能合约评估系统。后续系统还可以进行改进:增加其他更多类型的智能合约验证工具,如基于形式化验证,静态分析等,完善智能合约的审计全面性及可靠性。