【乾貨】各區塊鏈底層資料儲存分析(一)
網際網路的中心化發展模式是傳統網路安全的的軟肋,區塊鏈作為一種去中心化、集體維護、不可篡改的新興技術,是對網際網路底層架構的革新,是對當今生產力和生產關係的變革。區塊鏈也被譽為是繼蒸汽機、電力、資訊和網際網路科技之後,目前最有潛力觸發第五輪顛覆性革命浪潮的核心技術。
目前市場上主流的區塊鏈系統有比特幣,Ripple,以太坊和 Hyperledger Fabric 。本文的主要目的就是分析當前主要流行的區塊鏈的儲存技術以及他們之間的不同。
區塊鏈簡介區塊鏈(英語:blockchain 或 block chain)是用分散式資料庫識別、傳播和記載資訊的智慧化對等網路, 也稱為價值網際網路。中本聰於
其資料結構大致如下:
(區塊鏈結構)
比特幣(英語: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 表結構。
列名 |
型別 |
含義 |
LedgerHash |
CHARACTER |
雜湊值 |
LedgerSeq |
BIGINT UNSIGNED |
Ledger 序號 |
PrevHash |
CHARACTER |
前個 Ledger 的 Hash 值 |
TotalCoins |
BIGINT UNSIGNED |
當前網路上的 XR P總數(交易會銷燬 XRP ) |
ClosingTime |
BIGINT UNSIGNED |
關閉時間 |
PrevClosingTime |
BIGINT UNSIGNED |
前一個區塊的關閉時間 |
CloseTimeRes |
BIGINT UNSIGNED |
ledger 關閉時間的解決方案(2-120 S) |
CloseFlags |
BIGINT UNSIGNED |
標識 ledger 的關閉方式,一般都是0 |
AccountSetHash |
CHARACTER |
stateMap 根結點 hash |
TransSetHash |
CHARACTER |
txMap 根節點雜湊 |
(表1:Ledgers )
列名 |
型別 |
含義 |
TransID |
CHARACTER |
交易 hash |
TransType |
CHARACTER |
交易型別 |
FromAcct |
CHARACTER |
交易的發起賬戶 |
FromSeq |
BIGINT UNSIGNED |
交易在賬戶中的序號 |
LedgerSeq |
BIGINT UNSIGNED |
交易落在哪個區塊上 |
Status |
CHARACTER |
交易的狀態 V 表示“共識過” |
RawTxn |
BLOB |
交易序列化資料 |
TxnMeta |
BLOB |
交易 metaData 的序列化資料 |
(表2:Transactions )
未完待續......