本發(fā)明涉及一種區(qū)塊鏈技術(shù),特別是一種基于階段桶的復(fù)雜智能合約狀態(tài)同步方法。
背景技術(shù):
所謂復(fù)雜智能合約,就是執(zhí)行時(shí)間長(zhǎng),邏輯較復(fù)雜的合約,通常具有多個(gè)階段。在區(qū)塊鏈系統(tǒng)中,智能合約需要部署在所有節(jié)點(diǎn)上,并且智能合約在每次執(zhí)行時(shí)也需要系統(tǒng)中所有節(jié)點(diǎn)來(lái)同時(shí)執(zhí)行,以使得所有的節(jié)點(diǎn)狀態(tài)保持一致。然而,在實(shí)際中,區(qū)塊鏈系統(tǒng)中的各個(gè)節(jié)點(diǎn)的環(huán)境可能各有不同,智能合約在各個(gè)節(jié)點(diǎn)運(yùn)行的速度可能各不相同,加之邏輯復(fù)雜,智能合約可能會(huì)在運(yùn)行中的任何一個(gè)階段改變其所在節(jié)點(diǎn)的狀態(tài),而現(xiàn)有技術(shù)的方案并沒(méi)有針對(duì)只能合約節(jié)點(diǎn)環(huán)境存在差異情況下的智能合約執(zhí)行方法,因此會(huì)產(chǎn)生合約狀態(tài)異步,區(qū)塊鏈系統(tǒng)對(duì)于支持復(fù)雜智能合約執(zhí)行的能力低的技術(shù)缺陷,同時(shí),多個(gè)獨(dú)立節(jié)點(diǎn)同時(shí)執(zhí)行合約時(shí)數(shù)據(jù)一致性,結(jié)果統(tǒng)一性,數(shù)據(jù)的完整性以及數(shù)據(jù)的隔離性難以保證,數(shù)據(jù)同步會(huì)相互干擾。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種基于階段桶的復(fù)雜智能合約狀態(tài)同步方法,允許執(zhí)行智能合約的各節(jié)點(diǎn)環(huán)境存在差異,并且在執(zhí)行同一個(gè)智能合約時(shí)的速度存在差異,包括如下步驟:(1)判斷狀態(tài)類型交易,確定需要更新?tīng)顟B(tài)的賬戶地址;(2)根據(jù)狀態(tài)交易的信息生成階段桶,然后為每個(gè)階段桶設(shè)定一個(gè)計(jì)時(shí)器;(3)統(tǒng)計(jì)階段桶內(nèi)的狀態(tài)信息,并分別統(tǒng)計(jì)每類信息的條數(shù);(4)檢查 步驟(3)的結(jié)果,確定某階段桶是否已達(dá)成一致,如果已達(dá)成一致,繼續(xù)執(zhí)行步驟(5),否則繼續(xù)執(zhí)行步驟(7);(5)將狀態(tài)存儲(chǔ)到狀態(tài)區(qū)塊鏈中;(6)標(biāo)記該階段桶為“已達(dá)成一致”,然后刪除該階段桶;(7)檢查階段桶的計(jì)時(shí)器是否已超時(shí),如果未超時(shí)則跳轉(zhuǎn)執(zhí)行步驟(3),否則繼續(xù)執(zhí)行步驟(8);(8)標(biāo)記該階段桶為“已超時(shí)”,然后刪除該階段桶,此時(shí)的階段桶稱為“廢桶”。
優(yōu)選的,步驟(1)的所述交易是從交易區(qū)塊鏈發(fā)來(lái)的。
優(yōu)選的,步驟(2)中所述信息包括合約賬戶的地址、該合約賬戶總共被觸發(fā)執(zhí)行的次數(shù)以及需要更改的賬戶地址,
優(yōu)選的,步驟(3)所述統(tǒng)計(jì)階段桶內(nèi)的狀態(tài)信息是對(duì)階段桶內(nèi)的來(lái)自交易區(qū)塊鏈不同節(jié)點(diǎn)的相同內(nèi)容信息進(jìn)行歸類。
優(yōu)選的,步驟(4)所述確定某階段桶是否已達(dá)成一致是確定否有超過(guò)2/3的合約執(zhí)行節(jié)點(diǎn)擁有相同的狀態(tài)。
優(yōu)選的,步驟(8)所述“廢桶”是由某個(gè)階段桶中的意見(jiàn)長(zhǎng)期無(wú)法達(dá)成一致產(chǎn)生的。
優(yōu)選的,廢桶是由于桶內(nèi)已經(jīng)收集了所有執(zhí)行合約的節(jié)點(diǎn)的意見(jiàn),但相同的狀態(tài)信息總數(shù)小于總節(jié)點(diǎn)數(shù)的2/3而沒(méi)有達(dá)成一致所產(chǎn)生的。
優(yōu)選的,廢桶是由于執(zhí)行智能合約的個(gè)別節(jié)點(diǎn)執(zhí)行速度慢,當(dāng)它將自己的sTx發(fā)送到狀態(tài)區(qū)塊鏈時(shí),狀態(tài)區(qū)塊鏈已經(jīng)完成了對(duì)該階段的狀態(tài)統(tǒng)計(jì),超過(guò)2/3的節(jié)點(diǎn)已經(jīng)對(duì)該階段的狀態(tài)改變達(dá)成了一致,并已經(jīng)銷毀了對(duì)應(yīng)的階段桶而產(chǎn)生的,狀態(tài)區(qū)塊鏈會(huì)為該條sTx新建一個(gè)階段桶并等待永遠(yuǎn)無(wú)法完成的狀態(tài)統(tǒng)計(jì)。
優(yōu)選的,廢桶是由于某些sTx未能到達(dá)狀態(tài)區(qū)塊鏈,或者某些節(jié)點(diǎn)未能成功發(fā)送sTx導(dǎo)致對(duì)某階段的狀態(tài)統(tǒng)計(jì)達(dá)不到執(zhí)行合約總節(jié)點(diǎn)數(shù)的2/3以上所產(chǎn)生的。
優(yōu)選的,廢桶產(chǎn)生后,對(duì)于該合約的后續(xù)狀態(tài)無(wú)論是否一致都不再統(tǒng)計(jì), 記錄本次合約的源賬戶地址和標(biāo)記了本次執(zhí)行是合約第幾次被激活執(zhí)行的本次的執(zhí)行序號(hào),如果后續(xù)sTx是對(duì)同一合約的相同執(zhí)行序號(hào)的狀態(tài)信息,則直接丟棄。
優(yōu)選的,執(zhí)行智能合約的個(gè)別節(jié)點(diǎn)執(zhí)行速度慢時(shí),對(duì)于最近一段時(shí)間內(nèi)已經(jīng)確認(rèn)達(dá)成一致的階段桶,系統(tǒng)動(dòng)態(tài)維護(hù)一張“狀態(tài)表”,銷毀該階段桶時(shí)在表中記錄了桶的標(biāo)記名,以及銷毀時(shí)桶內(nèi)累計(jì)的意見(jiàn)總數(shù),如果隨后的sTx對(duì)應(yīng)標(biāo)記名與表中記錄的標(biāo)記名匹配,直接丟棄該sTx并將累計(jì)在該標(biāo)記名的意見(jiàn)總數(shù)加1,當(dāng)一條階段桶緩存記錄上所累積的意見(jiàn)總數(shù)達(dá)到執(zhí)行合約的所有節(jié)點(diǎn)的節(jié)點(diǎn)點(diǎn)數(shù),即執(zhí)行合約的所有節(jié)點(diǎn)已經(jīng)執(zhí)行完這個(gè)階段,或者該緩存記錄超過(guò)了一定時(shí)間限制時(shí),將記錄寫(xiě)入日志,然后在“狀態(tài)表”中清除它。
優(yōu)選的,某些sTx未能到達(dá)狀態(tài)區(qū)塊鏈,或者某些節(jié)點(diǎn)未能成功發(fā)送sTx時(shí),系統(tǒng)在每次新建階段桶的時(shí)候都會(huì)啟動(dòng)一個(gè)計(jì)時(shí)器,當(dāng)一個(gè)階段桶經(jīng)過(guò)一段時(shí)間后還沒(méi)有達(dá)成狀態(tài)一致時(shí),系統(tǒng)將銷毀階段桶。
本發(fā)明通過(guò)在單獨(dú)存儲(chǔ)狀態(tài)的區(qū)塊鏈上使用“階段桶”的辦法來(lái)保證執(zhí)行智能合約的各節(jié)點(diǎn)狀態(tài)的一致,區(qū)塊鏈系統(tǒng)對(duì)于支持復(fù)雜智能合約執(zhí)行的能力提高,同時(shí),多個(gè)獨(dú)立節(jié)點(diǎn)同時(shí)執(zhí)行合約時(shí)數(shù)據(jù)一致性,結(jié)果統(tǒng)一性,數(shù)據(jù)的完整性以及數(shù)據(jù)的隔離性的以保證,數(shù)據(jù)同步不會(huì)相互干擾。
根據(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是根據(jù)本發(fā)明實(shí)施例的簡(jiǎn)單賬戶結(jié)構(gòu)示意圖;
圖2是根據(jù)本發(fā)明實(shí)施例的復(fù)雜合約賬戶結(jié)構(gòu)示意圖;
圖3是根據(jù)本發(fā)明實(shí)施例的狀態(tài)同步流程示意圖。
具體實(shí)施方式
在進(jìn)行具體實(shí)施方式的說(shuō)明之前,為了更為清楚的表達(dá)所論述的內(nèi)容,首先說(shuō)明本發(fā)明所涉及的一些重要概念。
1、賬戶
智能合約附屬于某個(gè)賬戶,賬戶的結(jié)構(gòu)描述如下:
(1)激活狀態(tài):賬戶是否已被激活。0代表未被激活,1代表已激活。如果該字段為0,則賬戶不能發(fā)送交易,并且忽略除激活信息外一切發(fā)送到它的交易信息,直到重新被激活;
(2)創(chuàng)建時(shí)間和更新時(shí)間:記錄了此賬戶被創(chuàng)建的時(shí)間和上一次更新的時(shí)間;
(3)合約哈希值:對(duì)合約賬戶而言,這個(gè)字段記錄了與該賬戶關(guān)聯(lián)的合約代碼的哈希值,賬戶一旦生成,這個(gè)值就不再改變;
(4)nonce:一個(gè)整數(shù),記錄從該賬戶地址共發(fā)出了多少交易;
(5)number:記錄有多少交易發(fā)送到了該賬戶地址,記錄了合約被激活執(zhí)行的次數(shù);
(6)賬戶類型:分為兩種類型,1表示普通合約賬戶,2表示復(fù)雜合約賬戶;
(7)賬戶地址:一個(gè)20位長(zhǎng)的字符串,在系統(tǒng)中唯一標(biāo)識(shí)一個(gè)賬戶采用的是非對(duì)稱加密技術(shù)生成的公鑰和私鑰,然后對(duì)公鑰進(jìn)行md5哈希,取最后20個(gè)字符作為地址;
(8)賬戶緩存:暫時(shí)記錄合約執(zhí)行過(guò)程中產(chǎn)生的臨時(shí)數(shù)據(jù)。
對(duì)于簡(jiǎn)單的合約,完全可以將編譯完成后的二進(jìn)制數(shù)據(jù)直接存儲(chǔ)在區(qū)塊鏈上,以提高加載速度。但是對(duì)于復(fù)雜智能合約,如果將合約執(zhí)行相關(guān)的文件直接存儲(chǔ)在區(qū)塊鏈上將可能造成區(qū)塊體積過(guò)大,因此復(fù)雜合約只在賬戶中保存了 相關(guān)文件的地址以節(jié)省空間,真正的文件保存在區(qū)塊鏈外。賬戶的結(jié)構(gòu)如附圖1和圖2所示。
2、交易區(qū)塊鏈和狀態(tài)區(qū)塊鏈
交易區(qū)塊鏈接收來(lái)自區(qū)塊鏈系統(tǒng)外部的信息,并將這些信息存儲(chǔ)至區(qū)塊中,智能合約的執(zhí)行在交易區(qū)塊鏈的節(jié)點(diǎn)中完成。
狀態(tài)區(qū)塊鏈專門(mén)存儲(chǔ)狀態(tài)信息,維護(hù)賬戶信息,它負(fù)責(zé)智能合約執(zhí)行過(guò)程中和執(zhí)行完畢后的狀態(tài)同步及存儲(chǔ)。
3、狀態(tài)型交易
在智能合約執(zhí)行的過(guò)程中,每當(dāng)有狀態(tài)改變的操作時(shí),各執(zhí)行合約節(jié)點(diǎn)都會(huì)向?qū)iT(mén)存儲(chǔ)狀態(tài)的區(qū)塊鏈發(fā)送狀態(tài)型交易(sTx)來(lái)進(jìn)行狀態(tài)同步。sTx的內(nèi)容如下:
(1)源地址:發(fā)出該狀態(tài)交易的賬戶地址;
(2)源賬戶的公鑰:對(duì)這個(gè)公鑰進(jìn)行哈希后取其最后20個(gè)字符,應(yīng)該與源地址相同;
(3)執(zhí)行信息:本次合約的執(zhí)行信息,包括記錄本次是合約的第幾次執(zhí)行;
(4)對(duì)象賬戶地址:改變狀態(tài)的賬戶地址;
(5)狀態(tài)信息:狀態(tài)改變信息,與具體的領(lǐng)域有關(guān);
(6)簽名:使用源地址的私鑰對(duì)對(duì)象賬戶地址、執(zhí)行信息、狀態(tài)信息生成的摘要字段的簽名;
(7)時(shí)間戳:交易創(chuàng)建的時(shí)間
4、階段桶
智能合約是在交易區(qū)塊鏈的所有節(jié)點(diǎn)同時(shí)執(zhí)行,因此執(zhí)行過(guò)程中在進(jìn)行狀態(tài)改變操作時(shí),每個(gè)節(jié)點(diǎn)都會(huì)產(chǎn)生一條狀態(tài)型交易,為了對(duì)各個(gè)節(jié)點(diǎn)的狀態(tài)改變結(jié)果進(jìn)行匯總統(tǒng)一,維護(hù)狀態(tài)區(qū)塊鏈中的狀態(tài)一致性,系統(tǒng)為智能合約的每個(gè)階段設(shè)立一個(gè)階段桶,每個(gè)階段可能有一次或者多次狀態(tài)改變。
復(fù)雜類型的智能合約通常擁有較長(zhǎng)的執(zhí)行周期,并且具有多個(gè)階段,當(dāng)在 多個(gè)獨(dú)立的節(jié)點(diǎn)同時(shí)部署執(zhí)行時(shí),由于實(shí)際中不同節(jié)點(diǎn)的環(huán)境不同,智能合約執(zhí)行的速度存在差別,使得對(duì)合約執(zhí)行狀態(tài)的同步變得困難。比如,一個(gè)智能合約分為三個(gè)階段執(zhí)行,分別為a,b,c,其中每個(gè)階段都可能涉及一次或多次的狀態(tài)改變。假設(shè)當(dāng)node(i)的b階段執(zhí)行完畢時(shí),node(i+1)由于某種原因,其a階段剛剛執(zhí)行完畢,那么此時(shí)的本地狀態(tài)無(wú)法直接同步,而是需要等待node(i+1)的b階段執(zhí)行結(jié)束才可以進(jìn)行,這時(shí)使用階段桶從而減少處理等待時(shí)間就顯得很有必要性了。
階段桶的實(shí)現(xiàn)原理是將階段桶看成是一種結(jié)果統(tǒng)計(jì)器。狀態(tài)區(qū)塊鏈的每個(gè)節(jié)點(diǎn)都會(huì)接收到來(lái)自交易區(qū)塊鏈所有參與合約執(zhí)行的節(jié)點(diǎn)發(fā)來(lái)的狀態(tài)交易。對(duì)合約執(zhí)行的每個(gè)階段,交易區(qū)塊鏈都會(huì)以唯一的標(biāo)注作為階段桶的名稱(比如以“合約賬戶名+該合約被觸發(fā)的次數(shù)[即該賬戶合約執(zhí)行的總次數(shù)]+合約執(zhí)行階段的名稱或標(biāo)號(hào)”來(lái)命名)。
在首次收到交易區(qū)塊鏈某結(jié)點(diǎn)發(fā)來(lái)的一個(gè)新的階段的狀態(tài)交易時(shí)建立階段桶,接下來(lái),每次狀態(tài)區(qū)塊鏈節(jié)點(diǎn)在收到交易區(qū)塊鏈其余節(jié)點(diǎn)關(guān)于某階段的狀態(tài)交易時(shí),就放入對(duì)應(yīng)的階段桶。由此可見(jiàn),階段桶中存放的是來(lái)自交易區(qū)塊鏈不同節(jié)點(diǎn)的相同內(nèi)容信息。當(dāng)某個(gè)階段桶內(nèi)相同的內(nèi)容信息數(shù)量在規(guī)定的時(shí)限內(nèi)超過(guò)交易區(qū)塊鏈節(jié)點(diǎn)總數(shù)的2/3時(shí),階段桶的信息內(nèi)容達(dá)成一致,否則認(rèn)為階段桶的信息內(nèi)容無(wú)法達(dá)成一致,即產(chǎn)生了廢桶。
引入階段桶后,解決了在多個(gè)節(jié)點(diǎn)同時(shí)執(zhí)行合約的狀態(tài)同步問(wèn)題,提高了區(qū)塊鏈系統(tǒng)對(duì)于支持復(fù)雜智能合約執(zhí)行的能力。首先,階段桶保證了數(shù)據(jù)的一致性,使得在多個(gè)獨(dú)立節(jié)點(diǎn)同時(shí)執(zhí)行合約時(shí),可以得到統(tǒng)一的結(jié)果。另外,階段桶保證了數(shù)據(jù)的完整性,由于階段桶的存在,當(dāng)少數(shù)節(jié)點(diǎn)出現(xiàn)故障時(shí)并不會(huì)影響數(shù)據(jù)的準(zhǔn)確性和可靠性。再次,階段桶保證了數(shù)據(jù)的隔離性,如前文所述,復(fù)雜型合約通常具有較長(zhǎng)的實(shí)行周期,并且具有多個(gè)階段,階段桶使得相同合約的不同階段之間,相同合約在不同執(zhí)行輪次的相同階段之間(系統(tǒng)中可能同時(shí)有多個(gè)復(fù)雜型合約在執(zhí)行,也可能是不同的交易觸發(fā)了相同合約的多次執(zhí)行, 但他們屬于不同的執(zhí)行輪次),不同合約之間的數(shù)據(jù)同步不會(huì)相互干擾。
5、廢桶
如果某個(gè)階段桶中的意見(jiàn)長(zhǎng)期無(wú)法達(dá)成一致,就會(huì)產(chǎn)生廢桶。廢桶無(wú)法對(duì)狀態(tài)同步做出貢獻(xiàn),應(yīng)該及時(shí)的銷毀以避免浪費(fèi)資源。產(chǎn)生廢桶的原因可能有多種:
第一,桶內(nèi)已經(jīng)收集了所有執(zhí)行合約的節(jié)點(diǎn)的意見(jiàn),但沒(méi)有達(dá)成一致,即相同的狀態(tài)信息總數(shù)小于總節(jié)點(diǎn)數(shù)的2/3;
第二,執(zhí)行智能合約的個(gè)別節(jié)點(diǎn)執(zhí)行速度慢,當(dāng)它將自己的sTx發(fā)送到狀態(tài)區(qū)塊鏈時(shí),狀態(tài)區(qū)塊鏈已經(jīng)完成了對(duì)該階段的狀態(tài)統(tǒng)計(jì),即超過(guò)2/3的節(jié)點(diǎn)已經(jīng)對(duì)該階段的狀態(tài)改變達(dá)成了一致,并銷毀的對(duì)應(yīng)的階段桶,按照本發(fā)明的策略,狀態(tài)區(qū)塊鏈會(huì)為該條sTx新建一個(gè)階段桶并等待永遠(yuǎn)無(wú)法完成的狀態(tài)統(tǒng)計(jì);
第三,由于未知原因,某些sTx未能到達(dá)狀態(tài)區(qū)塊鏈,或者某些節(jié)點(diǎn)未能成功發(fā)送sTx導(dǎo)致對(duì)某階段的狀態(tài)統(tǒng)計(jì)達(dá)不到執(zhí)行合約總節(jié)點(diǎn)數(shù)的2/3以上。
第一種情況屬于錯(cuò)誤,這說(shuō)明執(zhí)行合約的所有節(jié)點(diǎn)在執(zhí)行合約時(shí)有總數(shù)超過(guò)1/3的節(jié)點(diǎn)與其他節(jié)點(diǎn)的狀態(tài)不一致,此時(shí)對(duì)于該合約的后續(xù)狀態(tài)無(wú)論是否一致都不再統(tǒng)計(jì),應(yīng)該記錄本次合約的源賬戶地址和本次的執(zhí)行序號(hào)(標(biāo)記了本次執(zhí)行是合約第幾次被激活執(zhí)行),如果后續(xù)sTx是對(duì)同一合約的相同執(zhí)行序號(hào)的狀態(tài)信息,則直接丟棄。
第二種情況,對(duì)于最近一段時(shí)間內(nèi)已經(jīng)確認(rèn)達(dá)成一致的階段桶,系統(tǒng)動(dòng)態(tài)維護(hù)一張“狀態(tài)表”,銷毀該階段桶時(shí)在表中記錄了桶的標(biāo)記名,以及銷毀時(shí)桶內(nèi)累計(jì)的意見(jiàn)總數(shù)。如果隨后的sTx對(duì)應(yīng)標(biāo)記名與表中記錄的標(biāo)記名匹配,直接丟棄該sTx并將累計(jì)在該標(biāo)記名的意見(jiàn)總數(shù)加1。當(dāng)一條階段桶緩存記錄上所累積的意見(jiàn)總數(shù)達(dá)到執(zhí)行合約的所有節(jié)點(diǎn)的總節(jié)點(diǎn)數(shù),即執(zhí)行合約的所有節(jié)點(diǎn)已經(jīng)執(zhí)行完這個(gè)階段,或者該緩存記錄超過(guò)了一定時(shí)間限制時(shí),將記錄寫(xiě)入日志,然后在“狀態(tài)表”中清除它。
第三種情況,系統(tǒng)在每次新建階段桶的時(shí)候都會(huì)啟動(dòng)一個(gè)計(jì)時(shí)器,當(dāng)一個(gè) 階段桶經(jīng)過(guò)一段時(shí)間后還沒(méi)有達(dá)成狀態(tài)一致時(shí),系統(tǒng)將銷毀階段桶。理由是,在正常的情況下,執(zhí)行合約的所有節(jié)點(diǎn)各節(jié)點(diǎn)對(duì)同一個(gè)合約的執(zhí)行速度不應(yīng)該相差太大,因此大多數(shù)節(jié)點(diǎn)對(duì)同一階段的狀態(tài)確認(rèn)時(shí)間間隔不會(huì)太久。如果經(jīng)過(guò)很長(zhǎng)時(shí)間還沒(méi)有達(dá)成一致,那么很可能這個(gè)階段桶以后也無(wú)法達(dá)成一致。
由于狀態(tài)區(qū)塊鏈并不知道一個(gè)具體的合約在執(zhí)行過(guò)程中會(huì)涉及到多少次的狀態(tài)改變操作,所以按照前文所述,狀態(tài)區(qū)塊鏈會(huì)給每個(gè)新出現(xiàn)的階段創(chuàng)建一個(gè)新的階段桶,并對(duì)其進(jìn)行關(guān)于狀態(tài)一致性的意見(jiàn)統(tǒng)計(jì)。但如果階段桶內(nèi)的信息長(zhǎng)期無(wú)法達(dá)成一致(即產(chǎn)生了廢桶),并且得不到適當(dāng)?shù)奶幚砭蜁?huì)造成極大的資源浪費(fèi),造成系統(tǒng)性能下降,甚至影響系統(tǒng)的穩(wěn)定性。因此以上的處理機(jī)制是必不可少的。
實(shí)施例
本具體實(shí)施例所涉及的系統(tǒng)有多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都部署相同的智能合約,智能合約作為合約賬戶的一部分而存在,由于區(qū)塊鏈系統(tǒng)各節(jié)點(diǎn)信息需要保持一致,因此系統(tǒng)中各節(jié)點(diǎn)所部署的智能合約均相同。
本具體實(shí)施例所涉及的智能合約為復(fù)雜類型,通常擁有較長(zhǎng)的執(zhí)行周期,具有多個(gè)階段,并且可能多次進(jìn)行狀態(tài)的改變,如果有狀態(tài)改變,則系統(tǒng)在每個(gè)階段結(jié)束時(shí)進(jìn)行一次狀態(tài)同步。
假設(shè)區(qū)塊鏈系統(tǒng)中的交易區(qū)塊鏈有A,B,C,D四個(gè)節(jié)點(diǎn),狀態(tài)區(qū)塊鏈有E,F(xiàn),G,H四個(gè)節(jié)點(diǎn),一個(gè)智能合約M分為三個(gè)階段執(zhí)行,分別為a,b,c,其中每個(gè)階段都可能涉及一次或多次的狀態(tài)改變,智能合約在ABCD四個(gè)節(jié)點(diǎn)被同時(shí)觸發(fā)執(zhí)行。對(duì)于ABCD每個(gè)節(jié)點(diǎn),每一個(gè)階段執(zhí)行結(jié)束,如果此階段涉及到狀態(tài)的改變,則改變后的狀態(tài)需要同步至狀態(tài)區(qū)塊鏈,因此節(jié)點(diǎn)ABCD都需要向狀態(tài)區(qū)塊鏈發(fā)送sTx來(lái)進(jìn)行狀態(tài)同步。
但是在實(shí)際中,不同節(jié)點(diǎn)之間不僅運(yùn)行環(huán)境存在差別,執(zhí)行速度也可能會(huì)不一致,即節(jié)點(diǎn)ABCD在執(zhí)行智能合約M時(shí),雖然同時(shí)被觸發(fā)執(zhí)行,但不一定 可以每次都同時(shí)完成a,b,c三個(gè)階段。
假設(shè)在智能合約M被觸發(fā)執(zhí)行一段時(shí)間后的t1時(shí)刻,ABCD四個(gè)節(jié)點(diǎn)的執(zhí)行狀態(tài)如下:
A節(jié)點(diǎn):階段a執(zhí)行完畢,正在執(zhí)行階段b,已經(jīng)向狀態(tài)區(qū)塊鏈發(fā)送了sTx(a);
B節(jié)點(diǎn):正在執(zhí)行階段a,還未向狀態(tài)區(qū)塊鏈發(fā)送狀態(tài)交易信息;
C節(jié)點(diǎn):階段a,b執(zhí)行完畢,正在執(zhí)行階段c,已經(jīng)向狀態(tài)區(qū)塊鏈發(fā)送了sTx(a),sTx(b);
D節(jié)點(diǎn):階段a執(zhí)行完畢,正在執(zhí)行階段b,已經(jīng)向狀態(tài)區(qū)塊鏈發(fā)送了sTx(a)。
狀態(tài)交易以廣播方式發(fā)向狀態(tài)區(qū)塊鏈的每個(gè)節(jié)點(diǎn),因此節(jié)點(diǎn)EFGH均可收到由交易區(qū)塊鏈節(jié)點(diǎn)ABCD發(fā)來(lái)的狀態(tài)交易信息。節(jié)點(diǎn)EFGH每個(gè)節(jié)點(diǎn)執(zhí)行的操作都相同,以節(jié)點(diǎn)E為例,由于t1時(shí)刻接到的不同階段的狀態(tài)信息共有兩類,分別為階段a和階段b,所以共有階段桶2個(gè),t1時(shí)刻節(jié)點(diǎn)E的階段桶情況如表1所示:
表1 t1時(shí)刻節(jié)點(diǎn)E的階段桶情況
可見(jiàn)t1時(shí)刻,合約階段a對(duì)應(yīng)的階段桶中收集的相同意見(jiàn)已經(jīng)超過(guò)了交易區(qū)塊鏈總結(jié)點(diǎn)數(shù)(本例中是4個(gè)節(jié)點(diǎn))的2/3,已經(jīng)達(dá)成一致,sTx(a)將會(huì)被寫(xiě)入狀態(tài)區(qū)塊鏈,按照本文前述策略,該階段桶將被刪除。
經(jīng)過(guò)一段時(shí)間,到達(dá)t2時(shí)刻后,ABCD四個(gè)節(jié)點(diǎn)的執(zhí)行狀態(tài)如下:
A節(jié)點(diǎn):階段a,b執(zhí)行完畢,正在執(zhí)行階段c,t1時(shí)刻后,又向狀態(tài)區(qū)塊鏈發(fā)送了sTx(b);
B節(jié)點(diǎn):階段a,b,c執(zhí)行完畢,t1時(shí)刻后,又向狀態(tài)區(qū)塊鏈發(fā)送了sTx(a),sTx(b),sTx(c);
C節(jié)點(diǎn):階段a,b,c執(zhí)行完畢,t1時(shí)刻后,又向狀態(tài)區(qū)塊鏈發(fā)送了sTx(c);
D節(jié)點(diǎn):階段a,b執(zhí)行完畢,正在執(zhí)行階段c,t1時(shí)刻后,又向狀態(tài)區(qū)塊鏈發(fā)送了sTx(b);
t2時(shí)刻節(jié)點(diǎn)E的階段桶情況如表2所示:
表2 t2時(shí)刻節(jié)點(diǎn)E階段桶情況
t2時(shí)刻,合約階段b對(duì)應(yīng)的階段桶已經(jīng)集齊了交易區(qū)塊鏈節(jié)點(diǎn)ABCD發(fā)來(lái)的狀態(tài)交易,若桶中相同內(nèi)容的信息數(shù)量超過(guò)交易區(qū)塊鏈節(jié)點(diǎn)總數(shù)的2/3,該桶就會(huì)被刪除,sTx(b)則會(huì)被寫(xiě)入狀態(tài)區(qū)塊鏈。合約階段c對(duì)應(yīng)的階段桶還在等待節(jié)點(diǎn)A和D的狀態(tài)交易,如果超過(guò)一定時(shí)長(zhǎng),狀態(tài)區(qū)塊鏈將不再等待sTx(c)的同步,則sTx(c)將不會(huì)被寫(xiě)入狀態(tài)區(qū)塊鏈,即sTx(c)沒(méi)有達(dá)成一致。
雖然本發(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)和修改。