本說明書實施例屬于區(qū)塊鏈,尤其涉及一種在區(qū)塊鏈系統(tǒng)中執(zhí)行智能合約的方法及區(qū)塊鏈節(jié)點。
背景技術:
1、區(qū)塊鏈(blockchain)系統(tǒng)是分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式。區(qū)塊鏈系統(tǒng)中按照時間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成鏈式數(shù)據(jù)結(jié)構(gòu),并以密碼學方式保證的不可篡改和不可偽造的分布式賬本。由于區(qū)塊鏈系統(tǒng)具有去中心化、信息不可篡改、自治性等特性,區(qū)塊鏈系統(tǒng)受到人們越來越多的重視和應用。
2、部署在區(qū)塊鏈系統(tǒng)中的智能合約,可能因修復缺陷、改進功能、優(yōu)化業(yè)務實現(xiàn)過程等目標,需要對其進行升級。在升級智能合約時,可能對合約代碼聲明的狀態(tài)變量進行修改,如增加狀態(tài)變量、刪除狀態(tài)變量或修改已有狀態(tài)變量的數(shù)據(jù)結(jié)構(gòu)。其中修改已有狀態(tài)變量的數(shù)據(jù)結(jié)構(gòu),可能導致智能合約的合約狀態(tài)出現(xiàn)不兼容的問題,例如升級后的合約代碼無法有效解碼原有的合約狀態(tài)中被修改的狀態(tài)變量的值,甚至導致錯誤的狀態(tài)數(shù)據(jù)被寫入合約狀態(tài)中。
技術實現(xiàn)思路
1、本發(fā)明的目的在于提供一種在區(qū)塊鏈系統(tǒng)中執(zhí)行智能合約的方法及區(qū)塊鏈節(jié)點。
2、第一方面,提供了一種在區(qū)塊鏈系統(tǒng)中執(zhí)行智能合約的方法,所述智能合約的合約代碼中包括與第一狀態(tài)變量對應的第一結(jié)構(gòu)體的第一版本,以及所述第一狀態(tài)變量涉及的多個子變量各自對應的升級信息,所述升級信息用于指示對應的子變量的修改類型和修改版本,所述修改版本不大于所述第一版本,所述方法通過執(zhí)行所述合約代碼實現(xiàn),所述方法包括:從所述智能合約的合約狀態(tài)中,讀取所述第一狀態(tài)變量的值;對所述第一狀態(tài)變量的值進行解碼操作,其中所述解碼操作包括:從所述第一狀態(tài)變量的值中解碼出第二版本,所述第二版本為編碼得到所述第一狀態(tài)變量的值時,所使用第二結(jié)構(gòu)體的歷史版本,所述第一版本不小于所述第二版本;對于所述多個子變量中的任意子變量,根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作。
3、第二方面,提供了一種區(qū)塊鏈系統(tǒng)中的區(qū)塊鏈節(jié)點,所述區(qū)塊鏈系統(tǒng)中部署有智能合約,所述智能合約的合約代碼中包括與第一狀態(tài)變量對應的第一結(jié)構(gòu)體的第一版本,以及所述第一狀態(tài)變量涉及的多個子變量各自對應的升級信息,所述升級信息用于指示其對應的子變量的修改類型和修改版本,所述修改版本不大于所述第一版本,所述區(qū)塊鏈節(jié)點用于執(zhí)行所述合約代碼,實現(xiàn):從所述智能合約的合約狀態(tài)中,讀取所述第一狀態(tài)變量的值;對所述第一狀態(tài)變量的值進行解碼操作,其中所述解碼操作包括:從所述第一狀態(tài)變量的值中解碼出第二版本,所述第二版本為編碼得到所述第一狀態(tài)變量的值時,所使用第二結(jié)構(gòu)體的歷史版本,所述第一版本不小于所述第二版本;對于所述多個子變量中的任意子變量,根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作。
4、第三方面,提供了一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,當所述計算機程序在計算設備中執(zhí)行時,計算設備執(zhí)行第一方面中所述的方法。
5、本說明書實施例提供的技術方案中,智能合約的合約代碼中包括與第一狀態(tài)變量對應的第一結(jié)構(gòu)體的第一版本,以及第一狀態(tài)變量涉及的多個子變量各自對應的升級信息,升級信息用于指示其對應的子變量的修改類型和修改版本,修改版本不大于第一版本;當執(zhí)行合約代碼的過程中需要對第一狀態(tài)變量的值進行解碼時,可以首先從智能合約的合約狀態(tài)中讀取第一狀態(tài)變量的值,并對第一狀態(tài)變量的值進行解碼操作,其中該解碼操作包括:從第一狀態(tài)變量的值中解碼出第二版本,第二版本為編碼得到第一狀態(tài)變量的值時,所使用第二結(jié)構(gòu)體的歷史版本,第一版本不小于第二版本;對于多個子變量中的任意子變量,根據(jù)子變量對應的升級信息和/或第二版本,對子變量執(zhí)行對應的解碼子操作。如此,當升級智能合約的過程中,通過新的合約代碼修改了智能合約的合約狀態(tài)中已有狀態(tài)變量的數(shù)據(jù)結(jié)構(gòu)時,可以實現(xiàn)在無需跟蹤并更新該智能合約的合約狀態(tài)中已有狀態(tài)變量的值的情況下,確保新的合約代碼能夠?qū)σ延袪顟B(tài)變量的值進行準確解碼。
1.一種在區(qū)塊鏈系統(tǒng)中執(zhí)行智能合約的方法,所述智能合約的合約代碼中包括與第一狀態(tài)變量對應的第一結(jié)構(gòu)體的第一版本,以及所述第一狀態(tài)變量涉及的多個子變量各自對應的升級信息,所述升級信息用于指示其對應的子變量的修改類型和修改版本,所述修改版本不大于所述第一版本,所述方法通過執(zhí)行所述合約代碼實現(xiàn),所述方法包括:
2.根據(jù)權利要求1所述的方法,所述合約代碼中還包括基于所述第一結(jié)構(gòu)體生成的解碼函數(shù),所述解碼操作通過執(zhí)行所述解碼函數(shù)實現(xiàn)。
3.根據(jù)權利要求1所述的方法,所述根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作,包括:
4.根據(jù)權利要求3所述的方法,所述根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作,還包括:當所述第二版本小于所述子變量的修改版本的情況下,在所述第一狀態(tài)變量的解碼結(jié)果中將所述子變量的值設置為預設數(shù)值。
5.根據(jù)權利要求1所述的方法,所述根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作,包括:
6.根據(jù)權利要求5所述的方法,所述方法還包括:當所述第二版本不大于所述子變量的修改版本的情況下,從所述第一狀態(tài)變量的值中解碼出所述子變量的值并舍棄。
7.根據(jù)權利要求1所述的方法,所述根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作,包括:當所述子變量的修改類型指示所述子變量為未進行修改的子變量的情況下,從所述第一狀態(tài)變量的值中解碼出所述子變量的值,并將所述子變量的值加入所述第一狀態(tài)變量的解碼結(jié)果。
8.根據(jù)權利要求1所述的方法,所述方法還包括:
9.根據(jù)權利要求1所述的方法,所述合約代碼通過編譯器對所述智能合約的源代碼進行編譯得到,所述合約源代碼中定義了所述第一結(jié)構(gòu)體以及其對應的結(jié)構(gòu)體注解,所述第一結(jié)構(gòu)體中包括字段注解,所述結(jié)構(gòu)體注解用于指示所述第一結(jié)構(gòu)體的版本為所述第一版本,所述字段注解用于指示所述多個子變量各自對應的升級信息。
10.根據(jù)權利要求1-9中任一項所述的方法,所述第一狀態(tài)變量的值為ssz編碼。
11.一種區(qū)塊鏈系統(tǒng)中的區(qū)塊鏈節(jié)點,所述區(qū)塊鏈系統(tǒng)中部署有智能合約,所述智能合約的合約代碼中包括與第一狀態(tài)變量對應的第一結(jié)構(gòu)體的第一版本,以及所述第一狀態(tài)變量涉及的多個子變量各自對應的升級信息,所述升級信息用于指示其對應的子變量的修改類型和修改版本,所述修改版本不大于所述第一版本,所述區(qū)塊鏈節(jié)點用于執(zhí)行所述合約代碼,實現(xiàn):從所述智能合約的合約狀態(tài)中,讀取所述第一狀態(tài)變量的值;對所述第一狀態(tài)變量的值進行解碼操作,其中所述解碼操作包括:從所述第一狀態(tài)變量的值中解碼出第二版本,所述第二版本為編碼得到所述第一狀態(tài)變量的值時,所使用第二結(jié)構(gòu)體的歷史版本,所述第一版本不小于所述第二版本;對于所述多個子變量中的任意子變量,根據(jù)所述子變量對應的升級信息和/或所述第二版本,對所述子變量執(zhí)行對應的解碼子操作。
12.一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,當所述計算機程序在計算設備中執(zhí)行時,計算設備執(zhí)行權利要求1-10中任一項所述的方法。