各區塊鏈底層數據存儲分析,幫你了解它們的不同之處
互聯網的中心化發展模式是傳統網絡安全的的軟肋,區塊鏈作為一種去中心化、集體維護、不可篡改的新興技術,是對互聯網底層架構的革新,是對當今生產力和生產關系的變革。區塊鏈也被譽為是繼蒸汽機、電力、信息和互聯網科技之后,目前最有潛力觸發第五輪顛覆性革命浪潮的核心技術。
目前市場上主流的區塊鏈系統有比特幣,Ripple,以太坊和 Hyperledger Fabric 。本文的主要目的就是分析當前主要流行的區塊鏈的存儲技術以及他們之間的不同。
區塊鏈簡介
區塊鏈(英語:blockchain 或 block chain)是用分布式數據庫識別、傳播和記載信息的智能化對等網絡, 也稱為價值互聯網。中本聰于2008年在《比特幣白皮書》中提出“區塊鏈”概念,并在2009年創立了比特幣社會網絡,開發出***個區塊,即“創世區塊”。區塊鏈包含一張被稱為區塊的列表,有著持續增長并且排列整齊的記錄。每個區塊都包含一個時間戳和一個與前一區塊的鏈接,這樣設計區塊鏈使得數據不可篡改,一旦記錄下來,在一個區塊中的數據將不可逆。
其數據結構大致如下:
(區塊鏈結構)
數據存儲
1、比特幣
比特幣(英語:Bitcoin)是一種去中心化、全球通用、不需第三方機構或個人,基于區塊鏈作為支付技術的電子加密貨幣。它由中本聰于2009年1月3日,基于無國界的對等網絡,用共識主動性開源軟件發明創立,是加密貨幣及區塊鏈的始祖,也是目前知名度與市場總值***的加密貨幣。
比特幣存儲系統由普通文件和 kv 數據庫(levelDB)組成。普通文件用于存儲區塊鏈數據,kv 數據庫用于存儲區塊鏈元數據。
用于存儲區塊鏈數據的普通文件以 blk00000.dat , blk00001.dat 文件名格式組成,如圖2所示,其中 index 目錄存儲用于存儲區塊元數據。
(圖2)
為了快速檢索區塊數據每個文件的大小是128 M Bytes。每個區塊的數據(區塊頭和區塊里的所有交易)都會序列成字節碼的形式寫入 dat 文件中。
在序列化的過程中,如果檢測到當前寫入文件尺寸加上區塊尺寸大于 128 M Bytes,則會重新生成一個 dat 文件。具體的序列化過程如下所述:
- 獲取當前 dat 文件大小 npos,并將區塊大小追加寫入至 dat 文件中
- 序列化區塊數據和區塊中的交易數據,并將序列化的數據追加至 dat 文件中。
- ?在寫入數據的過程中,會生成區塊和交易相關的元數據。
區塊的元數據格式如 <blockHash,xxxxx+npos> 格式, 其中 xxxxx 為 dat 文件序號,npos 為區塊寫入 dat 文件的起始位置。
交易的元數據格式如 <txHash, xxxxx+npos+nTxOffset> 格式, 其中 xxxxx、npos 和上面的描述一致,nTxOffset 為寫入 dat 文件的起始位置(基于npos 位置)。
上述所有元數據都將寫入 kv 數據庫中,其中 blockhash/txHash 將作為后續查詢具體數據在 dat 文件中的索引使用。
綜上所述,在獲取鏈數據的時候只需傳入區哈?;蚴墙灰坠?,就能很容易的定位到區塊數據或是交易數據。
2、瑞波幣
Ripple 是世界上***個開放的支付網絡,通過這個支付網絡可以轉賬任意一種貨幣,包括美元、歐元、人民幣、日元或者比特幣,簡便易行快捷,交易確認在幾秒以內完成,交易費用幾乎是零,沒有所謂的跨行異地以及跨國支付費用。
Ripple 的區塊鏈數據存儲系統是由關系型數據庫(sqlite)和 kv 數據庫組成,其中關系型數據庫用來存儲區塊頭信息和每筆交易的具體信息, kv 數據庫主要存儲區塊頭、交易和狀態表序列化后的數據。 Ripple 這樣處理的主要目的是單純在查詢區塊頭信息和具體每筆交易的時候,可以直接從關系型數據庫中查找;而要構造整個區塊數據的時候,除了從關系型數據庫構造區塊頭信息外,還要依據區塊頭里的交易根哈希和狀態表根哈希從 kv 數據庫中獲取具體的交易和狀態表信息。這是 Ripple 和其他三種類型區塊鏈系統唯一***的不同。
區塊頭信息的序列化具體步驟:
- 用區塊的哈希作為 Key;
- 序列化區塊高度、區塊哈希、前一個區塊哈希、交易根哈希、狀態表根哈希等生成的數據作為 value;
- 將 <key, value> 存儲至 kv 數據庫中。
交易的序列化具體步驟:
- 用區塊頭中的交易根哈希作為 Key;
- 序列化交易哈希、交易類型、交易數據和 MetaData 等生成的數據作為 value;
- 將 <Key, value> 存儲至 kv 數據庫中。
下表分別是 Ledgers 和 Transactions 表結構。
數據存儲(二)
1、以太坊
以太坊是一個開源的有智能合約功能的公共區塊鏈平臺。通過其專用加密貨幣以太幣(Ether,又稱為「以太幣」)提供去中心化的虛擬機(稱為「以太虛擬機」Ethereum Virtual Machine)來處理點對點合約。
以太坊的區塊主要由區塊頭和交易組成,區塊在存儲的過程中分別將區塊頭和交易體經過 RLP 編碼后存入至 KV 數據當中。以太坊在數據存儲的過程中,每個 value 對應的key 都有相對應的前綴,不同類型的 value 對應不同的前綴。
區塊交易體的存儲過程如下:
1. 將區塊中的交易數據和叔塊頭信息進行 RLP 編碼從而生成存儲值value;
2. 將數據類型前綴,編碼后的區塊高度和區塊哈希拼接生成 key;
3.將存儲至db數據庫中。
區塊的信息可以通過區塊哈希和區塊高度進行檢索,其存儲過程如下:
1.將區塊頭信息進行 RLP 編碼從而生成存儲值 value
2.將區塊高度進行編碼(轉發成大端格式數據)生成encNum
3. 將數據類型前綴 (headerPrefix) 和 encNum 生成以區塊高度為檢索信息的 key
4.將存儲至db數據庫中,從而生成以區塊高度為檢索的信息
5.將數據類型前綴(blockHashPrefix)和區塊哈希生成以區塊哈希為檢索信息的key
6.將存儲至db數據庫中,從生成區塊哈希為檢索的信息
在數據查詢的時候,應用層只需要提供交易 hash、區塊高度和區塊哈希就能得到交易 key,從而查詢到相關的交易信息。
2、Hyperledger Fabric
Hyperledger fabric (HLF)是由Linux基金會主導推廣的區塊鏈開源項目。在Hyperledger Fabric的基礎上又衍生出了其他一些相關的項目。HyperLedger項目匯集了金融、銀行、物聯網、供應鏈、制造等各界開發人員的心血。目的是為了打造一個跨領域的區塊鏈應用。
HLF 的存儲系統和比特幣一樣,也是由普通的文件和 kv 的數據庫(levelDB/couchDB)組成。在 HLF 中,每個 channel 對應一個賬本目錄,在賬本目錄中由 blockfile_000000、blockfile_000001 命名格式的文件名組成。為了快速檢索區塊數據每個文件的大小是64 M Bytes。每個區塊的數據(區塊頭和區塊里的所有交易)都會序列成字節碼的形式寫入 blockfile 文件中。
HLF存儲區塊數據的文件名格式如圖所示:
HLF檢索信息文件如圖所示:
在序列化的過程中,程序以 append 方式打開 blockfile 文件,然后將區塊大小和和區塊數據寫入至 blockfile 文件中。
以下是區塊數據寫入的具體描述:
1.寫入區塊頭數據,依次寫入的數據為區塊高度、交易哈希和前一個區塊哈希;
2. 寫入交易數據,依次寫入的數據為區塊包含交易總量和每筆交易詳細數據;
3. 寫入區塊的Metadata 數據,依次寫入的數據為 Metadata 數據總量和每個 Metadata 項的數據詳細信息。
在寫入數據的過程中會以 kv 的形式保存區塊和交易在 blockfile 文件中的索引信息,以方便 HLF 的快速查詢。
HLF 區塊索引信息格式在 kv 數據庫中存儲的最終的 LevelKey 值有前綴標志和區塊 hash 組成,而 LevelValue 的值由區塊高度,區塊 hash,本地文件信息(文件名,文件偏移等信息),每個交易在文件中的偏移列表和區塊的 MetaData 組成, HLF 按照特定的編碼方式將上述的信息拼接成 db 數據庫中的 value 。
HLF交易索引信息格式在kv數據庫中存儲最終的LevelKey值由channel_name,chaincode_name和chaincode中的key值組合而成:
LevelKey = channel_name + []byte + chaincode_name + []byte + key
而 LevelValue 的值由BlockNum 區塊號,TxNum 交易在區塊中的編號組成, HLF 通過將區塊號和交易編號按照特定的方式編碼,然后與 chaincode 中的 value 相互拼接最終生成 db 數據庫中的 value 。
總結
綜上所述,本文介紹的主要區塊鏈除了 Ripple 使用的關系型數據庫存儲、檢索區塊數據外,其他三種類型的區塊鏈都使用 kv 數據庫存儲區塊鏈的檢索信息。在存儲、檢索數據上,比特幣和 Hyperledger Fabric 高度一致,即使用普通文件存儲區塊數據,使用 kv 數據庫存儲檢索信息;以太坊的區塊數據和檢索信息都存儲至 kv 數據庫中,而 Ripple 的區塊數據也會存儲至 kv 數據庫中。