兄弟連區塊鏈教程Fabric1.0原始碼分析ledgerID資料
阿新 • • 發佈:2018-11-01
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