基于代码注释调优的智能合约自动生成方法

2024-06-01 10:24陈勇胡德锋徐超陈楠楠
计算机应用研究 2024年5期
关键词:智能合约微调

陈勇 胡德锋 徐超 陈楠楠

摘 要:针对智能合约开发效率不高、安全漏洞频发等问题,提出了一种基于代码注释调优的智能合约自动生成方法。首先结合智能合约代码关联注释的语义信息,构建智能合约聚类分析模型,实现功能类似智能合约的快速精准聚类;接着划分注释关联的合约层、函数层、接口层等不同层次智能合约知识库,以聚类后的代码及注释信息为基础,构造多样化Prompt特征提示语句数据集;最后,以大语言模型ChatGLM2-6B为基础,借助P-Tuning v2微调技术,实现特定需求智能合约的自动生成。为检测该方法的有效性,借助双语互译质量评估辅助工具BLEU和代码安全检测工具Mythril与VaaS,同现有方法进行了对比。实验结果表明,该方法生成的代碼BLEU平均值提升了13%左右,代码安全性提高6%左右。此方法将代码注释信息融入智能合约的自动生成,有效提升了智能合约的质量,为高效开发安全可靠的智能合约提供了一种新的方法。

关键词:智能合约;注释;大语言模型;微调;自动生成

中图分类号:TP183   文献标志码:A    文章编号:1001-3695(2024)05-031-1502-06

doi: 10.19734/j.issn.1001-3695.2023.09.0401

Research of smart contract automatic generation method based on code annotation optimization

Abstract:To address the issues of low efficiency and frequent security vulnerabilities in smart contract development, this paper proposed a smart contract auto-generation method based on code comment optimization. Firstly, it constructed a smart contract clustering analysis model based on the semantic information of smart contract code associated annotations to achieve fast and accurate clustering of functions similar to smart contracts. Then,it divided the smart contract knowledge base into different levels such as the contract layer, function layer, and interface layer associated with the annotation. And based on the clustered code and annotation information, it constructed a diversified Prompt feature prompt statement dataset. Finally, it achieved automatic generation of smart contracts with specific needs based on the large language model ChatGLM2-6B and with the help of P-Tuning v2 fine-tuning technology. In order to test the effectiveness of this method, this paper conducted comparative experiments with existing methods using the bilingual translation quality assessment assistant tool BLEU and the code security detection tools Mythril and VaaS. Experimental results show that the average BLEU of the code generated by this method is increased by about 13%, and the code security is improved by about 6%. This method integrates code annotation information into the automatic generation of smart contracts, effectively improves the quality of smart contracts, and provides a new method for the efficient development of safe and reliable smart contracts.

Key words:smart contract; annotation; big language model; fine-tuning; automatically generate

0 引言

随着智能合约的快速发展,其应用领域越来越广泛,智能合约的设计除了保证其本身的安全性之外,还需要了解相关应用领域的知识和技能。因此,在智能合约领域经常出现合约开发者与合约设计者的分离:合约开发人员在掌握智能合约编程语言的同时却缺乏对合约逻辑的认识,设计人员在熟悉业务规则的同时却缺乏对智能合约的理解。这无形中降低了智能合约开发效率,影响智能合约发展的步伐。其次,据文献[1]调查统计,截至2022年10月,以太坊中部署发布的智能合约数量已经高达5 100万,其市场规模将以每年32%的增长率增加,涉及的金额已经超过亿级。庞大的市场规模导致对智能合约的开发效率以及安全性要求更加严格,因此,如何快速开发出准确安全的智能合约成为该领域发展亟待解决的关键问题。

然而,目前智能合约的研究主要集中在合约的安全性,对智能合约的开发效率关注较少。一些研究[2,3]开始尝试利用RNN等神经网络实現智能合约的自动生成,但该类研究在代码语义理解层面仍然存在不足,使得生成的合约存在安全性和正确性不高、人机交互效率低等问题,难以满足快速发展的智能合约应用场景。近年来,随着注意力机制[4]的快速发展,以Chat-GPT[5]为代表的各种大语言模型广泛应用于各类通用场景,在代码生成领域也表现卓越。微软的Copilot融合了GPT的强大能力,能够根据使用者输入的信息从而生成相应的通用类代码;MetaAI发布的Code LLaMA Python可以生成各种高效的Python代码。因此,大语言模型对于提升代码生成的质量和效率具有极大的促进作用。然而,大语言模型的构建离不开高质量基础数据的支撑,对于各类常规代码的生成,大语言模型可以通过对大量成熟代码的学习获得出色的表现,但对于智能合约这类新型软件,直接应用已有的大语言模型难免出现生成代码不准确、安全性不高等问题,有必要进行针对性的训练和调优。

