面向以太坊的智能合约自动生成方法研究与实现
2020-12-07高一琛赵斌张召
高一琛 赵斌 张召
摘要:基于以太坊的智能合约已经广泛应用于各个领域,然而合约开发需要完备的专业领域知识和编程能力,针对智能合约编程友好性,本文提出了一种对于特定领域智能合约自动生成的方法,实现了对于智能合约的聚类分析以及交易类智能合约基本函数代码的生成,对于生成的代码采用BLEU以及SmartCheck进行检测,得到了较好的检测结果,采用MFC将生成的代码和uI控件链接,为用户提供友好的智能合约编程页面,实现智能合约的自动生成,方法生成的智能合约代码有一定的准确性,能够对智能合约的开发提供帮助,最后,通过一个案例分析验证了生成的智能合约的可用性。
关键词:智能合约:以太坊:区块链
中图分类号:TP301 文献标志码:A DOI:10.3969/j,issn,1000-5641.202091015
0引言
区块链近年来引发了多个行业利益相关者的兴趣,被认为是人类信用进化史上继血亲信用、贵金属信用、央行纸币信用之后的第四个里程碑,随着区块链技术在金融、能源、保险、物流和交通等关键领域的应用,它在全球范围内引起了越来越多的关注,区块链目前处于2.0时代,也就是应用功能更加强大的智能合约时代。
智能合约是一种由事件驱动的、具有状态的代码合约和算法合同,随着区块链技术的深入发展而受到广泛关注和研究,现有的智能合约是一种可自动执行的协议,在一定条件下直接控制各方之间的数字货币或资产的转移,基于区块链的智能合约具有去中心化、确定性、可验证、实时性等特点,在数字支付、金融贸易、云计算、物联网等方面有着广阔的应用前景。
然而智能合约的设计除了熟悉编程语言之外,还需要了解相关应用领域的知识和技能,开发人员在精通智能合约编程语言的同时缺乏对合同逻辑的认识,设计人员在熟悉业务规则的同时却缺乏对智能合约的理解,为了设计或运行智能合约,合约设计者必须预先确定代码逻辑,但是非开发人员(如金融工作者)对于编程语言的了解不多,这导致他们难以根据自己的需求设计出可用的智能合约,因此,基于以太坊来完成智能合约的自动生成能够在很大程度上降低开发智能合约代码的难度,提升智能合约编程的友好性。
目前已有的智能合约研究都集中在安全问题上,对于编程友好性的研究很少,本文对智能合约编程问题提出一个挑战,即基于领域特征的智能合约设计模板,智能合约已经在金融、公共事务等领域得到了广泛的应用,不同领域智能合约的设计有着很大的差异,因此,在实现智能合约自动生成时需要基于各个领域的特点来给出相应的基本函数模板。
本文的主要贡献如下。
1)实现了根据领域特征对智能合约分类的方法,采用空间向量模型VSM来对智能合约代码进行表述,并根据领域特性利用聚类算法DBSCAN将智能合约的数据集合划分为不同的类别,
2)实现了针对特定领域生成统一的智能合约代码的方法,采用Char-RNN模型来对特定领域的智能合约数据集进行训练,并使用LSTM作为神经网络来代替Char-RNN模型中的基本RNN,最后,使用此模型来生成统一的、针对领域的智能合约基本函数代码。
3)为用户提供一个页面编辑器,方便用户进行智能合约编写,实现智能合约的自动生成,页面上有一组和基本的智能合约代码链接的uI控件,用户可以通过点击控件来根据自身需求设计智能合约。
1相關工作
“智能合约”的概念产生于1994年,由密码学家Nick Szabo首次提出,他将智能合约定义为“一套以数字形式的承诺,包括能够使合约参与方在上面执行这些承诺的协议”,智能合约设计的目标是满足常见的合约条件,并最小化对可信中介的需求,智能合约扩展并利用了区块链技术,它是一组代码和数据,使用区块链网络上的加密签名事务进行部署。
以太坊是区块链最流行的开发平台,它提供了图灵完备的编程语言,如Solidity高级程序设计语言,可以用来创建智能合约、对任意状态转换函数进行编码,并为区块链应用程序创建系统,智能合约是在EVM[6]上运行的可执行代码,用来促进、执行和强制执行互不信任方之间的协议条款,它可以触发数据读写、执行计算、调用其他合约等程序。
虽然智能合约是一项很有前途的技术,但仍有许多挑战有待解决,例如,智能合约一旦被部署,代码是不可改变的,这使得它不可能修复任何被发现的错误,过去曾发生过一系列利用以太坊智能合约安全漏洞的攻击,例如,2016年6月17日,黑客利用DAO的编程漏洞,抽走了DAO三分之一的资金,大约5000万美元,为了避免发生像DAO这样的攻击,研究人员对合约编码优化问题进行了大量的研究,并开发了许多工具,例如,SmartDec安全团队开发了一个名为SmartChcck的静态代码分析器,它在可靠的源代码中运行分析,并自动检查智能合约的安全漏洞和不良做法,国内对智能合约的验证问题也做了相关研究,2016年提出了通过Promela建模语言并结合模型检测的SPIN工具对智能合约的安全性进行验证的方法,该方法基于对状态的搜索验证智能合约的安全属性,能够保障整个搜索行为的终止性。
然而,这些研究主要针对安全和隐私问题,用来规范智能合约的编码过程,智能合约编码的基本问题,也就是编程友好问题,很少涉及,智能合约编程的发展还面临着许多挑战,比如智能合约编程的可设计性及提供合约编码的专用模板。
2智能合约自动生成方法
2.1方法概述
本文提出了一种针对特定领域来自动生成智能合约(solidity语言)的方法,并进行了原型系统实现,该方法可基于特征生成统一规范的智能合约代码,之后提供了一个编辑页面,页面上的uI控件与生成的智能合约代码相链接,使得用户能够设计智能合约程序,该方法能够满足用户的需求,并通过页面编辑器的方式降低智能合约编程的复杂度。
本部分介绍该方法的基本流程,如图1所示,方法主要分为以下三步。
1.智能合约聚类
智能合约在多个领域得到了广泛的应用,本方法针对特定的合约领域,因此要先对智能合约进行聚类,得到不同领域的智能合约数据集,具体步骤如下。
(1)合约代码抓取:通过爬虫程序从Etherscan,也就是以太坊上应用最广泛的区块链浏览器上抓取经过验证的合约代码来作为数据集,它为下一步的聚类分析提供了智能合约数据集。
(2)合约聚类,实现智能合约分类:在上述步骤中抓取到的数据集包含各个领域的合约代码,此步骤要将其划分为不同的类别,首先,采用空间向量模型VSM来对智能合约代码进行表述,然后在向量化的基础上利用聚类算法DBSCAN将其分类,例如,类别涉及彩票合约、交易合约等。
2.生成统一的智能合约代码
选择聚类结果中的交易类合约来生成统一的智能合约代码,从而为用户提供一套基础的函数模板,使得智能合约设计更加高效、简单,首先,将上一步中获得的交易类智能合约作为数据集,然后采用Char-RNN模型来对数据集进行训练,由于长期依赖问题的存在,采用LSTM作为神经网络来代替Char-RNN模型中的基本RNN,最后,使用此模型来生成统一的交易类智能合约基本函数代码。
3.智能合約自动生成
为了方便用户使用,我们提供一个页面编辑器来帮助用户进行智能合约编写,从而实现智能合约的自动生成,页面上有一组和基本智能合约代码链接的uI控件,用户可以通过点击控件来根据自身需求设计智能合约。
2.2智能合约聚类
智能合约在不同的领域有着不同的实现,也有着不同的基本合约函数,因此在生成针对特定领域的合约模板前要先对其进行分类,首先需要从名为Ethersean的区块链浏览器上获取智能合约作为数据集,然后对抓取的数据集进行聚类分析。
2.2.1智能合约代码抓取
本文中方法的实现需要大量的智能合约程序作为数据集,如果数据集数量不够,会限制合约的统一代码生成,因此,为了更好地分析智能合约,第一步就是从Etherscan上抓取智能合约程序作为数据集。
Etherscan是一个能够对以太坊区块链进行探索和分析的分布式智能合约平台,用户可以通过此平台查看以太坊区块链上的事务信息,爬虫程序从Ethersean上采集智能合约代码的流程如下:它从Web上的智能合约第一个索引页开始,建立合约的URL列表,将设定数量的合约地址保存到文件中。之后根据保存下来的地址,页面跳转到合约的details页面将合约代码保存到文件中,最后,得到智能合约程序的数据集。
2.2.2智能合约聚类
对于抓取到的智能合约数据集,本步骤的目的是对其进行聚类,从而得到不同领域的智能合约数据,为生成相应领域的统一的智能合约代码做准备,采用的聚类方法为DBSCAN算法。
要实现聚类分析,首先需要对所爬取的数据进行预处理,使其表示为一种满足需求的结构化形式,在此基础上再利用算法进行聚类分析,采用的聚类流程如图2所示。
为了方便计算机处理,需要将合约代码以计算机可识别处理的方式存储,这里采用的是向量空间模型VSM,它将文本空间看作一组正交特征向量组成的向量空间,将文本表示为多维空间中的一个特征向量:V(d)=(t1.w1(d);…ti,wi(d);…;tn,wn(d)),其中七i为特征项,wi为ti的权重,即频率,
DBSCAN是一种基于密度的聚类算法,根据基于中心的密度对点进行分类,其密度用数据集中Eps半径之内的点的个数进行估计,根据基于中心的思想,可以将点分为以下三种类别:(1)核心点:给定邻域内的点数超过阈值参数MinPts,则认为该点是一个核心点;(2)边界点:边界点不是核心点,但它落在某个核心点的邻域内;(3)噪声点:既不是核心点,也不是边界点。
在本文中,首先要对智能合约代码的特征项进行处理,并不是每一个词都能作为合约的特征项,有的词可能出现了很多次,但是没有什么重要性,比如“return”“public”等词并不能体现出一个合约的特征,反而会影响聚类效果,因此,在预处理的过程中,不仅删除了智能合约程序中的注释,还设置了“public”“return”等停止词,另外,为了更好地描述合约特征,在预处理过程中不考虑大小写,将仅有大小写区别的特征项进行合并。
在聚类过程中,采用欧氏距离作为距离函数来描述两个特征向量之间的距离,对于长度不一致的特征向量,在向量中添加频率为0的项进行补齐后再做计算,对于划分在同一个簇中的智能合约,将合约文件名以及特征向量输出到关联的文件中,以便作为之后的数据集。
此方法中采用的DBSCAN算法详见算法1。
2.3统一的智能合约代码生成
智能合约程序由不同功能的代码组成,如交易类合约包含“transfer”等函数、“ERC20”标准接口代码,在交易过程中会使用的“SafeMath”等基本函数,为了使智能合约的设计过程更加简单,可以采用Char-RNN来生成统一的合约基本函数,从而得到相应领域的智能合约模板。
递归神经网络(RNNs)在自然语言处理中表现出强大的学习能力,它可以对序列数据进行很好的建模,并且能充分利用序列的信息,因为网络对文本中的每个单词依次进行语义合成,所以它不要求文本有统一的长度,图3所示为传统的递归神经网络结构。
标准的递归神经网络给定一个输入向量序列,通过迭代计算一个隐藏状态和一个输出序列,如图3所示,x是输入单元,代表词向量;h是隐藏状态;o表示输出,u是输入-隐藏的权值矩阵,w是隐藏-隐藏的权值矩阵,V是隐藏一输出的权值矩阵。
Char-RNN是字符级语言模型,能够接收一大块文本文件作为输入,并将其输入基本的RNN算法中,该算法学习预测序列中的下一个字符,在训练了基本的RNN之后,它可以一个字符一个字符地生成与原始数据集风格相似的文本。
另外,对于生成的智能合约代码,采用SmartCheck工具来进行代码的逻辑检测,其中逻辑语法存在问题或是不完整、重复的函数皆被视为错误,最后得到生成的智能合约代码中错误函数占比为31.73%,生成的部分代码的SmartCheck测试结果如图6所示,其中红框表示这些代码中存在的问题,蓝框显示问题所在的代码段。
3智能合约自动生成原型系统
3.1系统架构
本文中的智能合约自动生成原型系统运行于Windowsl0操作系统平台之上,系统基于MFC完成智能合约的自动生成,系统架构如图7所示。
智能合约自动生成原型系统在创建合约时会对合约进行重名检测,并提供继承功能;合约生成模块的智能合约基本代码来自之前Char-RNN的训练结果,包含基本函数代码、SafeMath以及ERC20标准接口代码;合约存储模块对自动生成的智能合约进行存储。
3.2系统功能
智能合约自动生成原型系统实现了用户自定义智能合约设计,从而实现智能合约的自动生成,图8所示为智能合约自动生成原型系统的页面,红框部分显示了之前生成的智能合约函数名称及代码,黄框中为新建合约、添加函数等功能的按钮,右侧为合约代码编辑框,由图7可以看出,智能合约自动生成原型系统主要包含合约创建模块、合约生成模块、合约存储模块,接下来依次介绍各模块的功能,
3.2.1合约创建
合约创建模块的主要功能为创建新的智能合约,在新建时,提供了合约继承功能,并且能够检测合约是否重名。
如图9所示,点击“New”按钮新建智能合约时,默认合约名为“Contract”,用户可自行修改,若合约名称不符合要求,会弹出提示框要求用户重新输入,右侧的ListBox控件中将会显示已经生成的合约名称,用户可以自行选择是否继承。
3.2.2合约生成
合约生成模块提供了上述改进的Char-RNN生成的智能合约代码,包含基本函数方法(如“transferFrom”函数)、标准接口代码(如“ERC20”代码)和基本合约代码(如“SafeMath”合约代码),系统创建了一组文件用来存储这些代码,在运行时完成加载。
如图10所示为创建“approve”函数的截图,软件运行时,会首先打开“approve”等函数的文件,读取其中的代码,并将其保存在相应的对象中,“approve”函数在页面上表示为List控件的一项,加载完成后,可以通过函数名称来得到相应的函数代码,并在Static控件中显示,为了方便显示并编辑代码,软件定义了相应的触发事件将代码与控件相关联,最后,用户可以通过选中“approve”项,在Static控件中显示对应的函数代码,点击“Add”按钮,可将代码添加到右侧编辑框中的光标位置。
3.2.3合约存储
合约存储模块能够将生成的智能合约保存到文件中,用户可以点击“save”按钮,将设计的合约以“,sol”格式保存到任意路径,如图11所示,
3.3智能合约生成案例
本节介绍通过设计生成智能合约的过程,并以合约“MyToken”作为例子来进行分析,“MyToken”是一个基于ERC20标准的代币合约,可以实现基本的代币交易功能。
第一步,用户在编辑器上分别选中“SafeMath”和“ERC20”,两者分别链接有Char-RNN模型生成的基本合约代码和标准接口代码,点击“Add”按钮,在编辑框出现相应代码后,用户可以根据自身的需求对代码进行进一步修改,例如,添加“SafeMath”代码,它提供了统一的算术功能(如加、减、乘、除),使得交易更加规范。
第二步,完成上述步骤后,用户可以通过继承“ERC20”和“SafeMath”来实现合约“MyToken”,之后,用户可以通过控件在合约中添加新的函数来实现不同的功能,例如,在合约中添加“allowance”函数,允许spender从owner中转出的相应数目的代币。
第三步,在合约“MyToken”设计完成后,用户可以点击“save”按钮,将设计的合约以“,sol”格式保存到任意路径,为了验证设计的智能合约的可用性,可使用SmartCheck进行检测,并将“MyToken”合約部署到以太坊上,结果表明,合约逻辑正确且能够顺利执行。
4结论
本文提出了一个自动生成智能合约的方法,并设计了一个面向用户的编程界面,该方法对于大小在3-6 KB的交易类智能合约,能够得到逻辑正确的交易类智能合约模板,用户可以根据自己的定义和要求,用Solidity编写智能合约代码,系统增强了非开发人员用户的设计能力,并提供了一种比传统方式更高效、快捷、简单的智能合约设计方法,节省了合约编程的时间,
但是,本文的方法主要针对交易类智能合约实现,对于其他领域的智能合约还待进一步研究,该方法未来的工作会对更多领域的智能合约代码自动生成进行研究,针对不同的领域提供智能合约设计模板。