本發(fā)明涉及區(qū)塊鏈技術領域,尤其涉及一種區(qū)塊鏈狀態(tài)的同步方法及裝置。
背景技術:
目前大部分的區(qū)塊鏈節(jié)點的數據存儲,都是存儲自創(chuàng)世塊開始的全量區(qū)塊,同時存儲一份最新的區(qū)塊鏈狀態(tài),以此執(zhí)行交易、進行區(qū)塊鏈狀態(tài)同步及區(qū)塊鏈共識。當全新節(jié)點加入區(qū)塊鏈網絡時,會執(zhí)行區(qū)塊鏈狀態(tài)同步,以同步除創(chuàng)世塊以外的所有區(qū)塊,使自身狀態(tài)與區(qū)塊鏈網絡內各節(jié)點的狀態(tài)一致。由于區(qū)塊鏈節(jié)點存儲數據時,全量區(qū)塊均存在關聯,因此區(qū)塊鏈狀態(tài)同步需要按順序依次執(zhí)行各個區(qū)塊中的交易,才可構建完整的狀態(tài),缺少了任一區(qū)塊,狀態(tài)即無法同步。
這種情況下,會導致容量過大的問題,即區(qū)塊鏈節(jié)點無法丟棄任何區(qū)塊,區(qū)塊鏈節(jié)點存儲的區(qū)塊數量將隨著時間無限增長,導致存儲空間占用過大,由于節(jié)點的存儲空間是有限的,且按區(qū)塊鏈網絡的設計,區(qū)塊鏈節(jié)點存儲空間無法水平擴容,在存儲空間到達上限時,該區(qū)塊鏈節(jié)點就無法使用,導致使用壽命較短。
技術實現要素:
本發(fā)明的主要目的在于提出一種區(qū)塊鏈狀態(tài)的同步方法及裝置,旨在解決現有的區(qū)塊鏈狀態(tài)的同步方式,占用存儲空間過大,導致區(qū)塊鏈節(jié)點使用壽命較短的技術問題。
為實現上述目的,本發(fā)明提供的一種區(qū)塊鏈狀態(tài)的同步方法,應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步方法包括:
在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;
將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;
在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
優(yōu)選地,所述對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊的步驟之前,所述方法還包括:
確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量;
將所述區(qū)塊鏈狀態(tài)總容量與所述區(qū)塊總容量進行比對;
在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,暫停區(qū)塊鏈網絡的記賬功能。
優(yōu)選地,所述在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求的步驟之后,所述方法還包括:
統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量;
在統(tǒng)計的節(jié)點數量達到預設閾值時,將各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。
優(yōu)選地,所述統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量的步驟之后,所述方法還包括:
在統(tǒng)計的節(jié)點數量小于所述預設閾值時,通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。
優(yōu)選地,所述在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊的步驟之后,所述方法還包括:
在區(qū)塊鏈網絡中的各個節(jié)點中,根據預設的策略刪除除狀態(tài)區(qū)塊以外的各個區(qū)塊。
此外,為實現上述目的,本發(fā)明還提出一種區(qū)塊鏈狀態(tài)的同步方法,應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步方法包括:
區(qū)塊鏈網絡中的第二節(jié)點向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求;
所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據;
存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
優(yōu)選地,所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊的步驟包括:
所述第二節(jié)點確定當前區(qū)塊高度與所述第一節(jié)點的狀態(tài)區(qū)塊高度;
在當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊;
在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,并從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊。
優(yōu)選地,在所述第二節(jié)點存儲有區(qū)塊時,所述存儲獲取的所述狀態(tài)區(qū)塊的步驟包括:
將獲取的所述狀態(tài)區(qū)塊接入所述第二節(jié)點的區(qū)塊鏈中,以存儲所述狀態(tài)區(qū)塊;
所述存儲獲取的所述狀態(tài)區(qū)塊的步驟之后,所述方法還包括:
刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪。
此外,為實現上述目的,本發(fā)明還提出一種區(qū)塊鏈狀態(tài)的同步裝置,應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步裝置包括:
處理模塊,用于在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;
匯總模塊,用于將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;
響應模塊,用于在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
優(yōu)選地,所述裝置還包括:
確定模塊,用于確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量;
比對模塊,用于將所述區(qū)塊鏈狀態(tài)總容量與所述區(qū)塊總容量進行比對;
暫停模塊,用于在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,暫停區(qū)塊鏈網絡的記賬功能。
優(yōu)選地,所述裝置還包括:
統(tǒng)計模塊,用于統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量;
開啟模塊,用于在統(tǒng)計的節(jié)點數量達到預設閾值時,將各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。
優(yōu)選地,所述裝置還包括:
撤銷模塊,用于在統(tǒng)計的節(jié)點數量小于所述預設閾值時,通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。
優(yōu)選地,所述裝置還包括:
刪除模塊,用于在區(qū)塊鏈網絡中的各個節(jié)點中,根據預設的策略刪除除狀態(tài)區(qū)塊以外的各個區(qū)塊。
此外,為實現上述目的,本發(fā)明還提出一種區(qū)塊鏈狀態(tài)的同步裝置,應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步裝置包括:
廣播模塊,用于向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求;
獲取模塊,用于從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據;
存儲模塊,用于存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
優(yōu)選地,所述獲取模塊包括:
確定單元,用于確定當前區(qū)塊高度與所述第一節(jié)點的狀態(tài)區(qū)塊高度;
獲取單元,用于在當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊;
同步單元,用于在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,并從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊。
優(yōu)選地,在所述第二節(jié)點存儲有區(qū)塊時,所述存儲模塊,還用于將獲取的所述狀態(tài)區(qū)塊接入所述第二節(jié)點的區(qū)塊鏈中,以存儲所述狀態(tài)區(qū)塊;
所述裝置還包括:裁剪模塊,用于刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪。
本發(fā)明提出的區(qū)塊鏈狀態(tài)的同步方法及裝置,先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊,然后將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,后續(xù)在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。本方案中,由于狀態(tài)區(qū)塊存儲有最新區(qū)塊鏈狀態(tài)數據,因此區(qū)塊鏈網絡中的其它節(jié)點只要同步并存儲狀態(tài)區(qū)塊即可,無須再同步其它各個區(qū)塊,使得區(qū)塊鏈節(jié)點中占用的存儲空間減小,從而延長了區(qū)塊鏈節(jié)點的使用壽命。
附圖說明
圖1為本發(fā)明區(qū)塊鏈狀態(tài)的同步方法第一實施例的流程示意圖;
圖2為本發(fā)明區(qū)塊鏈狀態(tài)的同步方法第二實施例的流程示意圖;
圖3為圖2中步驟s50的細化流程示意圖;
圖4為本發(fā)明區(qū)塊鏈狀態(tài)的同步裝置第一實施例的功能模塊示意圖;
圖5為本發(fā)明區(qū)塊鏈狀態(tài)的同步裝置第二實施例的功能模塊示意圖;
圖6為圖5中獲取模塊50的細化功能模塊示意圖;
圖7為本發(fā)明區(qū)塊鏈網絡各個節(jié)點的示意圖。
本發(fā)明目的的實現、功能特點及優(yōu)點將結合實施例,參照附圖做進一步說明。
具體實施方式
應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明實施例的解決方案主要是:先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊,然后將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,后續(xù)在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。以解決現有的區(qū)塊鏈狀態(tài)的同步方式,占用存儲空間過大,導致區(qū)塊鏈節(jié)點使用壽命較短的問題。
本發(fā)明中涉及的專業(yè)術語包括:
區(qū)塊鏈:即去中心化的分布式賬本數據庫。區(qū)塊鏈本身其實是一串使用密碼學算法所產生的數據塊,每一個數據塊中包含了多次區(qū)塊鏈網絡交易有效確認的信息。區(qū)塊鏈技術起源于比特幣的應用,是一種成熟技術,并非本文闡述的發(fā)明內容,本文闡述的是將區(qū)塊鏈技術用于金融領域的資產交易業(yè)務。
p2p(peertopeer)對等網絡:中心化網絡中,交易各方通過一個中心節(jié)點代理和中轉數據通信。p2p對等網絡中,節(jié)點之間可以互相直接通信,構成一個對等的網狀結構,減少了中心網絡的開銷;一個節(jié)點產生的數據,可以同時向多個節(jié)點發(fā)送廣播,也可以向其他任意節(jié)點查詢和獲取數據。
節(jié)點:指參與到區(qū)塊鏈網絡里,進行交易和數據交換的網絡節(jié)點,每個獨立機構可以擁有一個到多個交易節(jié)點,每個交易節(jié)點是一組物理網絡,計算機,區(qū)塊鏈應用軟件以及數據庫的組合。節(jié)點和節(jié)點之間,通過tcp(transmissioncontrolprotocol,傳輸控制協議)/ip(internetprotocol,網際協議)協議互相連接。
區(qū)塊鏈狀態(tài):定義創(chuàng)世塊的區(qū)塊序號(下稱序號)為0,區(qū)塊n的序號為n,定義狀態(tài)n為從序號0區(qū)塊執(zhí)行到序號n區(qū)塊的結果狀態(tài),則有:
狀態(tài)0=f(
狀態(tài)1=f(狀態(tài)0,區(qū)塊1)
狀態(tài)n=f(狀態(tài)n-1,區(qū)塊n)
區(qū)塊鏈狀態(tài)同步:一個p2p對等網絡,網絡中所有的節(jié)點均持有相同的創(chuàng)世塊,p2p對等網絡各節(jié)點中最大的區(qū)塊鏈狀態(tài)為狀態(tài)n,定義p2p對等網絡中某個持有狀態(tài)m(m<n)的節(jié)點從p2p對等網絡的其它節(jié)點同步區(qū)塊,使自身從狀態(tài)m變遷為狀態(tài)n的過程為區(qū)塊鏈狀態(tài)同步。
區(qū)塊鏈共識:一個可以進行區(qū)塊鏈狀態(tài)同步的p2p對等網絡,p2p對等網絡各節(jié)點中最大的區(qū)塊鏈狀態(tài)為狀態(tài)n,定義p2p對等網絡上各交易節(jié)點,使用共同的算法,對區(qū)塊n+1進行確認,并使p2p對等網絡中某個節(jié)點由狀態(tài)n變遷為狀態(tài)n+1的過程為區(qū)塊鏈共識。
定義上文中,各交易節(jié)點,使用共同的算法,對區(qū)塊n+1進行確認的算法和機制,為區(qū)塊鏈共識機制。
區(qū)塊鏈網絡:一個可以進行區(qū)塊鏈狀態(tài)同步和區(qū)塊鏈共識的p2p對等網絡,定義一個過程:網絡中各節(jié)點中持有的最大區(qū)塊鏈狀態(tài)為狀態(tài)n,使p2p對等網絡中某個節(jié)點通過區(qū)塊鏈共識由狀態(tài)n變遷為狀態(tài)n+1,p2p對等網絡的其它節(jié)點通過區(qū)塊鏈狀態(tài)同步,最終p2p對等網絡的部分節(jié)點均達到狀態(tài)n+1;重復上述過程,不斷更新網絡內節(jié)點之最大區(qū)塊鏈狀態(tài)的網絡,定義為區(qū)塊鏈網絡。
本發(fā)明提供一種區(qū)塊鏈狀態(tài)的同步方法。
參照圖1,圖1為本發(fā)明區(qū)塊鏈狀態(tài)的同步方法第一實施例的流程示意圖。
在本實施例中,所述區(qū)塊鏈狀態(tài)的同步方法應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步方法包括:
在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,所述區(qū)塊鏈網絡中的節(jié)點是以p2p對等網絡的形式進行通信的,即一個節(jié)點產生的數據,可以同時向多個節(jié)點發(fā)送廣播,也可以向其它任意節(jié)點查詢和獲取數據,具體可參照圖7。
需要說明的是,本實施例中的第一節(jié)點不限于一個節(jié)點,也可以是多個節(jié)點,只要是區(qū)塊高度符合預設條件的節(jié)點即可,所述預設條件在下文詳述。同理,第二節(jié)點也不限于一個節(jié)點,可以是多個節(jié)點,只要是需要進行區(qū)塊鏈狀態(tài)同步的節(jié)點即可。
以下是本實施例中逐步實現區(qū)塊鏈狀態(tài)同步的具體步驟:
步驟s10,在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;
在本實施例中,先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,所述預設條件優(yōu)選為高度最高,并且所述第一節(jié)點是共識節(jié)點,因此,在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,相當于是先在區(qū)塊鏈網絡中選定區(qū)塊高度最高的共識節(jié)點,將選定的節(jié)點作為第一節(jié)點。在選定第一節(jié)點之后,對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊。本實施例中,創(chuàng)建狀態(tài)區(qū)塊,可以是在當前最高區(qū)塊的基礎上加多一級,例如當前最高區(qū)塊為n,則創(chuàng)建的狀態(tài)區(qū)塊就為n+1。
在本實施例中,在選定區(qū)塊高度符合預設條件的第一節(jié)點之后,且所述“對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊”的步驟之前,所述方法還包括:
步驟a,確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量;
步驟b,將所述區(qū)塊鏈狀態(tài)總容量與所述區(qū)塊總容量進行比對;
步驟c,在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,暫停區(qū)塊鏈網絡的記賬功能。
即,本實施例中,在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點之后,確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量,然后獲取該區(qū)塊鏈狀態(tài)總容量,以及所有區(qū)塊(自創(chuàng)世塊到當前區(qū)塊)的總容量,再比較兩者大小,若區(qū)塊鏈狀態(tài)總容量小于區(qū)塊總容量的預設比例,如30%,則認為第一節(jié)點需要執(zhí)行區(qū)塊鏈數據裁剪操作,并且可以進行區(qū)塊鏈狀態(tài)同步以使各個節(jié)點同步有狀態(tài)區(qū)塊。需要注意的是,由于后續(xù)要進行區(qū)塊鏈狀態(tài)的同步,若是不暫停區(qū)塊鏈網絡中各個節(jié)點的記賬功能,后續(xù)生成的狀態(tài)區(qū)塊會覆蓋以往所有區(qū)塊,因此在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,必須先暫停當前區(qū)塊鏈網絡的記賬,避免新生成區(qū)塊的信息被狀態(tài)區(qū)塊覆蓋。其中,在基于有限節(jié)點共識機制的區(qū)塊鏈網絡中,可以同時暫停所有共識節(jié)點的記賬,進行區(qū)塊鏈數據裁剪,因此本實施例中,優(yōu)選暫停的是共識節(jié)點的記賬功能。
步驟s20,將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;
在對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊之后,再將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,其中,所述最新區(qū)塊鏈狀態(tài)數據是指第一節(jié)點中各個區(qū)塊的狀態(tài)數據,如賬戶余額信息、合約余額信息、智能合約的代碼數據、智能合約的局部變量數據等等。
應當理解,本實施例將各個區(qū)塊的狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,那么該狀態(tài)區(qū)塊就包含了第一節(jié)點從創(chuàng)世塊開始到此區(qū)塊所有的狀態(tài)數據,通過此區(qū)塊可構建本地的區(qū)塊鏈狀態(tài),后續(xù)就可正常執(zhí)行區(qū)塊鏈的交易、狀態(tài)同步和共識。
進一步地,所述“將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中”的步驟之后,所述方法還包括:
步驟d,對所述第一節(jié)點中的狀態(tài)區(qū)塊進行哈希值計算,以進行狀態(tài)區(qū)塊網絡傳輸的校驗;
步驟e,在網絡傳輸校驗正常時,采用預設的壓縮算法對所述狀態(tài)區(qū)塊的數據進行壓縮,以便后續(xù)將壓縮后的狀態(tài)區(qū)塊同步至其它節(jié)點。
本實施例中,所述壓縮算法包括但不限于gzip(gnuzip的縮寫,是一個gnu自由軟件的文件壓縮程序)算法。
步驟s30,在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,在狀態(tài)區(qū)塊建立完成并匯總完狀態(tài)數據之后,所述第一節(jié)點可將所述狀態(tài)區(qū)塊發(fā)送給另一個區(qū)塊鏈節(jié)點,使另一個區(qū)塊鏈的狀態(tài)與該第一節(jié)點一致,具體地:所述第一節(jié)點監(jiān)聽區(qū)塊鏈網絡中其它各個節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求,本實施例中為了方便理解,用第二節(jié)點來表示其它節(jié)點,在監(jiān)聽到第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,所述第一節(jié)點回復一個響應信息,然后第二節(jié)點根據響應信息,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
本實施例中,由于第一節(jié)點和第二節(jié)點都可以包括多個節(jié)點,因此第二節(jié)點廣播信息時,可以向任一節(jié)點進行廣播,第一節(jié)點回復響應信息時,可以向最先監(jiān)聽到廣播的第二節(jié)點進行回復,同理第二節(jié)點需要獲取狀態(tài)區(qū)塊時,可以從最先響應的第一節(jié)點中獲取,以保持區(qū)塊鏈狀態(tài)同步的高效。此外,各個節(jié)點在進行狀態(tài)區(qū)塊同步時,會附上記賬者的簽名,保證狀態(tài)區(qū)塊同步的安全性。
進一步地,所述步驟s30之后,所述方法還包括:
步驟f,統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量;
步驟g,在統(tǒng)計的節(jié)點數量達到預設閾值時,將各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。
步驟h,在統(tǒng)計的節(jié)點數量小于預設閾值時,通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。
即,在本實施例中,在第二節(jié)點從第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步之后,再統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量,然后將統(tǒng)計的節(jié)點數量與預設閾值進行比對,本實施例中,所述預設閾值根據實際情況進行設置,此處不做限定。
在統(tǒng)計的節(jié)點數量達到預設閾值時,說明當前區(qū)塊鏈網絡符合區(qū)塊鏈共識的要求,那么將包含狀態(tài)區(qū)塊的各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。也就是說,在符合區(qū)塊鏈共識的要求的情況下,根據包含狀態(tài)區(qū)塊的節(jié)點進行區(qū)塊鏈網絡的共識,以使區(qū)塊鏈網絡中其它所有節(jié)點都同步有狀態(tài)區(qū)塊。
在統(tǒng)計的節(jié)點數量未達到預設閾值時,說明當前區(qū)塊鏈網絡不符合區(qū)塊鏈共識的要求,那么此時通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。即,撤銷之前的狀態(tài)區(qū)塊操作,以重新進行狀態(tài)區(qū)塊的同步。
進一步地,所述步驟s30之后,所述方法還包括:
步驟i,在區(qū)塊鏈網絡中的各個節(jié)點中,根據預設的策略刪除除狀態(tài)區(qū)塊以外的各個區(qū)塊。
即區(qū)塊鏈網絡中的各個節(jié)點開始記賬后,區(qū)塊鏈節(jié)點可按自身的策略,刪除狀態(tài)區(qū)塊以前的舊區(qū)塊,以達到節(jié)約存儲空間的目的,其中,所述策略事先根據實際情況進行設置,此處不做限定。
可以理解,與同步歷史所有區(qū)塊的方法相比,本實施例所采用的方法,使用狀態(tài)區(qū)塊進行區(qū)塊鏈狀態(tài)同步和區(qū)塊鏈存儲,無需同步全量區(qū)塊,并且,之前的各個區(qū)塊也可刪除,最終實現區(qū)塊鏈裁剪,在適合的場景中,能節(jié)省區(qū)塊鏈節(jié)點的存儲容量和網絡帶寬,從而節(jié)省空間。。
此外,現有的區(qū)塊同步方式,當區(qū)塊鏈網絡中有新節(jié)點加入時,需要從創(chuàng)世塊開始執(zhí)行區(qū)塊鏈狀態(tài)同步,同步除創(chuàng)世塊以外的所有區(qū)塊,通過執(zhí)行各個區(qū)塊的交易,將自身狀態(tài)變遷到最新,此期間無法處理任何交易。執(zhí)行過程中的開銷主要來自:重新執(zhí)行交易邏輯的開銷、重新計算前綴樹的開銷,數據寫入磁盤的開銷,因此,還會導致效率較低。針對這種缺點,本發(fā)明所采用的方案,區(qū)塊鏈節(jié)點可直接套用狀態(tài),無需從創(chuàng)世塊開始重新計算所有交易,減少了計算資源消耗,避免了這種情況的發(fā)生,會提高同步的效率。
本實施例提出的區(qū)塊鏈狀態(tài)的同步方法,先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊,然后將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,后續(xù)在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。本方案中,由于狀態(tài)區(qū)塊存儲有最新區(qū)塊鏈狀態(tài)數據,因此區(qū)塊鏈網絡中的其它節(jié)點只要同步并存儲狀態(tài)區(qū)塊即可,無須再同步其它各個區(qū)塊,使得區(qū)塊鏈節(jié)點中占用的存儲空間減小,從而延長了區(qū)塊鏈節(jié)點的使用壽命。
本發(fā)明進一步提供一種區(qū)塊鏈狀態(tài)的同步方法。
參照圖2,圖2為本發(fā)明區(qū)塊鏈狀態(tài)的同步方法第二實施例的流程示意圖。
在本實施例中,所述區(qū)塊鏈狀態(tài)的同步方法應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步方法包括:
區(qū)塊鏈網絡中的第二節(jié)點向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求;所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據;存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
以下是本實施例中逐步實現區(qū)塊鏈狀態(tài)同步的具體步驟:
步驟s40,區(qū)塊鏈網絡中的第二節(jié)點向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求;
步驟s50,所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據;
在本實施例中,所述第二節(jié)點可以是區(qū)塊鏈網絡中已存儲有區(qū)塊的節(jié)點,也可以是剛加入區(qū)塊鏈網絡的新節(jié)點,若是新節(jié)點,新節(jié)點未存儲有區(qū)塊。具體地,參照圖3,所述步驟s50包括:
步驟s51,所述第二節(jié)點確定當前區(qū)塊高度與所述第一節(jié)點的狀態(tài)區(qū)塊高度;
步驟s52,在當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊;
步驟s53,在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,并從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊。
即,第二節(jié)點先確定當前區(qū)塊高度與狀態(tài)區(qū)塊高度,若當前區(qū)塊高度與狀態(tài)區(qū)塊高度都為n,則接收狀態(tài)區(qū)塊,并使用狀態(tài)區(qū)塊構建新的區(qū)塊鏈狀態(tài),然后將新的區(qū)塊鏈狀態(tài)與本地的區(qū)塊鏈狀態(tài)進行對比,若兩個狀態(tài)相等,則接收狀態(tài)區(qū)塊并納入本地區(qū)塊鏈,若狀態(tài)不相等,需要人工介入,進行損失和處理的評估。
此時,如果接收狀態(tài)區(qū)塊的節(jié)點當前區(qū)塊高度小于n,則先同步本地高度至高度n這兩者之間的區(qū)塊,執(zhí)行交易并使本地區(qū)塊鏈狀態(tài)到達高度為n的狀態(tài),再接收狀態(tài)區(qū)塊n,并使用狀態(tài)區(qū)塊構建新的區(qū)塊鏈狀態(tài),將新的區(qū)塊鏈狀態(tài)與本地區(qū)塊鏈狀態(tài)進行對比,若兩個狀態(tài)相等,則接收狀態(tài)區(qū)塊并納入本地區(qū)塊鏈,若狀態(tài)不相等,需要人工介入,進行損失和處理的評估。
需要說明的是,本實施例中,在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,然后再從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,相當于是第二節(jié)點先進行區(qū)塊的同步,然后從第一節(jié)點中獲取狀態(tài)區(qū)塊時,可以對獲取的狀態(tài)區(qū)塊進行驗證,從而提高區(qū)塊同步的準確性。在其它實施例中,在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,第二節(jié)點也可直接從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊的同步,但是就無法對獲取的狀態(tài)區(qū)塊進行驗證。因此本實施例中,在第二節(jié)點的當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,即可對獲取的狀態(tài)區(qū)塊進行驗證。
步驟s60,存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,若第二節(jié)點未存儲有區(qū)塊,則可直接存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在所述第二節(jié)點存儲有區(qū)塊時,所述步驟s60包括:
將獲取的所述狀態(tài)區(qū)塊接入所述第二節(jié)點的區(qū)塊鏈中,以存儲所述狀態(tài)區(qū)塊;
所述步驟s60之后,所述方法還包括:
刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪。
即,在所述第二節(jié)點存儲有區(qū)塊時,此時,由于狀態(tài)區(qū)塊已經存儲有區(qū)塊鏈最新區(qū)塊鏈狀態(tài),此時,可直接刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪,從而增加區(qū)塊鏈節(jié)點的存儲空間。
本實施例提出的區(qū)塊鏈狀態(tài)的同步方法,區(qū)塊鏈網絡中的第二節(jié)點先向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求,再從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據,最終存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。本方案中,由于狀態(tài)區(qū)塊存儲有最新區(qū)塊鏈狀態(tài)數據,因此區(qū)塊鏈網絡中的其它節(jié)點只要同步并存儲狀態(tài)區(qū)塊即可,無須再同步各個區(qū)塊,使得區(qū)塊鏈節(jié)點中占用的存儲空間減小,從而延長了區(qū)塊鏈節(jié)點的使用壽命。
本發(fā)明提供一種區(qū)塊鏈狀態(tài)的同步裝置。
參照圖4,圖4為本發(fā)明區(qū)塊鏈狀態(tài)的同步裝置第一實施例的功能模塊示意圖。
需要強調的是,對本領域的技術人員來說,圖4所示功能模塊圖僅僅是一個較佳實施例的示例圖,本領域的技術人員圍繞圖4所示的區(qū)塊鏈狀態(tài)的同步裝置的功能模塊,可輕易進行新的功能模塊的補充;各功能模塊的名稱是自定義名稱,僅用于輔助理解該區(qū)塊鏈狀態(tài)的同步裝置的各個程序功能塊,不用于限定本發(fā)明的技術方案,本發(fā)明技術方案的核心是,各自定義名稱的功能模塊所要達成的功能。
在本實施例中,所述區(qū)塊鏈狀態(tài)的同步方法應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步裝置包括:
處理模塊10,用于在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;
匯總模塊20,用于將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;
響應模塊30,用于在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,所述區(qū)塊鏈網絡中的節(jié)點是以p2p對等網絡的形式進行通信的,即一個節(jié)點產生的數據,可以同時向多個節(jié)點發(fā)送廣播,也可以向其它任意節(jié)點查詢和獲取數據,具體可參照圖7。
需要說明的是,本實施例中的第一節(jié)點不限于一個節(jié)點,也可以是多個節(jié)點,只要是區(qū)塊高度符合預設條件的節(jié)點即可,所述預設條件在下文詳述。同理,第二節(jié)點也不限于一個節(jié)點,可以是多個節(jié)點,只要是需要進行區(qū)塊鏈狀態(tài)同步的節(jié)點即可。
以下是本實施例中逐步實現區(qū)塊鏈狀態(tài)同步的各個模塊具體功能:
其中,處理模塊10,用于在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊;
在本實施例中,處理模塊10先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,所述預設條件優(yōu)選為高度最高,并且所述第一節(jié)點是共識節(jié)點,因此,在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,相當于是先在區(qū)塊鏈網絡中選定區(qū)塊高度最高的共識節(jié)點,將選定的節(jié)點作為第一節(jié)點。在選定第一節(jié)點之后,對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊。本實施例中,創(chuàng)建狀態(tài)區(qū)塊,可以是在當前最高區(qū)塊的基礎上加多一級,例如當前最高區(qū)塊為n,則創(chuàng)建的狀態(tài)區(qū)塊就為n+1。
在本實施例中,所述裝置還包括:
確定模塊,用于確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量;
比對模塊,用于將所述區(qū)塊鏈狀態(tài)總容量與所述區(qū)塊總容量進行比對;
暫停模塊,用于在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,暫停區(qū)塊鏈網絡的記賬功能。
即,本實施例中,在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點之后,確定模塊確定區(qū)塊鏈網絡中所選定的第一節(jié)點當前的區(qū)塊鏈狀態(tài)總容量,以及所述第一節(jié)點中所有區(qū)塊的區(qū)塊總容量,然后獲取該區(qū)塊鏈狀態(tài)總容量,以及所有區(qū)塊(自創(chuàng)世塊到當前區(qū)塊)的總容量,比對模塊再比較兩者大小,若區(qū)塊鏈狀態(tài)總容量小于區(qū)塊總容量的預設比例,如30%,則認為第一節(jié)點需要執(zhí)行區(qū)塊鏈數據裁剪操作,并且可以進行區(qū)塊鏈狀態(tài)同步以使各個節(jié)點同步有狀態(tài)區(qū)塊。需要注意的是,由于后續(xù)要進行區(qū)塊鏈狀態(tài)的同步,若是不暫停區(qū)塊鏈網絡中各個節(jié)點的記賬功能,后續(xù)生成的狀態(tài)區(qū)塊會覆蓋以往所有區(qū)塊,因此在所述區(qū)塊鏈狀態(tài)總容量小于所述區(qū)塊總容量的預設比例時,暫停模塊先暫停當前區(qū)塊鏈網絡的記賬,避免新生成區(qū)塊的信息被狀態(tài)區(qū)塊覆蓋。其中,在基于有限節(jié)點共識機制的區(qū)塊鏈網絡中,可以同時暫停所有共識節(jié)點的記賬,進行區(qū)塊鏈數據裁剪,因此本實施例中,優(yōu)選暫停的是共識節(jié)點的記賬功能。
其中,匯總模塊20,用于將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中;
在對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊之后,匯總模塊20再將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,其中,所述最新區(qū)塊鏈狀態(tài)數據是指第一節(jié)點中各個區(qū)塊的狀態(tài)數據,如賬戶余額信息、合約余額信息、智能合約的代碼數據、智能合約的局部變量數據等等。
應當理解,本實施例將各個區(qū)塊的狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,那么該狀態(tài)區(qū)塊就包含了第一節(jié)點從創(chuàng)世塊開始到此區(qū)塊所有的狀態(tài)數據,通過此區(qū)塊可構建本地的區(qū)塊鏈狀態(tài),后續(xù)就可正常執(zhí)行區(qū)塊鏈的交易、狀態(tài)同步和共識。
進一步地,所述匯總模塊20“將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中”之后,所述裝置還包括:
校驗模塊,用于對所述第一節(jié)點中的狀態(tài)區(qū)塊進行哈希值計算,以進行狀態(tài)區(qū)塊網絡傳輸的校驗;
壓縮模塊,用于在網絡傳輸校驗正常時,采用預設的壓縮算法對所述狀態(tài)區(qū)塊的數據進行壓縮,以便后續(xù)將壓縮后的狀態(tài)區(qū)塊同步至其它節(jié)點。
本實施例中,所述壓縮算法包括但不限于gzip(gnuzip的縮寫,是一個gnu自由軟件的文件壓縮程序)算法。
其中,響應模塊30,用于在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,在狀態(tài)區(qū)塊建立完成并匯總完狀態(tài)數據之后,響應模塊30可將所述狀態(tài)區(qū)塊發(fā)送給另一個區(qū)塊鏈節(jié)點,使另一個區(qū)塊鏈的狀態(tài)與該第一節(jié)點一致,具體地:所述第一節(jié)點監(jiān)聽區(qū)塊鏈網絡中其它各個節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求,本實施例中為了方便理解,用第二節(jié)點來表示其它節(jié)點,在監(jiān)聽到第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,所述第一節(jié)點回復一個響應信息,然后第二節(jié)點根據響應信息,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
本實施例中,由于第一節(jié)點和第二節(jié)點都可以包括多個節(jié)點,因此第二節(jié)點廣播信息時,可以向任一節(jié)點進行廣播,第一節(jié)點回復響應信息時,可以向最先監(jiān)聽到廣播的第二節(jié)點進行回復,同理第二節(jié)點需要獲取狀態(tài)區(qū)塊時,可以從最先響應的第一節(jié)點中獲取,以保持區(qū)塊鏈狀態(tài)同步的高效。此外,各個節(jié)點在進行狀態(tài)區(qū)塊同步時,會附上記賬者的簽名,保證狀態(tài)區(qū)塊同步的安全性。
進一步地,所述裝置還包括:
統(tǒng)計模塊,用于統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量;
開啟模塊,用于在統(tǒng)計的節(jié)點數量達到預設閾值時,將各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。
撤銷模塊,用于在統(tǒng)計的節(jié)點數量小于預設閾值時,通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。
即,在本實施例中,在第二節(jié)點從第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步之后,統(tǒng)計模塊再統(tǒng)計區(qū)塊鏈網絡中包含狀態(tài)區(qū)塊的節(jié)點數量,然后將統(tǒng)計的節(jié)點數量與預設閾值進行比對,本實施例中,所述預設閾值根據實際情況進行設置,此處不做限定。
在統(tǒng)計的節(jié)點數量達到預設閾值時,說明當前區(qū)塊鏈網絡符合區(qū)塊鏈共識的要求,那么開啟模塊將包含狀態(tài)區(qū)塊的各個節(jié)點中的狀態(tài)區(qū)塊作為創(chuàng)世塊,并開啟記賬功能。也就是說,在符合區(qū)塊鏈共識的要求的情況下,根據包含狀態(tài)區(qū)塊的節(jié)點進行區(qū)塊鏈網絡的共識,以使區(qū)塊鏈網絡中其它所有節(jié)點都同步有狀態(tài)區(qū)塊。
在統(tǒng)計的節(jié)點數量未達到預設閾值時,說明當前區(qū)塊鏈網絡不符合區(qū)塊鏈共識的要求,那么此時撤銷模塊通過第一節(jié)點廣播撤銷信息,以撤銷各個節(jié)點同步狀態(tài)區(qū)塊的操作,并將各個節(jié)點恢復為原來的區(qū)塊高度,以重新進行記賬。即,撤銷之前的狀態(tài)區(qū)塊操作,以重新進行狀態(tài)區(qū)塊的同步。
進一步地,所述裝置還包括:
刪除模塊,用于在區(qū)塊鏈網絡中的各個節(jié)點中,根據預設的策略刪除除狀態(tài)區(qū)塊以外的各個區(qū)塊。
即區(qū)塊鏈網絡中的各個節(jié)點開始記賬后,區(qū)塊鏈節(jié)點可按自身的策略,刪除狀態(tài)區(qū)塊以前的舊區(qū)塊,以達到節(jié)約存儲空間的目的,其中,所述策略事先根據實際情況進行設置,此處不做限定。
可以理解,與同步歷史所有區(qū)塊的方法相比,本實施例所采用的方法,使用狀態(tài)區(qū)塊進行區(qū)塊鏈狀態(tài)同步和區(qū)塊鏈存儲,無需同步全量區(qū)塊,并且,之前的各個區(qū)塊也可刪除,最終實現區(qū)塊鏈裁剪,在適合的場景中,能節(jié)省區(qū)塊鏈節(jié)點的存儲容量和網絡帶寬,從而節(jié)省空間。
此外,現有的區(qū)塊同步方式,當區(qū)塊鏈網絡中有新節(jié)點加入時,需要從創(chuàng)世塊開始執(zhí)行區(qū)塊鏈狀態(tài)同步,同步除創(chuàng)世塊以外的所有區(qū)塊,通過執(zhí)行各個區(qū)塊的交易,將自身狀態(tài)變遷到最新,此期間無法處理任何交易。執(zhí)行過程中的開銷主要來自:重新執(zhí)行交易邏輯的開銷、重新計算前綴樹的開銷,數據寫入磁盤的開銷,因此,還會導致效率較低。針對這種缺點,本發(fā)明所采用的方案,區(qū)塊鏈節(jié)點可直接套用狀態(tài),無需從創(chuàng)世塊開始重新計算所有交易,減少了計算資源消耗,避免了這種情況的發(fā)生,會提高同步的效率。
本實施例提出的區(qū)塊鏈狀態(tài)的同步裝置,先在區(qū)塊鏈網絡中選定區(qū)塊高度符合預設條件的第一節(jié)點,并對選定的第一節(jié)點創(chuàng)建狀態(tài)區(qū)塊,然后將所述第一節(jié)點中的最新區(qū)塊鏈狀態(tài)數據匯總到所述狀態(tài)區(qū)塊中,后續(xù)在監(jiān)聽到所述區(qū)塊鏈網絡中第二節(jié)點廣播的區(qū)塊鏈狀態(tài)的同步請求時,響應所述區(qū)塊鏈狀態(tài)的同步請求,以供所述第二節(jié)點從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。本方案中,由于狀態(tài)區(qū)塊存儲有最新區(qū)塊鏈狀態(tài)數據,因此區(qū)塊鏈網絡中的其它節(jié)點只要同步并存儲狀態(tài)區(qū)塊即可,無須再同步其它各個區(qū)塊,使得區(qū)塊鏈節(jié)點中占用的存儲空間減小,從而延長了區(qū)塊鏈節(jié)點的使用壽命。
本發(fā)明進一步提供一種區(qū)塊鏈狀態(tài)的同步裝置。
參照圖5,圖5為本發(fā)明區(qū)塊鏈狀態(tài)的同步裝置第二實施例的功能模塊示意圖。
在本實施例中,所述區(qū)塊鏈狀態(tài)的同步裝置,應用于區(qū)塊鏈網絡中,所述區(qū)塊鏈網絡包括多個節(jié)點,所述區(qū)塊鏈狀態(tài)的同步裝置包括:
廣播模塊40,用于向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求;
獲取模塊50,用于從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據;
存儲模塊60,用于存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在本實施例中,所述第二節(jié)點可以是區(qū)塊鏈網絡中已存儲有區(qū)塊的節(jié)點,也可以是剛加入區(qū)塊鏈網絡的新節(jié)點,新節(jié)點未存儲有區(qū)塊。
在所述第二節(jié)點存儲有區(qū)塊時,參照圖6,所述獲取模塊50包括:
確定單元51,用于確定當前區(qū)塊高度與所述第一節(jié)點的狀態(tài)區(qū)塊高度;
獲取單元52,用于在當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊;
同步單元53,用于在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,并從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊。
即,確定單元51先確定當前區(qū)塊高度與狀態(tài)區(qū)塊高度,若當前區(qū)塊高度與狀態(tài)區(qū)塊高度都為n,則獲取單元52接收狀態(tài)區(qū)塊,并使用狀態(tài)區(qū)塊構建新的區(qū)塊鏈狀態(tài),然后將新的區(qū)塊鏈狀態(tài)與本地的區(qū)塊鏈狀態(tài)進行對比,若兩個狀態(tài)相等,則接收狀態(tài)區(qū)塊并納入本地區(qū)塊鏈,若狀態(tài)不相等,需要人工介入,進行損失和處理的評估。
此時,如果接收狀態(tài)區(qū)塊的節(jié)點當前區(qū)塊高度小于n,則同步單元53先同步本地高度至高度n這兩者之間的區(qū)塊,執(zhí)行交易并使本地區(qū)塊鏈狀態(tài)到達高度為n的狀態(tài),再接收狀態(tài)區(qū)塊n,并使用狀態(tài)區(qū)塊構建新的區(qū)塊鏈狀態(tài),將新的區(qū)塊鏈狀態(tài)與本地區(qū)塊鏈狀態(tài)進行對比,若兩個狀態(tài)相等,則接收狀態(tài)區(qū)塊并納入本地區(qū)塊鏈,若狀態(tài)不相等,需要人工介入,進行損失和處理的評估。
需要說明的是,本實施例中,在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,先同步當前區(qū)塊高度至狀態(tài)區(qū)塊高度這兩者之間的區(qū)塊,然后再從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,相當于是第二節(jié)點先進行區(qū)塊的同步,然后從第一節(jié)點中獲取狀態(tài)區(qū)塊時,可以對獲取的狀態(tài)區(qū)塊進行驗證,從而提高區(qū)塊同步的準確性。在其它實施例中,在當前區(qū)塊高度小于狀態(tài)區(qū)塊高度時,第二節(jié)點也可直接從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,以實現區(qū)塊的同步,但是就無法對獲取的狀態(tài)區(qū)塊進行驗證。因此本實施例中,在第二節(jié)點的當前區(qū)塊高度與狀態(tài)區(qū)塊高度一致時,即可對獲取的狀態(tài)區(qū)塊進行驗證。。
在本實施例中,若第二節(jié)點未存儲有區(qū)塊,則可直接存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。
在所述第二節(jié)點存儲有區(qū)塊時,所述存儲模塊,還用于將獲取的所述狀態(tài)區(qū)塊接入所述第二節(jié)點的區(qū)塊鏈中,以存儲所述狀態(tài)區(qū)塊;
所述裝置還包括:裁剪模塊,用于刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪。
即,在所述第二節(jié)點存儲有區(qū)塊時,此時,由于狀態(tài)區(qū)塊已經存儲有區(qū)塊鏈最新區(qū)塊鏈狀態(tài),此時,裁剪模塊可直接刪除所述第二節(jié)點之前存儲的區(qū)塊,以對所述區(qū)塊鏈進行裁剪,從而增加區(qū)塊鏈節(jié)點的存儲空間。
本實施例提出的區(qū)塊鏈狀態(tài)的同步裝置,區(qū)塊鏈網絡中的第二節(jié)點先向區(qū)塊鏈網絡廣播區(qū)塊鏈狀態(tài)的同步請求,以供創(chuàng)建有狀態(tài)區(qū)塊的第一節(jié)點響應所述區(qū)塊鏈狀態(tài)的同步請求,再從所述第一節(jié)點中獲取所述狀態(tài)區(qū)塊,其中,所述狀態(tài)區(qū)塊中匯總有最新區(qū)塊鏈狀態(tài)數據,最終存儲獲取的所述狀態(tài)區(qū)塊,以實現區(qū)塊鏈狀態(tài)的同步。本方案中,由于狀態(tài)區(qū)塊存儲有最新區(qū)塊鏈狀態(tài)數據,因此區(qū)塊鏈網絡中的其它節(jié)點只要同步并存儲狀態(tài)區(qū)塊即可,無須再同步各個區(qū)塊,使得區(qū)塊鏈節(jié)點中占用的存儲空間減小,從而延長了區(qū)塊鏈節(jié)點的使用壽命。
需要說明的是,在本文中,術語“包括”、“包含”或者其任何其它變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其它要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到上述實施例方法可借助軟件加必需的通用硬件平臺的方式來實現,當然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在一個存儲介質(如rom/ram、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,空調器,或者網絡設備等)執(zhí)行本發(fā)明各個實施例所述的方法。
以上僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其它相關的技術領域,均同理包括在本發(fā)明的專利保護范圍內。