程序语义信息的提取是代码自动生成的关键,代码注释[6]作为源代码的辅助信息,标注了代码实现的目的和基本思路,对于提升代码语义信息提取的准确率具有极大的帮助,已经被开发者所广泛使用以提升开发效率[7]。为此,本文从大语言模型出发,借助于智能合约的代码注释,提出了一种基于注释调优的智能合约自动生成方法,将代码注释提供的额外语义信息辅助大语言模型的调优,以提高模型学习过程中对于代码语义的理解,从而更快速准确地生成满足不同需求的智能合约代码,提高智能合约相关应用的开发效率。本文的主要贡献如下:

a)设计了基于注释辅助聚类分析的智能合约相似性评估。对爬虫程序获取的智能合约进行预处理和划分代码层次,从注释信息和代码两个维度出发,分别给予不同的权重并对各层次的智能合约源代码进行聚类分析,从而获取到具有相似特征的层次化智能合约源代码文档和注释,保证智能合约生成模型的准确性,同时提高代码的复用性。

b)构建了代码注释组成的Prompt指令数据集。设计了多个Prompt模版,与注释信息组成数据集的输入部分,同时将智能合约代码划分为函数层、合约层、库合约层以及接口层四个层次,并以此作为数据集的输出部分。

c)训练了注释辅助调优的智能合约自动生成大模型。采用P-Tuning v2微调方法,在ChatGLM2-6B大模型的基础上利用智能合约数据集进行高效的微调和训练,并选取调优后的最佳模型,实现注释信息辅助的智能合约代码自适应匹配。

1 相关研究

目前,大语言模型[8]在医疗、金融以及教育等领域都得到了广泛的应用,各大公司都发布了相应的大语言模型,例如OpenAI的Chat-GPT、清华大学发布的ChatGLM-6B[9]大模型、Meta的LLaMA[10]以及百川等模型,大模型虽然具有强大的学习能力,但其参数量巨大、硬件要求高等特点成为了众多学者考虑的问题。另一方面,针对特定领域的问题,其处理能力仍然有待提高,因此研究者们提出了大模型在垂直领域进行下游任务的进一步微调的方法。微软公司提出了一种基于低阶自适应的大语言模型微调方法(LoRA)[11],该方法通过修改模型结构实现高效微调。斯坦福大学提出的基于提示词前缀优化的方法(Prefix Tuning)[12]在近几年里也得到了不断的优化和改进,例如Prompt Tuning、P-Tuning[13]、P-Tuning v2[14]等。微调使得大语言模型的发展更为广泛,北京大学提出了开源的法律大语言模型(ChatLaw)[15],该模型是以LLaMA模型为基础并采用LoRA方法针对法律领域知识进行精准微调而来。Wang等人[16]以LLaMA-7B为基准模型,融入了大量的结构化和非结构化医学领域的知识进行微调,提出了在医疗领域表现更佳的HuaTuo大语言模型。

针对智能合约领域的研究,目前主要以智能合约代码漏洞检测为主。文献[17~19]从区块链结构中Solidity代码层、EVM执行层、区块链系统层三个角度分析智能合约漏洞,其中Solidity代码层包含重入漏洞(The Dao攻击)、整数溢出漏洞等十几个漏洞,EVM执行层涉及短地址漏洞、以太丢失漏洞等四个漏洞,区块链系统层主要包括时间戳依赖漏洞等三个漏洞。针对智能合约漏洞的检测方法[17]主要分为形式化验证法、符号执行法、模糊检测法、中间表示法以及深度学习的方法,因此VaaS、Oyente[17]、SmartCheck[19]等工具广泛应用于智能合约漏洞的检测,智能合约的安全性问题得到了有效的改善。此外,在智能合约与开发人员友好性交互方面,文献[18,20]提出了一种对于特定领域智能合约自动生成的方法,借助于深度学习中长短期记忆递归神经网络(LSTM)构建智能合约自动生成模型,采用SmartCheck检测生成代码并得到了较好的实验结果,最后通过设计良好的交互界面提高了编程的友好性和高效性。

代码注释作为理解代码的重要手段,不少研究者[21,22]对其使用方式、质量评估和改进等方面进行了研究。王潮等人[23]总结了代码注释质量评估相关的研究成果,从代码注释的一致性、重要性等角度指出代码注释对于程序语义的理解有着至关重要的作用。代码注释的一致性能够充分体现出注释内容和对应代码真实运行逻辑是否一致。高质量代码注释有效减少了大模型理解代码的代价,尤其是在面临着较大的代码数据量的情况下,合理的代码注释从很大程度上缓解了该问题。

