Press "Enter" to skip to content

论文分享(八)| 智能合约代码Notice可以自动生成啦!

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

论文题目 :Automating User Notice Generation for Smart Contract Functions by Taming Application-Inherent Conflicts

 

作者:Xing Hu, Zhipeng Gao, Xin Xia, David Lo , Xiaohu Yang

 

会议:International Conference on Automated Software Engineering (ASE 2021)

 

论文链接:https://xin-xia.github.io/publication/ase214.pdf

 

智能合约已经得到了广泛的关注,并且在自动金融和商业交易中起着至关重要的作用。

 

对于从未见过源代码的最终用户,他们可以阅读客户端中显示的用户Notice,以了解智能合约功能的事务处理。然而,由于时间限制或缺乏动力,在智能合约的开发过程中,用户的Notice经常开发者被忽略。对于缺乏用户Notice信息的最终用户,他们没有简单的方法来检查智能合约的代码语义。

 

因此,在本文中,作者提出了 一种新的方法SMARTDOC来自动生成智能合约功能的用户Notice 。作者的工具可以帮助最终用户更好地理解智能合约并发现这个合约的金融风险,增加用户对智能合约可靠性的信心。SMARTDOC利用来学习源代码的表示,并根据学习到的表示生成自然语言描述。作者还集成了指针机制,从输入源代码中复制单词,而不是在预测过程中生成单词。作者从54,739份用Solidity写的智能合约中提取了7,878对功能、Notice。由于所收集的智能合约函数的数量有限(即7,878个函数),作者开发了一种迁移学习技术来利用所学习的知识来提高SMARTDOC的性能。学习到的知识是通过在Java代码语料库上的预训练获得的。实验结果表明,在给定源代码的情况下,作者的方法能够有效地产生用户Notice,并且明显优于目前最先进的方法。为了调查人们对作者生成的用户Notice的看法,作者还进行了一次人工评估,并要求参与者对不同方法生成的用户Notice进行评分。结果表明,SMARTDOC在自然度、信息量和相似度三个方面优于Baseline。

 

背景介绍

 

当区块链交易被并行执行时,带来的最这其中的突破点在哪里?

 

可以把和智能合约互动的人分为两类:开发者和终端用户。开发者实现智能合约时,他们需要将金融操作(如转账)转化为一个或多个合约交易;然后,最终用户开始交易,触发执行智能合约中规定的功能。

 

在这项研究中,作者认为,最终用户往往是不懂技术的合约消费者。为了帮助这些无法阅读源代码的用户,Solidity(最流行的智能合约编程语言之一)提供了一个可以为终端用户提供Notice的机制。

 

 

智能合约代码示例

 

上面说明了一个智能合约功能的例子以及最终用户如何使用它。 假设Alice是一个对编程一无所知的智能合约的终端用户; 当她向上述函数提交一个目标地址为0x83 * Cc,”mintedAmount “为100的交易时,那幺Notice将呈现给Alice为。 “拿出100个代币并将其发送到0x83 * Cc”。

 

在阅读了用户Notice后,爱丽丝可以更好地理解合约,从而可以更好地做出知情决定,即拒绝或确认交易。

 

Solidity合约可以使用特殊的形式注释为函数、返回变量等提供丰富的文档。这种特殊的形 式被命名为以太坊自然语言规范格式(Natspec)。

 

从下图中,可以观察到几乎所有的智能合约都少于40个函数。因此,作者分析了它们的交易,发现具有更多用户Notice的智能合约会有更多的交易。这是因为详细的用户Notice可以使最终用户充分意识到金融风险,并极大增加了用户对智能合约的信心,因此最终用户更喜欢通过具有更高质量用户Notice的智能合约来进行交易。

 

 

智能合约中的功能分配

 

下图也可以看出具有更多用户Notice数的智能合约明显更受欢迎,后两段合约 显示了两个智能合约的源代码,即SMT和LooksCoin,其中SMT有58,785个交易,LooksCoin有25个交易。很明显两个智能合约实现了相同的功能。但 在本例子中 SMT合约提供了足够的用户Notice,而LooksCoindid没有为最终用户提供任何Notice。详细的用户Notice可以帮助最终用户更好地了解他们的操作,从而使智能合约在最终用户中更受欢迎。

 

 

 

智能合约案例

 

 

具有不同用户Notice数量的智能合约平均交易使用量

 

1

 

研究价值

 

由于区块链系统的不可更改特性,一旦部署了智能合约,就无法添加用户Notice。因此,希望有一种工具能够在智能合约开发人员忘记的时候自动为他们生成用户Notice。

 

