1. 程式人生 > >Hyperledger Fabric基礎之賬本

Hyperledger Fabric基礎之賬本

參考https://hyperledger-fabric.readthedocs.io/en/release-1.2/ledger/ledger.html

Ledger記賬本是Hyperdger Fabric基礎的最後一章。

記賬本我們天天都在使用,銀行卡,支付寶和微信支付,我們最關心的肯定是賬號上的餘額了(即資產的當前狀態),我想看下昨天我具體花了多少錢花在哪裡就需要看交易的流水明細。同理Hyperledger Fabric結構也是類似的,需要記錄Asset資產的當前狀態和交易的歷史。

區塊鏈的賬本

區塊鏈的賬本包含兩部分,world state(世界的狀態?整體的狀態?)和區塊鏈。

首先是World state 通常使用資料庫儲存一組賬本的當前的狀態值,這樣就不用遍歷所有的交易日誌去計算當前的狀態值,通常使用key-value鍵值對錶示,狀態值可被建立,更新和刪除。

其次是區塊鏈,記錄著決定world state狀態的交易日誌。交易的資訊會收集起來追加到區塊鏈,一旦寫入,就不能修改了。

World State

World state如上所述,程式和應用更多的時候需要獲取賬本當前的狀態值。

上面的例子, 有兩個車, 第一個車CAR1(key值/鍵值), 它的值是Audi。而CAR2的值就更完善些, 型別是BMW,紅色,歸屬於Jane。兩個車的版本號都是0。

賬本的狀態用於記錄在區塊鏈中共享的應用資訊,我們可以編寫程式呼叫鏈碼採訪這些狀態,例如通過key操作(查增刪)。

現實中,World state常用資料庫實現,資料庫對於讀取和儲存狀態都提供了高效的實現,是不是和no-sql中的couchdb, mongodb有點像 :-)

交易儲存了World state的變化,它是有生命週期的, 從應用發起到提交到區塊鏈儲存為止。 只是交易必須要足夠的背書節點簽名之後才可以更新world state.

我們注意到CAR的記錄都有版本號,狀態值變化,版本號就會增加。交易建立的時候會對應到狀態的版本號,如果交易記錄打包到區塊分發到其它節點,其它節點的賬本副本發現對應的狀態版本變了, 那麼這個交易記錄認為是無效的。 這個跟我們實際開發中常用的樂觀鎖的概念是類似的。

區塊鏈

我們學習下區塊鏈的大體結構。 區塊鏈是交易日誌,內部連線的區塊,每個區塊包含一系列的交易,每個交易代表一個查詢或更新world state的操作。

每個區塊的頭部包含了區塊所有交易的雜湊值,還有上一個區塊頭部的雜湊值,

有點像連結串列,這樣所有的交易就有序的串起來了,也可以保證資料的安全。即使儲存賬本的一個節點被篡改了,它不能讓其它有正確區塊記錄的記賬節點認同。

實際上,區塊鏈於world state不同,通常不使用資料庫儲存,通常使用檔案儲存。這是一個合理的設計選擇,因為區塊鏈的資料結構偏向於大量的小操作的集合, 區塊鏈追加資料是最常用的操作,而查詢頻率不高。

上圖為例, B0是第一個區塊,也稱為genesis block創世塊,沒交易記錄,只會儲存有通道,orderer,peer等資訊,後面我們實際部署配置的時候會用到創世塊。

區塊

(1)區塊頭部

頭部的數字編號,從0開始遞增。

當前區塊的雜湊值,例如下圖的CH2

上一塊區塊的雜湊值, 例如PH1

(2)區塊資料段

B2開始儲存的都是有序的交易日誌。

(3)區塊的元資料

包含區塊寫入的時間戳,證書,公鑰,寫入者的簽名,是否合法的標記位等。

交易

參考下圖交易資料的具體結構

(1)頭部

即上圖H4, 包含交易必要的元資料,例如對應的鏈碼和版本等。

(2)Sinature簽名

上圖S4, 由客戶端應用建立,使用客戶的私鑰做簽名。

(3)Proposal 提議

上圖P4, 封裝了應用提供給鏈碼使用的輸入引數,鏈碼執行,使用這些入參, 與現有world state一起使用,就能計算出新的world state.

(4)響應

R4, 儲存world state改變前後的狀態值,作為讀寫的結合。 這個就是鏈碼的響應,如果後面交易驗證通過了,賬本就按照響應去更新world state狀態值。

(5)Endorsements背書記錄

E4, 如之前章節所述,更新交易第一步發起提議後,需要背書節點的簽名,就在這裡記錄了。

World State資料庫的選擇

Hyperledger Fabric當前支援Level DB和CouchDB.

Level DB適合於簡單的key-value鍵值對,嵌入網路的peer節點程序。

CouchDB適合於複雜些的world state狀態要用JSON文件表示的場景,提供了更多的富查詢特性,與peer節點程序隔離開。

重要的是,Hyperledger Fabric作為state DB實現的level DB或couchDB都是可插拔的設計, 完全可能用其它的關係型資料庫或非關係型資料庫實現。

基礎完結, 後面我們會通過Hyperledger Fabric的入門例子, 實際操作和配置, 使用Go和Nodejs編寫聯鏈碼。

再之後估計就是學下更方便些的Hyperledger Composer的方式去開發部署區塊鏈。

但是相信有了前面這些核心基礎知識, 後面的學習會相對簡單很多。技術原本就是苦中作樂的事情,希望大家多些快樂。

更多關注