github.com/suchongming/fabric@v2.1.1+incompatible/core/committer/committer_impl.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package committer
     8  
     9  import (
    10  	"github.com/hyperledger/fabric-protos-go/common"
    11  	"github.com/hyperledger/fabric/common/flogging"
    12  	"github.com/hyperledger/fabric/core/ledger"
    13  )
    14  
    15  var logger = flogging.MustGetLogger("committer")
    16  
    17  //--------!!!IMPORTANT!!-!!IMPORTANT!!-!!IMPORTANT!!---------
    18  // This is used merely to complete the loop for the "skeleton"
    19  // path so we can reason about and  modify committer component
    20  // more effectively using code.
    21  
    22  // PeerLedgerSupport abstract out the API's of ledger.PeerLedger interface
    23  // required to implement LedgerCommitter
    24  type PeerLedgerSupport interface {
    25  	GetPvtDataAndBlockByNum(blockNum uint64, filter ledger.PvtNsCollFilter) (*ledger.BlockAndPvtData, error)
    26  
    27  	GetPvtDataByNum(blockNum uint64, filter ledger.PvtNsCollFilter) ([]*ledger.TxPvtData, error)
    28  
    29  	CommitLegacy(blockAndPvtdata *ledger.BlockAndPvtData, commitOpts *ledger.CommitOptions) error
    30  
    31  	CommitPvtDataOfOldBlocks(reconciledPvtdata []*ledger.ReconciledPvtdata) ([]*ledger.PvtdataHashMismatch, error)
    32  
    33  	GetBlockchainInfo() (*common.BlockchainInfo, error)
    34  
    35  	DoesPvtDataInfoExist(blockNum uint64) (bool, error)
    36  
    37  	GetBlockByNumber(blockNumber uint64) (*common.Block, error)
    38  
    39  	GetConfigHistoryRetriever() (ledger.ConfigHistoryRetriever, error)
    40  
    41  	GetMissingPvtDataTracker() (ledger.MissingPvtDataTracker, error)
    42  
    43  	Close()
    44  }
    45  
    46  // LedgerCommitter is the implementation of  Committer interface
    47  // it keeps the reference to the ledger to commit blocks and retrieve
    48  // chain information
    49  type LedgerCommitter struct {
    50  	PeerLedgerSupport
    51  }
    52  
    53  // NewLedgerCommitter is a factory function to create an instance of the committer
    54  // which passes incoming blocks via validation and commits them into the ledger.
    55  func NewLedgerCommitter(ledger PeerLedgerSupport) *LedgerCommitter {
    56  	return &LedgerCommitter{PeerLedgerSupport: ledger}
    57  }
    58  
    59  // CommitLegacy commits blocks atomically with private data
    60  func (lc *LedgerCommitter) CommitLegacy(blockAndPvtData *ledger.BlockAndPvtData, commitOpts *ledger.CommitOptions) error {
    61  	// Committing new block
    62  	if err := lc.PeerLedgerSupport.CommitLegacy(blockAndPvtData, commitOpts); err != nil {
    63  		return err
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  // GetPvtDataAndBlockByNum retrieves private data and block for given sequence number
    70  func (lc *LedgerCommitter) GetPvtDataAndBlockByNum(seqNum uint64) (*ledger.BlockAndPvtData, error) {
    71  	return lc.PeerLedgerSupport.GetPvtDataAndBlockByNum(seqNum, nil)
    72  }
    73  
    74  // LedgerHeight returns recently committed block sequence number
    75  func (lc *LedgerCommitter) LedgerHeight() (uint64, error) {
    76  	info, err := lc.GetBlockchainInfo()
    77  	if err != nil {
    78  		logger.Errorf("Cannot get blockchain info, %s", info)
    79  		return 0, err
    80  	}
    81  
    82  	return info.Height, nil
    83  }
    84  
    85  // DoesPvtDataInfoExistInLedger returns true if the ledger has pvtdata info
    86  // about a given block number.
    87  func (lc *LedgerCommitter) DoesPvtDataInfoExistInLedger(blockNum uint64) (bool, error) {
    88  	return lc.DoesPvtDataInfoExist(blockNum)
    89  }
    90  
    91  // GetBlocks used to retrieve blocks with sequence numbers provided in the slice
    92  func (lc *LedgerCommitter) GetBlocks(blockSeqs []uint64) []*common.Block {
    93  	var blocks []*common.Block
    94  
    95  	for _, seqNum := range blockSeqs {
    96  		if blck, err := lc.GetBlockByNumber(seqNum); err != nil {
    97  			logger.Errorf("Not able to acquire block num %d, from the ledger skipping...", seqNum)
    98  			continue
    99  		} else {
   100  			logger.Debug("Appending next block with seqNum = ", seqNum, " to the resulting set")
   101  			blocks = append(blocks, blck)
   102  		}
   103  	}
   104  
   105  	return blocks
   106  }