1. 程式人生 > >【乾貨】各區塊鏈底層資料儲存分析(一)

【乾貨】各區塊鏈底層資料儲存分析(一)

網際網路的中心化發展模式是傳統網路安全的的軟肋,區塊鏈作為一種去中心化、集體維護、不可篡改的新興技術,是對網際網路底層架構的革新,是對當今生產力和生產關係的變革。區塊鏈也被譽為是繼蒸汽機、電力、資訊和網際網路科技之後,目前最有潛力觸發第五輪顛覆性革命浪潮的核心技術。

目前市場上主流的區塊鏈系統有比特幣,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 表結構。

列名

型別

含義

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

未完待續......