區塊鏈教程Fabric1.0源代碼分析ledgerID數據庫-兄弟連區塊鏈教程

1、idStore概述

  • Fabric支持創建多個Ledger,不同Ledger以ledgerID區分。
  • 多個ledgerID及其創世區塊存儲在idStore數據庫中,idStore數據庫基於leveldb實現。
  • idStore默認使用路徑:/var/hyperledger/production/ledgersData/ledgerProvider/。
  • idStore庫中特殊key "underConstructionLedgerKey",用於標誌最新在建的ledgerID,ledgerID創建成功後或失敗時該標誌將清除,另外此標誌也用於異常時按ledgerID恢復數據。
  • idStore相關代碼集中在core/ledger/kvledger/kv_ledger_provider.go。

2、idStore結構體定義

leveldbhelper更詳細內容,參考:Fabric 1.0源代碼筆記 之 LevelDB(KV數據庫)

type idStore struct {
    db *leveldbhelper.DB
}
//代碼在core/ledger/kvledger/kv_ledger_provider.go

3、idStore方法定義

func openIDStore(path string) *idStore //按path創建並打開leveldb數據庫
func (s *idStore) setUnderConstructionFlag(ledgerID string) error //設置ledgerID在建標誌,將key爲"underConstructionLedgerKey",value爲ledgerID寫入庫
func (s *idStore) unsetUnderConstructionFlag() error //取消ledgerID在建標誌(確認構建失敗時),刪除key"underConstructionLedgerKey"
func (s *idStore) getUnderConstructionFlag() (string, error) //獲取ledgerID在建標誌(按ledgerID恢復時),按key"underConstructionLedgerKey",取ledgerID
func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error //創建LedgerID,即以ledgerID爲key,將創世區塊寫入庫
func (s *idStore) ledgerIDExists(ledgerID string) (bool, error) //查找ledgerID是否存在,即查庫中key爲ledgerID是否存在
func (s *idStore) getAllLedgerIds() ([]string, error) //獲取ledgerID列表
func (s *idStore) close() //關閉idStore leveldb數據庫
func (s *idStore) encodeLedgerKey(ledgerID string) []byte //爲ledgerID添加前綴即"l"
func (s *idStore) decodeLedgerID(key []byte) string //解除ledgerID前綴
//代碼在core/ledger/kvledger/kv_ledger_provider.go

func (s idStore) createLedgerID(ledgerID string, gb common.Block) error代碼如下:
將ledgerID和Block入庫,並清除ledgerID在建標誌。

func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error {
    key := s.encodeLedgerKey(ledgerID) //爲ledgerID添加前綴即"l"
    var val []byte
    var err error
    if val, err = proto.Marshal(gb); err != nil { //Block序列化
        return err
    }
    if val, err = s.db.Get(key); err != nil {
        return err
    }
    if val != nil {
        return ErrLedgerIDExists //ledgerID已存在
    }
    batch := &leveldb.Batch{}
    batch.Put(key, val) //ledgerID和Block入庫
    batch.Delete(underConstructionLedgerKey) //清除ledgerID在建標誌
    return s.db.WriteBatch(batch, true) //提交執行
}
//代碼在core/ledger/kvledger/kv_ledger_provider.go

感謝關注兄弟連區塊鏈教程分享!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章