现有的方法主要集中在为通用编程语言(如Java和Python)生成注释。这些注释帮助开发人员理解源代码。然而,生成评论特别是面向用户的评论(即用户Notice)还没有得到太多的关注。为智能合约制作这样的工具是一项重要的任务。主要包含以下挑战:

 

(一) 动态表达机制 :智能合约中的用户Notice支持动态表达式。与其他编程语言的一般代码注释(如Java注释)不同,Solidity编译器从源代码中动态生成用户Notice。动态表达机制要求用户Notice中的某些单词应该与源代码中相应的标记相同。对于刚才所示的例子,单词“mintedAmount”和“target”都是从源代码中复制的。这种机制使得用户Notice与源代码紧密相关。尽管现有的文档生成方法在通用代码注释生成方面取得了巨大成功(例如,Java方法的注释),但尚不清楚它们是否能成功应用于智能合约的用户Notice生成。对于这些深度学习模型来说,如何从智能合约中正确复制变量名仍然具有挑战性。

 

(二) 数据饥渴 :与其他流行的编程语言(如Java)相比,为智能合约收集大规模数据集更加困难。尽管以太坊区块链已经积累了大量的智能合约,但数据饥渴问题依然存在。也就是说,只有一小部分智能合约有用户Notice。根据作者的初步研究,54,739份智能合约中只有11,409份包含用户Notice;如果只看函数,比例甚至更小。如何利用有限的标签数据生成准确的用户Notice是这项工作的挑战

 

在本文中,作者提出了一种称为SMARTDOC的新方法来解决上述挑战。主要的目标是理解智能合约中的功能,并为智能合约中的功能自动生成用户Notice(即@Notice)。

 

2

 

实现方法

 

 

方法框架

 

上图展示了作者的方法SMARTDOC的整体框架。 它主要由三个阶段组成:预训练、微调和应用。 在预训练阶段,利用作者本人2019年发表论文中准备的Java数据集对SMARTDOC模型进行预训练。

 

1)预训练过程:为了得到一个好的Solidity函数的代码模型,作者首先在Java语料库上对作者的模型进行预训练。

 

这是合理的,首先,Java语料库比Solidity函数的规模大得多,这为训练一个全面的模型提供了足够的数据集。 第二,Solidity语言在语法和句法方面与Java语言相似;这些从Java语料库中学习到的相似特征对于可靠性功能也是有效的。

 

2)微调过程:当模型被预训练时,作者然后在用户Notice生成任务中对其进行微调。微调过程可以快速调整来自Java预训练模型的知识,以学习代码语义和可靠性函数的结构。

 

 

深度学习架构

 

上图是作者提出的基于深度学习的模型的网络架构的概述。作者模型的架构遵循Transformer框架,该框架在之前的文章已成功应用于机器翻译任务。该体系结构主要由三个子模块组成:

 

A. Encoder: 源代码编码器。该模块旨在表示源代码,并利用多头自注意来学习源代码的顺序信息。

 

编码器旨在学习智能合约函数X。输入到编码器前每个标记被嵌入到一个向量中。为了帮助SMARTDOC关注Function X的重要信息,编码器采用了多头自我注意力层来捕捉输入的重要部分。然后多头自注意层的输出被输入到一个前馈神经网络。

 

B. Decoder: Notice生成解码器。本模块旨在通过自我关注层和编码-解码层生成Notice。编码器-解码器关注层帮助解码器关注输入序列中的适当位置。

 

解码器组件主要由两部分组成,即自关注层和编解码关注层。

 

自我关注层类似于编码器组件中的自我关注层,只是它只处理输出序列中生成的单词。与自注意层不同,编解码器注意层学习源代码和目标用户Notice之间的关系。注意力的计算类似于自我注意。查询矩阵来自自我关注层的输出,关键字和值矩阵来自编码器组件的输出。对于每一步,解码器输出一个状态向量,它可以变成一个序列的一个字。

 

C. Pointer generator : 指针生成器用于从源代码中复制变量

 

如前文所述,智能合约用户Notice的动态表达式机制导致用户Notice中的词语需要从源代码中复制。因此,作者在解决这个问题的方法中集成了指针生成器。指针生成器是根据词汇表,副本分布和生成概率来计算的。

 

1)词汇表分布:根据transformer体系结构,词汇表分布Pvocab是由跟随线性层的softmax层来计算的。

 

2)复制分布:复制分布是从输入序列中复制一个单词的可能性,即本合约中的源代码。它是根据注意力分布计算的,即解码器中编码器-解码器注意力层的输出。编码器和解码器之间注意力分布的计算类似于自注意层,除了关键向量来自编码器的输出= (r1,…,rm)。目标单词和源代码标记之间的注意力分布。

 

