本公開的實(shí)施例總體上涉及區(qū)塊鏈技術(shù),并且具體地,涉及一種在區(qū)塊鏈中獲得智能合約接口的方法和設(shè)備。
背景技術(shù):
區(qū)塊鏈的快速發(fā)展與智能合約的提出和使用密切相關(guān)。智能合約是一套以數(shù)字形式定義的承諾,包括合約參與方約定的權(quán)利和義務(wù)。數(shù)字形式是指承諾需要以可讀代碼形式寫入機(jī)器中,只要參與方達(dá)成協(xié)定,智能合約建立的權(quán)利和義務(wù)即由機(jī)器或網(wǎng)絡(luò)系統(tǒng)執(zhí)行得以保證。
基于區(qū)塊鏈技術(shù)的智能合約不僅可以發(fā)揮智能合約在成本效率方面的優(yōu)勢,而且可以避免惡意行為對合約正常執(zhí)行的干擾。將智能合約以數(shù)字化的形式寫入?yún)^(qū)塊鏈中,由區(qū)塊鏈技術(shù)的特性保障存儲、讀取、執(zhí)行整個(gè)過程透明可跟蹤、不可攥改。同時(shí),由區(qū)塊鏈自帶的共識算法構(gòu)建出一套狀態(tài)機(jī)系統(tǒng),使得智能合約能夠高效地運(yùn)行。
目前,智能合約的接口定義以及智能合約的區(qū)塊鏈上代碼是處于完全分離的狀態(tài)。也就是說,智能合約的創(chuàng)建者需要在鏈下將智能合約的接口信息發(fā)送給智能合約的調(diào)用者,以便其能夠?qū)崿F(xiàn)智能合約的預(yù)期功能。另外,在智能合約接口出現(xiàn)升級的情況下,還需要額外告知調(diào)用者更新后的信息。由此,給智能合約的應(yīng)用帶來不便。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,期望的是提供一種解決方案用以獲得區(qū)塊鏈中的智能合約接口,從而促進(jìn)智能合約的應(yīng)用。
總體上,本公開的實(shí)施例提出了在區(qū)塊鏈中獲得智能合約接口的方法和設(shè)備。
在本公開的第一方面,提供一種用于在區(qū)塊鏈中獲得智能合約接口的方法。該方法包括:創(chuàng)建智能合約;通過解析智能合約來提取智能合約中的功能接口的信息;基于功能接口的信息,生成智能合約的接口定義數(shù)據(jù);以及將接口定義數(shù)據(jù)添加到智能合約中。
在某些實(shí)施例中,生成接口定義數(shù)據(jù)包括:基于功能接口的信息,以結(jié)構(gòu)化數(shù)據(jù)交換格式表示接口定義數(shù)據(jù)。
在某些實(shí)施例中,將接口定義數(shù)據(jù)添加到智能合約中包括:基于接口定義數(shù)據(jù),生成用以獲取接口定義數(shù)據(jù)的獲取函數(shù);以及將獲取函數(shù)添加到智能合約中。
在某些實(shí)施例中,在添加之后還包括:編譯智能合約,以生成字節(jié)碼而促進(jìn)智能合約到區(qū)塊鏈中的部署。
在本公開的第二方面,提供一種用于在區(qū)塊鏈中獲得智能合約接口的方法。該方法包括:基于智能合約的合約地址,調(diào)用用以獲取智能合約的接口定義數(shù)據(jù)的獲取函數(shù);以及解析獲取函數(shù),以得到智能合約的接口定義數(shù)據(jù)。
在某些實(shí)施例中,該方法還包括:從接口定義數(shù)據(jù)獲取智能合約中的功能接口的信息;以及基于功能接口的信息,調(diào)用智能合約中的功能接口。
在本公開的第三方面,提供一種電子設(shè)備。該電子設(shè)備包括:處理器;存儲器,耦合至處理器并且存儲有指令,指令在由處理器執(zhí)行時(shí)使電子設(shè)備執(zhí)行以下動(dòng)作:創(chuàng)建智能合約;通過解析智能合約來提取智能合約中的功能接口的信息;基于功能接口的信息,生成智能合約的接口定義數(shù)據(jù);以及將接口定義數(shù)據(jù)添加到智能合約中。
在本公開的第四方面,提供一種電子設(shè)備。該電子設(shè)備包括:處理器;存儲器,耦合至處理器并且存儲有指令,指令在由處理器執(zhí)行時(shí)使電子設(shè)備執(zhí)行以下動(dòng)作:基于智能合約的合約地址,調(diào)用用以獲取智能合約的接口定義數(shù)據(jù)的獲取函數(shù);以及解析獲取函數(shù),以得到智能合約的接口定義數(shù)據(jù)。
根據(jù)本發(fā)明的第五方面,提供一種計(jì)算機(jī)可讀存儲介質(zhì),其具有存儲在其上的計(jì)算機(jī)可讀程序指令,計(jì)算機(jī)可讀程序指令用于執(zhí)行根據(jù)本公開的第一方面和第二方面所描述的方法。
本公開的實(shí)施例提出了在區(qū)塊鏈中獲得智能合約接口的方案,其有效解決了無法直接在鏈上獲取智能合約接口的問題,并且增強(qiáng)了智能合約的用戶友好性。
附圖說明
結(jié)合附圖并參考以下詳細(xì)說明,本公開各實(shí)施例的上述和其他特征、優(yōu)點(diǎn)及方面將變得更加明顯。在附圖中,相同或相似的附圖標(biāo)記表示相同或相似的元素,其中:
圖1示出了根據(jù)本公開一個(gè)實(shí)施例的獲得智能合約接口的方法的示例流程圖;
圖2示出了根據(jù)本公開另一實(shí)施例的獲得智能合約接口的方法的示例流程圖;以及
圖3示出了根據(jù)本公開的一些實(shí)施例的設(shè)備的框圖。
具體實(shí)施方式
現(xiàn)將結(jié)合附圖對本公開的實(shí)施例進(jìn)行具體的描述。應(yīng)當(dāng)注意的是,附圖中對相似的部件或者功能組件可能使用同樣的數(shù)字標(biāo)示。所附附圖僅僅旨在說明本公開的實(shí)施例。本領(lǐng)字段的技術(shù)人員可以在不偏離本公開精神和保護(hù)范圍的基礎(chǔ)上從下述描述得到替代的實(shí)施方式。
如本文中所述,術(shù)語“包括”及其各種變體可以被理解為開放式術(shù)語,其意味著“包括但不限于”。術(shù)語“基于”可以被理解為“至少部分地基于”。術(shù)語“一個(gè)實(shí)施例”可以被理解為“至少一個(gè)實(shí)施例”。術(shù)語“另一實(shí)施例”可以被理解為“至少一個(gè)其它實(shí)施例”。
基于區(qū)塊鏈的智能合約包括事務(wù)處理和保存的機(jī)制以及一個(gè)完備的狀態(tài)機(jī),以用于接受和處理各種智能合約;并且事務(wù)的保存和狀態(tài)處理都在區(qū)塊鏈上完成。事務(wù)主要包含需要發(fā)送的數(shù)據(jù);而事件則是對這些數(shù)據(jù)的描述信息。事務(wù)及事件信息傳入智能合約后,合約資源集合中的資源狀態(tài)會(huì)被更新,進(jìn)而觸發(fā)智能合約進(jìn)行狀態(tài)機(jī)判斷。如果自動(dòng)狀態(tài)機(jī)中某個(gè)或某幾個(gè)動(dòng)作的觸發(fā)條件滿足,則由狀態(tài)機(jī)根據(jù)預(yù)設(shè)信息選擇合約動(dòng)作自動(dòng)執(zhí)行。
如前所述,區(qū)塊鏈中的智能合約應(yīng)用日趨增多,但是智能合約的接口信息需要通過鏈下方式將智能合約的接口發(fā)送給智能合約的調(diào)用者。為促進(jìn)理解,示例(1)示出了區(qū)塊鏈智能合約的一個(gè)示例性實(shí)例。
示例代碼(1)
作為示例,具體地,以上智能合約coin由一組代碼(智能合約的函數(shù)、調(diào)用的方法或稱之為事務(wù)和事件)和數(shù)據(jù)(智能合約的狀態(tài))組成,其實(shí)現(xiàn)形式簡單的加密貨幣。其中,被用戶或者其他合約調(diào)用以用來完成該合約功能的函數(shù)包括mint和send。該示例代碼表明,如果智能合約創(chuàng)建者之外的其他人調(diào)用函數(shù)mint,什么都不會(huì)發(fā)生;而函數(shù)send可以被擁有一定數(shù)量的代幣的任何用戶調(diào)用,以發(fā)送一些代幣給其他用戶。
當(dāng)智能合約的調(diào)用者需要調(diào)用智能合約coin時(shí),其需要知道智能合約的接口信息,例如調(diào)用函數(shù)的名稱、參數(shù)等。如前所述,當(dāng)前這些信息需要由智能合約的創(chuàng)建者在區(qū)塊鏈之外通過其他途徑傳遞給調(diào)用者。當(dāng)智能合約的接口出現(xiàn)變化時(shí),同樣需要告知調(diào)用者更新后的接口信息。
本公開的實(shí)施例提出一種獲得智能合約接口的方案,將智能合約的接口定義和區(qū)塊鏈上源碼進(jìn)行統(tǒng)一管理,從而避免鏈下傳遞智能合約接口到調(diào)用方。
圖1示出了根據(jù)本公開一個(gè)實(shí)施例的獲得智能合約接口的方法100的示例流程圖??梢岳斫猓椒?00可以由智能合約創(chuàng)建方執(zhí)行。
在110,創(chuàng)建智能合約。根據(jù)需要,智能合約創(chuàng)建方可以創(chuàng)建智能合約,例如以合適的語言編寫智能合約,諸如solidity、serpent等。示例(1)為以當(dāng)前最流行的智能合約語言solidity創(chuàng)建的智能合約。
接下來,在120,通過解析智能合約來提取智能合約中的功能接口的信息。在一個(gè)實(shí)施例中,通過解析智能合約源碼,提取智能合約中的功能接口或函數(shù)的相關(guān)信息,例如函數(shù)名稱、函數(shù)參數(shù)等。例如在示例1中,用以調(diào)用send函數(shù)的相關(guān)信息。
在130,基于功能接口的信息,生成智能合約的接口定義數(shù)據(jù)。在一個(gè)示例中,基于功能接口的信息,以結(jié)構(gòu)化數(shù)據(jù)交換格式表示該接口定義數(shù)據(jù)。這些格式可以包括諸如基于javascript語言的輕量級的數(shù)據(jù)交換(json)、可擴(kuò)展標(biāo)記語言(xml)、另一種標(biāo)記語言(yaml)等。
為了簡化示例以促進(jìn)理解,示例(2)給出了簡單合約test用以進(jìn)一步說明本公開的實(shí)施例。
示例代碼(2)
contracttest{
functionmultiply(uinta)returns(uintd){returna*7;}
}
根據(jù)本公開的一個(gè)實(shí)施例,可以提取諸如示例合約test的接口信息,并生成接口定義數(shù)據(jù)。例如如下:
[{"constant":false,"inputs":[{"name":"a","type":"uint256"
}],"name":"multiply","outputs":[{"name":"d","type":"uint2
56"}],"payable":false,"type":"function"}]
在140,將接口定義數(shù)據(jù)添加到智能合約中。根據(jù)本公開的一個(gè)實(shí)施例,基于接口定義數(shù)據(jù),生成用以獲取接口定義數(shù)據(jù)的獲取函數(shù),并將該獲取函數(shù)添加到智能合約中。
例如,對于示例合約test,可以生成獲取函數(shù)getabi,并將getabi添加到合約test中。示例代碼如下:
以此方式,將智能合約的接口定義和鏈上源碼進(jìn)行統(tǒng)一管理。接下來即可進(jìn)行原有字節(jié)碼生成過程。編譯智能合約,以生成字節(jié)碼而促進(jìn)智能合約到區(qū)塊鏈中的部署。
當(dāng)智能合約部署到區(qū)塊鏈中之后,調(diào)用者可以獲知智能合約的區(qū)塊鏈地址。相應(yīng)地,調(diào)用者可以根據(jù)合約地址,在鏈上調(diào)用接口獲取函數(shù),從而能夠在鏈上繼續(xù)實(shí)現(xiàn)具體邏輯操作。
圖2示出了根據(jù)本公開另一實(shí)施例的獲得智能合約接口的方法200的示例流程圖??梢岳斫?,方法200可以由智能合約調(diào)用方執(zhí)行。
在210,基于智能合約的合約地址,調(diào)用用以獲取所述智能合約的接口定義數(shù)據(jù)的獲取函數(shù)。根據(jù)本公開的一個(gè)實(shí)施例,智能合約調(diào)用方可以直接在鏈上獲取智能合約接口,這是通過以如上所述的方法100而部署智能合約實(shí)現(xiàn)的。
在220,解析獲取函數(shù),以得到智能合約的接口定義數(shù)據(jù)。作為示例,例如調(diào)用方可以如下獲取智能合約test的地址并解析獲取函數(shù)。
contractempty=contract().address(address);
abi=j(luò)son.parse(decode(contractempty.getabi))
根據(jù)本公開的實(shí)施例,方法200還包括從接口定義數(shù)據(jù)獲取智能合約中的功能接口的信息;以及基于功能接口的所述信息,調(diào)用智能合約中的功能接口。例如,可以如下來調(diào)用智能合約test中的功能接口。
contractexample=contract(abi).address(address);
contractexample.multiply(123);
由此,智能合約調(diào)用方不需要從鏈下獲得智能合約接口定義,而是根據(jù)合約地址,調(diào)用getabi接口,在獲得返回結(jié)果后,再繼續(xù)調(diào)用其它功能接口,從而實(shí)現(xiàn)具體邏輯操作。
通過以上所描述的本公開的實(shí)施例,提供了在區(qū)塊鏈中獲得智能合約接口的方案。該方案實(shí)現(xiàn)相對簡捷,便于智能合約應(yīng)用,并且提高了智能合約的用戶友好性。
圖3圖示了可以用來實(shí)施本公開的實(shí)施例的電子設(shè)備300的示意性框圖。應(yīng)當(dāng)理解,電子設(shè)備300可以被實(shí)現(xiàn)為智能合約創(chuàng)建或調(diào)用設(shè)備,或者電子設(shè)備300也可以被實(shí)現(xiàn)為智能合約創(chuàng)建或調(diào)用設(shè)備中的任一個(gè)模塊。如圖3所示,設(shè)備300包括中央處理單元(cpu)301(例如處理器),其可以根據(jù)存儲在只讀存儲器(rom)302中的計(jì)算機(jī)程序指令或者從存儲單元308加載到隨機(jī)訪問存儲器(ram)303中的計(jì)算機(jī)程序指令,來執(zhí)行各種適當(dāng)?shù)膭?dòng)作和處理。在ram303中,還可存儲設(shè)備300操作所需的各種程序和數(shù)據(jù)。cpu301、rom302以及ram303通過總線304彼此相連。輸入/輸出(i/o)接口305也連接至總線304。
設(shè)備300中的多個(gè)部件連接至i/o接口305,包括:輸入單元306,例如鍵盤、鼠標(biāo)等;輸出單元307,例如各種類型的顯示器、揚(yáng)聲器等;存儲單元308,例如磁盤、光盤等;以及通信單元309,例如網(wǎng)卡、調(diào)制解調(diào)器、無線通信收發(fā)機(jī)等。通信單元309允許設(shè)備300通過諸如因特網(wǎng)的計(jì)算機(jī)網(wǎng)絡(luò)和/或各種電信網(wǎng)絡(luò)與其他設(shè)備交換信息/數(shù)據(jù)。
上文所描述的各種方法,例如方法100或200,可由處理單元301執(zhí)行。例如,在一些實(shí)施例中,方法100或200可被實(shí)現(xiàn)為計(jì)算機(jī)軟件程序,其被有形地包含于機(jī)器可讀介質(zhì),例如存儲單元308。在一些實(shí)施例中,計(jì)算機(jī)程序的部分或者全部可以經(jīng)由rom302和/或通信單元309而被載入和/或安裝到設(shè)備300上。當(dāng)計(jì)算機(jī)程序被加載到ram303并由cpu301執(zhí)行時(shí),可以執(zhí)行上文描述的方法100或200中的一個(gè)或多個(gè)動(dòng)作或步驟。
一般而言,本公開的各種示例實(shí)施例可以在硬件或?qū)S秒娐贰④浖?、固件、邏輯,或其任何組合中實(shí)施。某些方面可以在硬件中實(shí)施,而其他方面可以在可以由控制器、微處理器或其他計(jì)算設(shè)備執(zhí)行的固件或軟件中實(shí)施。當(dāng)本公開的實(shí)施例的各方面被圖示或描述為框圖、流程圖或使用某些其他圖形表示時(shí),將理解此處描述的方框、裝置、系統(tǒng)、技術(shù)或方法可以作為非限制性的示例在硬件、軟件、固件、專用電路或邏輯、通用硬件或控制器或其他計(jì)算設(shè)備,或其某些組合中實(shí)施。
作為示例,可以用通用處理器、數(shù)字信號處理器(dsp)、專用集成電路(asic)、現(xiàn)場可編程門陣列(fpga)或其它可編程邏輯器件、分立門或者晶體管邏輯、分立硬件組件或用于執(zhí)行本文所述的功能的任意組合來實(shí)現(xiàn)或執(zhí)行結(jié)合本公開所描述的各種示例性的邏輯塊、模塊和電路。通用處理器可以是微處理器,或者,處理器也可以是任何普通的處理器、控制器、微控制器或者狀態(tài)機(jī)。處理器也可以實(shí)現(xiàn)為計(jì)算設(shè)備的組合,例如,dsp和微處理器的組合、多個(gè)微處理器、一個(gè)或多個(gè)微處理器與dsp內(nèi)核的結(jié)合,或者任何其它此種結(jié)構(gòu)。
作為示例,本公開的實(shí)施例可以在機(jī)器可執(zhí)行指令的上下文中被描述,機(jī)器可執(zhí)行指令諸如包括在目標(biāo)的真實(shí)或者虛擬處理器上的器件中執(zhí)行的程序模塊中。一般而言,程序模塊包括例程、程序、庫、對象、類、組件、數(shù)據(jù)結(jié)構(gòu)等,其執(zhí)行特定的任務(wù)或者實(shí)現(xiàn)特定的抽象數(shù)據(jù)結(jié)構(gòu)。在各實(shí)施例中,程序模塊的功能可以在所描述的程序模塊之間合并或者分割。用于程序模塊的機(jī)器可執(zhí)行指令可以在本地或者分布式設(shè)備內(nèi)執(zhí)行。在分布式設(shè)備中,程序模塊可以位于本地和遠(yuǎn)程存儲介質(zhì)二者中。
用于實(shí)現(xiàn)本公開的方法的計(jì)算機(jī)程序代碼可以用一種或多種編程語言編寫。這些計(jì)算機(jī)程序代碼可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其他可編程的數(shù)據(jù)處理裝置的處理器,使得程序代碼在被計(jì)算機(jī)或其他可編程的數(shù)據(jù)處理裝置執(zhí)行的時(shí)候,引起在流程圖和/或框圖中規(guī)定的功能/操作被實(shí)施。程序代碼可以完全在計(jì)算機(jī)上、部分在計(jì)算機(jī)上、作為獨(dú)立的軟件包、部分在計(jì)算機(jī)上且部分在遠(yuǎn)程計(jì)算機(jī)上或完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。
在本公開的上下文中,機(jī)器可讀介質(zhì)可以是包含或存儲用于或有關(guān)于指令執(zhí)行系統(tǒng)、裝置或設(shè)備的程序的任何有形介質(zhì)。機(jī)器可讀介質(zhì)可以是機(jī)器可讀信號介質(zhì)或機(jī)器可讀存儲介質(zhì)。機(jī)器可讀介質(zhì)可以包括但不限于電子的、磁的、光學(xué)的、電磁的、紅外的或半導(dǎo)體系統(tǒng)、裝置或設(shè)備,或其任意合適的組合。機(jī)器可讀存儲介質(zhì)的更詳細(xì)示例包括帶有一根或多根導(dǎo)線的電氣連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存儲存取器(ram)、只讀存儲器(rom)、可擦除可編程只讀存儲器(eprom或閃存)、光存儲設(shè)備、磁存儲設(shè)備,或其任意合適的組合。
另外,盡管操作以特定順序被描繪,但這并不應(yīng)該理解為要求此類操作以示出的特定順序或以相繼順序完成,或者執(zhí)行所有圖示的操作以獲取期望結(jié)果。在某些情況下,多任務(wù)或并行處理會(huì)是有益的。同樣地,盡管上述討論包含了某些特定的實(shí)施細(xì)節(jié),但這并不應(yīng)解釋為限制任何發(fā)明或權(quán)利要求的范圍,而應(yīng)解釋為對可以針對特定發(fā)明的特定實(shí)施例的描述。本說明書中在分開的實(shí)施例的上下文中描述的某些特征也可以整合實(shí)施在單個(gè)實(shí)施例中。反之,在單個(gè)實(shí)施例的上下文中描述的各種特征也可以分離地在多個(gè)實(shí)施例或在任意合適的子組合中實(shí)施。
盡管已經(jīng)以特定于結(jié)構(gòu)特征和/或方法動(dòng)作的語言描述了主題,但是應(yīng)當(dāng)理解,所附權(quán)利要求中限定的主題并不限于上文描述的特定特征或動(dòng)作。相反,上文描述的特定特征和動(dòng)作是作為實(shí)現(xiàn)權(quán)利要求的示例形式而被公開的。