在利用深度学习进行代码自动生成的研究中,Iqbal等人[2]指出递归神经网络(RNN)、卷积神经网络(CNN)以及生成的对抗网络(GAN)是主要研究方向,其思想是利用各种神经网络结构搭建代码自动生成模型,并通过大量数据训练模型生成相应的代码。另一方面,ChatGLM2-6B 是由清华大学开源的开源中英双语对话模型,Zheng等人[24]在此基础上,经过了600B代码数据预训练,提出了CodeGeeX2的多语言代码生成模型以及LLaMA在多语言代码微调后的代码生成模型Code LLaMA[25]。此外,BigCoder也发布了编程助手StarCode[26],具有代码生成、补齐以及解释等多种功能。

综上所述,大模型在智能合约代码生成领域已经展现出良好的趋势,但如何增强大模型对代码的语义理解能力仍然是研究者们需要进一步探索的內容,而注释内容能够提供较强的语义信息,对于增强大模型的语义分析能力具有积极意义。基于此,本文提出了基于代码注释和大语言模型微调技术相结合的智能合约自动生成方法,以充分利用注释的语义信息增强大模型的语义分析能力,提高其生成的智能合约代码的正确性。

2 注释信息辅助调优的智能合约自动生成与匹配方法

2.1 总体框架

以上述研究工作作为基础,本文提出了基于注释信息辅助的智能合约自动生成与匹配方法。首先,本文将从智能合约的注释信息和代码体两个角度出发,采用聚类技术针对智能合约各类层次的代码进行分析。然后,通过划分聚类后的代码层次并将注释与之关联,构建智能合约代码生成的指令数据集,同时利用注释信息辅助和安全检测工具分别增强和保证其代码的易理解性和可靠性。最后,以ChatGLM2-6B为基座模型,采用P-Tuning v2方法结合构建的特定数据集对基座模型进行高效微调,开发人员利用界面输入自己的功能需求从而匹配目标代码设计智能合约代码,提高开发的高效性和准确性。

本节将介绍整个研究过程的总体框架,具体如图1所示。

由框架图可知,本文研究思路主要分为三部分。首先利用爬虫程序从以太坊上爬取智能合约源代码文档,将代码和对应注释文档划分层次并通过文件序号建立对应的映射关系。在注释辅助智能合约源代码聚类阶段,本文对聚类的代码和注释文档分别进行预处理后作为输入,从注释和代码两个维度出发,采用K-means算法生成各层次代码簇,从而提取出具有高相似性的层次化代码和注释信息作为代码生成的数据集。其次,在大模型微调数据集构造部分,为确保筛选出对应注释内容较多的代码体,本文将聚类后的层次化代码进行二次预处理,并将代码体对应的注释与Prompt模版构成指令数据集的输入部分,输出部分为相应的层次化智能合约代码。最后,采用ChatGLM2-6B模型作为基础模型,结合构建的数据集进行P-Tuning v2方式微调,选取训练后智能合约代码生成效果最优的大模型,同时本文设计了便捷的人机交互界面,用户在交互界面输入需求信息,从而实现注释辅助智能合约自适应匹配。

2.2 注释指导的智能合约聚类

就代码分析而言,大多数研究仅局限于代码内容本身,往往忽略了注释为对应代码体所带来的信息。因此除了代码体本身这一基础维度之外,注释是本次研究的另一个重点。本文结合注释信息文本和代码文本两个维度进行聚类,从而提取相似的各层次智能合约代码。聚类具体操作步骤如下:

注释中含有较多的源代码描述信息,能够帮助开发者快速理解和阅读智能合约源代码。为提高研究的准确性,本文对于获取的智能合约源代码文档,应尽量保证聚类实验前的智能合约文档具有较多的注释内容。本文通过统计智能合约源代码中注释的行数,从中筛选出注释行数在300以上的智能合约代码,同时文本量较大的智能合约文件含有丰富的注释信息和代码,故保留文件大小在50 KB~80 KB的智能合约文档作为聚类的数据集。其次智能合约源程序文档中含有众多的JSON格式文本、二进制代码文本以及不含注释的智能合约文本,这些源代码对于实验没有参考意义,因此在聚类实验前要进行预处理,删除此类智能合约源代码文档。

