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