블록체인 자습서 Fabric1.0 소스 코드 분석 Ledger(장부) 2

7429 단어
블록체인 자습서 Fabric1.0 소스 코드 분석 Ledger 2.
Fabric 1.0 소스 코드 노트의 Ledger(장부)
PeerLedger 인터페이스에 포함된 commonledger를 추가합니다.Ledger 인터페이스는 다음과 같이 정의됩니다.
type Ledger interface {
    GetBlockchainInfo() (*common.BlockchainInfo, error) //  blockchain    
    GetBlockByNumber(blockNumber uint64) (*common.Block, error) //       Block,  math.MaxUint64     Block
    GetBlocksIterator(startBlockNumber uint64) (ResultsIterator, error) //   startBlockNumber      (  startBlockNumber),        ,  ledger    block  
    Close() //  ledger
    Commit(block *common.Block) error //   block
}
//   common/ledger/ledger_interface.go

ValidatedLedger 인터페이스에 방법이 정의되지 않았습니다.PeerLedger에서 잘못된 거래를 선별한 후,ValidatedLedger는 최종 장부를 표시합니다.잠시 소홀히 하다.
QueryExecutor 인터페이스 정의: 질의를 수행하는 데 사용됩니다.여기서 Get* 방법은 KV-based 데이터 모델을 지원하는 데 사용되며, ExecuteQuery 방법은 더욱 풍부한 데이터와 조회 지원을 지원하는 데 사용됩니다.
type QueryExecutor interface {
    GetState(namespace string, key string) ([]byte, error) // namespace key  value,  chaincode,chaincodeId  namespace
    GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error) //        key  
    //     ,    startKey、    endKeyd      
    GetStateRangeScanIterator(namespace string, startKey string, endKey string) (commonledger.ResultsIterator, error)
    ExecuteQuery(namespace, query string) (commonledger.ResultsIterator, error) //          ,     statedb
    Done() //  QueryExecutor     
}
//   core/ledger/ledger_interface.go

HistoryQueryExecutor 인터페이스 정의: 사용 내역 조회를 실행합니다.
type HistoryQueryExecutor interface {
    GetHistoryForKey(namespace string, key string) (commonledger.ResultsIterator, error) // key     
}
//   core/ledger/ledger_interface.go

TxSimulator 인터페이스 정의: "최신"상태의 일관된 스냅샷에서 거래를 시뮬레이션합니다.여기서 Set* 방법은 KV-based 데이터 모델을 지원하는 데 사용되며, ExecuteUpdate 방법은 더욱 풍부한 데이터와 조회 지원을 지원하는 데 사용된다.
type TxSimulator interface {
    QueryExecutor //  QueryExecutor  
    SetState(namespace string, key string, value []byte) error // namespace key  value
    DeleteState(namespace string, key string) error // namespace key  
    SetStateMultipleKeys(namespace string, kvs map[string][]byte) error //        key  
    ExecuteUpdate(query string) error //ExecuteUpdate           
    GetTxSimulationResults() ([]byte, error) //         
}
//   core/ledger/ledger_interface.go

4、kvledger.kvLedger 구조체 및 방법(PeerLedger 인터페이스 구현)
kvLedger 구조체 정의:
type kvLedger struct {
    ledgerID   string //ledgerID
    blockStore blkstorage.BlockStore //blkstorage
    txtmgmt    txmgr.TxMgr //txmgr
    historyDB  historydb.HistoryDB //historyDB
}
//   core/ledger/kvledger/kv_ledger.go

관련 방법은 다음과 같습니다.
//  kvLedger
func newKVLedger(ledgerID string, blockStore blkstorage.BlockStore,versionedDB statedb.VersionedDB, historyDB historydb.HistoryDB) (*kvLedger, error)
//          statedb historydb
func (l *kvLedger) recoverDBs() error
//         ,            db       ,    
func (l *kvLedger) recommitLostBlocks(firstBlockNum uint64, lastBlockNum uint64, recoverables ...recoverable) error
//   ID    
func (l *kvLedger) GetTransactionByID(txID string) (*peer.ProcessedTransaction, error)
//  BlockchainInfo
func (l *kvLedger) GetBlockchainInfo() (*common.BlockchainInfo, error)
//        
func (l *kvLedger) GetBlockByNumber(blockNumber uint64) (*common.Block, error)
//          
func (l *kvLedger) GetBlocksIterator(startBlockNumber uint64) (commonledger.ResultsIterator, error)
//     
func (l *kvLedger) GetBlockByHash(blockHash []byte) (*common.Block, error)
//   ID   
func (l *kvLedger) GetBlockByTxID(txID string) (*common.Block, error)
//   ID        
func (l *kvLedger) GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error)
func (l *kvLedger) Prune(policy commonledger.PrunePolicy) error //    
//       
func (l *kvLedger) NewTxSimulator() (ledger.TxSimulator, error)
//       
func (l *kvLedger) NewQueryExecutor() (ledger.QueryExecutor, error)
func (l *kvLedger) NewHistoryQueryExecutor() (ledger.HistoryQueryExecutor, error)
//     ,   blkstorage,            statedb,     historyDB
func (l *kvLedger) Commit(block *common.Block) error
//           
func (l *kvLedger) Close() //  
//   core/ledger/kvledger/kv_ledger.go