智能合约源代码大体上由“function”“contract”“interface”和“library”四个层次代码组成,对于聚类的数据集本文进行了上述层次划分。划分过程中,鉴于源代码结构复杂,根据代码的特殊形式获取代码和对应的注释内容,例如“library”层代码以“library Math {”和单行“}”结尾,注释内容则一般处于代码开头部分上一行并以“/**”开头和“*/”结尾,故首先采用正则化表达式提取出注释内容,当检测到下述的代码时,首先提取出四个层次对应的代码存储在相应的文件中,层次化的代码可以帮助开发者快速生成和管理目标代码。其次,注释作为代码的信息描述,将含注释的源代码中的注释与源代码分别进行了不同文件的存储,有效地避免了聚类过程中这两类样本的相互干扰。然后通过文档序号建立代码体文档和对应注释文档的联系,例如在提取过程中,提取出一个“interface”层代码中一个接口代码则为interface1文件,相应的注释文档即对应为interface1_note文件,建立序号映射关系的智能合约代码体样本和注释信息样本即为本次研究实验数据集。

K-means是一种基于距离划分的聚类算法,其认为两个目标的距离越近,相似度越大,故选取该算法为聚类算法。本文所处理的代码和注释都为字符和符号组成的文本,且随着文本长度增加,数据向量化的维度也会增大,余弦距离在高维空间中只受其向量夹角影响,而不受文本长度的影响,从而能更好地捕捉数据之间的相似性。其次余弦距离的计算相对简单,这使得它在大规模数据集上的计算效率较高,故选取该算法为聚类算法。本文采用余弦距离(cosine distance)作为计算依据,并分别计算智能合约各层次代码内容的余弦距离值以及对应注释内容的余弦距离值,最后给予两个余弦值一定的权重后相加即为样本最终的判断距离,通过衡量各样本之间该距离从而实现聚类。

为提高聚类的准确性,智能合约数据集在聚类前应进行预处理。首先,智能合约代码中有些词出现了很多次但不能体现出在代码中的重要性,比如“public”“return”“internal”等词并不能作为特征项,因此本文设置了“public”该类词作为停用词。同理,注释一般则是以“//”“/**/”等形式存在,所以这些词也不能作为特征项,注释文档聚类中应设置“//”等停用词。其次,鉴于Solidity语言特性,许多标识符是含有大小写的,例如“Contract”、变量名等,因此这里将大小写视为一致。

在聚类过程中,需将每个文档向量化,计算其余弦距离。本文采用空间向量模型(VSM),将代码和注释文档看作由多组不同的特征项与对应权重组成的向量,公式如下:

Di=Di(t1,w1;t2,w2;…;tn,wn)(1)

Gi=Gi(t1,w1;t2,w2;…;tn,wn)(2)

其中:Di和Gi分别表示第i个代码和注释文档;tn为其中每个标识符或关键字;wn为对应的词频。每个代码文档中词频构成代码文档向量化表示Ei=[w1;w2;…;wn],注释文档向量化表示为Ni=[w1;w2;…;wn],计算每个文档与中心点的向量内积和。实验中选取多个聚类中心,依次计算各层次智能合约代码Ei与中心文档Ecenter的余弦距离值,同时计算该文档对应的注释文档Ni与中心文档Ncenter的余弦距离,分别给予权重且比例为λ∶(1-λ),加权计算后进行相加,公式为

聚类过程如算法1所示,具体如下:

a)对智能合约数据集进行无效文档去除,避免非合约结构代码对聚类的干扰,同时分别对代码和注释文档进行停用词处理。

b)通过空间向量模型将各文档向量化,随机选取K个中心文档作为聚类中心,循环开始标志flag为true,当满足所有文档都聚类至最近的聚类中心时,循环标志为false,即结束聚类。采用式(3)依次计算每段代码及其注释文档与各中心点的距离,并将其分配给距离最近的中心文档(第5~13行)。

c)在上一步完成后,重新计算K个簇中各文档的平均距离并更新聚类中心(第15~17行)。

d)计算新、旧聚类中心的余弦距离,若中心点没有发生变化,则结束本次聚类,否则返回算法1中第5行重复上述步骤直至聚类中心不再变化,结束标志为flag=false(第18~23行)。

经过聚类处理后,每个层次的代码分为多个簇,一个簇中的代码为相似的智能合约代码,例如具有相似功能描述的“function”层次代码则为一个簇。

算法1 基于注释指导的智能合约K-means聚类算法

2.3 基于注释辅助微调的多层次智能合约自动生成方法

大模型是指深度学习中具有数以亿计参数的巨大神经网络模型,这些模型在过去的几年中得到了广泛关注和发展,主要是由于它们在各种任务上取得了令人瞩目的性能提升。本文以ChatGLM2-6B 大模型为基座模型,设计了15个模仿使用者提问方式的Prompt同注释构成指令数据集的输入,注释信息对应的层次化代码为输出部分,通过基座模型对微调指令数据集的二次训练生成新的智能合约生成模型,实现智能合约的自动化生成。在上述基础上,本文采用了目前比较主流的P-Tuning v2微调方法训练模型,对生成的模型进行评估并选取效果最优的模型作为智能合约生成的大语言模型。

