高一琛 趙斌 張召
摘要:基于以太坊的智能合約已經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域,然而合約開發(fā)需要完備的專業(yè)領(lǐng)域知識和編程能力,針對智能合約編程友好性,本文提出了一種對于特定領(lǐng)域智能合約自動生成的方法,實(shí)現(xiàn)了對于智能合約的聚類分析以及交易類智能合約基本函數(shù)代碼的生成,對于生成的代碼采用BLEU以及SmartCheck進(jìn)行檢測,得到了較好的檢測結(jié)果,采用MFC將生成的代碼和uI控件鏈接,為用戶提供友好的智能合約編程頁面,實(shí)現(xiàn)智能合約的自動生成,方法生成的智能合約代碼有一定的準(zhǔn)確性,能夠?qū)χ悄芎霞s的開發(fā)提供幫助,最后,通過一個(gè)案例分析驗(yàn)證了生成的智能合約的可用性。
關(guān)鍵詞:智能合約:以太坊:區(qū)塊鏈
中圖分類號:TP301 文獻(xiàn)標(biāo)志碼:A DOI:10.3969/j,issn,1000-5641.202091015
0引言
區(qū)塊鏈近年來引發(fā)了多個(gè)行業(yè)利益相關(guān)者的興趣,被認(rèn)為是人類信用進(jìn)化史上繼血親信用、貴金屬信用、央行紙幣信用之后的第四個(gè)里程碑,隨著區(qū)塊鏈技術(shù)在金融、能源、保險(xiǎn)、物流和交通等關(guān)鍵領(lǐng)域的應(yīng)用,它在全球范圍內(nèi)引起了越來越多的關(guān)注,區(qū)塊鏈目前處于2.0時(shí)代,也就是應(yīng)用功能更加強(qiáng)大的智能合約時(shí)代。
智能合約是一種由事件驅(qū)動的、具有狀態(tài)的代碼合約和算法合同,隨著區(qū)塊鏈技術(shù)的深入發(fā)展而受到廣泛關(guān)注和研究,現(xiàn)有的智能合約是一種可自動執(zhí)行的協(xié)議,在一定條件下直接控制各方之間的數(shù)字貨幣或資產(chǎn)的轉(zhuǎn)移,基于區(qū)塊鏈的智能合約具有去中心化、確定性、可驗(yàn)證、實(shí)時(shí)性等特點(diǎn),在數(shù)字支付、金融貿(mào)易、云計(jì)算、物聯(lián)網(wǎng)等方面有著廣闊的應(yīng)用前景。
然而智能合約的設(shè)計(jì)除了熟悉編程語言之外,還需要了解相關(guān)應(yīng)用領(lǐng)域的知識和技能,開發(fā)人員在精通智能合約編程語言的同時(shí)缺乏對合同邏輯的認(rèn)識,設(shè)計(jì)人員在熟悉業(yè)務(wù)規(guī)則的同時(shí)卻缺乏對智能合約的理解,為了設(shè)計(jì)或運(yùn)行智能合約,合約設(shè)計(jì)者必須預(yù)先確定代碼邏輯,但是非開發(fā)人員(如金融工作者)對于編程語言的了解不多,這導(dǎo)致他們難以根據(jù)自己的需求設(shè)計(jì)出可用的智能合約,因此,基于以太坊來完成智能合約的自動生成能夠在很大程度上降低開發(fā)智能合約代碼的難度,提升智能合約編程的友好性。
目前已有的智能合約研究都集中在安全問題上,對于編程友好性的研究很少,本文對智能合約編程問題提出一個(gè)挑戰(zhàn),即基于領(lǐng)域特征的智能合約設(shè)計(jì)模板,智能合約已經(jīng)在金融、公共事務(wù)等領(lǐng)域得到了廣泛的應(yīng)用,不同領(lǐng)域智能合約的設(shè)計(jì)有著很大的差異,因此,在實(shí)現(xiàn)智能合約自動生成時(shí)需要基于各個(gè)領(lǐng)域的特點(diǎn)來給出相應(yīng)的基本函數(shù)模板。
本文的主要貢獻(xiàn)如下。
1)實(shí)現(xiàn)了根據(jù)領(lǐng)域特征對智能合約分類的方法,采用空間向量模型VSM來對智能合約代碼進(jìn)行表述,并根據(jù)領(lǐng)域特性利用聚類算法DBSCAN將智能合約的數(shù)據(jù)集合劃分為不同的類別,
2)實(shí)現(xiàn)了針對特定領(lǐng)域生成統(tǒng)一的智能合約代碼的方法,采用Char-RNN模型來對特定領(lǐng)域的智能合約數(shù)據(jù)集進(jìn)行訓(xùn)練,并使用LSTM作為神經(jīng)網(wǎng)絡(luò)來代替Char-RNN模型中的基本RNN,最后,使用此模型來生成統(tǒng)一的、針對領(lǐng)域的智能合約基本函數(shù)代碼。
3)為用戶提供一個(gè)頁面編輯器,方便用戶進(jìn)行智能合約編寫,實(shí)現(xiàn)智能合約的自動生成,頁面上有一組和基本的智能合約代碼鏈接的uI控件,用戶可以通過點(diǎn)擊控件來根據(jù)自身需求設(shè)計(jì)智能合約。
1相關(guān)工作
“智能合約”的概念產(chǎn)生于1994年,由密碼學(xué)家Nick Szabo首次提出,他將智能合約定義為“一套以數(shù)字形式的承諾,包括能夠使合約參與方在上面執(zhí)行這些承諾的協(xié)議”,智能合約設(shè)計(jì)的目標(biāo)是滿足常見的合約條件,并最小化對可信中介的需求,智能合約擴(kuò)展并利用了區(qū)塊鏈技術(shù),它是一組代碼和數(shù)據(jù),使用區(qū)塊鏈網(wǎng)絡(luò)上的加密簽名事務(wù)進(jìn)行部署。
以太坊是區(qū)塊鏈最流行的開發(fā)平臺,它提供了圖靈完備的編程語言,如Solidity高級程序設(shè)計(jì)語言,可以用來創(chuàng)建智能合約、對任意狀態(tài)轉(zhuǎn)換函數(shù)進(jìn)行編碼,并為區(qū)塊鏈應(yīng)用程序創(chuàng)建系統(tǒng),智能合約是在EVM[6]上運(yùn)行的可執(zhí)行代碼,用來促進(jìn)、執(zhí)行和強(qiáng)制執(zhí)行互不信任方之間的協(xié)議條款,它可以觸發(fā)數(shù)據(jù)讀寫、執(zhí)行計(jì)算、調(diào)用其他合約等程序。
雖然智能合約是一項(xiàng)很有前途的技術(shù),但仍有許多挑戰(zhàn)有待解決,例如,智能合約一旦被部署,代碼是不可改變的,這使得它不可能修復(fù)任何被發(fā)現(xiàn)的錯(cuò)誤,過去曾發(fā)生過一系列利用以太坊智能合約安全漏洞的攻擊,例如,2016年6月17日,黑客利用DAO的編程漏洞,抽走了DAO三分之一的資金,大約5000萬美元,為了避免發(fā)生像DAO這樣的攻擊,研究人員對合約編碼優(yōu)化問題進(jìn)行了大量的研究,并開發(fā)了許多工具,例如,SmartDec安全團(tuán)隊(duì)開發(fā)了一個(gè)名為SmartChcck的靜態(tài)代碼分析器,它在可靠的源代碼中運(yùn)行分析,并自動檢查智能合約的安全漏洞和不良做法,國內(nèi)對智能合約的驗(yàn)證問題也做了相關(guān)研究,2016年提出了通過Promela建模語言并結(jié)合模型檢測的SPIN工具對智能合約的安全性進(jìn)行驗(yàn)證的方法,該方法基于對狀態(tài)的搜索驗(yàn)證智能合約的安全屬性,能夠保障整個(gè)搜索行為的終止性。
然而,這些研究主要針對安全和隱私問題,用來規(guī)范智能合約的編碼過程,智能合約編碼的基本問題,也就是編程友好問題,很少涉及,智能合約編程的發(fā)展還面臨著許多挑戰(zhàn),比如智能合約編程的可設(shè)計(jì)性及提供合約編碼的專用模板。
2智能合約自動生成方法
2.1方法概述
本文提出了一種針對特定領(lǐng)域來自動生成智能合約(solidity語言)的方法,并進(jìn)行了原型系統(tǒng)實(shí)現(xiàn),該方法可基于特征生成統(tǒng)一規(guī)范的智能合約代碼,之后提供了一個(gè)編輯頁面,頁面上的uI控件與生成的智能合約代碼相鏈接,使得用戶能夠設(shè)計(jì)智能合約程序,該方法能夠滿足用戶的需求,并通過頁面編輯器的方式降低智能合約編程的復(fù)雜度。
本部分介紹該方法的基本流程,如圖1所示,方法主要分為以下三步。
1.智能合約聚類
智能合約在多個(gè)領(lǐng)域得到了廣泛的應(yīng)用,本方法針對特定的合約領(lǐng)域,因此要先對智能合約進(jìn)行聚類,得到不同領(lǐng)域的智能合約數(shù)據(jù)集,具體步驟如下。
(1)合約代碼抓?。和ㄟ^爬蟲程序從Etherscan,也就是以太坊上應(yīng)用最廣泛的區(qū)塊鏈瀏覽器上抓取經(jīng)過驗(yàn)證的合約代碼來作為數(shù)據(jù)集,它為下一步的聚類分析提供了智能合約數(shù)據(jù)集。
(2)合約聚類,實(shí)現(xiàn)智能合約分類:在上述步驟中抓取到的數(shù)據(jù)集包含各個(gè)領(lǐng)域的合約代碼,此步驟要將其劃分為不同的類別,首先,采用空間向量模型VSM來對智能合約代碼進(jìn)行表述,然后在向量化的基礎(chǔ)上利用聚類算法DBSCAN將其分類,例如,類別涉及彩票合約、交易合約等。
2.生成統(tǒng)一的智能合約代碼
選擇聚類結(jié)果中的交易類合約來生成統(tǒng)一的智能合約代碼,從而為用戶提供一套基礎(chǔ)的函數(shù)模板,使得智能合約設(shè)計(jì)更加高效、簡單,首先,將上一步中獲得的交易類智能合約作為數(shù)據(jù)集,然后采用Char-RNN模型來對數(shù)據(jù)集進(jìn)行訓(xùn)練,由于長期依賴問題的存在,采用LSTM作為神經(jīng)網(wǎng)絡(luò)來代替Char-RNN模型中的基本RNN,最后,使用此模型來生成統(tǒng)一的交易類智能合約基本函數(shù)代碼。
3.智能合約自動生成
為了方便用戶使用,我們提供一個(gè)頁面編輯器來幫助用戶進(jìn)行智能合約編寫,從而實(shí)現(xiàn)智能合約的自動生成,頁面上有一組和基本智能合約代碼鏈接的uI控件,用戶可以通過點(diǎn)擊控件來根據(jù)自身需求設(shè)計(jì)智能合約。
2.2智能合約聚類
智能合約在不同的領(lǐng)域有著不同的實(shí)現(xiàn),也有著不同的基本合約函數(shù),因此在生成針對特定領(lǐng)域的合約模板前要先對其進(jìn)行分類,首先需要從名為Ethersean的區(qū)塊鏈瀏覽器上獲取智能合約作為數(shù)據(jù)集,然后對抓取的數(shù)據(jù)集進(jìn)行聚類分析。
2.2.1智能合約代碼抓取
本文中方法的實(shí)現(xiàn)需要大量的智能合約程序作為數(shù)據(jù)集,如果數(shù)據(jù)集數(shù)量不夠,會限制合約的統(tǒng)一代碼生成,因此,為了更好地分析智能合約,第一步就是從Etherscan上抓取智能合約程序作為數(shù)據(jù)集。
Etherscan是一個(gè)能夠?qū)σ蕴粎^(qū)塊鏈進(jìn)行探索和分析的分布式智能合約平臺,用戶可以通過此平臺查看以太坊區(qū)塊鏈上的事務(wù)信息,爬蟲程序從Ethersean上采集智能合約代碼的流程如下:它從Web上的智能合約第一個(gè)索引頁開始,建立合約的URL列表,將設(shè)定數(shù)量的合約地址保存到文件中。之后根據(jù)保存下來的地址,頁面跳轉(zhuǎn)到合約的details頁面將合約代碼保存到文件中,最后,得到智能合約程序的數(shù)據(jù)集。
2.2.2智能合約聚類
對于抓取到的智能合約數(shù)據(jù)集,本步驟的目的是對其進(jìn)行聚類,從而得到不同領(lǐng)域的智能合約數(shù)據(jù),為生成相應(yīng)領(lǐng)域的統(tǒng)一的智能合約代碼做準(zhǔn)備,采用的聚類方法為DBSCAN算法。
要實(shí)現(xiàn)聚類分析,首先需要對所爬取的數(shù)據(jù)進(jìn)行預(yù)處理,使其表示為一種滿足需求的結(jié)構(gòu)化形式,在此基礎(chǔ)上再利用算法進(jìn)行聚類分析,采用的聚類流程如圖2所示。
為了方便計(jì)算機(jī)處理,需要將合約代碼以計(jì)算機(jī)可識別處理的方式存儲,這里采用的是向量空間模型VSM,它將文本空間看作一組正交特征向量組成的向量空間,將文本表示為多維空間中的一個(gè)特征向量:V(d)=(t1.w1(d);…ti,wi(d);…;tn,wn(d)),其中七i為特征項(xiàng),wi為ti的權(quán)重,即頻率,
DBSCAN是一種基于密度的聚類算法,根據(jù)基于中心的密度對點(diǎn)進(jìn)行分類,其密度用數(shù)據(jù)集中Eps半徑之內(nèi)的點(diǎn)的個(gè)數(shù)進(jìn)行估計(jì),根據(jù)基于中心的思想,可以將點(diǎn)分為以下三種類別:(1)核心點(diǎn):給定鄰域內(nèi)的點(diǎn)數(shù)超過閾值參數(shù)MinPts,則認(rèn)為該點(diǎn)是一個(gè)核心點(diǎn);(2)邊界點(diǎn):邊界點(diǎn)不是核心點(diǎn),但它落在某個(gè)核心點(diǎn)的鄰域內(nèi);(3)噪聲點(diǎn):既不是核心點(diǎn),也不是邊界點(diǎn)。
在本文中,首先要對智能合約代碼的特征項(xiàng)進(jìn)行處理,并不是每一個(gè)詞都能作為合約的特征項(xiàng),有的詞可能出現(xiàn)了很多次,但是沒有什么重要性,比如“return”“public”等詞并不能體現(xiàn)出一個(gè)合約的特征,反而會影響聚類效果,因此,在預(yù)處理的過程中,不僅刪除了智能合約程序中的注釋,還設(shè)置了“public”“return”等停止詞,另外,為了更好地描述合約特征,在預(yù)處理過程中不考慮大小寫,將僅有大小寫區(qū)別的特征項(xiàng)進(jìn)行合并。
在聚類過程中,采用歐氏距離作為距離函數(shù)來描述兩個(gè)特征向量之間的距離,對于長度不一致的特征向量,在向量中添加頻率為0的項(xiàng)進(jìn)行補(bǔ)齊后再做計(jì)算,對于劃分在同一個(gè)簇中的智能合約,將合約文件名以及特征向量輸出到關(guān)聯(lián)的文件中,以便作為之后的數(shù)據(jù)集。
此方法中采用的DBSCAN算法詳見算法1。
2.3統(tǒng)一的智能合約代碼生成
智能合約程序由不同功能的代碼組成,如交易類合約包含“transfer”等函數(shù)、“ERC20”標(biāo)準(zhǔn)接口代碼,在交易過程中會使用的“SafeMath”等基本函數(shù),為了使智能合約的設(shè)計(jì)過程更加簡單,可以采用Char-RNN來生成統(tǒng)一的合約基本函數(shù),從而得到相應(yīng)領(lǐng)域的智能合約模板。
遞歸神經(jīng)網(wǎng)絡(luò)(RNNs)在自然語言處理中表現(xiàn)出強(qiáng)大的學(xué)習(xí)能力,它可以對序列數(shù)據(jù)進(jìn)行很好的建模,并且能充分利用序列的信息,因?yàn)榫W(wǎng)絡(luò)對文本中的每個(gè)單詞依次進(jìn)行語義合成,所以它不要求文本有統(tǒng)一的長度,圖3所示為傳統(tǒng)的遞歸神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
標(biāo)準(zhǔn)的遞歸神經(jīng)網(wǎng)絡(luò)給定一個(gè)輸入向量序列,通過迭代計(jì)算一個(gè)隱藏狀態(tài)和一個(gè)輸出序列,如圖3所示,x是輸入單元,代表詞向量;h是隱藏狀態(tài);o表示輸出,u是輸入-隱藏的權(quán)值矩陣,w是隱藏-隱藏的權(quán)值矩陣,V是隱藏一輸出的權(quán)值矩陣。
Char-RNN是字符級語言模型,能夠接收一大塊文本文件作為輸入,并將其輸入基本的RNN算法中,該算法學(xué)習(xí)預(yù)測序列中的下一個(gè)字符,在訓(xùn)練了基本的RNN之后,它可以一個(gè)字符一個(gè)字符地生成與原始數(shù)據(jù)集風(fēng)格相似的文本。
另外,對于生成的智能合約代碼,采用SmartCheck工具來進(jìn)行代碼的邏輯檢測,其中邏輯語法存在問題或是不完整、重復(fù)的函數(shù)皆被視為錯(cuò)誤,最后得到生成的智能合約代碼中錯(cuò)誤函數(shù)占比為31.73%,生成的部分代碼的SmartCheck測試結(jié)果如圖6所示,其中紅框表示這些代碼中存在的問題,藍(lán)框顯示問題所在的代碼段。
3智能合約自動生成原型系統(tǒng)
3.1系統(tǒng)架構(gòu)
本文中的智能合約自動生成原型系統(tǒng)運(yùn)行于Windowsl0操作系統(tǒng)平臺之上,系統(tǒng)基于MFC完成智能合約的自動生成,系統(tǒng)架構(gòu)如圖7所示。
智能合約自動生成原型系統(tǒng)在創(chuàng)建合約時(shí)會對合約進(jìn)行重名檢測,并提供繼承功能;合約生成模塊的智能合約基本代碼來自之前Char-RNN的訓(xùn)練結(jié)果,包含基本函數(shù)代碼、SafeMath以及ERC20標(biāo)準(zhǔn)接口代碼;合約存儲模塊對自動生成的智能合約進(jìn)行存儲。
3.2系統(tǒng)功能
智能合約自動生成原型系統(tǒng)實(shí)現(xiàn)了用戶自定義智能合約設(shè)計(jì),從而實(shí)現(xiàn)智能合約的自動生成,圖8所示為智能合約自動生成原型系統(tǒng)的頁面,紅框部分顯示了之前生成的智能合約函數(shù)名稱及代碼,黃框中為新建合約、添加函數(shù)等功能的按鈕,右側(cè)為合約代碼編輯框,由圖7可以看出,智能合約自動生成原型系統(tǒng)主要包含合約創(chuàng)建模塊、合約生成模塊、合約存儲模塊,接下來依次介紹各模塊的功能,
3.2.1合約創(chuàng)建
合約創(chuàng)建模塊的主要功能為創(chuàng)建新的智能合約,在新建時(shí),提供了合約繼承功能,并且能夠檢測合約是否重名。
如圖9所示,點(diǎn)擊“New”按鈕新建智能合約時(shí),默認(rèn)合約名為“Contract”,用戶可自行修改,若合約名稱不符合要求,會彈出提示框要求用戶重新輸入,右側(cè)的ListBox控件中將會顯示已經(jīng)生成的合約名稱,用戶可以自行選擇是否繼承。
3.2.2合約生成
合約生成模塊提供了上述改進(jìn)的Char-RNN生成的智能合約代碼,包含基本函數(shù)方法(如“transferFrom”函數(shù))、標(biāo)準(zhǔn)接口代碼(如“ERC20”代碼)和基本合約代碼(如“SafeMath”合約代碼),系統(tǒng)創(chuàng)建了一組文件用來存儲這些代碼,在運(yùn)行時(shí)完成加載。
如圖10所示為創(chuàng)建“approve”函數(shù)的截圖,軟件運(yùn)行時(shí),會首先打開“approve”等函數(shù)的文件,讀取其中的代碼,并將其保存在相應(yīng)的對象中,“approve”函數(shù)在頁面上表示為List控件的一項(xiàng),加載完成后,可以通過函數(shù)名稱來得到相應(yīng)的函數(shù)代碼,并在Static控件中顯示,為了方便顯示并編輯代碼,軟件定義了相應(yīng)的觸發(fā)事件將代碼與控件相關(guān)聯(lián),最后,用戶可以通過選中“approve”項(xiàng),在Static控件中顯示對應(yīng)的函數(shù)代碼,點(diǎn)擊“Add”按鈕,可將代碼添加到右側(cè)編輯框中的光標(biāo)位置。
3.2.3合約存儲
合約存儲模塊能夠?qū)⑸傻闹悄芎霞s保存到文件中,用戶可以點(diǎn)擊“save”按鈕,將設(shè)計(jì)的合約以“,sol”格式保存到任意路徑,如圖11所示,
3.3智能合約生成案例
本節(jié)介紹通過設(shè)計(jì)生成智能合約的過程,并以合約“MyToken”作為例子來進(jìn)行分析,“MyToken”是一個(gè)基于ERC20標(biāo)準(zhǔn)的代幣合約,可以實(shí)現(xiàn)基本的代幣交易功能。
第一步,用戶在編輯器上分別選中“SafeMath”和“ERC20”,兩者分別鏈接有Char-RNN模型生成的基本合約代碼和標(biāo)準(zhǔn)接口代碼,點(diǎn)擊“Add”按鈕,在編輯框出現(xiàn)相應(yīng)代碼后,用戶可以根據(jù)自身的需求對代碼進(jìn)行進(jìn)一步修改,例如,添加“SafeMath”代碼,它提供了統(tǒng)一的算術(shù)功能(如加、減、乘、除),使得交易更加規(guī)范。
第二步,完成上述步驟后,用戶可以通過繼承“ERC20”和“SafeMath”來實(shí)現(xiàn)合約“MyToken”,之后,用戶可以通過控件在合約中添加新的函數(shù)來實(shí)現(xiàn)不同的功能,例如,在合約中添加“allowance”函數(shù),允許spender從owner中轉(zhuǎn)出的相應(yīng)數(shù)目的代幣。
第三步,在合約“MyToken”設(shè)計(jì)完成后,用戶可以點(diǎn)擊“save”按鈕,將設(shè)計(jì)的合約以“,sol”格式保存到任意路徑,為了驗(yàn)證設(shè)計(jì)的智能合約的可用性,可使用SmartCheck進(jìn)行檢測,并將“MyToken”合約部署到以太坊上,結(jié)果表明,合約邏輯正確且能夠順利執(zhí)行。
4結(jié)論
本文提出了一個(gè)自動生成智能合約的方法,并設(shè)計(jì)了一個(gè)面向用戶的編程界面,該方法對于大小在3-6 KB的交易類智能合約,能夠得到邏輯正確的交易類智能合約模板,用戶可以根據(jù)自己的定義和要求,用Solidity編寫智能合約代碼,系統(tǒng)增強(qiáng)了非開發(fā)人員用戶的設(shè)計(jì)能力,并提供了一種比傳統(tǒng)方式更高效、快捷、簡單的智能合約設(shè)計(jì)方法,節(jié)省了合約編程的時(shí)間,
但是,本文的方法主要針對交易類智能合約實(shí)現(xiàn),對于其他領(lǐng)域的智能合約還待進(jìn)一步研究,該方法未來的工作會對更多領(lǐng)域的智能合約代碼自動生成進(jìn)行研究,針對不同的領(lǐng)域提供智能合約設(shè)計(jì)模板。