5、kvledger.Provider 구조체 및 방법(PeerLedgerProvider 인터페이스 구현)
Provider 구조체 정의:
type Provider struct {
    idStore            *idStore //idStore
    blockStoreProvider blkstorage.BlockStoreProvider //blkstorage
    vdbProvider        statedb.VersionedDBProvider //statedb
    historydbProvider  historydb.HistoryDBProvider //historydb
}
//   core/ledger/kvledger/kv_ledger_provider.go

4
  • idStore 상세 내용, 참조: Fabric 1.0 소스 코드 노트의 Ledger #idStore(ledgerID 데이터베이스)
  • 4
  • blkstorage 더 자세한 내용, 참조: Fabric 1.0 소스 코드 노트의 Ledger #blkstorage(block 파일 저장소)
  • 4
  • statedb 자세한 내용, 참조: Fabric 1.0 소스 코드 노트의 Ledger #statedb(상태 데이터베이스)
  • 4
  • Historydb 상세 내용, 참조: Fabric 1.0 소스 코드 노트의 Ledger #historydb(히스토리 데이터베이스)
  • 관련 방법은 다음과 같습니다.
    //    idStore、blockStoreProvider、vdbProvider historydbProvider,     Provider,           Ledger
    func NewProvider() (ledger.PeerLedgerProvider, error)
    //          Ledger,      (  blkstorage,    statedb,      historydb),  ledgerID
    func (provider *Provider) Create(genesisBlock *common.Block) (ledger.PeerLedger, error)
    //  provider.openInternal(ledgerID),  Ledger
    func (provider *Provider) Open(ledgerID string) (ledger.PeerLedger, error)
    // ledgerID  blkstorage、statedb historydb,   kvledger
    func (provider *Provider) openInternal(ledgerID string) (ledger.PeerLedger, error)
    //ledgerID    
    func (provider *Provider) Exists(ledgerID string) (bool, error)
    //  ledgerID  ,  provider.idStore.getAllLedgerIds()
    func (provider *Provider) List() ([]string, error)
    //  idStore、blkstorage、statedb、historydb
    func (provider *Provider) Close()
    //             Ledger,   
    func (provider *Provider) recoverUnderConstructionLedger()
    func (provider *Provider) runCleanup(ledgerID string) error //      
    func panicOnErr(err error, mgsFormat string, args ...interface{}) //panicOnErr
    //   core/ledger/kvledger/kv_ledger_provider.go

    6.ledgermgmt(Ledger 관리 함수)
    글로벌 변수:
    var openedLedgers map[string]ledger.PeerLedger //Ledger map,Key ChainID( ChannelId LedgerId)
    var ledgerProvider ledger.PeerLedgerProvider //LedgerProvider
    //   core/ledger/ledgermgmt/ledger_mgmt.go

    Ledger 관리 함수:
    func Initialize() //Ledger   ,  initialize(),once.Do       
    func initialize() //Ledger   ,     openedLedgers ledgerProvider
    //  ledgerProvider.Create(genesisBlock)  Ledger,   openedLedgers
    func CreateLedger(genesisBlock *common.Block) (ledger.PeerLedger, error) 
    // id Ledger,   ledgerProvider.Open(id)  Ledger
    func OpenLedger(id string) (ledger.PeerLedger, error) 
    //  ledgerID  ,  ledgerProvider.List()
    func GetLedgerIDs() ([]string, error)
    //  ledgerProvider
    func Close()
    //  closableLedger
    func wrapLedger(id string, l ledger.PeerLedger) ledger.PeerLedger
    //   core/ledger/ledgermgmt/ledger_mgmt.go

    closableLedger:
    type closableLedger struct {
        id string
        ledger.PeerLedger
    }
    
    func (l *closableLedger) Close() //  l.closeWithoutLock()
    func (l *closableLedger) closeWithoutLock() //delete(openedLedgers, l.id)
    //   core/ledger/ledgermgmt/ledger_mgmt.go

    좋은 웹페이지 즐겨찾기