本發(fā)明涉及一種智能合約技術(shù)領(lǐng)域,特別是涉及區(qū)塊鏈上智能合約執(zhí)行與存儲(chǔ)的系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)方法。
背景技術(shù):
合約是現(xiàn)實(shí)社會(huì)中經(jīng)濟(jì)活動(dòng)的基礎(chǔ),它是兩方面或幾方面在共同協(xié)作時(shí),為了確定各自的權(quán)利和義務(wù)而訂立的共同遵守的條文。合約規(guī)定了交易的標(biāo)的、內(nèi)容、時(shí)間和執(zhí)行約定等,并具有法律保障,雙方或多方在信任或者不信任的狀態(tài)下履行合約承諾,有法可依、有據(jù)可尋。合約通過(guò)規(guī)范承諾與執(zhí)行合約過(guò)程,從而保證交易活動(dòng)的有序進(jìn)行。當(dāng)前,人類社會(huì)正在向數(shù)字社會(huì)發(fā)展,虛擬經(jīng)濟(jì)是數(shù)字社會(huì)的重要活動(dòng),一個(gè)巨大挑戰(zhàn)就是將現(xiàn)實(shí)中人們經(jīng)濟(jì)活動(dòng)轉(zhuǎn)移到網(wǎng)絡(luò)虛擬世界上。智能合約的概念在1994年由nickszabo首次提出。智能合約是能夠自動(dòng)執(zhí)行合約條款的可計(jì)算交易協(xié)議程序代碼,它與區(qū)塊鏈(blockchain)技術(shù)的結(jié)合,形成了誠(chéng)信網(wǎng)絡(luò)上價(jià)值轉(zhuǎn)移的數(shù)字合約或代碼即合約(codeasacontract),正成為人們?cè)谔摂M世界中維持安全數(shù)字關(guān)系的重要手段,是未來(lái)數(shù)字社會(huì)的基礎(chǔ)協(xié)議,因此智能合約的相關(guān)研究是具有重要意義的。
智能合約理論幾乎與互聯(lián)網(wǎng)技術(shù)(worldwideweb)同時(shí)出現(xiàn),但應(yīng)用實(shí)踐卻一直嚴(yán)重地落后于理論,缺乏將這個(gè)理念轉(zhuǎn)變現(xiàn)實(shí)的清晰路徑。主要面臨兩個(gè)方面問(wèn)題,一是智能合約沒(méi)有有效的手段來(lái)控制實(shí)物資產(chǎn),保證合約的執(zhí)行,正如售貨機(jī)通過(guò)將商品保存在內(nèi)部控制財(cái)產(chǎn)所有權(quán),可是計(jì)算機(jī)程序很難控制現(xiàn)金、股份等現(xiàn)實(shí)世界中的資產(chǎn);二是單個(gè)計(jì)算機(jī)很難保證執(zhí)行這些條款以獲得合約方的信任,合約方需要可靠的解釋和執(zhí)行代碼的可信環(huán)境,它無(wú)法親自檢查有問(wèn)題的計(jì)算機(jī),也無(wú)法直接觀察與驗(yàn)證其他合約方的執(zhí)行動(dòng)作,只有讓第三方審核各方合約執(zhí)行的記錄。而區(qū)塊鏈技術(shù)的出現(xiàn)解決了這些問(wèn)題,奠定了智能合約應(yīng)用的基礎(chǔ),同時(shí),智能合約也擴(kuò)大了區(qū)塊鏈的應(yīng)用范圍。區(qū)塊鏈為完全數(shù)字化資產(chǎn)的記錄和轉(zhuǎn)移奠定了基礎(chǔ),通過(guò)完全數(shù)字化的資產(chǎn),區(qū)塊鏈給計(jì)算機(jī)代碼提供直接控制資產(chǎn)的方法,使得智能合約具有執(zhí)行力。在區(qū)塊鏈上,資產(chǎn)的控制就是控制資產(chǎn)對(duì)應(yīng)的密鑰權(quán)限,而不是任何實(shí)物。區(qū)塊鏈?zhǔn)褂?jì)算系統(tǒng)成為受信任系統(tǒng),它已經(jīng)不僅限于數(shù)據(jù)庫(kù)的功能,同時(shí)還是可以執(zhí)行代碼和記錄數(shù)字資產(chǎn)所有權(quán)的分布式計(jì)算機(jī),數(shù)字資產(chǎn)所有權(quán)就可以被上傳和存儲(chǔ)在區(qū)塊鏈中,并根據(jù)指令執(zhí)行,一旦區(qū)塊鏈記錄了合約代碼,合約方就可以確定合約不會(huì)被更改。2015年以太坊(ethereum)把區(qū)塊鏈技術(shù)和智能合約理論結(jié)合,設(shè)計(jì)實(shí)現(xiàn)了可編程的合約語(yǔ)言與可執(zhí)行的基礎(chǔ)設(shè)施,開(kāi)創(chuàng)了基于區(qū)塊鏈上智能合約的巨大應(yīng)用場(chǎng)景。在ethereum中,智能合約是存儲(chǔ)在區(qū)塊鏈上的腳本,通過(guò)區(qū)塊鏈節(jié)點(diǎn)以分布式的形式執(zhí)行,相當(dāng)于商業(yè)交易、監(jiān)督管理過(guò)程中法律、法規(guī)的執(zhí)行者。區(qū)塊鏈以按序、安全、可驗(yàn)證的方式保證合約的執(zhí)行。相比目前復(fù)雜的涉及用戶、汽車經(jīng)銷商和銀行的貸款行為和手續(xù),智能合約是能夠自動(dòng)執(zhí)行合約條款的計(jì)算機(jī)程序,它能夠完善現(xiàn)有的商業(yè)模式,更重要的是他們可能顛覆現(xiàn)有的商業(yè)模式,也大大減少了第三方中介的費(fèi)用。
但是現(xiàn)有的基于區(qū)塊鏈的智能合約技術(shù)還處于一個(gè)初級(jí)階段,尚有很多問(wèn)題還沒(méi)有解決,如執(zhí)行效率低下,ethereum雖然改進(jìn)了比特幣的公有鏈算法,但也需要15秒/塊,這還無(wú)法滿足實(shí)際生產(chǎn)的需求;智能合約作為區(qū)塊鏈的鏈上代碼執(zhí)行的安全問(wèn)題;以及智能合約代碼與文本的一致性問(wèn)題等。目前基于區(qū)塊鏈的智能合約的設(shè)計(jì)與技術(shù)仍有進(jìn)一步研究和改進(jìn)的空間,有必要進(jìn)一步研究基于區(qū)塊鏈的智能合約技術(shù)。
區(qū)塊鏈與智能合約的結(jié)合對(duì)區(qū)塊鏈納入交易的速度與智能合約的可擴(kuò)展性都會(huì)產(chǎn)生影響。當(dāng)前ethereum的智能合約執(zhí)行模型降低了區(qū)塊鏈納入交易的速度。
智能合約就是一段經(jīng)過(guò)協(xié)商的代碼,它的執(zhí)行應(yīng)該是分布式的、可觀察和可驗(yàn)證的,代碼被部署在分享的、復(fù)制的賬本上,它可以維持自己的狀態(tài)、控制自己的資產(chǎn)(狀態(tài)、資產(chǎn)與代碼一樣,被存儲(chǔ)在賬本上),還能夠?qū)邮盏降耐饨缧畔⑦M(jìn)行回應(yīng)。把智能合約放在區(qū)塊鏈上執(zhí)行就是利用區(qū)塊鏈本身自帶的一致性算法來(lái)保證合約執(zhí)行結(jié)果的一致性。
圖1是智能合約與區(qū)塊鏈結(jié)合的原理性示意圖,其中,區(qū)塊鏈?zhǔn)前踩姆植际綌?shù)據(jù)庫(kù),智能合約通過(guò)協(xié)議與用戶界面促使合約的執(zhí)行具有一致性、可觀察性、可驗(yàn)證性、自強(qiáng)制性和接入控制。代碼/程序以文本形式存儲(chǔ)在不同的節(jié)點(diǎn)上,給代碼/程序添加斷點(diǎn),并對(duì)斷點(diǎn)的程序狀態(tài)進(jìn)行一致性驗(yàn)證,只能通過(guò)消息改變程序的信息空間,合約及其狀態(tài)記錄在區(qū)塊鏈中,合約狀態(tài)的改變智能通過(guò)消息去觸發(fā)。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明設(shè)計(jì)了一種私有區(qū)塊鏈的智能合約異步執(zhí)行存儲(chǔ)系統(tǒng)與實(shí)現(xiàn)方法。
首先,提供一種私有區(qū)塊鏈的智能合約異步執(zhí)行存儲(chǔ)系統(tǒng),包括:私有區(qū)塊鏈的執(zhí)行狀態(tài)機(jī)、交易處理器執(zhí)行狀態(tài)機(jī),能夠支持scam(smartcontractasynchronousmodel,即智能合約異步執(zhí)行模型)的存儲(chǔ)結(jié)構(gòu)模塊。
優(yōu)選的,采用執(zhí)行狀態(tài)機(jī)mnode表示scam中私有區(qū)塊鏈的執(zhí)行狀態(tài)機(jī),是一個(gè)五元組(qnode,∑mode,δnode,snode,fnode),qnode是私有區(qū)塊鏈中節(jié)點(diǎn)的狀態(tài)集合,∑mode是輸入(事件)的集合,δnode是轉(zhuǎn)換函數(shù)的集合,snode是初始狀態(tài),fnode是終止?fàn)顟B(tài)的集合
優(yōu)選的,采用執(zhí)行狀態(tài)機(jī)mexecutor表示scam中交易處理器執(zhí)行狀態(tài)機(jī),是一個(gè)五元組(qexecutor,∑executor,δexecutor,sexecutor,fexecutor),qexecutor是交易處理器狀態(tài)機(jī)的狀態(tài)集合如表4。∑executor是輸入(事件)的集合。δexecutor是轉(zhuǎn)換函數(shù)的集合。sexecutor是初始狀態(tài)值,fexecutor終止?fàn)顟B(tài)的集合
優(yōu)選的,所述能夠支持scam的存儲(chǔ)結(jié)構(gòu)模塊包括關(guān)系型數(shù)據(jù)庫(kù)以及kv(key-value)數(shù)據(jù)庫(kù),所述關(guān)系型數(shù)據(jù)庫(kù)用于存儲(chǔ)區(qū)塊鏈,所述kv數(shù)據(jù)庫(kù)用于存儲(chǔ)狀態(tài)樹(shù)的節(jié)點(diǎn),并且為了支持協(xié)議,kv中設(shè)置多個(gè)變量。
優(yōu)選的,所述關(guān)系型數(shù)據(jù)庫(kù)采用區(qū)塊頭部表與交易數(shù)據(jù)表兩個(gè)表存儲(chǔ)的形式,其中區(qū)塊頭部表以區(qū)塊哈希為主鍵,而交易數(shù)據(jù)表以交易哈希為主鍵,同時(shí)在存儲(chǔ)交易的時(shí)候,增加一個(gè)字段用于存儲(chǔ)交易所在的區(qū)塊哈希。
優(yōu)選的,所述kv中設(shè)置的多個(gè)變量包括:1)“state_root”,表示最新處理交易的狀態(tài)樹(shù)根;2)“state_height”,表示最新處理交易所在區(qū)塊的高度;3)“state_tx”,表示最新處理交易所在區(qū)塊的序號(hào);4)“state_latest”,表示交易處理器最新處理的高度;5)“block:itran:j”,表示記錄區(qū)塊高度為i,交易序號(hào)為j的交易處理成功后的狀態(tài)根與結(jié)果;6)“blocktrans:*”,表示區(qū)塊*的交易的key值;7)“用戶編號(hào)”,表示對(duì)應(yīng)存儲(chǔ)用戶信息;8)“計(jì)算節(jié)點(diǎn)”,記錄區(qū)塊鏈計(jì)算節(jié)點(diǎn)的地址列表,作為一個(gè)多方共同維護(hù)的合約賬戶,當(dāng)有計(jì)算節(jié)點(diǎn)需要更新的時(shí)候,必須經(jīng)過(guò)大多數(shù)管理節(jié)點(diǎn)的同意,才能更新,這樣保證了更新的同步性;9)“第三方編號(hào)”,用于給監(jiān)管方分配權(quán)限;10)“合約編號(hào)”,存儲(chǔ)合約的信息,包括代碼、合約狀態(tài);11)“名稱注冊(cè)”,用于給合約注冊(cè)名稱,便于查詢。
優(yōu)選的,所述交易處理器執(zhí)行模塊以服務(wù)組合形式提供合約服務(wù),分為執(zhí)行器executor與計(jì)算器compute,執(zhí)行器executor用于與節(jié)點(diǎn)通信,計(jì)算器compute用于計(jì)算交易,為了安全考慮合約代碼執(zhí)行部分會(huì)放到docker執(zhí)行,計(jì)算器compute的服務(wù)在docker中啟動(dòng),計(jì)算器compute負(fù)責(zé)執(zhí)行合約代碼,并返回計(jì)算結(jié)果給執(zhí)行器executor,在docker執(zhí)行以保證合約執(zhí)行不會(huì)給節(jié)點(diǎn)帶來(lái)危險(xiǎn)。
本發(fā)明還提供了一種私有區(qū)塊鏈的智能合約異步執(zhí)行存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法,包括步驟:
1)首先,在firsttimesetup進(jìn)入建立私有區(qū)塊鏈執(zhí)行模塊;
2)在啟動(dòng)的同時(shí),采用onmessage監(jiān)聽(tīng)消息,所述監(jiān)聽(tīng)消息包括:接收新區(qū)塊newblock消息、區(qū)塊投票vote消息、區(qū)塊存儲(chǔ)recblock消息和區(qū)塊請(qǐng)求missingblock消息;
3)當(dāng)接收到新的區(qū)塊就進(jìn)入receivenewblock函數(shù),對(duì)區(qū)塊進(jìn)行處理,先判斷區(qū)塊的來(lái)源與有效性然后在對(duì)有效區(qū)塊進(jìn)行投票;
4)投票消息進(jìn)入recblockvotedmg函數(shù),當(dāng)區(qū)塊的贊成票或反對(duì)票超過(guò)一定數(shù)量,則根據(jù)結(jié)果存儲(chǔ)區(qū)塊;
5)區(qū)塊請(qǐng)求消息進(jìn)入recblockrequestdmg函數(shù),節(jié)點(diǎn)將其他節(jié)點(diǎn)需要的區(qū)塊放入消息中發(fā)送出去;
6)區(qū)塊存儲(chǔ)消息進(jìn)入recblocksdmg函數(shù),節(jié)點(diǎn)會(huì)將區(qū)塊存儲(chǔ)到賬本中,同時(shí)交易處理器計(jì)算交易。
優(yōu)選的,執(zhí)行器executor每次初始化的時(shí)候,都會(huì)先從數(shù)據(jù)庫(kù)中讀取狀態(tài)值,繼續(xù)上次結(jié)束后的工作,所述狀態(tài)值包括:”state_root”、”state_height”、”state_tx”、”result_root”、”state_latest”、”block:*tran:*”、”blocktrans:*”、”cache”和”resultcache”,并且每次計(jì)算完交易后,都會(huì)更新這些值,在運(yùn)行狀態(tài)過(guò)程中,執(zhí)行器execuotr不斷將未處理交易發(fā)送給計(jì)算器computor進(jìn)行處理。
優(yōu)選的,所述交易處理器執(zhí)行模塊的服務(wù)是通過(guò)使用grpc實(shí)現(xiàn),所述grpc允許用戶定義一個(gè)服務(wù),指定其可以被遠(yuǎn)程調(diào)用的方法及其參數(shù)和返回類型。
采用本發(fā)明的系統(tǒng)和方法,提高了智能合約的執(zhí)行效率,智能合約作為區(qū)塊鏈的鏈上代碼執(zhí)行的安全性進(jìn)一步提高并且智能合約代碼與文本的一致性問(wèn)題得以解決。
根據(jù)下文結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的詳細(xì)描述,本領(lǐng)域技術(shù)人員將會(huì)更加明了本發(fā)明的上述以及其他目的、優(yōu)點(diǎn)和特征。
附圖說(shuō)明
后文將參照附圖以示例性而非限制性的方式詳細(xì)描述本發(fā)明的一些具體實(shí)施例。附圖中相同的附圖標(biāo)記標(biāo)示了相同或類似的部件或部分。本領(lǐng)域技術(shù)人員應(yīng)該理解,這些附圖未必是按比例繪制的。本發(fā)明的目標(biāo)及特征考慮到如下結(jié)合附圖的描述將更加明顯,附圖中:
圖1是現(xiàn)有技術(shù)的智能合約與區(qū)塊鏈結(jié)合的原理性示意圖;
圖2是根據(jù)本發(fā)明實(shí)施例的基于區(qū)塊鏈的智能合約scam模型示意圖;
圖3是根據(jù)本發(fā)明實(shí)施例的scam中私有區(qū)塊鏈執(zhí)行方法流程圖;
圖4是根據(jù)本發(fā)明實(shí)施例的私有區(qū)塊鏈執(zhí)行狀態(tài)機(jī)示意圖;
圖5是根據(jù)本發(fā)明實(shí)施例的交易處理器執(zhí)行狀態(tài)機(jī)示意圖;
圖6是根據(jù)本發(fā)明實(shí)施例的基于區(qū)塊鏈的智能合約狀態(tài)存儲(chǔ)模型示意圖;
圖7是根據(jù)本發(fā)明實(shí)施例的私有區(qū)塊鏈智能合約異步執(zhí)行存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法模塊圖。
具體實(shí)施方式
ethereum是首個(gè)把分布式虛擬機(jī)與區(qū)塊鏈相結(jié)合的系統(tǒng),私有區(qū)塊鏈上智能合約異步執(zhí)行模型的設(shè)計(jì)來(lái)源于ethereum中智能合約設(shè)計(jì)。ethereum的區(qū)塊鏈不僅存儲(chǔ)了交易,還存儲(chǔ)了最新賬戶狀態(tài)信息,賬戶分為兩種:一種是合約賬戶,其中合約賬戶才有相應(yīng)的代碼、一種是外部賬戶,這種帳戶沒(méi)有代碼。每個(gè)賬戶都有相應(yīng)的地址,包含:nonce(賬戶里的nonce相當(dāng)于是該賬戶所做的交易數(shù),賬戶的nonce記為)、balance(賬戶余額,記為)、合約代碼(合約賬戶才有,記為)和存儲(chǔ)(記為)。合約代碼存儲(chǔ)在合約賬戶中,合約是需要交易觸發(fā)執(zhí)行的,交易中填寫合約賬戶的地址,這樣計(jì)算節(jié)點(diǎn)接收到交易后就會(huì)去查詢對(duì)應(yīng)的代碼,加上交易中的data信息作為輸入來(lái)執(zhí)行合約。交易包含以下元素:nonce(交易里的nonce相當(dāng)于是交易被處理的標(biāo)志,記為)、gasprice(由于ethereum是公有鏈,需要通過(guò)收取計(jì)算費(fèi)用來(lái)保護(hù)不被攻擊,記為)、gaslimit(計(jì)算費(fèi)用的上限,記為)和to(交易的接收方,記為)、value(金額,記為),以及v,r,s用于簽名驗(yàn)證。
ethereum先計(jì)算新區(qū)塊中的所有交易后,將狀態(tài)根放入?yún)^(qū)塊的頭部,計(jì)算好區(qū)塊頭部后,再將新的區(qū)塊廣播出去,導(dǎo)致合約的計(jì)算時(shí)間包含在了區(qū)塊的制作時(shí)間中,所以ethereum的速度很慢,不僅如此,公有鏈存儲(chǔ)歷史數(shù)據(jù)回滾的可能性,所以很難做到區(qū)塊計(jì)算與交易計(jì)算的分離。私有鏈的區(qū)塊具有即時(shí)終結(jié)性,提供了區(qū)塊計(jì)算與交易計(jì)算分離的可能性,
下面給出本實(shí)施例中私有區(qū)塊鏈上智能合約異步執(zhí)行方法的概述。
智能合約異步執(zhí)行就是在不影響合約狀態(tài)一致性的前提下,將合約的計(jì)算從區(qū)塊的計(jì)算抽取出來(lái)?;镜乃悸罚核接墟湹膮^(qū)塊具有即時(shí)性,就是與ethereum不同,ethereum由于自身的一致性的原因,可能有狀態(tài)回滾的可能,而私有鏈中被驗(yàn)證過(guò)的區(qū)塊是不會(huì)被回滾的,所以,可以讓區(qū)塊鏈將所有來(lái)源正確的交易都放入?yún)^(qū)塊鏈中,交易可以異步處理,處理的結(jié)果也存放在結(jié)果樹(shù)中,然后將結(jié)果樹(shù)的根放入?yún)^(qū)塊的頭部,區(qū)塊在做共識(shí)的時(shí)候,只對(duì)當(dāng)前的已經(jīng)被處理過(guò)的交易進(jìn)行一致性檢查。交易由交易處理器執(zhí)行,交易處理器從區(qū)塊鏈數(shù)據(jù)庫(kù)中取出未被處理的交易并執(zhí)行。
圖2是基于區(qū)塊鏈的智能合約異步執(zhí)行模型(smartcontractasynchronousmodel,scam),區(qū)塊鏈節(jié)點(diǎn)負(fù)責(zé)將來(lái)源正確的交易鏈入鏈中,使得交易的順序固化,然后交易處理器按區(qū)塊鏈中交易的順序逐個(gè)處理交易,每次做區(qū)塊的時(shí)候都是對(duì)最新處理交易的狀態(tài)做一致性同步。最新?tīng)顟B(tài)由三個(gè)變量表示,state_height表示已被處理交易所在區(qū)塊高度、state_tx表示已被處理交易序號(hào)、state_root表示最新?tīng)顟B(tài)樹(shù)的根)。
圖3顯示了scam中私有區(qū)塊鏈的執(zhí)行過(guò)程,區(qū)塊鏈在做塊的時(shí)候負(fù)責(zé)將交易固定在鏈中不處理交易,只驗(yàn)證交易的來(lái)源是否正確,但會(huì)對(duì)最新處理的交易狀態(tài)進(jìn)行共識(shí)。后面交易處理器負(fù)責(zé)將區(qū)塊鏈中的交易處理,并在計(jì)算新區(qū)塊的時(shí)候提供最新?tīng)顟B(tài)值,即state_height,state_tx和state_root這三個(gè)變量,在驗(yàn)證區(qū)塊的時(shí)候檢查這三個(gè)變量的值。
交易會(huì)廣播給所有的計(jì)算節(jié)點(diǎn),節(jié)點(diǎn)通過(guò)compute_right(tx,height,time_interval)計(jì)算是否有權(quán)限計(jì)算新的區(qū)塊,有權(quán)限的節(jié)點(diǎn)計(jì)算新區(qū)塊,這時(shí)節(jié)點(diǎn)需要通過(guò)state=querystate()向交易處理器詢問(wèn)最新?tīng)顟B(tài),計(jì)算好新的區(qū)塊后廣播給其他的計(jì)算節(jié)點(diǎn)。計(jì)算節(jié)點(diǎn)接收到新區(qū)塊后,需要交易處理器驗(yàn)證狀態(tài)是否正確,區(qū)塊驗(yàn)證通過(guò),則廣播贊成票,否則發(fā)送反對(duì)票。當(dāng)節(jié)點(diǎn)接收到的區(qū)塊的贊成票或反對(duì)票數(shù)量超過(guò)節(jié)點(diǎn)數(shù)的1/3,則進(jìn)行同步計(jì)算,并存儲(chǔ)區(qū)塊。智能合約異步執(zhí)行模型(scam)中私有區(qū)塊鏈執(zhí)行系統(tǒng)包括:私有區(qū)塊鏈狀態(tài)執(zhí)行狀態(tài)機(jī)、交易處理器執(zhí)行狀態(tài)機(jī),能夠支持scam的存儲(chǔ)結(jié)構(gòu)模塊以及智能合約模塊。
下面分別對(duì)系統(tǒng)的各個(gè)組成部分進(jìn)行說(shuō)明:
1)scam中私有區(qū)塊鏈的執(zhí)行狀態(tài)機(jī)
執(zhí)行狀態(tài)機(jī)mnode表示scam中私有區(qū)塊鏈的執(zhí)行狀態(tài)機(jī),是一個(gè)五元組(qnode,∑mode,δnode,snode,fnode),qnode是私有區(qū)塊鏈中節(jié)點(diǎn)的狀態(tài)集合,如表1所示?!苖ode是輸入(事件)的集合,δnode是轉(zhuǎn)換函數(shù)的集合。snode是初始狀態(tài),fnode是終止?fàn)顟B(tài)的集合
表1
私有區(qū)塊鏈節(jié)點(diǎn)執(zhí)行狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換函數(shù)如表2。
表2
私有區(qū)塊鏈節(jié)點(diǎn)執(zhí)行狀態(tài)機(jī)∑mode的定義如表3。
表3
綜合表1-3,狀態(tài)機(jī)轉(zhuǎn)換示意圖如圖4所示。
從私有區(qū)塊鏈執(zhí)行過(guò)程看出,交易處理器必須滿足的四個(gè)接口是querystate、verifystate、newblock和computestate。
2)scam中交易處理器執(zhí)行狀態(tài)機(jī)
執(zhí)行狀態(tài)機(jī)mexecutor表示scam中交易處理器執(zhí)行狀態(tài)機(jī),是一個(gè)五元組(qexecutor,∑executor,δexecutor,sexecutor,fexecutor),qexecutor是交易處理器狀態(tài)機(jī)的狀態(tài)集合如表4。∑executor是輸入(事件)的集合。δexecutor是轉(zhuǎn)換函數(shù)的集合。sexecutor是初始狀態(tài)值,fexecutor終止?fàn)顟B(tài)的集合
表4
當(dāng)沒(méi)有未處理交易的時(shí)候,交易處理器一直處于等待監(jiān)聽(tīng)狀態(tài),不同的消息會(huì)觸發(fā)不同的行為,δexecutor定義如表5所示。
表5
∑executor定義的事件如表6所示。
表6
綜合表4-6,我們可以得到如圖5的狀態(tài)機(jī)轉(zhuǎn)換圖。
3)能夠支持scam的存儲(chǔ)結(jié)構(gòu)模塊
根據(jù)私有區(qū)塊鏈與智能合約的存儲(chǔ)要求與特點(diǎn)獲得能夠支持scam的存儲(chǔ)結(jié)構(gòu)模塊。私有區(qū)塊鏈的存儲(chǔ)有一個(gè)特點(diǎn)就是區(qū)塊一旦存儲(chǔ)了就不需要改動(dòng),所以可以將區(qū)塊鏈存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,存為兩個(gè)表,區(qū)塊頭部表與交易數(shù)據(jù)表,其中區(qū)塊頭部表以區(qū)塊哈希為主鍵,而交易數(shù)據(jù)表以交易哈希為主鍵,同時(shí)在存儲(chǔ)交易的時(shí)候,增加一個(gè)字段用于存儲(chǔ)交易所在的區(qū)塊哈希。
智能合約全局狀態(tài)的存儲(chǔ)特點(diǎn)是更新多,而且異步執(zhí)行需要很多臨時(shí)存儲(chǔ)的地方,所以以key-value的形式存儲(chǔ)是十分合適的,這里采用kv數(shù)據(jù)庫(kù)存儲(chǔ)狀態(tài)樹(shù)的節(jié)點(diǎn)。
圖6表示基于區(qū)塊鏈的智能合約狀態(tài)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)模塊,為了支持異步執(zhí)行協(xié)議,kv中需要以下幾個(gè)變量:
1)“state_root”,最新處理交易的狀態(tài)樹(shù)根;
2)“state_height”,最新處理交易所在區(qū)塊的高度;
3)“state_tx”,最新處理交易所在區(qū)塊的序號(hào);
4)“state_latest”,交易處理器最新處理的高度;
5)“block:itran:j”,記錄區(qū)塊高度為i,交易序號(hào)為j的交易處理成功后的狀態(tài)根與結(jié)果;
6)“blocktrans:*”,區(qū)塊*的交易的key值;
7)“用戶編號(hào)”,對(duì)應(yīng)存儲(chǔ)用戶信息;
8)“計(jì)算節(jié)點(diǎn)”,記錄區(qū)塊鏈計(jì)算節(jié)點(diǎn)的地址列表,這是一個(gè)多方共同維護(hù)的合約賬戶,當(dāng)有計(jì)算節(jié)點(diǎn)需要更新的時(shí)候,必須經(jīng)過(guò)大多數(shù)管理節(jié)點(diǎn)的同意,才能更新,這樣保證了更新的同步性;
9)“第三方編號(hào)”,用于給監(jiān)管方分配權(quán)限;
10)“合約編號(hào)”,存儲(chǔ)合約的信息,包括代碼、合約狀態(tài);
11)“名稱注冊(cè)”,用于給合約注冊(cè)名稱,便于查詢。
圖7表示一種私有區(qū)塊鏈的智能合約異步執(zhí)行存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法模塊圖。首先,程序入口在firsttimesetup,在啟動(dòng)的同時(shí),還有onmessage用于監(jiān)聽(tīng)消息(接收新區(qū)塊newblock消息、區(qū)塊投票vote消息、區(qū)塊存儲(chǔ)recblock消息和區(qū)塊請(qǐng)求missingblock消息)。當(dāng)接收到新的區(qū)塊就會(huì)進(jìn)入receivenewblock函數(shù),對(duì)區(qū)塊進(jìn)行處理,先判斷區(qū)塊的來(lái)源與有效性然后在對(duì)有效區(qū)塊進(jìn)行投票;投票消息會(huì)進(jìn)入recblockvotedmg函數(shù),當(dāng)區(qū)塊的贊成票或反對(duì)票超過(guò)一定數(shù)量,則根據(jù)結(jié)果存儲(chǔ)區(qū)塊;區(qū)塊請(qǐng)求消息會(huì)進(jìn)入recblockrequestdmg函數(shù),節(jié)點(diǎn)將其他節(jié)點(diǎn)需要的區(qū)塊放入消息中發(fā)送出去;區(qū)塊存儲(chǔ)消息會(huì)進(jìn)入recblocksdmg函數(shù),節(jié)點(diǎn)會(huì)將區(qū)塊存儲(chǔ)到賬本中,并同時(shí)交易處理器去計(jì)算交易。
交易處理器每次初始化的時(shí)候,都會(huì)先從數(shù)據(jù)庫(kù)中讀取狀態(tài)值,繼續(xù)上次結(jié)束后的工作:”state_root”、”state_height”、”state_tx”、”result_root”、”state_latest”、”block:*tran:*”、”blocktrans:*”、”cache”和”resultcache”。且每次計(jì)算完交易后,都會(huì)更新這些值。在運(yùn)行狀態(tài)過(guò)程中,交易處理器不斷計(jì)算未處理交易。
4)智能合約模塊:
以服務(wù)組合形式提供合約服務(wù),它分為執(zhí)行器executor與計(jì)算器compute,執(zhí)行器executor負(fù)責(zé)與節(jié)點(diǎn)通信,計(jì)算器compute負(fù)責(zé)計(jì)算交易。在這里智能合約模塊服務(wù)是通過(guò)使用grpc實(shí)現(xiàn)(grpc允許我們定義一個(gè)服務(wù),指定其可以被遠(yuǎn)程調(diào)用的方法及其參數(shù)和返回類型)。executor是交易執(zhí)行器,為了安全考慮合約代碼執(zhí)行部分會(huì)放到docker執(zhí)行,所以還有一個(gè)計(jì)算服務(wù)compute在docker中啟動(dòng),compute負(fù)責(zé)執(zhí)行合約代碼,并返回計(jì)算結(jié)果給executor,在docker執(zhí)行可以保證合約執(zhí)行不會(huì)給節(jié)點(diǎn)帶來(lái)危險(xiǎn)。executor服務(wù)要提供的全部服務(wù)包括query、verify、newblock和querytrie,定義如表7。
表7
compute只有compute服務(wù),服務(wù)定義如表8,請(qǐng)求交易包括交易的內(nèi)容,結(jié)果的返回不僅包括結(jié)果的內(nèi)容,還包括狀態(tài)值的變化。
表8
由于是將計(jì)算服務(wù)放在docker中執(zhí)行,所以合約執(zhí)行過(guò)程需要查詢區(qū)塊鏈狀態(tài)并返回結(jié)果,交易處理器接收到結(jié)果的返回,則會(huì)更新?tīng)顟B(tài)。stub表示交易處理器與計(jì)算服務(wù)(docker)的中間,stud對(duì)象包含了計(jì)算服務(wù)與交易處理器之間的行為,合約編寫的時(shí)候可以直接調(diào)用stub的接口,stub定義如表9。
表9
雖然本發(fā)明已經(jīng)參考特定的說(shuō)明性實(shí)施例進(jìn)行了描述,但是不會(huì)受到這些實(shí)施例的限定而僅僅受到附加權(quán)利要求的限定。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解可以在不偏離本發(fā)明的保護(hù)范圍和精神的情況下對(duì)本發(fā)明的實(shí)施例能夠進(jìn)行改動(dòng)和修改。