3)最终分发:最后,模型使用一个软开关pgento来转换从词汇生成单词和从输入源codePcopy复制。

 

D.   Transfer learning :迁移学习

 

在训练过程中,深度学习模型需要大量的标记数据。然而,智能合约和Notice的并行数据是有限的。为了更好地利用智能合约中的潜在信息,文章加入了迁移学习技术来重用学习到的知识。迁移学习是缓解数据饥饿问题的有效技术。迁移学习超越了特定的任务和领域(在本文中,评论生成),并试图利用来自预训练模型的知识,并使用它来解决目标问题(在本文中,用户Notice生成)。又因为智能合约函数的特点,选择Java方法的注释生成作为学习编程语言特点的源任务。

 

3

 

指标

 

A: Dataset :

 

使用夏鑫等人也是她们实验室之前发的文章中提供的原始智能合约数据集,该数据集包含从Ether-scan抓取的54,739个经过验证的文件(每个文件可能包含多个智能合约)。

 

预处理:首先,作者利用Solidity-parser来分析智能合约并提取函数。作者排除了构造函数,因为构造函数一般都很简单。由于Solidity-parser不支持NatSpec注释抽取,作者将正则表达式定义为提取标有@Notice给函数的NatSpec注释。她们从智能合约中提取了1,296,556个函数,获得了51,567个带有用户Notice的函数。智能合约函数的平均代码行数(LOC)为6.34。

 

过滤:然后,作者从智能合约函数中提取用户Notice(NATspec comment标签为@Notice ),并过滤掉非英语样本。又因为重复代码对神经网络有负面影响,会在评估中引入偏差,作者删除了重复函数和用户Notice。最后,作者得到7,878个〈Func,Notice〉对。

 

生成训练/测试集:作者将数据集分为训练集和测试集。作者随机选择1k对进行测试,其余的用于训练。作者发现超过96%的代码片段少于200个标记,用户Notice少于50个单词。此外,它们长度的模式分别为30和10。

 

 

代码标记及长度

 

B.Baseline:

 

Attendgru 方法利用Attentional Sequence to Sequence模型来生成代码注释。在预测阶段,他们使用贪婪搜索算法进行推理,最大限度地减少实验变量的数量和计算成本。

 

Ast-attendgru方法在Attendgru的基础上整合了结构信息。结构化信息来自抽象语法树(AST)。

 

Re2Com是最先进的代码注释生成 ,它集成了三种技术,即IR、emplate, 和neural  networks。

 

C.评估指标:

 

BLEU:使用度量BLEU来评估不同的方法。它计算生成的Notice和引用之间的相似度。相似性计算方法是:n个语法匹配精度分数的几何平均值乘以简短因子,以防止生成非常短的句子。

 

ROUGE-L:是另一个广泛使用的度量标准,它考虑了句子级结构的相似性,并自动识别序列文法中最长的句子。

 

D.训练参数细节:

 

作者在TensorFlow的基础上实现SMARTDOC。 Token embedding和hidden size都设置为256维。头和块的数量分别被设置为4和3。使用Adam优化所有参数,初始学习率为0.0005。使用预热步骤的方法,为了克服过拟合,作者利用了退出机制,并将退出率设置为0.1。作者将编码器的最大长度设置为200,解码器的最大长度设置为50。训练运行了50个迭代次数。作者在配有10 GB内存的NVIDIA GeForce RTX 2080 ti GPU的Linux服务器上进行实验。

 

4

 

比较评价

 

A.对比Baseline评价:

 

 

实验设置:收集的数据集应用作者的方法和Baseline方法(即attendgru、ast-attendgru、andRe2Com ),并根据BLEU和ROUGE-L比较它们的性能。 为了检查SMARTDOCand和基准方法之间的性能差异是否显着,作者在95%的置信水平下运行符号秩测试。对于每种方法,作者收集了1000个分数(每个案例一个), 对比了每一个的评估指标。

 

结果:表中显示了作者的方法SMARTDOCand和Baseline技术的BLEU和ROUGE-L评分。可以观察到,ast-a具有最差的性能,并且作者的方法SMARTDOC显着优于所有Baseline模型。与Baseline相比,作者提出的方法SMARTDOCare在BLEU和ROUGE-L方面的改进分别超过60%和35%。所有的p值都远远小于0.05,这意味着作者的方法比Baseline方法有显着的改进。

 

 

B. 消融分析

 

