TW202107455A - 區塊鏈狀態資料恢復方法及裝置、電子設備 - Google Patents

區塊鏈狀態資料恢復方法及裝置、電子設備 Download PDF

Info

Publication number
TW202107455A
TW202107455A TW109105604A TW109105604A TW202107455A TW 202107455 A TW202107455 A TW 202107455A TW 109105604 A TW109105604 A TW 109105604A TW 109105604 A TW109105604 A TW 109105604A TW 202107455 A TW202107455 A TW 202107455A
Authority
TW
Taiwan
Prior art keywords
block
account
tree
historical
state tree
Prior art date
Application number
TW109105604A
Other languages
English (en)
Other versions
TWI732463B (zh
Inventor
卓海振
俞本權
陸鍾豪
Original Assignee
開曼群島商創新先進技術有限公司
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 開曼群島商創新先進技術有限公司 filed Critical 開曼群島商創新先進技術有限公司
Publication of TW202107455A publication Critical patent/TW202107455A/zh
Application granted granted Critical
Publication of TWI732463B publication Critical patent/TWI732463B/zh

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1448Management of the data involved in backup or backup restore
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • G06F16/275Synchronous replication

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

一種區塊鏈狀態資料恢復方法,區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;包括:判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊;疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態。

Description

區塊鏈狀態資料恢復方法及裝置、電子設備
本說明書一個或多個實施例涉及區塊鏈技術領域,尤其涉及一種區塊鏈狀態資料恢復方法及裝置、電子設備。
區塊鏈技術,也被稱之為分散式帳本技術,是一種由若干台計算設備共同參與“記帳”,共同維護一份完整的分散式資料庫的新興技術。由於區塊鏈技術具有去中心化、公開透明、每台計算設備可以參與資料庫記錄、並且各計算設備之間可以快速的進行資料同步的特性,使得區塊鏈技術已在眾多的領域中廣泛的進行應用。
本說明書提出一種區塊鏈狀態資料恢復方法,所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述方法包括: 判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 所述狀態恢復邏輯包括: 判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。 較佳地,所述判定與所述最新區塊中的交易相關的目標帳戶,包括: 重新執行所述最新區塊中的交易,以判定所述最新區塊中的交易相關的目標帳戶;或者,查詢與所述最新區塊對應的讀寫集,以判定所述最新區塊中的交易相關的目標帳戶。 所述查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態,包括: 在所述最新區塊的上一區塊的歷史Merkle狀態樹上查詢與所述目標帳戶對應的歷史帳戶狀態;或者,在與所述最新區塊的上一區塊對應的讀寫集中,查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 較佳地,所述疊代執行狀態恢復邏輯之前,還包括: 判定從所述區塊鏈的創世塊至所述目標區塊所包含的交易的總數量,是否大於從所述目標區塊至所述最新區塊所包含的交易的總數量;如果是,進一步疊代執行所述狀態恢復邏輯。 較佳地,還包括: 在所述區塊鏈中的任一區塊中的交易執行完畢後,基於與所述區塊中的交易相關的目標帳戶的最新帳戶狀態,產生與所述區塊的當前Merkle狀態樹對應的更新資料節點和與所述區塊的歷史Merkle狀態樹對應的歷史資料節點; 基於產生的所述更新資料節點對所述區塊的上一區塊的當前Merkle狀態樹上與所述目標帳戶對應的資料節點進行修改更新,以得到所述區塊的當前Merkle狀態樹;以及, 基於產生的所述歷史資料節點和多工的所述區塊的上一區塊的歷史Merkle狀態樹上與所述目標帳戶對應的資料節點以外的其它資料節點,為所述區塊創建歷史Merkle狀態樹。 較佳地,所述當前Merkle狀態樹上的資料節點被組織成B+樹的資料結構在資料庫中儲存;所述歷史Merkle狀態樹上的資料節點被組織成LSM樹的資料結構在資料庫中儲存。 較佳地,所述資料庫為Key-Value資料庫; 所述Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存在所述資料庫中;其中,所述當前Merkle狀態樹上的資料節點的key為所述資料節點的節點ID;所述歷史Merkle狀態樹上的資料節點的key為所述資料節點包含的資料內容的hash值。 較佳地,所述資料庫為LevelDB資料庫;或者基於LevelDB架構的資料庫。 較佳地,所述資料庫為基於LevelDB架構的Rocksdb資料庫。 較佳地,所述Merkle樹為融合了Trie字典樹的樹形結構的Merkle樹變種。 較佳地,所述 Merkle狀態樹為Merkle Patricia Tree狀態樹。 本說明書還提出一種區塊鏈狀態資料恢復裝置,所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述裝置包括: 判定模組,判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 恢復模組,疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 所述狀態恢復邏輯包括: 判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。 較佳地,所述判定模組: 重新執行所述最新區塊中的交易,以判定所述最新區塊中的交易相關的目標帳戶;或者,查詢與所述最新區塊對應的讀寫集,以判定所述最新區塊中的交易相關的目標帳戶。 所述恢復模組: 在所述最新區塊的上一區塊的歷史Merkle狀態樹上查詢與所述目標帳戶對應的歷史帳戶狀態;或者,在與所述最新區塊的上一區塊對應的讀寫集中,查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 較佳地,所述恢復模組進一步: 在疊代執行狀態恢復邏輯之前,判定從所述區塊鏈的創世塊至所述目標區塊所包含的交易的總數量,是否大於從所述目標區塊至所述最新區塊所包含的交易的總數量;如果是,進一步疊代執行所述狀態恢復邏輯。 較佳地,還包括: 產生模組,在所述區塊鏈中的任一區塊中的交易執行完畢後,基於與所述區塊中的交易相關的目標帳戶的最新帳戶狀態,產生與所述區塊的當前Merkle狀態樹對應的更新資料節點和與所述區塊的歷史Merkle狀態樹對應的歷史資料節點; 修改模組,基於產生的所述更新資料節點對所述區塊的上一區塊的當前Merkle狀態樹上與所述目標帳戶對應的資料節點進行修改更新,以得到所述區塊的當前Merkle狀態樹; 創建模組,基於產生的所述歷史資料節點和多工的所述區塊的上一區塊的歷史Merkle狀態樹上與所述目標帳戶對應的資料節點以外的其它資料節點,為所述區塊創建歷史Merkle狀態樹。 較佳地,所述當前Merkle狀態樹上的資料節點被組織成B+樹的資料結構在資料庫中儲存;所述歷史Merkle狀態樹上的資料節點被組織成LSM樹的資料結構在資料庫中儲存。 較佳地,所述資料庫為Key-Value資料庫; 所述Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存在所述資料庫中;其中,所述當前Merkle狀態樹上的資料節點的key為所述資料節點的節點ID;所述歷史Merkle狀態樹上的資料節點的key為所述資料節點包含的資料內容的hash值。 較佳地,所述資料庫為LevelDB資料庫;或者基於LevelDB架構的資料庫。 較佳地,所述資料庫為基於LevelDB架構的Rocksdb資料庫。 較佳地,所述Merkle樹為融合了Trie字典樹的樹形結構的Merkle樹變種。 較佳地,所述 Merkle狀態樹為Merkle Patricia Tree狀態樹。 以上技術方案中,可以在支援將帳戶狀態資料組織成當前Merkle狀態樹和歷史Merkle狀態樹的區塊鏈模型中,將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,穩定高效的還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。
這裡將詳細地對示例性實施例進行說明,其示例表示在圖式中。下面的描述涉及圖式時,除非另有表示,不同圖式中的相同數字表示相同或相似的要素。以下示例性實施例中所描述的實施方式並不代表與本說明書一個或多個實施例相一致的所有實施方式。相反,它們僅是與如所附申請專利範圍中所詳述的、本說明書一個或多個實施例的一些方面相一致的裝置和方法的例子。 需要說明的是:在其他實施例中並不一定按照本說明書示出和描述的順序來執行相應方法的步驟。在一些其他實施例中,其方法所包括的步驟可以比本說明書所描述的更多或更少。此外,本說明書中所描述的單個步驟,在其他實施例中可能被分解為多個步驟進行描述;而本說明書中所描述的多個步驟,在其他實施例中也可能被合併為單個步驟進行描述。 區塊鏈一般被劃分為三種類型:公有鏈(Public Blockchain),私有鏈(Private Blockchain)和聯盟鏈(Consortium Blockchain)。此外,還可以有上述多種類型的結合,比如私有鏈+聯盟鏈、聯盟鏈+公有鏈等。 其中,去中心化程度最高的是公有鏈。公有鏈以比特幣、乙太坊為代表,加入公有鏈的參與者(也可稱為區塊鏈中的節點)可以讀取鏈上的資料記錄、參與交易、以及競爭新區塊的記帳權等。而且,各節點可自由加入或者退出網路,並進行相關操作。 私有鏈則相反,該網路的寫入許可權由某個組織或者機構控制,資料讀取許可權受組織規定。簡單來說,私有鏈可以為一個弱中心化系統,其對節點具有嚴格限制且節點數量較少。這種類型的區塊鏈更適合於特定機構內部使用。 聯盟鏈則是介於公有鏈以及私有鏈之間的區塊鏈,可實現“部分去中心化”。聯盟鏈中各個節點通常有與之相對應的實體機構或者組織;節點透過授權加入網路並組成利益相關聯盟,共同維護區塊鏈運行。 基於區塊鏈的基本特性,區塊鏈通常是由若干個區塊構成。在這些區塊中分別記錄有與該區塊的創建時刻對應的時間戳,所有的區塊嚴格按照區塊中記錄的時間戳,構成一條在時間上有序的資料鏈條。 對於物理世界產生的真實資料,可以將其構建成區塊鏈所支援的標準的交易(transaction)格式,然後發佈至區塊鏈,由區塊鏈中的節點設備對收到的交易進行共識處理,並在達成共識後,由區塊鏈中作為記帳節點的節點設備,將這筆交易打包進區塊,在區塊鏈中進行持久化存證。 其中,區塊鏈中支援的共識演算法可以包括: 第一類共識演算法,即節點設備需要爭奪每一輪的記帳週期的記帳權的共識演算法;例如,工作量證明(Proof of Work, POW)、股權證明(Proof of Stake,POS)、委任權益證明(Delegated Proof of Stake,DPOS)等共識演算法; 第二類共識演算法,即預先為每一輪記帳週期選舉記帳節點(不需要爭奪記帳權)的共識演算法;例如,實用拜占庭容錯(Practical Byzantine Fault Tolerance,PBFT)等共識演算法。 在採用第一類共識演算法的區塊鏈網路中,爭奪記帳權的節點設備,都可以在接收到交易後執行該筆交易。爭奪記帳權的節點設備中可能有一個節點設備在本輪爭奪記帳權的過程中勝出,成為記帳節點。記帳節點可以將收到的交易與其它交易一起打包以產生最新區塊,並將產生的最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識。 在採用第二類共識演算法的區塊鏈網路中,具有記帳權的節點設備在本輪記帳前已經商定好。因此,節點設備在接收到交易後,如果自身不是本輪的記帳節點,則可以將該交易發送至記帳節點。對於本輪的記帳節點,在將該交易與其它交易一起打包以產生最新區塊的過程中或者之前,可以執行該交易。記帳節點在產生最新區塊後,可以將該最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識。 如上所述,無論區塊鏈採用以上示出的哪種共識演算法,本輪的記帳節點都可以將接收到的交易打包以產生最新區塊,並將產生的最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識驗證。如果其它節點設備接收到最新區塊或者該最新區塊的區塊頭後,經驗證沒有問題,可以將該最新區塊追加到原有的區塊鏈末尾,從而完成區塊鏈的記帳過程。其它節點驗證記帳節點發來的新的區塊或區塊頭的過程中,也可以執行該區塊中的包含的交易。 在區塊鏈領域,有一個重要的概念就是帳戶(Account);以乙太坊為例,乙太坊通常將帳戶劃分為外部帳戶和合約帳戶兩類;外部帳戶就是由用戶直接控制的帳戶,也稱之為用戶帳戶;而合約帳戶則是由用戶透過外部帳戶創建的,包含合約代碼的帳戶(即智慧合約)。 當然,對於一些基於乙太坊的架構而衍生出的區塊鏈模型(比如螞蟻區塊鏈),還可以對區塊鏈支援的帳戶類型,進行進一步的擴展,在本說明書中不進行特別限定。 對於區塊鏈中的帳戶而言,通常會透過一個結構體,來維護帳戶的帳戶狀態。當區塊中的交易被執行後,區塊鏈中與該交易相關的帳戶的狀態通常也會發生變化。 以乙太坊為例,帳戶的結構體通常包括Balance、Nonce、Code和Storage等欄位。其中: Balance欄位,用於維護帳戶目前的帳戶餘額; Nonce欄位,用於維護該帳戶的交易次數;它是用於保障每筆交易能且只能被處理一次的計數器,有效避免重放攻擊; Code欄位,用於維護該帳戶的合約代碼;在實際應用中,Code欄位中通常僅維護合約代碼的hash值;因而,Code欄位通常也稱之為Codehash欄位。 Storage欄位,用於維護該帳戶的儲存內容(預設欄位值為空);對於合約帳戶而言,通常會分配一個獨立的儲存空間,用以儲存該合約帳戶的儲存內容;該獨立的儲存空間通常稱之為該合約帳戶的帳戶儲存。合約帳戶的儲存內容通常會構建成MPT(Merkle Patricia Trie)樹的資料結構儲存在上述獨立的儲存空間之中;其中,基於合約帳戶的儲存內容構建成的MPT樹,通常也稱之為Storage樹。而Storage欄位通常僅維護該Storage樹的根節點;因此,Storage欄位通常也稱之為StorageRoot欄位。 其中,對於外部帳戶而言,以上示出的Code欄位和Storage欄位的欄位值均為空值。 對於大多數區塊鏈模型,通常都會使用Merkle樹;或者,基於Merkle樹的資料結構,來儲存和維護資料。以乙太坊為例,乙太坊使用了MPT樹(一種Merkle樹變種),作為資料組織形式,用來組織和管理帳戶狀態、交易資訊等重要資料。 乙太坊針對區塊鏈中需要儲存和維護的資料,設計了三棵MPT樹,分別是MPT狀態樹、MPT交易樹和MPT收據樹。其中,除了以上三棵MPT樹以外,實際上還存在一棵基於合約帳戶的儲存內容構建的Storage樹。 MPT狀態樹,是由區塊鏈中所有帳戶的帳戶狀態(state)資料組織成的MPT樹;MPT交易樹,是由區塊鏈中的交易(transaction)資料組織成的MPT樹;MPT收據樹,是區塊中的交易在執行完畢後產生的與每筆交易對應的交易收據(receipt)組織成的MPT樹。以上示出的MPT狀態樹、MPT交易樹和MPT收據樹的根節點的hash值,最終都會被添加至對應區塊的區塊頭中。 其中,MPT交易樹和MPT收據樹均與區塊相對應,即每一個區塊都有自己的MPT交易樹和MPT收據樹。而MPT狀態樹是一個全域的MPT樹,並不與某一個特定的區塊相對應,而是涵蓋了區塊鏈中所有帳戶的帳戶狀態資料。 對於組織成的MPT交易樹、MPT收據樹和MPT狀態樹,最終都會在採用多級資料儲存結構的Key-Value型資料庫(比如,LevelDB)中進行儲存。 而採用多級資料儲存結構的上述資料庫,通常採用多級資料儲存的結構,可以被劃分為n級資料儲存;例如,各級資料儲存可以依次設為L0,L1,L2,L3....L(n-1);對於上述資料庫中的各級資料儲存而言,等級編號越小通常級別越高;例如,L0儲存的是最新的若干區塊的資料,L1儲存的是次新的若干區塊的資料,以此類推。 其中,各級資料儲存對應的儲存媒體的讀寫性能,通常也可以存在性能差異;例如,級別高(即等級編號較小的)的資料儲存對應的儲存媒體的讀寫性能,可以高於級別低的資料儲存對應的儲存媒體的讀寫性能。在實際應用中,級別高的資料儲存,可以使用儲存成本較高,儲存性能較優的儲存媒體;而級別低的資料儲存,可以使用單位成本低,且容量較大的儲存媒體。 在實際應用中,隨著區塊鏈的區塊號的增長(也稱之為區塊高度),在資料庫中儲存的資料,會包含很多歷史資料;而且,區塊號越小的區塊中的資料越久遠,越不重要。因此,為了降低整體的儲存成本,通常可以對不同區塊高度的資料進行“區別對待”;例如,可以將區塊號較小的區塊中的資料,儲存至成本較低的儲存媒體上;而將區塊號較大的區塊中的資料,儲存在成本較高的儲存媒體上。 需要說明的是,區塊鏈每產生一個最新區塊,則在該最新區塊中的交易被執行之後,區塊鏈中這些被執行交易的相關帳戶(可以是外部帳戶也可以是合約帳戶)的帳戶狀態,通常也會隨之發生變化; 例如,當區塊中的一筆“轉帳交易”執行完畢後,與該“轉帳交易”相關的轉出方帳戶和轉入方帳戶的餘額(即這些帳戶的Balance欄位的欄位值),通常也會隨之發生變化。 而節點設備在區塊鏈產生的最新區塊中的交易執行完畢後,由於當前區塊鏈中的帳戶狀態發生了變化,因此節點設備需要根據區塊鏈中所有帳戶當前的帳戶狀態資料,來構建MPT狀態樹,用於維護區塊鏈中所有帳戶的最新狀態。 也即,每當區塊鏈中產生一個最新區塊,並且該最新區塊中的交易執行完畢後,導致區塊鏈中的帳戶狀態發生了變化,節點設備都需要基於區塊鏈中所有帳戶最新的帳戶狀態資料,重新構建一棵MPT狀態樹。 換句話說,區塊鏈中每一個區塊,都有一個與之對應的MPT狀態樹;該MPT狀態樹,維護了在該區塊中的交易在執行完畢後,區塊鏈中所有帳戶最新的帳戶狀態。 請參見圖1,圖1為本說明書示出的一種將區塊鏈的帳戶狀態資料組織成MPT狀態樹的示意圖。 MPT樹,是一種經過改良的Merkle樹變種,其融合了Merkle樹和Trie字典樹(也稱之為前綴樹)兩種樹形結構的優點。 在MPT樹中通常包括三種資料節點,分別為葉子節點(leaf node),擴展節點(extension node)和分支節點(branch node)。 葉子節點,是表示為[key,value]的一個鍵值對,其中key是種特殊的十六進位編碼字元,value是該葉子節點對應的帳戶位址的狀態資料(即以上示出的結構體)。擴展節點,也是表示為[key,value]的一個鍵值對,其中key也是種特殊的十六進位編碼字元,但是value是其他節點的hash值(hash指標),也就是說可以透過hash指標連結到其他節點。 分支節點,包含17個元素,前16個元素對應著key中的16個可能的十六進位字元;一個字元對應一個nibble(半位元組)。如果有一個[key,value]對在這個分支節點終止,則該分支節點可以充當葉子節點的角色,最後一個元素則代表葉子節點的value值;反之,分支節點的最後一個元素,可以為空值。 由於在MPT樹上,從根節點到一個葉子節點的搜索路徑上的字元,組成一個完整的帳戶位址;因此,對於分支節點而言,其既可以是上述搜索路徑的終止節點,也可以是上述搜索路徑的中間節點。 假設需要組織成MTP狀態樹的帳戶狀態資料如下表1所示:
帳戶位址(Key) 帳戶狀態(Value)
a 7 1 1 3 5 5 state1
a 7 7 d 3 3 7 state2
a 7 f 9 3 6 5 state3
a 7 7 d 3 9 7 state4
表1 在表1中,帳戶位址是由若干16進制的字元構成的字串。帳戶狀態state,是由上述Balance,Nonce,Code和Storage等欄位構成的結構體。 最終按照表1中的帳戶狀態資料組織成的MPT狀態樹,如圖1所示;該MPT狀態樹是由4個葉子節點,2個分支節點,和2個擴展節點構成。 在圖1中,prefix欄位為擴展節點和葉子節點共同具有的前綴欄位。該prefix欄位的不同欄位值可以用於表示不同的節點類型。 例如,prefix欄位的取值為0,表示包含偶數個nibbles的擴展節點;如前所述,nibble表示半位元組,由4位元二進位組成,一個nibble可以對應一個組成帳戶位址的字元。prefix欄位的取值為1,表示包含奇數個nibble(s)的擴展節點;prefix欄位的取值為2,表示包含偶數個nibbles的葉子節點;prefix欄位的取值為3,表示包含奇數個nibble(s)的葉子節點。 而分支節點,由於其是並列單nibble的前綴節點,因此分支節點不具有上述prefix欄位。 擴展節點中的Shared nibble欄位,對應該擴展節點所包含的鍵值對的key值,表示帳戶位址之間的共同字元前綴;比如,上表中的所有帳戶位址均具有共同的字元前綴a7。Next Node欄位中填充下一個節點的hash值(hash指標)。 分支節點中的16進制字元0~f欄位,對應該分支節點所包含的鍵值對的key值;如果該分支節點為帳戶位址在MPT樹上的搜索路徑上的中間節點,則該分支節點的Value欄位可以為空值。0~f欄位中用於填充下一個節點的hash值。 葉子節點中的Key-end,對應該葉子節點所包含的鍵值對的key值,表示帳戶位址的最後幾個字元。從根節點搜索到葉子節點的搜索路徑上的各個節點的key值,構成了一個完整的帳戶位址。該葉子節點的Value欄位填充帳戶位址對應的帳戶狀態資料;例如,可以對上述Balance,Nonce,Code和storage等欄位構成的結構體進行編碼後,填充至葉子節點的Value欄位。 進一步的,如圖1所示的MPT狀態樹上的node,最終也是以Key-Value鍵值對的形式儲存在資料庫中; 其中,當MPT狀態樹上的node在資料庫中進行儲存時,MPT狀態樹上的node的鍵值對中的key,可以為node所包含的資料內容的hash值;MPT狀態樹上的node的鍵值對中的Value,為node所包含的資料內容。 也即,在將MPT狀態樹上的node儲存至資料庫時,可以計算該node所包含的資料內容的hash值(即對node整體進行hash計算),並將計算出的hash值作為key,將該node所包含的資料內容作為value,產生Key-Value鍵值對;然後,將產生的Key-Value鍵值對儲存至資料庫中。 由於MPT狀態樹上的node,是以node所包含的資料內容的hash值為Key,node所包含的資料內容為value進行儲存;因此,在需要查詢MPT狀態樹上的node時,通常可以基於node所包含的資料內容的hash值作為key來進行內容定址。而採用“內容定址”,對於一些“內容重複”的node,則通常可以進行“多工”,以節約資料儲存的儲存空間。如圖2所示,圖2為本說明書示出的一種MPT狀態樹上的node多工的示意圖。 需要說明的是,在實際應用中,當區塊鏈產生的一個最新區塊中的交易執行完畢後,可能僅僅會導致部分帳戶的帳戶狀態發生變化;因此,在構建MPT狀態樹時,並不需要基於區塊鏈中所有的帳戶當前的狀態資料,重新構建一棵完整的MPT狀態樹,而只需要在該最新區塊之前的區塊對應的MPT狀態樹的基礎上,對部分帳戶狀態發生變化的帳戶對應的node進行更新即可。 而對於MPT狀態樹上與帳戶狀態未發生變化的帳戶對應的node,由於這些node未發生資料更新,因此可以直接多工該最新區塊之前的區塊對應的MPT狀態樹上相應的node即可。 如圖2所示,假設表1中的帳戶狀態資料,為Block N中的交易執行完畢後,區塊鏈上所有帳戶的最新帳戶狀態;基於表1中的帳戶狀態資料組織成的MPT狀態樹,仍如圖1所示。 假設當Block N+1中的交易執行完畢後,導致上述表1中的帳戶位址為“a7f9365”的帳戶狀態,由“state3”更新為“state5”;此時,在Block N+1更新MPT狀態樹時,並不需要在Block N+1中的交易執行完畢後,基於區塊鏈中所有的帳戶當前的狀態資料重新構建一棵MPT狀態樹。 在這種情況下,可以僅將Block N 對應的MPT狀態樹上(即圖1示出的MPT狀態樹),“key-end”為“9365”的葉子節點中的Value,由“state3”更新為“state5”,並繼續更新從root節點到該葉子節點的路徑上的所有節點的hash指標; 也即,當MPT狀態樹上的葉子節點發生更新,由於該葉子節點整體的hash值發生更新,那麼從根節點到該葉子節點的路徑上的所有節點的hash指標也會隨之發生更新。 例如,請繼續參見圖2,除了需要更新“key-end”為“9365”的葉子節點中的Value值以外,還需要更新該葉子節點的上一個分支節點(Branch Node)的f欄位中填充的,指向該葉子節點的hash指標;進一步的,還可以繼續向根節點追溯,繼續更新該分支節點的上一個根節點(Root Extension Node)的“Next Node”欄位中填充的,指向該分支節點的hash指標。 而除了以上發生更新的節點以外,其它未發生更新的節點,都可以直接多工Block N的MPT狀態樹上對應的節點即可; 其中,由於Block N對應的MPT樹,最終需要作為歷史資料進行保留;因此,在Block N+1更新MPT狀態樹時,對於這些發生更新的node,並不是在Block N對應的MPT狀態樹上原來的node的基礎上,直接進行修改更新,而是在Block N+1對應的MPT樹上重新創建這些發生更新的node。 也即,在與Block N+1對應的MPT狀態樹上,實際上只需要重新創建少量發生更新的node,對於其它未發生更新的node,可以透過直接多工Block N對應的MPT狀態樹上對應的節點。 例如,如圖2所示,對於Block N+1對應的MPT狀態樹上,實際上只需要重新創建一個作為根節點的擴展節點、一個分支節點和一個葉子節點;對於未發生更新的node,可以透過在該MPT狀態樹上這些重新創建的node中,添加指向Block N對應的MPT狀態樹上的相應node的hash指標來完成node的“多工”。而Block N對應的MPT狀態樹上那些更新之前的node,將作為歷史帳戶狀態資料進行保存;比如,圖2示出的“key-end”為“9365”,且Value為“state3”的葉子節點,將作為歷史資料進行保留。 在以上例子中,以Block N+1的MPT狀態樹上的少量node發生內容更新,從而可以“多工”上一個區塊Block N的大多數node為例進行了說明。而在實際應用中,Block N+1的MPT狀態樹上也可能會較上一個區塊Block N新增node。在這種情況下,該新增的node雖然無法直接從上一個區塊Block N的MPT樹中進行“多工”,但有可能從更早之前的區塊的MPT狀態樹上進行“多工”; 例如,Block N+1的MPT狀態樹上新增的node,雖然沒在Block N的MPT狀態樹上出現過,但可能出現在更早的Block的MPT狀態樹上;比如,出現在Block N-1的MPT狀態樹上;因此,Block N+1的MPT狀態樹上新增的node,可以直接多工Block N-1的MPT狀態樹上對應的node即可。 以MPT樹為代表的眾多採用“內容定址”的Merkle樹,雖然可以透過多工一些“內容重複”的資料節點的方式,來節約區塊鏈中的帳戶狀態資料在資料庫中儲存時的儲存空間;但隨著資料的不斷增加,大量的歷史狀態資料過於冗餘,勢必會導致針對Merkle狀態樹的存取性能降低,最終會影響區塊鏈平臺的TPS(Transactions Per Second)指標; 例如,在實際應用中,由於以MPT樹為代表的採用“內容定址”的Merkle樹,會存在節點多工的情況,最新區塊的Merkle狀態樹上的很多資料節點,往往是多工之前的歷史區塊對應的Merkle狀態樹上的資料節點;這就會導致最新區塊的Merkle狀態樹上維護的很多區塊鏈帳戶的最新帳戶狀態資料,實際上是“混雜”在眾多的歷史帳戶狀態資料之中;因此,當需要查找各區塊鏈帳戶的最新帳戶狀態時,則需要遍歷大量的歷史狀態資料,從而對Merkle狀態樹的存取性能造成影響。 基於此,為了提升Merkle狀態樹的存取性能,在一些區塊鏈模型中通常同時支援當前Merkle狀態樹和歷史Merkle狀態樹。 在這一類區塊鏈模型中,區塊鏈中的帳戶狀態資料仍然可以被組織成Merkle狀態樹在資料庫中儲存;其中,上述Merkle狀態樹可以包括當前Merkle狀態樹(Current State Tree)和歷史Merkle狀態樹(History State Tree); 當前Merkle狀態樹,是由各區塊鏈帳戶的最新帳戶狀態組織成的Merkle狀態樹;歷史Merkle狀態樹是由各區塊鏈帳戶的歷史帳戶狀態組織成的Merkle狀態樹。每一個區塊都有一棵與之對應的當前Merkle狀態樹和歷史Merkle狀態樹。 進一步的,當區塊鏈中的任一區塊中的交易執行完畢後,一方面,可以基於與該區塊中的交易相關的目標帳戶更新後的最新帳戶狀態,產生與該區塊的當前Merkle狀態樹對應的更新資料節點;另一方面,可以基於上述目標帳戶更新前的歷史帳戶狀態,產生與該區塊的歷史Merkle狀態樹對應的歷史資料節點; 當產生了上述更新資料節點和歷史資料節點後,可以基於產生的更新資料節點對該區塊的上一區塊的當前Merkle狀態樹上,與上述目標帳戶對應的資料節點進行修改更新,以得到該區塊的當前Merkle狀態樹;以及, 基於產生的上述歷史資料節點和多工的上述區塊的上一區塊的歷史Merkle狀態樹上與該目標帳戶對應的資料節點以外的其它資料節點,為該區塊創建歷史Merkle狀態樹。 透過這種方式,由於當前Merkle狀態樹和歷史Merkle狀態樹之間,並不存在資料節點的多工關係;當前Merkle狀態樹上只維護各區塊鏈帳戶的最新帳戶狀態,歷史Merkle狀態樹上只維護各區塊鏈帳戶的歷史帳戶狀態;因此,當需要查找各區塊鏈帳戶的最新帳戶狀態時,只需要遍歷上一區塊的當前Merkle狀態樹,就可以查找到這部分帳戶在上一區塊中的交易執行完畢後的最新帳戶狀態,從而可以提升Merkle狀態樹的存取性能。 而在實際應用中,當區塊鏈中的節點設備發生節點設備當機,則該節點設備在當機恢復後,通常可能需要將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 因此,在同時支援當前Merkle狀態樹和歷史Merkle狀態樹的區塊鏈模型中,如何在區塊鏈中的節點設備當機恢復後,將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,穩定高效的還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態,是這類區塊鏈模型中亟待解決的問題。 在相關技術中,如果想要將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上的最新帳戶狀態,還原至各區塊鏈帳戶在最新區塊之前的任一目標歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態,通常可以透過以下示出的方法來實現: 方法一: 假設上述目標歷史區塊記為區塊N,可以透過重新執行從創世塊(即區塊鏈的第一區塊)到區塊N中包含的所有交易,創建出區塊N的歷史Merkle狀態樹,再將上述最新區塊的當前Merkle狀態樹,修改回區塊N的當前Merkle狀態樹,完成狀態資料的還原。 然而,透過這種方式,需要重新執行大量的交易,狀態資料的還原代價較高。 方法二: 假設上述目標歷史區塊仍然記為區塊N,則可以透過遍歷資料庫中儲存的所有歷史Merkle狀態樹,查找到與區塊N對應的歷史Merkle狀態樹,再將上述最新區塊的當前Merkle狀態樹,修改回區塊N的當前Merkle狀態樹,完成狀態資料的還原。 然而,透過這種方式,由於需要遍歷資料庫中所有歷史Merkle狀態樹,將與區塊N對應的歷史Merkle狀態樹上的資料節點逐個查找出來;因此,狀態資料的還原代價仍然較高。 有鑑於此,本說明書提出一種,在同時支援當前Merkle狀態樹和歷史Merkle狀態樹的區塊鏈模型中,將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,穩定高效的還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態的技術方案。 在實現時,當節點設備當機恢復後,首先可以判定待恢復的目標區塊;其中,該目標區塊可以為區塊鏈中的最新區塊之前的任一歷史區塊; 例如,在實際應用中,管理員可以在節點設備當機恢復後,透過向節點設備輸入配置指令的形式,來指定需要恢復的目標區塊的區塊號。 進一步的,節點設備可以透過疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為上述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 其中,上述狀態恢復邏輯可以包括以下執行邏輯: 判定與最新區塊中的交易相關的目標帳戶,並查詢上述目標帳戶在最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將當前Merkle狀態樹中與上述目標帳戶對應的最新帳戶狀態,修改為上述上一區塊的歷史Merkle狀態樹中與上述目標帳戶對應的歷史帳戶狀態,並在修改完成後將上述上一區塊重新判定為最新區塊。 以上技術方案中,可以在支援將帳戶狀態資料組織成當前Merkle狀態樹和歷史Merkle狀態樹的區塊鏈模型中,將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,穩定高效的還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 請參見圖3,圖3是一示例性實施例提供的一種區塊鏈狀態資料恢復方法的流程圖。所述方法應用於區塊鏈節點設備;所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述方法包括以下步驟: 步驟302,判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 步驟304、疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 其中,所述狀態恢復邏輯包括:判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態;將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。 在示出的一種實施方式中,上述Merkle樹,具體可以包括融合了Trie字典樹的樹形結構的任意形式的Merkle樹變種; 例如,在實際應用中,上述Merkle樹仍然可以採用以乙太坊為代表的公鏈採用的MPT樹;或者,對於基於乙太坊架構而衍生出的區塊鏈模型而言,除了可以採用諸如MPT樹等改良版的Merkle樹以外,也可以採用其他形式的類似於MPT樹的,融合了Trie字典樹的樹形結構的Merkle樹變種,在本說明書中不再進行一一列舉。 區塊鏈中的帳戶狀態資料,可以被組織成Merkle狀態樹的資料結構,在上述資料庫中進行儲存; 例如,上述Merkle狀態樹仍然可以是MPT樹,可以採用MPT樹的資料結構,將區塊鏈的帳戶狀態資料組織成MPT狀態樹。 其中,在本說明書中,區塊鏈中的帳戶狀態資料組織成的Merkle狀態樹,具體可以包括當前Merkle狀態樹(Current State Tree)和歷史Merkle狀態樹(History State Tree);當前Merkle狀態樹,是由各區塊鏈帳戶的最新帳戶狀態組織成的Merkle狀態樹;歷史Merkle狀態樹,是由各區塊鏈帳戶的歷史帳戶狀態組織成的Merkle狀態樹。 其中,對於區塊鏈中的每一個區塊來說,都有一棵與之對應的當前Merkle狀態樹和歷史Merkle狀態樹。 需要說明的是,當前Merkle狀態樹和歷史Merkle狀態樹,是兩顆獨立存在的Merkle狀態樹;當前Merkle狀態樹與歷史Merkle狀態樹之間並不存在資料節點的多工關係。 其中,所謂當前Merkle狀態樹與歷史Merkle狀態樹之間並不存在資料節點的多工關係是指,區塊鏈中的任一區塊的當前Merkle狀態樹中,均會包含與所有區塊鏈帳戶對應的資料節點,而並不需要多工該區塊或者該區塊之前的任一歷史區塊的歷史Merkle狀態樹上的任何資料節點。 例如,在實際應用中,在為某一目標區塊創建當前Merkle狀態樹時,由於上一區塊的當前Merkle狀態樹中會包含與所有區塊鏈帳戶對應的資料節點,因此可以直接在上一區塊的當前Merkle狀態樹的基礎上,對部分發生更新的資料節點進行修改更新,即可得到該目標區塊的當前Merkle狀態樹,而並不需要多工該區塊或者該區塊之前的任一歷史區塊的歷史Merkle狀態樹上的任何資料節點。 而對於區塊鏈中的任一區塊的歷史Merkle狀態樹來說,可以僅包含與該區塊中的交易相關的帳戶對應的資料節點,而對於與該區塊中的交易相關的帳戶以外的其它區塊鏈帳戶對應的資料節點,則可以直接多工該區塊之前的任一歷史區塊的歷史Merkle狀態樹上的資料節點;其中,具體的資料節點多工方式,具體仍然可以參考圖2以及與圖2相關部分的描述。 在本說明書中,接入區塊鏈的使用者用戶端,可以將資料打包成區塊鏈所支援的標準的交易格式,然後發佈至區塊鏈;而區塊鏈中的節點設備,可以基於搭載的共識演算法與其它節點設備一起,對使用者用戶端發佈至區塊鏈的這些交易進行共識,以此來為區塊鏈產生最新區塊;其中,具體的共識過程不再贅述。 而區塊鏈中的節點設備在執行了區塊鏈中的任一區塊中的交易之後,區塊鏈中與這些被執行的交易相關的目標帳戶的帳戶狀態,通常也會隨之發生變化;因此,節點設備在該區塊中的交易執行完畢後,可以根據上述目標帳戶發生帳戶更新前的歷史帳戶狀態(即最新區塊中的交易執行前的帳戶狀態)和發生帳戶更新後的最新帳戶狀態(即最新區塊中的交易執行後的帳戶狀態),來為該區塊分別創建當前Merkle狀態樹和歷史Merkle狀態樹。 其中,需要說明的是,在本說明書中,節點設備既可以執行區塊鏈中產生的最新區塊中的交易,也可以重新執行區塊鏈中的任一歷史區塊中的交易; 也即,在本說明書中,節點設備無論是執行了新產生的最新區塊中的交易,還是重新執行了任一歷史區塊中的交易,都可以基於該區塊中的交易執行完畢後,與這些被執行的交易相關的目標帳戶發生帳戶更新前的歷史帳戶狀態,和發生帳戶更新後的最新帳戶狀態,為執行的該區塊分別創建當前Merkle狀態樹和歷史Merkle狀態樹。 在本說明書中,當區塊鏈上的任一區塊中的交易執行完畢後,節點設備可以基於與該區塊中的交易相關的目標帳戶更新後的最新帳戶狀態,產生與該區塊的當前Merkle狀態樹對應的更新資料節點; 例如,在實現時,節點設備可以在上一區塊的當前Merkle狀態樹上,查詢與該區塊中的交易相關的目標帳戶對應的資料節點,並複製查詢到的這些資料節點;然後基於上述目標帳戶更新後的最新帳戶狀態,對複製的這些資料節點的value進行修改更新,得到上述更新資料節點。其中,對資料節點的value進行查找和更新的過程,具體仍然可以參考圖1以及與圖1相關部分的描述。 相應的,當區塊中的交易執行完畢後,節點設備還可以基於與該區塊中的交易相關的目標帳戶更新前的歷史帳戶狀態,產生與該區塊的歷史Merkle狀態樹對應的歷史資料節點; 例如,在實現時,節點設備也可以在上一區塊的歷史Merkle狀態樹上,查詢與該區塊中的交易相關的目標帳戶對應的資料節點,並複製查詢到的這些資料節點;然後基於上述目標帳戶更新前的歷史帳戶狀態,對複製的這些資料節點的value進行修改更新,得到上述歷史資料節點。 在示出的一種實現方式中,上述更新資料節點和歷史資料節點均可以表示成寫入集的形式。 在區塊中的交易的執行過程中,區塊鏈中的節點設備首先可以產生與該區塊中的交易對應的讀寫集(read-write set);對於產生的讀寫集,也可以在上述資料庫中進行儲存;例如,在實際應用中,對於產生的讀寫集,可以作為交易的執行日誌保存到該交易對應的收據(receipt)中。 其中,上述讀寫集具體用於記錄該區塊中的交易在執行前,與該交易相關的帳戶的帳戶狀態(即帳戶更新前的歷史帳戶狀態);以及,該區塊中的交易在執行完畢後,與該交易相關的帳戶的帳戶狀態(即帳戶更新後的最新帳戶狀態)。 例如,以區塊中的交易為轉帳交易為例,與該區塊中的交易對應的讀寫集可以表示成< account,Balance1,Balance2>的形式;其中,account表示與區塊中的交易相關的轉帳帳戶,Balance1表示該轉帳交易在執行前該轉帳帳戶的資金餘額,Balance2表示該轉帳交易在執行後該轉帳帳戶的資金餘額。 當區塊中的交易執行完畢後,節點設備可以根據產生的與該區塊中的交易對應的讀寫集,進一步產生與該區塊的Merkle狀態樹對應的寫入集;該寫入集具體用於描述需要寫入該區塊的Merkle狀態樹的資料節點。 其中,需要說明的是,由於在本說明書中,對於區塊鏈中的任一區塊來說,都有當前Merkle狀態樹和歷史Merkle狀態樹兩棵Merkle狀態樹;因此,當區塊中的交易執行完畢後,節點設備可以根據產生的與該區塊中的交易對應的讀寫集,進一步產生雙份修改集;其中一份寫入集,為與該區塊的當前Merkle狀態樹對應的寫入集,該寫入集即為需要向該區塊的當前Merkle狀態樹寫入的資料節點(即上述更新資料節點);另一份寫入集,為與該區塊的當前Merkle狀態樹對應的寫入集,該寫入集即為需要向該區塊的歷史Merkle狀態樹寫入的資料節點(即上述歷史資料節點)。 在本說明書中,當節點設備基於與該區塊中的交易相關的目標帳戶更新後的最新帳戶狀態,產生了與該區塊的當前Merkle狀態樹對應的更新資料節點;以及,基於與該區塊中的交易相關的目標帳戶更新前的歷史帳戶狀態,產生了與該區塊的歷史Merkle狀態樹對應的歷史資料節點之後,可以基於產生的更新資料節點和歷史資料節點,來分別為該區塊創建當前Merkle狀態樹和歷史Merkle狀態樹; 一方面,節點設備具體可以在上一區塊的當前Merkle狀態樹的基礎上,對部分發生更新的資料節點進行修改更新,來為該區塊創建當前Merkle狀態樹。 在這種情況下,產生的上述更新資料節點,即為需要對上一區塊的當前Merkle狀態樹上進行修改更新的資料節點。節點設備可以在上述區塊的上一區塊的當前Merkle狀態樹上,查詢與上述目標帳戶對應的資料節點,並基於產生的上述更新資料節點對查詢到的這些資料節點進行修改更新。當修改更新完成後,即可得到該區塊的當前Merkle狀態樹。 例如,在實現時,如果上述更新資料節點表示成寫入集的形式,則可以基於該寫入集,對上述區塊的上一區塊的當前Merkle狀態樹上與上述目標帳戶對應的資料節點進行修改更新。 另一方面,節點設備也可以在上一區塊的歷史Merkle狀態樹的基礎上,重新創建添加部分發生更新的資料節點,並多工上一區塊的歷史Merkle狀態樹上與上述目標帳戶對應的資料節點以外的其它資料節點,為該區塊創建歷史Merkle狀態樹。 在這種情況下,產生的上述歷史資料節點,即為需要重新創建添加的資料節點。節點設備可以在上述區塊的上一區塊的歷史Merkle狀態樹上,查詢與上述目標帳戶對應的資料節點以外的其它資料節點,並多工這些查詢到的其它資料節點;然後,可以基於產生的上述歷史資料節點和多工的這些其它資料節點,為該區塊創建歷史Merkle狀態樹。其中,對資料節點的多工過程,具體仍然可以參考圖2以及與圖2相關部分的描述。 例如,在實現時,如果上述歷史資料節點也表示成寫入集的形式,則可以基於該寫入集,和多工的上述區塊的上一區塊的歷史Merkle狀態樹上與上述目標帳戶對應的資料節點以外的其它資料節點,為該區塊創建歷史Merkle狀態樹。 透過以上描述可知,對於歷史Merkle狀態樹上而言,更多的是涉及向歷史Merkle狀態樹上寫入新的歷史資料節點的操作,並不涉及到對資料節點進行修改更新的操作;因此,歷史Merkle狀態樹本身對於讀資料的性能的要求並不高; 而對於當前Merkle狀態樹而言,更多的是涉及對資料節點進行修改更新的操作;而且,在實際應用中,節點設備在執行交易的過程中,通常需要頻繁的調用當前Merkle狀態樹中維護的各區塊鏈帳戶的最新帳戶狀態;因此,當前Merkle狀態樹本身對於讀資料的性能以及修改資料的性能要求較高; 基於此,在實際應用中,將歷史Merkle狀態樹在資料庫中進行儲存時,可以採對寫入性能較高,而對讀性能要求不高的資料結構;而將當前Merkle狀態樹在資料庫中進行儲存時,可以採對讀性能和修改性能較高,對於寫入性能要求不高的資料結構。 在示出的一種實施方式中,可以將上述當前Merkle狀態樹上的資料節點組織成B+樹(balance+ tree)的資料結構在資料庫中儲存;將歷史Merkle狀態樹上的資料節點組織成LSM樹(Log-Structured Merge Tree)的資料結構在資料庫中儲存。其中,將當前Merkle狀態樹上的資料節點組織成B+樹(balance+ tree)的資料結構以及將歷史Merkle狀態樹上的資料節點組織成LSM樹的資料結構的具體方式,在本說明書中不再進行詳述。 在示出的一種實施方式中,上述資料庫,具體可以是Key-Value型資料庫;例如,在示出的一種實施方式中,上述資料庫可以為採用多層儲存結構的LevelDB資料庫;或者,基於LevelDB架構的資料庫;比如,Rocksdb資料庫就是一種典型的基於LevelDB資料庫架構的資料庫。 在這種情況下,無論是當前Merkle狀態樹還是歷史Merkle狀態樹,最終都會以Key-Value鍵值對的形式儲存至上述資料庫。 如前所述,由於歷史Merkle狀態樹仍然會存在多工之前區塊的歷史Merkle狀態樹上的資料節點的情況,而當前Merkle狀態樹則不必考慮資料節點多工的情況,更多的是涉及對資料節點的value進行修改;因此,基於這種特性上的差異,在將當前Merkle狀態樹和歷史Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存至上述資料庫時,可以為當前Merkle狀態樹和歷史Merkle狀態樹設計差異化的key鍵。 在示出的一種實施方式中,鑒於歷史Merkle狀態樹仍然會存在多工之前區塊的歷史Merkle狀態樹上的資料節點的情況,則歷史Merkle狀態樹上的資料節點在以Key-Value鍵值對的形式儲存至上述資料庫時,仍然可以採用該資料節點所包含的資料內容的hash值作為key。 而鑒於當前Merkle狀態樹具有對資料節點的value進行頻繁修改的需求,則當前Merkle狀態樹上的資料節點在以Key-Value鍵值對的形式儲存至上述資料庫時,可以採用該資料節點的節點ID作為key; 其中,在實際應用中,上述節點ID具體可以是上述Merkle狀態樹的根節點到該資料節點的路徑對應的字元前綴;或者,基於上述Merkle狀態樹的根節點到該資料節點的路徑對應的字元前綴映射得到的一個節點編號。 在本說明書中,當區塊鏈中的節點設備發生當機,則該節點設備在當機恢復時,可以將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為指定的目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態;其中,上述目標區塊具體可以是指上述最新區塊之前的任一歷史區塊。 請參見圖4,圖4為本說明書示出的一種對當前Merkle狀態樹進行狀態還原的示意圖。 假設上述目標區塊記為N1,上述最新區塊記為N2; 節點設備在當機恢復後,首先可以判定待恢復的目標區塊; 例如,在實際應用中,管理員可以在節點設備當機恢復後,可以透過輸入配置指令的形式,來指定需要恢復的目標區塊的區塊號。而節點設備可以透過解析管理員輸入的配置指令,來獲取上述目標區塊的區塊號。 在示出的一種實施方式中,節點設備在判定待恢復的目標區塊後,首先可以判定從上述區塊鏈的創世塊至上述目標區塊N1,所包含的交易的總數量,是否大於從上述目標區塊N1至上述最新區塊N2所包含的交易的總數量; 例如,在一種實現方式中,可以對上述區塊鏈支援的區塊格式進行改進,在每一個區塊的區塊頭中添加一個用於指示當前區塊的區塊體中包含的交易總數的欄位。而節點設備可以透過讀取各個區塊的區塊頭中的該欄位所記錄的數值,獲取到各個區塊中所包含的交易總數;進而,可以統計出從上述區塊鏈的創世塊至上述目標區塊N1所包含的交易的總數量;以及,從上述目標區塊N1至上述最新區塊N2所包含的交易的總數量,來完成比較。 請參見圖4,如果節點設備判定出,從創世塊至上述目標區塊N1,所包含的交易的總數量,小於或者等於從上述目標區塊N1至上述最新區塊N2所包含的交易的總數量,此時節點設備仍然可以基於以上描述的相關技術中的方法一或者方法二來完成狀態資料的還原。 反之,如果節點設備判定出,從創世塊至上述目標區塊N1,所包含的交易的總數量,大於從上述目標區塊N1至上述最新區塊N2所包含的交易的總數量,此時按照以上描述的相關技術中的方法一或者方法二來完成狀態資料的還原的代價較高;因此,可以透過疊代執行如圖4所示出的狀態恢復邏輯,來完成狀態資料的還原,直到將最新區塊N2的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為上述目標區塊N1的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態。 以下參照圖4,對疊代執行上述狀態恢復邏輯進行狀態資料還原的過程進行詳細描述。 請繼續參見圖4,首先,節點設備可以將當前正在執行的區塊N修改為上述最新區塊N2;也即,當前正在執行的區塊N的初始值為N2;其中,上述當前執行的區塊N,是指上述狀態恢復邏輯在軟體層面正在進行執行處理的區塊。 在將上述最新區塊N2判定為當前正在執行的區塊N後,節點設備可以進一步判定與上述最新區塊N2中的交易相關的目標帳戶; 其中,節點設備判定與上述最新區塊N2中的交易相關的目標帳戶的方式,在本說明書中不進行特別限定; 在示出的一種實施方式中,節點設備可以透過重新執行上述最新區塊N2中的交易,來判定上述最新區塊中的交易相關的目標帳戶; 例如,節點設備可以透過重新執行上述最新區塊N2中的交易,來產生與上述最新區塊中的交易對應的讀寫集,然後透過讀取讀寫集中記錄的帳戶位址,來明確上述最新區塊中的交易相關的目標帳戶。 在示出的另一種實施方式中,如果區塊鏈模型支援將在最新區塊中的交易的執行過程中產生的與該最新區塊對應的讀寫集,在資料庫中進行儲存;那麼,節點設備在判定上述最新區塊中的交易相關的目標帳戶時,也可以不重新執行上述最新區塊中的交易,而是直接在上述資料庫中查詢與該最新區塊對應的讀寫集,然後直接讀取該讀寫集中記錄的資料,來明確上述最新區塊中的交易相關的目標帳戶。 請繼續參見圖4,當節點設備在判定出上述最新區塊N2中的交易相關的目標帳戶之後,可以進一步查詢上述目標帳戶在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 其中,節點設備查詢上述目標帳戶在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態的具體方式,在本說明書中也不進行特別限定; 在示出的一種實施方式中,節點設備可以基於上述目標帳戶的帳戶位址在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上執行一次查詢(相當於根據帳戶位址執行一次精確查找,並不需要遍歷上一區塊的歷史Merkle狀態樹),判定出上述目標帳戶,在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 在示出的另一種實施方式中,如果區塊鏈模型支援將在最新區塊中的交易的執行過程中產生的與該最新區塊對應的讀寫集,在資料庫中進行儲存;那麼,節點設備在查詢上述目標帳戶在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態時,也可以不在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上執行查詢動作,而是在上述資料庫中查詢與該最新區塊的上一區塊對應的讀寫集,然後讀取該讀寫集中記錄的資料,來明確上述目標帳戶在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 當判定出上述目標帳戶,在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態之後,節點設備可以將上述最新區塊的當前Merkle狀態樹中與上述目標帳戶對應的最新帳戶狀態,修改為上述最新區塊N2的上一區塊的歷史Merkle狀態樹上與上述目標帳戶對應的歷史帳戶狀態; 例如,在實現時,節點設備可以根據上述目標帳戶在上述最新區塊N2的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態,產生對應於上述最新區塊的當前Merkle狀態樹的寫入集,然後基於產生的寫入集,對上述目標帳戶在上述最新區塊N2的當前Merkle狀態樹上對應的資料節點,進行修改更新。 當節點設備將將上述最新區塊的當前Merkle狀態樹中與上述目標帳戶對應的最新帳戶狀態,修改為上述最新區塊N2的上一區塊的歷史Merkle狀態樹上與上述目標帳戶對應的歷史帳戶狀態之後,上述最新區塊N2的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,已經還原至上述最新區塊N2的上一區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態。 此時,節點設備可以將當前正在執行的區塊N再次修改為上述最新區塊N2的上一區塊;然後重新執行以上描述的過程,直到將當前正在執行的區塊N修改為上述目標區塊N1時停止; 其中,需要說明的是,如圖4所示,當前正在執行的區塊N的取值,可以記為N=N2——;表示當前正在執行的區塊N以N2為初始值,每當疊代執行一次以上描述的狀態恢復邏輯之後,當前正在執行的區塊N的取值在N2的初始值的基礎上減去1。而節點設備將當前正在執行的區塊N修改為上述最新區塊N2的上一區塊的過程,相當於是將上述最新區塊N2的上一區塊,重新修改為最新區塊; 透過疊代以上描述的狀態恢復邏輯,可以逐個區塊進行反向的狀態還原,直到將最新區塊N2的當前Merkle狀態樹上與各區塊鏈帳戶對應的帳戶狀態,修改為目標區塊N1的歷史Merkle狀態樹與各區塊鏈帳戶對應的帳戶狀態時停止。 例如,假設N1=90;N2=100;在需要將第100號區塊對應的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,還原至第90號區塊對應的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態,按照以上描述的方法,首先將當前正在執行的區塊N設置為100,當按照以上方法將第100號區塊對應的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,還原至第99號區塊對應的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態之後,再將當前正在執行的區塊N修改為99(即將99號區塊重新設置為最新區塊),並重複以上的過程,直到當前正在執行的區塊N修改為90時停止。 以上技術方案中,由於採用的是反向逐個重放區塊中的交易,來完成狀態資料的還原;因此,當從創世塊至上述目標區塊N1,所包含的交易的總數量,顯著大於從上述目標區塊N1至上述最新區塊N2所包含的交易的總數量時,採用以上技術方案,相較於以上描述的相關技術中的方法一和方法二,可以顯著降低重播成本,可以在支援將帳戶狀態資料組織成當前Merkle狀態樹和歷史Merkle狀態樹的區塊鏈模型中,將各區塊鏈帳戶在最新區塊的當前Merkle狀態樹上對應的最新帳戶狀態,穩定高效的還原至各區塊鏈帳戶在最新區塊之前的任一歷史區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 與上述方法實施例相對應,本申請還提供了裝置的實施例。 與上述方法實施例相對應,本說明書還提供了一種區塊鏈狀態資料恢復裝置的實施例。 本說明書的區塊鏈狀態資料恢復裝置的實施例可以應用在電子設備上。裝置實施例可以透過軟體實現,也可以透過硬體或者軟硬體結合的方式實現。以軟體實現為例,作為一個邏輯意義上的裝置,是透過其所在電子設備的處理器將非揮發性記憶體中對應的電腦程式指令讀取到記憶體中運行形成的。 從硬體層面而言,如圖5所示,為本說明書的區塊鏈狀態資料恢復裝置所在電子設備的一種硬體結構圖,除了圖5所示的處理器、記憶體、網路介面、以及非揮發性記憶體之外,實施例中裝置所在的電子設備通常根據該電子設備的實際功能,還可以包括其他硬體,對此不再贅述。 圖6是本說明書一示例性實施例示出的一種區塊鏈狀態資料恢復裝置的方塊圖。 請參考圖6,所述區塊鏈狀態資料恢復裝置60可以應用在前述圖5所示的電子設備中,其中所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述裝置60包括: 判定模組601,判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 恢復模組602,疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 所述狀態恢復邏輯包括: 判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。 在本實施例中,所述判定模組601: 重新執行所述最新區塊中的交易,以判定所述最新區塊中的交易相關的目標帳戶;或者,查詢與所述最新區塊對應的讀寫集,以判定所述最新區塊中的交易相關的目標帳戶。 所述恢復模組602: 在所述最新區塊的上一區塊的歷史Merkle狀態樹上查詢與所述目標帳戶對應的歷史帳戶狀態;或者,在與所述最新區塊的上一區塊對應的讀寫集中,查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。 在本實施例中,所述恢復模組602進一步: 在疊代執行狀態恢復邏輯之前,判定從所述區塊鏈的創世塊至所述目標區塊所包含的交易的總數量,是否大於從所述目標區塊至所述最新區塊所包含的交易的總數量;如果是,進一步疊代執行所述狀態恢復邏輯。 在本實施例中,所述裝置60還包括: 產生模組603(圖6中未示出),在所述區塊鏈中的任一區塊中的交易執行完畢後,基於與所述區塊中的交易相關的目標帳戶的最新帳戶狀態,產生與所述區塊的當前Merkle狀態樹對應的更新資料節點和與所述最新區塊的歷史Merkle狀態樹對應的歷史資料節點; 修改模組604(圖6中未示出),基於產生的所述更新資料節點對所述區塊的上一區塊的當前Merkle狀態樹上與所述目標帳戶對應的資料節點進行修改更新,以得到所述區塊的當前Merkle狀態樹; 創建模組605(圖6中未示出),基於產生的所述歷史資料節點和多工的所述區塊的上一區塊的歷史Merkle狀態樹上與所述目標帳戶對應的資料節點以外的其它資料節點,為所述區塊創建歷史Merkle狀態樹。 在本實施例中,所述當前Merkle狀態樹上的資料節點被組織成B+樹的資料結構在資料庫中儲存;所述歷史Merkle狀態樹上的資料節點被組織成LSM樹的資料結構在資料庫中儲存。 在本實施例中,所述資料庫為Key-Value資料庫; 所述Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存在所述資料庫中;其中,所述當前Merkle狀態樹上的資料節點的key為所述資料節點的節點ID;所述歷史Merkle狀態樹上的資料節點的key為所述資料節點包含的資料內容的hash值。 在本實施例中,所述資料庫為LevelDB資料庫;或者基於LevelDB架構的資料庫。 在本實施例中,所述資料庫為基於LevelDB架構的Rocksdb資料庫。 在本實施例中,所述Merkle樹為融合了Trie字典樹的樹形結構的Merkle樹變種。 在本實施例中,所述 Merkle狀態樹為Merkle Patricia Tree狀態樹。 上述實施例闡明的系統、裝置、模組或單元,具體可以由電腦晶片或實體實現,或者由具有某種功能的產品來實現。一種典型的實現設備為電腦,電腦的具體形式可以是個人電腦、膝上型電腦、蜂巢式電話、相機電話、智慧型電話、個人數位助理、媒體播放機、導航設備、電子郵件收發設備、遊戲控制台、平板電腦、可穿戴設備或者這些設備中的任意幾種設備的組合。 在一個典型的配置中,電腦包括一個或多個處理器(CPU)、輸入/輸出介面、網路介面和記憶體。 記憶體可能包括電腦可讀媒體中的非永久性記憶體,隨機存取記憶體(RAM)和/或非揮發性記憶體等形式,如唯讀記憶體(ROM)或快閃記憶體(flash RAM)。記憶體是電腦可讀媒體的示例。 電腦可讀媒體包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現資訊儲存。資訊可以是電腦可讀指令、資料結構、程式的模組或其他資料。電腦的儲存媒體的例子包括,但不限於相變記憶體(PRAM)、靜態隨機存取記憶體(SRAM)、動態隨機存取記憶體(DRAM)、其他類型的隨機存取記憶體(RAM)、唯讀記憶體(ROM)、電可擦除可程式設計唯讀記憶體(EEPROM)、快閃記憶體或其他記憶體技術、唯讀光碟唯讀記憶體(CD-ROM)、數位多功能光碟(DVD)或其他光學儲存、磁盒式磁帶、磁片儲存、量子記憶體、基於石墨烯的儲存媒體或其他磁性存放裝置或任何其他非傳輸媒體,可用於儲存可以被計算設備存取的資訊。按照本文中的界定,電腦可讀媒體不包括暫存電腦可讀媒體(transitory media),如調變的資料訊號和載波。 還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,並不排除在包括所述要素的過程、方法、商品或者設備中還存在另外的相同要素。 上述對本說明書特定實施例進行了描述。其它實施例在所附申請專利範圍的範圍內。在一些情況下,在申請專利範圍中記載的動作或步驟可以按照不同於實施例中的順序來執行並且仍然可以實現期望的結果。另外,在圖式中描繪的過程不一定要求示出的特定順序或者連續順序才能實現期望的結果。在某些實施方式中,多工處理和並行處理也是可以的或者可能是有利的。 在本說明書一個或多個實施例使用的術語是僅僅出於描述特定實施例的目的,而非旨在限制本說明書一個或多個實施例。在本說明書一個或多個實施例和所附申請專利範圍中所使用的單數形式的“一種”、“所述”和“該”也旨在包括多數形式,除非上下文清楚地表示其他含義。還應當理解,本文中使用的術語“和/或”是指並包含一個或多個相關聯的列出專案的任何或所有可能組合。 應當理解,儘管在本說明書一個或多個實施例可能採用術語第一、第二、第三等來描述各種資訊,但這些資訊不應限於這些術語。這些術語僅用來將同一類型的資訊彼此區分開。例如,在不脫離本說明書一個或多個實施例範圍的情況下,第一資訊也可以被稱為第二資訊,類似地,第二資訊也可以被稱為第一資訊。取決於語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“回應於判定”。 以上所述僅為本說明書一個或多個實施例的較佳實施例而已,並不用以限制本說明書一個或多個實施例,凡在本說明書一個或多個實施例的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本說明書一個或多個實施例保護的範圍之內。
302,304:步驟 60:區塊鏈狀態資料恢復裝置 601:判定模組 602:恢復模組 603:產生模組 604:修改模組 605:創建模組
[圖1]是一示例性實施例提供的一種將區塊鏈的帳戶狀態資料組織成MPT狀態樹的示意圖; [圖2]是一示例性實施例提供的一種MPT狀態樹上的node多工的示意圖; [圖3]是一示例性實施例提供的一種區塊鏈狀態資料恢復方法的流程圖; [圖4]是一示例性實施例提供的一種對當前Merkle狀態樹進行狀態還原的示意圖; [圖5]是一示例性實施例提供的一種電子設備的結構示意圖; [圖6]是一示例性實施例提供的一種區塊鏈狀態恢復裝置的方塊圖。

Claims (22)

  1. 一種區塊鏈狀態資料恢復方法,所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述方法包括: 判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 所述狀態恢復邏輯包括: 判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。
  2. 根據請求項1所述的方法,所述判定與所述最新區塊中的交易相關的目標帳戶,包括: 重新執行所述最新區塊中的交易,以判定所述最新區塊中的交易相關的目標帳戶;或者,查詢與所述最新區塊對應的讀寫集,以判定所述最新區塊中的交易相關的目標帳戶; 所述查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態,包括: 在所述最新區塊的上一區塊的歷史Merkle狀態樹上查詢與所述目標帳戶對應的歷史帳戶狀態;或者,在與所述最新區塊的上一區塊對應的讀寫集中,查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。
  3. 根據請求項2所述的方法,所述疊代執行狀態恢復邏輯之前,還包括: 判定從所述區塊鏈的創世塊至所述目標區塊所包含的交易的總數量,是否大於從所述目標區塊至所述最新區塊所包含的交易的總數量;如果是,進一步疊代執行所述狀態恢復邏輯。
  4. 根據請求項1所述的方法,還包括: 在所述區塊鏈中的任一區塊中的交易執行完畢後,基於與所述區塊中的交易相關的目標帳戶的最新帳戶狀態,產生與所述區塊的當前Merkle狀態樹對應的更新資料節點和與所述區塊的歷史Merkle狀態樹對應的歷史資料節點; 基於產生的所述更新資料節點對所述區塊的上一區塊的當前Merkle狀態樹上與所述目標帳戶對應的資料節點進行修改更新,以得到所述區塊的當前Merkle狀態樹;以及, 基於產生的所述歷史資料節點和多工的所述區塊的上一區塊的歷史Merkle狀態樹上與所述目標帳戶對應的資料節點以外的其它資料節點,為所述區塊創建歷史Merkle狀態樹。
  5. 根據請求項4所述的方法,所述當前Merkle狀態樹上的資料節點被組織成B+樹的資料結構在資料庫中儲存;所述歷史Merkle狀態樹上的資料節點被組織成LSM樹的資料結構在資料庫中儲存。
  6. 根據請求項1所述的方法,所述資料庫為Key-Value資料庫; 所述Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存在所述資料庫中;其中,所述當前Merkle狀態樹上的資料節點的key為所述資料節點的節點ID;所述歷史Merkle狀態樹上的資料節點的key為所述資料節點包含的資料內容的hash值。
  7. 根據請求項1所述的方法,所述資料庫為LevelDB資料庫;或者基於LevelDB架構的資料庫。
  8. 根據請求項7所述的方法,所述資料庫為基於LevelDB架構的Rocksdb資料庫。
  9. 根據請求項1所述的方法,所述Merkle樹為融合了Trie字典樹的樹形結構的Merkle樹變種。
  10. 根據請求項9所述的方法,所述 Merkle狀態樹為Merkle Patricia Tree狀態樹。
  11. 一種區塊鏈狀態資料恢復裝置,所述區塊鏈中的帳戶狀態資料被組織成Merkle狀態樹在資料庫中儲存;所述Merkle狀態樹包括由各區塊鏈帳戶的最新帳戶狀態組織成的當前Merkle狀態樹;以及,由各區塊鏈帳戶的歷史帳戶狀態組織成的歷史Merkle狀態樹;所述裝置包括: 判定模組,判定待恢復的目標區塊;其中,所述目標區塊為所述區塊鏈的最新區塊之前的任一歷史區塊; 恢復模組,疊代執行狀態恢復邏輯,直到將最新區塊的當前Merkle狀態樹上與各區塊鏈帳戶對應的最新帳戶狀態,恢復為所述目標區塊的歷史Merkle狀態樹上與各區塊鏈帳戶對應的歷史帳戶狀態; 所述狀態恢復邏輯包括: 判定與所述最新區塊中的交易相關的目標帳戶,並查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態; 將所述最新區塊的當前Merkle狀態樹中與所述目標帳戶對應的最新帳戶狀態,修改為所述上一區塊的歷史Merkle狀態樹中與所述目標帳戶對應的歷史帳戶狀態,並在修改完成後將所述上一區塊重新判定為所述最新區塊。
  12. 根據請求項11所述的裝置,所述判定模組: 重新執行所述最新區塊中的交易,以判定所述最新區塊中的交易相關的目標帳戶;或者,查詢與所述最新區塊對應的讀寫集,以判定所述最新區塊中的交易相關的目標帳戶; 所述恢復模組: 在所述最新區塊的上一區塊的歷史Merkle狀態樹上查詢與所述目標帳戶對應的歷史帳戶狀態;或者,在與所述最新區塊的上一區塊對應的讀寫集中,查詢所述目標帳戶在所述最新區塊的上一區塊的歷史Merkle狀態樹上對應的歷史帳戶狀態。
  13. 根據請求項12所述的裝置,所述恢復模組進一步: 在疊代執行狀態恢復邏輯之前,判定從所述區塊鏈的創世塊至所述目標區塊所包含的交易的總數量,是否大於從所述目標區塊至所述最新區塊所包含的交易的總數量;如果是,進一步疊代執行所述狀態恢復邏輯。
  14. 根據請求項11所述的裝置,還包括: 產生模組,在所述區塊鏈中的任一區塊中的交易執行完畢後,基於與所述區塊中的交易相關的目標帳戶的最新帳戶狀態,產生與所述區塊的當前Merkle狀態樹對應的更新資料節點和與所述區塊的歷史Merkle狀態樹對應的歷史資料節點; 修改模組,基於產生的所述更新資料節點對所述區塊的上一區塊的當前Merkle狀態樹上與所述目標帳戶對應的資料節點進行修改更新,以得到所述區塊的當前Merkle狀態樹; 創建模組,基於產生的所述歷史資料節點和多工的所述區塊的上一區塊的歷史Merkle狀態樹上與所述目標帳戶對應的資料節點以外的其它資料節點,為所述區塊創建歷史Merkle狀態樹。
  15. 根據請求項14所述的裝置,所述當前Merkle狀態樹上的資料節點被組織成B+樹的資料結構在資料庫中儲存;所述歷史Merkle狀態樹上的資料節點被組織成LSM樹的資料結構在資料庫中儲存。
  16. 根據請求項11所述的裝置,所述資料庫為Key-Value資料庫; 所述Merkle狀態樹上的資料節點以Key-Value鍵值對的形式儲存在所述資料庫中;其中,所述當前Merkle狀態樹上的資料節點的key為所述資料節點的節點ID;所述歷史Merkle狀態樹上的資料節點的key為所述資料節點包含的資料內容的hash值。
  17. 根據請求項11所述的裝置,所述資料庫為LevelDB資料庫;或者基於LevelDB架構的資料庫。
  18. 根據請求項17所述的裝置,所述資料庫為基於LevelDB架構的Rocksdb資料庫。
  19. 根據請求項11所述的裝置,所述Merkle樹為融合了Trie字典樹的樹形結構的Merkle樹變種。
  20. 根據請求項19所述的裝置,所述 Merkle狀態樹為Merkle Patricia Tree狀態樹。
  21. 一種電子設備,包括: 處理器; 用於儲存處理器可執行指令的記憶體; 其中,所述處理器透過運行所述可執行指令以實現如請求項1-10中任一項所述的方法。
  22. 一種電腦可讀儲存媒體,其上儲存有電腦指令,其特徵在於,該指令被處理器執行時實現如請求項1-10中任一項所述方法的步驟。
TW109105604A 2019-07-31 2020-02-21 區塊鏈狀態資料恢復方法及裝置、電子設備 TWI732463B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN201910703814.4 2019-07-31
CN201910703814.4A CN110471795B (zh) 2019-07-31 2019-07-31 区块链状态数据恢复方法及装置、电子设备

Publications (2)

Publication Number Publication Date
TW202107455A true TW202107455A (zh) 2021-02-16
TWI732463B TWI732463B (zh) 2021-07-01

Family

ID=68509335

Family Applications (1)

Application Number Title Priority Date Filing Date
TW109105604A TWI732463B (zh) 2019-07-31 2020-02-21 區塊鏈狀態資料恢復方法及裝置、電子設備

Country Status (3)

Country Link
CN (1) CN110471795B (zh)
TW (1) TWI732463B (zh)
WO (1) WO2021017421A1 (zh)

Families Citing this family (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110471795B (zh) * 2019-07-31 2020-10-02 阿里巴巴集团控股有限公司 区块链状态数据恢复方法及装置、电子设备
US10761948B1 (en) 2019-07-13 2020-09-01 Alibaba Group Holding Limited Method, apparatus, and electronic device for restoring state data of blockchain
CN111159197A (zh) * 2019-12-31 2020-05-15 深圳市网心科技有限公司 一种数据存储方法、装置、设备及可读存储介质
CN111209341B (zh) * 2020-01-07 2023-03-14 北京众享比特科技有限公司 区块链的数据存储方法、装置、设备及介质
CN111309731A (zh) * 2020-02-18 2020-06-19 杭州复杂美科技有限公司 一种区块存储和查询方法、设备及存储介质
CN111400106B (zh) * 2020-03-27 2023-07-28 百度国际科技(深圳)有限公司 一种区块链账本同步方法、装置以及电子设备
CN112001731B (zh) * 2020-04-02 2022-05-24 支付宝(杭州)信息技术有限公司 区块链账户余额的存证、恢复方法及装置
CN111488606B (zh) * 2020-04-08 2021-04-27 北京瑞策科技有限公司 基于业务数据区块链的数据共享方法及装置
CN111611310A (zh) * 2020-04-28 2020-09-01 深圳壹账通智能科技有限公司 区块链数据裁剪方法、节点恢复方法、装置、设备及介质
CN111523896B (zh) * 2020-05-06 2023-05-30 杭州复杂美科技有限公司 防攻击方法、设备和存储介质
CN111597262B (zh) * 2020-05-14 2023-05-02 北京众享比特科技有限公司 一种区块链中的区块数据的管理方法和管理系统
CN111625598B (zh) * 2020-05-15 2023-08-25 南京东垚建筑科技研究院有限公司 一种工程协作区块链数据结构及应用方法
CN111651300B (zh) * 2020-06-05 2023-03-21 成都质数斯达克科技有限公司 一种区块链数据恢复方法、装置、设备及介质
CN113886135A (zh) * 2020-10-20 2022-01-04 支付宝(杭州)信息技术有限公司 一种区块链数据的恢复方法和装置
CN112800132B (zh) * 2021-01-12 2023-08-08 东北大学 一种电子档案的区块链存储方法
CN112765682B (zh) * 2021-04-07 2022-08-05 暗链科技(深圳)有限公司 区块分布式区块链的区块数据结构、存储介质及电子设备
CN112988911B (zh) * 2021-05-07 2021-09-24 支付宝(杭州)信息技术有限公司 区块链数据存储方法及装置、电子设备
CN112905607B (zh) * 2021-05-07 2022-02-01 支付宝(杭州)信息技术有限公司 区块链数据存储方法及装置、电子设备
CN113268544B (zh) * 2021-05-31 2023-06-27 新华三技术有限公司 一种数据处理方法及装置
CN114356927A (zh) * 2021-12-31 2022-04-15 杭州趣链科技有限公司 数据存储方法、装置、计算机设备和存储介质
CN114564539B (zh) * 2022-03-01 2022-11-25 山东大学 账户活跃度感知的区块链世界状态动态构建方法及系统
CN115174599A (zh) * 2022-05-13 2022-10-11 达闼机器人(成都)有限公司 业务归档节点创建及数据处理方法、装置、设备及介质
CN116032940B (zh) * 2023-02-20 2023-06-06 安徽中科晶格技术有限公司 基于宕机容忍的区块链见证共识方法、装置、设备及介质

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106383754A (zh) * 2016-09-19 2017-02-08 北京众享比特科技有限公司 一种基于区块链技术的数据库备份、恢复方法和系统
TWM543413U (zh) * 2016-12-05 2017-06-11 Taiwan United Financial Technology Co Ltd 利用區塊鏈技術進行交易的網路借貸平台
CN106815530B (zh) * 2016-12-26 2020-04-24 北京爱接力科技发展有限公司 数据存证方法、数据校验方法及装置
US10225273B2 (en) * 2017-01-27 2019-03-05 International Business Machines Corporation Secured event monitoring leveraging blockchain
CN111917864B (zh) * 2017-02-22 2023-08-22 创新先进技术有限公司 一种业务校验的方法及装置
US10320566B2 (en) * 2017-04-04 2019-06-11 International Business Machines Corporation Distributed logging of application events in a blockchain
US11348095B2 (en) * 2017-04-11 2022-05-31 Nchain Licensing Ag Rapid distributed consensus on blockchain
US11316696B2 (en) * 2017-09-29 2022-04-26 R3 Ltd. Hash subtrees for grouping components by component type
KR102417067B1 (ko) * 2017-12-08 2022-07-05 한국전자통신연구원 블록 체인 네트워크의 노드에서 수행되는 블록 생성 방법 및 장치
WO2019125069A1 (ko) * 2017-12-21 2019-06-27 바스아이디 랩 재팬 컴퍼니 리미티드 블록체인을 이용한 개인정보 분리 후 조합을 통한 인증 시스템
US11018850B2 (en) * 2017-12-26 2021-05-25 Akamai Technologies, Inc. Concurrent transaction processing in a high performance distributed system of record
CN108197226A (zh) * 2017-12-29 2018-06-22 山大地纬软件股份有限公司 Mptc账户状态树以及mptc区块链快速检索方法
US10896418B2 (en) * 2017-12-29 2021-01-19 Ebay Inc. Secure management of data files using a blockchain
CA3088610A1 (en) * 2018-01-17 2019-07-25 Geeq Corporation Blockchain methods, nodes, systems and products
CN108282474B (zh) * 2018-01-18 2020-04-17 山东大学 基于区块链的数字资产交易一致性的维护方法
US11210369B2 (en) * 2018-01-19 2021-12-28 Nasdaq, Inc. Systems and methods of digital content certification and verification using cryptography and blockchain
US20190228386A1 (en) * 2018-01-19 2019-07-25 Xapo Holdings Limited Recording evidence of address/account allocations in a distributed ledger
US10261711B1 (en) * 2018-01-25 2019-04-16 Merck Sharp & Dohme Corp. Proof of non-tampering for stored data
TWM561279U (zh) * 2018-02-12 2018-06-01 林俊良 用於處理金融資產之策略模型腳本之區塊鏈系統與節點伺服器
US10250381B1 (en) * 2018-02-22 2019-04-02 Capital One Services, Llc Content validation using blockchain
US10320569B1 (en) * 2018-04-05 2019-06-11 HOTYB, Inc. Systems and methods for authenticating a digitally signed assertion using verified evaluators
CN108923932B (zh) * 2018-07-10 2020-12-11 东北大学 一种去中心化协同验证系统及验证方法
CN109274481B (zh) * 2018-08-01 2020-03-27 中国科学院数据与通信保护研究教育中心 一种区块链的数据可追踪方法
CN109710620B (zh) * 2018-12-29 2021-03-16 杭州复杂美科技有限公司 数据存储方法、数据读取方法、设备和存储介质
CN109919756B (zh) * 2019-02-22 2023-04-18 西南财经大学 基于Merkle树回溯定位技术的转账系统、查验方法及交易方法
CN110471795B (zh) * 2019-07-31 2020-10-02 阿里巴巴集团控股有限公司 区块链状态数据恢复方法及装置、电子设备

Also Published As

Publication number Publication date
TWI732463B (zh) 2021-07-01
CN110471795A (zh) 2019-11-19
CN110471795B (zh) 2020-10-02
WO2021017421A1 (zh) 2021-02-04

Similar Documents

Publication Publication Date Title
TWI732463B (zh) 區塊鏈狀態資料恢復方法及裝置、電子設備
TWI740392B (zh) 同步區塊鏈狀態資料之電腦實施的方法、非暫時性電腦可讀的媒體及電腦實現的系統
TWI731595B (zh) 區塊鏈狀態資料儲存方法及裝置、電子設備
US11113272B2 (en) Method and apparatus for storing blockchain state data and electronic device
US10956444B2 (en) Block chain state data synchronization method, apparatus, and electronic device
TWI737157B (zh) 基於區塊鏈的分級儲存方法及裝置、電子設備
WO2020258853A1 (zh) 基于区块链的分级存储方法及装置、电子设备
WO2020258856A1 (zh) 基于区块链的分级存储方法及装置、电子设备
US10761948B1 (en) Method, apparatus, and electronic device for restoring state data of blockchain
US11036720B2 (en) Blockchain-based hierarchical data storage
US11386054B2 (en) Blockchain-based hierarchical data storage
US11288247B2 (en) Blockchain based hierarchical data storage
TW202107373A (zh) 基於區塊鏈的電子票據報銷方法及裝置、電子設備
WO2023160077A1 (zh) 区块链数据恢复方法及装置、电子设备
US20200279309A1 (en) Blockchain-based electronic bill cancellation method, apparatus, and electronic device
WO2024021419A1 (zh) 区块链数据存储方法及装置, 电子设备
WO2022233274A1 (zh) 区块链数据存储方法及装置、电子设备