1. 程式人生 > >2.05 hyperledger fabric賬本儲存

2.05 hyperledger fabric賬本儲存

1.賬本儲存概述

  • peer節點賬本儲存圖如下
    在這裡插入圖片描述
  • 左邊區塊鏈是狹義上的區塊儲存,底層是一個檔案系統,區塊並不是儲存在資料庫,而是直接儲存為檔案
  • 右下角的區塊索引用於查詢區塊,將區塊屬性與區塊位置關聯,例如根據區塊雜湊、高度、交易ID查詢區塊
  • 區塊索引的實現使用了levelDB,是一個內嵌的資料庫
  • fabric中不是一個區塊單獨存一個檔案,所以需要區塊索引去查詢
  • 右上角狀態資料庫是區塊鏈上的最新資料

2.交易讀寫集

  • 交易讀寫集(RWSet)有三個概念
    • 讀集
    • 寫集
    • 版本號
  • 交易驗證階段需要對交易讀寫集進行驗證
  • 交易模擬&驗證過程例子,現在假設有T1,T2,T3,T4和T5共5筆交易,所有模擬基於同一個世界狀態
    • 世界狀態:(k1,1,v1)(k2,1,v2)(k3,1,v3)(k4,1,v4)——key,version和value

    • T1通過驗證,因為它並沒有任何讀操作,並且世界狀態中k1和k2鍵的值分別更新為(k1,2,v1’)和(k2,2,v2’)

    • T2不能通過驗證,因為它讀取了k1鍵的值,該值在T1中被修改了

    • T3通過驗證,因為它並沒有任何讀操作。並且世界狀態中k2的值被更新為(k2,3,v2”)

    • T4不能通過驗證,因為它讀取了k2鍵的值,該值在T1中被修改了

    • T5通過驗證,雖然讀取了k5的值,但是k5的值之前交易並未修改過

3.賬本儲存其他概念

  • 世界狀態
    • 交易執行後所有鍵的最新值
    • 可以顯著提升鏈碼執行效率
  • 歷史資料索引
    • 啟用與否取決於智慧合約是否有查詢歷史的需求
    • 記錄某個鍵在某區塊的某條交易中被改變,只記錄改變動作,不記錄具體改變為了什麼
  • 區塊儲存
    • 區塊在fabric中以檔案塊儲存,檔名是blocfile_xxxxxx(加一個6位數的編號)
    • 現階段,每個檔案塊大小是64M,需要更改的話,需要修改peer原始碼重新編譯
  • 區塊讀取
    • 區塊檔案流
    • 區塊流
    • 區塊迭代器
  • 區塊索引
    • 快速定位區塊
    • 索引鍵:區塊高度、區塊雜湊、交易雜湊
  • 區塊提交
    • 儲存區塊檔案
    • 更新資料狀態

4.賬本儲存原始碼

  • 看core/ledger下的ledger_interface.go
  • 讀寫集分為交易讀寫集生成和交易讀寫集驗證兩個部分
  • 狀態資料庫
    • core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go
  • 歷史資料庫
    • core/ledger/kvledger/history/historydb/historyleveldb/historyleveldb.go
  • 區塊檔案讀取
    • common/ledger/blkstorage/fsblkstorage/ fs_blockstore.go

5.賬本儲存總結

  • 賬本儲存的介面定義,從總體上把握
  • 交易讀寫集校驗,防止雙花攻擊,比特幣是用最長鏈來防止的
  • 狀態資料庫及歷史狀態資料庫
  • 區塊檔案儲存及區塊索引