在本文中,作者使用Transformer对智能合约中函数的源代码进行建模。然后,作者利用指针机制在用户Notice生成过程中从源代码中复制单词。为了减轻最小标记数据的限制,作者还利用迁移学习在预测用户Notice之前利用预先训练的知识。作者想要调查这些组件对作者的方法的性能的影响。

 

 

实验设置:为了说明每个组件的重要性,作者将作者的方法与其两个不完整的变体进行比较:

 

 

TransformerRemoves移除了指针机制和预先训练的知识。

 

Transformer+Pis transformer,带指针,仅删除预先培训的知识。

 

 

通过比较smart docs和Transformer,可以观察指针机制和迁移学习技术的有效性。

 

结果:两种变体的有效性在表中中得到证明。可以观察到作者的方法smart doc在每种度量上都优于其他两种变体。与前一个表中所示的Baseline实验结果相比,变压器和变压器+pout都执行Baseline。具体来说,与基于递归神经网络的Baseline相比, TransformerRemoves 在用户Notice生成方面大幅提升了性能(BLEU方面超过40%,ROUGE-L方面超过30%)。与之相比,指针机制的集成进一步提高了性能(BLEU方面提高了约4%)。

 

 

 

与Transformer+P相比,smart doc利用迁移学习技术来减轻数据集数量的限制。可以观察到,它在BLEU和ROUGE-L方面分别提高了约4%和7%。此外,改进的P值小于0.05,表明方法SMARTDOC明显优于变体。

 

 

收敛速度

 

上图表示了SMART-DOCandTransformer+P的收敛速度,可以观察到SMARTDOC收敛曲线具有更高的起点、更高的斜率和更高的渐近线。更高的起点意味着作者的模型有更好的初始能力(在细化模型之前)来产生用户Notice。斜率越高,表明作者的模型在训练期间的改进率越陡。最后,更高的渐近线显示了SMARTDOC更好的收敛技巧。

 

C. 时间成本分析

 

 

实验设置:为了测量作者的方法和其他Baseline的时间复杂度,作者记录了它们的训练过程和测试过程的开始时间和结束时间。为了公平比较,所有模型都在同一台机器包含10 GB内存的NVIDIA GeForce RTX 2080TiGPU。

 

结果:上表说明了作者的方法和Baseline的时间成本。

 

 

与Baseline相比,作者的方法Smartdoc具有最多的参数,大约有2500万个可训练参数。Re2Com花费最高的成本(大约8.2小时)来很好地训练模型。

 

在测试阶段,Attendgru方法是最有效的方法;平均来说,推荐用户Notice需要0.004秒。然而,它所产生的用户Notice的质量是有限的。

 

Smartdoc需要大约0.59小时来训练好,并且需要大约70毫秒来推荐用户Notice。实验结果表明作者的方法是有效的。

 

 

 

5

 

人工评价

 

虽然诸如BLEU和ROUGE-L的自动度量可以评估生成的用户文档和人类编写的参考文本之间的差距,但是它不能反映真人对生成的用户文档的感知。作者进行人体评价。人工评估衡量三个方面,包括生成的用户文档和引用的相似性,自然性(生成的用户文档的语法性和流畅性),以及信息性(从输入代码到生成的用户文档的内容量,忽略文本的流畅性)。分数范围从0到4(越高越好)。

 

作者邀请10名具有1-3年区块链或smartcontract经验且英语水平良好的志愿者,每人30分钟,以问卷的形式评估生成的用户文档。作者随机选择100个智能合约函数,并为每个函数提供参考(人工编写的用户文档)。此外,作者还提供了四种机器生成的用户文档,分别由Attendgru、Ast-attendedgru、Re2Com和SMARTDOC生成。每位参与者都被要求从相似性、自然性和信息量等方面对每个样本进行评分。所有这些分数都是整数,范围从0到4。在注释过程中,参与者可以在网上搜索相关信息和不熟悉的概念。参与者不知道哪种方法产生了哪种文本。

 

 

结果如上表所示,作者的方法在人工评价中也明显优于Baseline。

 

6

 

结论

 

本文提出了一种基于Transformer、指针机制和迁移学习技术的智能合约用户Notice生成方法SMARTDOC。 已经用1000对智能合约函数和它们的用户Notice评估了作者的方法。

 

实验结果表明,该方法能有效生成智能合约的用户Notice,明显优于现有方法。 进行了人工评估,以调查人们对生成的用户Notice的看法。 结果表明,作者的方法可以生成自然的、信息丰富的用户Notice,并且生成的用户Notice比Baseline更接近参考文本。

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。