2.3.1 指令数据集预处理

聚类后的数据以代码簇的形式输出,每个代码簇中含有较多高相似功能的智能合约代码,因此需要对该数据进行二次预处理。首先删除智能合约注释中的无关内容,由于在聚类过程中进行了停用词处理,并没有进行相关代码和注释内容的修改,注释中仍存在着“/**”“@dev”“@notice”等无意义内容,在这里将这些字符替换为空字符,并将注释内容重新写入从而保证内容的连贯性。其次,每个代码簇中存在高相似度的智能合约代码,为保证指令数据集的质量,对每个簇中数据进行相似度计算,对于相同的代码则提取其中一个参与指令数据集的构建。鉴于对智能合约代码数据集划分了层次,因此与之相对应的单个注释匹配字符量比较小,可以认为是短文本类型,这恰恰符合Jaccard的计算特性。另一方面,Jaccard是一种常用的相似度计算方法,相比于其他算法,计算量以及效率更为良好,在智能合约自适应匹配过程中,较好地降低了开发时间并且对于开发环境的要求更加友好。

故本文采用Jaccard[27]作为度量标准,计算簇中代码的相似度。对于每个簇中代码,分别计算注释和代码的相似度,当其中任意一者相似度高于0.9,则认为这两段代码功能重复。 本文给定两个集合,如式(4)所示,ui为代码簇,表示簇中第i个代码,ci为注释文本簇,表示簇中对应的第i个注释,N为集合数量,相似度值为簇中代码之间Jaccard度量值以及对应注释内容Jaccard度量值最大值,当最大值>0.9,则认为是功能相同的代码。

2.3.2 指令数据集构建

在上述预处理后,如图2所示,本文中指令数据集为JSON格式的数据,数据模式如下:{“instruction”:“value1”,“input”:“value2”,“output”:“value3”},每条数据为包含instruction、input以及output三个键值对形式的JSON数据,其中instruction为Prompt模版,该部分设计了15个模仿使用者提问的方式,例如“请帮我生成{input}的相关代码内容”“你现在是一个语言模型,帮我生成相关的智能合约代码,注释如下:input”等,尽量最大范围达到使用者在获取智能合约代码的各种提问方式,从而提升大模型的输出的准确性。

注释是代码的相关信息描述,对于代码的易理解性发挥着至关重要的作用,研究者们往往忽略了这两者的关联性。由于大语言模型在自然处理领域引起了广泛关注,如何更有效地提升Prompt指令质量也成为了研究熱点之一,智能合约代码附有的注释信息能够为其带来更加准确的描述。因此在提示指令工程中,本文加入了注释信息同时随机抽取一个模版构建微调数据集的指令,这也是本文研究的要点。众所周知,目前大多数研究者在提问方式中通过GPT生成、人工构造等方式尽可能最大化涉及使用者可能会提问的各类问句,由于智能合约涉及金融、医疗等多个领域,其代码和注释信息中内容具有很强的现实含义,例如“token”代表货币,“address”代表使用者地址。结合这一内容,本文在智能合约指令的数据集的input部分加入了注释信息来帮助大模型更好地学习智能合约领域的知识,如图2所示,本文设计了多个提问模版,随机与注释信息搭配构成大模型学习的输入内容,output部分为输出信息,即大模型在接收使用者的需求信息后所回应的内容,在这里将注释对应的层次化代码作为数据集的输出部分。

2.3.3 模型微调

自然语言处理目前存在一个重要范式,即一般领域的大规模预训练对特定任务领域的适应。但随着规模的变大,当进行特定任务适应时,由于训练成本太高,无法重新训练所有模型参数,所以研究者提出在原有模型基础上进行一些垂直领域的微调,从而达到更优的效果。ChatGLM2-6B是由清华大学团队发布的第二代大模型,具有高性能、强大的推理能力等特点。本文以该模型作为微调的基础模型,同时采用了目前比较热门的P-Tuning v2方法。

P-Tuning v2是P-Tuning的优化,利用多层提示(即深度提示优化),在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,因此具有更多可学习的参数以及对模型的预测更直接的影响。在本实验中,学习率为1E-4 ,每训练1 000步保存一次模型,梯度累积次数和GPU设备上批次大小都为1,词表大小为1 560,设定模型接收的最大输入长度为1 024,采用单卡进行训练。

在微调训练后,本文将训练后的模型保存至相应文件夹中,ChatGLM2-6B官方源码中提供了模型测试的可视化界面。因此本文将代码中模型路径更改为训练后的模型,在测试界面对微调训练的智能合约生成大模型进行测试。使用者在界面中输入自己的需求信息,大模型根據接收内容返回相应的智能合约代码内容。

3 实验与结果分析

3.1 实验环境及数据集

本文实验是在算力服务器上完成的,显卡为单卡A100,程序编写和运行环境为Python 3.10、PyTorch 2.0以及CUDA 11.6。本文采用的数据集由自编爬虫程序获取,选取以太坊平台(Ethereum)并爬取10 437个智能合约源程序,智能合约文档的大小在1 KB~211 KB。本文将数据集进行初步的预处理,去除一些JSON、ABI等格式的智能合约,保留大小集中在50 KB~80 KB的1 737个智能合约文档作为本文实验的数据集。最后对数据集中智能合约源代码进行“function”“contract”“interface”和“library”层次划分以及注释和对应代码体划分,并定义了聚类分析中所需要的停用词文档,同时设计了15个提示指令的模板。

本文首要步骤是获取聚类的智能合约数据集,以太坊是目前应用最广泛的区块链交互平台,其平台公布了众多获得开源许可的智能合约源代码,本文通过编写智能合约源代码爬虫程序获取该平台最近一年的智能合约作为实验数据集。具体操作流程如下:从以太坊平台下载智能合约地址文件,借助自动化程序打开以太坊浏览器,读取文件中地址构建智能合约源代码页面,从第一页开始,循环更新内容,按照上述方法依次获取每页智能合约源代码存储至本地文件中,直至智能合约地址文件读取完毕。

3.2 结果及分析

在完成聚类实验后,本文获取了618个智能合约代码簇,每一个代码簇包含较多相似的智能合约代码,因此本文对簇中数据进行上述的相似度计算,选取一个代码以及对应的注释内容和指令模板随机构成一条数据,数据量为782条。

为确保生成代码的有效性,在微调后的大模型中,通过指令生成50条各层次智能合约代码,本文采用BLEU指标对其进行评估。BLEU指标[28]是一种广泛应用于机器翻译任务的评测机制,在这里通过生成代码文本和参考文本之间共同出现n元词的次数(n-gram)衡量生成代码的质量。n元词中n取值为1~4,BLEU分数取值为0~1,如果两个句子完美匹配,那么BLEU为1.0,反之,如果两个句子完全不匹配, 那么BLEU为0.0。其中,BLEU机制评分如式(5)所示。

对于生成的代码文本,为避免符号对评测分数的影响,本文将“+”“-”等非词语统一替换为空格,同时根据Solidity语言特性将代码文本通过空格进行分词并得到BLEU分数。式(6)为提高率计算公式,P(x,y)为x相对于y的提高率。

本文针对各层次中生成的代码分别采用BLEU机制测评,实验后BLEU得分如表1所示,同时与文献[14]进行了对比,采用式(6)计算提高率,x为本文实验中合约层(contract)对应BLEU1~4得分,y为文献[14]中BLEU1~4得分。从实验结果可以看出,本文方法生成的代码评分更高,本实验得分相对于文献[14],BLEU1~4得分分别提高了6%、3%、9%、7%。

另外,为验证生成的智能合约的安全性和正确性,本文分别使用VaaS和Mythril安全检测工具,对生成的智能合约的正确率进行检测。在本实验中,将代码不完整、代码编译错误以及检测不合格统一视为不正确的智能合约,实验结果如表2所示。其中,第一列表示检测的自动生成代码类型,该实验主要对比了六种类型:本文方法自动生成的函数层(function)代码、合约层(contract)代码、接口层(interface)代码以及库层(library)代码、无注释微调模型生成的合约层代码、文献[14]生成的合约层代码;第二、三列分别表示VaaS和Mythril这两类智能合约安全检测工具测得的正确率。

由该实验结果可以看出,在正确率上,合约层因为功能最全,涉及的元素最多,所以其正确率相对较低,但也达到了72%左右。而无注释微调的模型,其生成合约代码的平均正确率仅为65.3%。由于文献[14]仅利用Vaas检测了其生成代码的安全性,所以本文仅比较了Vaas工具的检测结果。根据结果可以看出,文献[14]生成的智能合约的正确率为68.27%,根据式(6)计算可得,本文方法相对于文献[14],正确率提升了(72.3%-68.27%)/68.27%=6%。

此外,本文模型同目前比较主流的代码生成模型进行了对比实验。本文选取ChatGPT 3.5、Code LLaMA以及ChatGLM2-6B作为评测衡量的模型,通过同样的口令在各个模型中生成ERC20智能合约代码,如表3所示,并将生成代码分别与源代码进行BLEU评分计算和对比。

从表3得分来看,各类大模型的低分说明在智能合约生成方面能力很差,无法生成复杂化的代码。本文相比其他模型具有明显的提升,评分贴近ChatGPT,生成代码与源代码接近度更高,效果更好。其次,本文生成的代码提供了相关的接口代码、库合约代码。整体来看,大多数通用类模型目前仅局限于单个合约代码,结构较为简单,不能满足当前智能合约领域的多元化。另一方面,本文所生成代码提供了众多的注释信息,这也是本文重点之一,注释信息能够帮助开发者快速高效地理解代码,提高开发效率。

4 结束语

本文提出一种基于代码注释调优的智能合约自动生成方法,该方法通过爬取以太坊上智能合约源代码作为数据集并进行层次化划分和代码注释划分。在聚类分析中,从注释和代码体两个角度出发,有效地提取出各层次代码中高相似度的代码。同时,采用ChatGLM2-6B为基座模型,利用聚类后智能合约源代码和注释构建提示指令数据集,采用P-Tuning v2方式训练智能合约自动生成模型,生成各类应用场景下的智能合约代码。在智能合约的安全方面,本文采用BLEU评分机制和智能合约检测工具检测生成代码的质量和安全问题,最后设计了便捷快速的可视化界面供开发者使用。实验结果表明,本文方法生成的智能合约代码质量和安全指标较好,相比于已有方法具有明顯的提高。

本文方法可有效应用于智能合约的自动生成,对于智能合约开发的效率性、安全性问题具有一定的研究意义,但也存在一定的不足。首先本文没有针对特定领域智能合约开展研究,目前仅局限于各领域中常用的合约代码,缺少对各个特定领域代码的研究。其次,本文所采用的ChatGLM2-6B模型虽有明显的提高,但后续可以考虑使用更多的大模型作为基座模型开展研究。最后,在数据方面,后续可以加大数据量规模以及考虑其他微调方法,并结合如何构建更高效的指令数据开展工作。

参考文献:

[1]Tolmach P,Li Yi,Lin Shangwei,et al. A survey of smart contract formal specification and verification [J]. ACM Computing Surveys (CSUR),2021,54(7): 1-38.

[2]Iqbal T,Qureshi S. The survey: text generation models in deep lear-ning [J]. Journal of King Saud University-Computer and Information Sciences,2022,34(6): 2515-2528.

[3]Bas A,Topal M O,Duman C,et al. A brief history of deep learning based text generation [C]// Proc of International Conference on Computer and Applications. Piscataway,NJ:IEEE Press,2022: 1-4.

[4]Ma Tian,Wang Wanwan,Chen Yu. Attention is all you need: an interpretable transformer-based asset allocation approach [J]. International Review of Financial Analysis,2023,90: 102876.

[5]Sallam M. ChatGPT utility in healthcare education,research,and practice: systematic review on the promising perspectives and valid concerns [J]. Healthcare,2023,11(21):2819.

[6]潘兴禄,刘陈晓,王敏,等. 基于概念传播的软件项目代码注释生成方法 [J]. 软件学报,2023,34(9): 4114-4131. (Pan Xinglu,Liu Chenxiao,Wang Min,et al. Code comment generation based on concept propagation for software projects [J]. Journal of Software,2023,34(9): 4114-4131.)

[7]Geng Mingyang,Wang Shangwen,Dong Dezun,et al. Fine-grained code-comment semantic interaction analysis [C]// Proc of the 30th International Conference on Program Comprehension. Piscataway,NJ:IEEE Press,2022: 585-596.

[8]Xin W,Zhou Kun,Li Junyi,et al. A survey of large language models [EB/OL]. (2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2303.18223.

[9]Zeng Aohan,Wang Zihan,Du Zhengxiao,et al. GLM-130B: an open bilingual pre-trained model [EB/OL]. (2022)[2023-11-04]. https://doi.org/10.48550/arXiv.2210.02414.

[10]Touvron H,Lavril T,Izacard G,et al. LLaMA: open and efficient foundation language models [EB/OL]. (2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2302.13971.

[11]Hu E J,Shen Yelong,Wallis P,et al. LoRA: low-rank adaptation of large language models [EB/OL]. (2021) [2023-11-04]. https://doi.org/10.48550/arXiv.2106.09685.

[12]Li X L,Liang P. Prefix-tuning: optimizing continuous prompts for generation [EB/OL]. (2021) [2023-11-04]. https://doi.org/10.48550/arXiv.2101.00190.

[13]Liu Xiao,Ji Kaixuan,Fu Yicheng,et al. P-Tuning: Prompt tuning can be comparable to fine-tuning across scales and tasks [EB/OL]. (2022)[2023-11-04]. https://aclanthology.org/2022.acl-short.8.

[14]Liu Xiao,Ji Kaixuan,Fu Yicheng,et al. P-Tuning v2: Prompt tuning can be comparable to fine-tuning universally across scales and tasks [EB/OL]. (2021)[2023-11-04]. https://doi.org/10.48550/arXiv.2110.07602.

[15]Cui Jiaxi,Li Zongjian,Yan Yang,et al. ChatLaw: open-source legal large language model with integrated external knowledge bases [EB/OL]. (2023)[2023-11-04]. https://doi.org/10.48550/arXiv.2306.16092.

[16]Wang Haochun,Liu Chi,Xi Nuwa,et al. HuaTuo: tuning LLaMA model with Chinese medical knowledge [EB/OL]. (2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2304.06975.

[17]錢鹏,刘振广,何钦铭,等. 智能合约安全漏洞检测技术研究综述[J]. 软件学报,2022,33(8): 3059-3085. (Qian Peng,Liu Zhenguang,He Qinming,et al. Smart contract vulnerability detection technique: a survey [J]. Journal of Software,2022,33(8): 3059-3085.)

[18]高一琛,赵斌,张召. 面向以太坊的智能合约自动生成方法研究与实现 [J]. 华东师范大学学报: 自然科学版,2020,2020(5): 21-32. (Gao Yichen,Zhao Bin,Zhang Zhao. Research and implementation of a smart automatic contract generation method for Ethe-reum [J]. Journal of East China Normal University: Natural Sciences,2020,2020(5): 21-32.)

[19]Rani P,Birrer M,Panichella S,et al. What do developers discuss about code comments? [C]// Proc of the 21st IEEE International Working Conference on Source Code Analysis and Manipulation. Piscataway,NJ:IEEE Press,2021: 153-164.

[20]Mao Dianhui,Wang Fang,Wang Yalei,et al. Visual and user-defined smart contract designing system based on automatic coding [J]. IEEE Access,2019,7: 73131-73143.

[21]Xing Hu,Xin Xia,Lo D,et al. Practitionersexpectations on automated code comment generation [C]// Proc of the 44th International Conference on Software Engineering. Piscataway,NJ:IEEE Press,2022: 1693-1705.

[22]Rani P,Panichella S,Leuenberger M,et al. What do class comments tell us?An investigation of comment evolution and practices in Pharo [J]. Empirical Software Engineering,2021,26(6): 112.

[23]王潮,徐卫伟,周明辉. 软件中代码注释质量问题研究综述 [J]. 软件学报. 2023,35(2): 513-531. (Wang Chao,Xu Weiwei,Zhou Minghui. Survey on quality of software code comments [J]. Journal of Software,2023,35(2): 513-531.)

[24]Zheng Qinkai,Xia Xiao,Zou Xu,et al. CodeGeeX: a pre-trained model for code generation with multilingual evaluations on Human-Eval-X [EB/OL].(2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2303.17568

[25]Roziere B,Gehring J,Gloeckle F,et al. Code LLaMA: open foundation models for code [EB/OL]. (2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2308.12950.

[26]Li R,Allal L B,Zi Yangtian,et al. StarCoder: may the source be with you! [EB/OL]. (2023) [2023-11-04]. https://doi.org/10.48550/arXiv.2305.06161.

[27]郭宏,伊亞聪,闫献国,等. 基于Jaccard 的协同过滤刀具推荐算法 [J]. 太原科技大学学报,2023,44(5): 464-468,475. (Guo Hong,Yi Yacong,Yan Xianguo,et al. Collaborative filter tool recommendation algorithm based on Jaccard [J]. Journal of Taiyuan Uni-versity of Science and Technology,2023,44(5): 464-468,475.)

[28]Xia Min,Shao Haidong,Ma Xiandong,et al. A stacked GRU-RNN-based approach for predicting renewable energy and electricity load for smart grid operation [J]. IEEE Trans on Industrial Informatics,2021,17(10): 7050-7059.

猜你喜欢
智能合约微调
乐海乐器“微调轴”研发成功
一种新型微调挤塑模具的设计及应用
农产品供应链金融信用体系框架设计
基于区块链技术的去中心化数字出版平台研究
灵活易用,结合自动和手动微调达到好效果 StormAudio ISP 3D.16 ELITE/PA 16 ELITE
区块链技术在互联网保险行业的应用探讨
区块链技术在会计中的应用展望
智能合约与金融合约
隐显结合 听读辩证——高职高专听读模式教学方法与实践的总结、理论适用及模式微调
全国大部省份结束2014高考 多地高考模式微调