github.com/renegr87/renegr87@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/validator/valimpl/default_impl.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package valimpl
     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  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate"
    14  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr"
    15  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/validator"
    16  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/validator/internal"
    17  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/validator/statebasedval"
    18  	"github.com/hyperledger/fabric/core/ledger/util"
    19  )
    20  
    21  var logger = flogging.MustGetLogger("valimpl")
    22  
    23  // DefaultImpl implements the interface validator.Validator
    24  // This performs the common tasks that are independent of a particular scheme of validation
    25  // and for actual validation of the public rwset, it encloses an internal validator (that implements interface
    26  // internal.InternalValidator) such as statebased validator
    27  type DefaultImpl struct {
    28  	txmgr              txmgr.TxMgr
    29  	db                 privacyenabledstate.DB
    30  	internalValidator  internal.Validator
    31  	customTxProcessors map[common.HeaderType]ledger.CustomTxProcessor
    32  }
    33  
    34  // NewStatebasedValidator constructs a validator that internally manages statebased validator and in addition
    35  // handles the tasks that are agnostic to a particular validation scheme such as parsing the block and handling the pvt data
    36  func NewStatebasedValidator(
    37  	txmgr txmgr.TxMgr,
    38  	db privacyenabledstate.DB,
    39  	customTxProcessors map[common.HeaderType]ledger.CustomTxProcessor,
    40  	hasher ledger.Hasher,
    41  ) validator.Validator {
    42  	return &DefaultImpl{
    43  		txmgr,
    44  		db,
    45  		&statebasedval.Validator{
    46  			DB:     db,
    47  			Hasher: hasher,
    48  		},
    49  		customTxProcessors,
    50  	}
    51  }
    52  
    53  // ValidateAndPrepareBatch implements the function in interface validator.Validator
    54  func (impl *DefaultImpl) ValidateAndPrepareBatch(blockAndPvtdata *ledger.BlockAndPvtData,
    55  	doMVCCValidation bool) (*privacyenabledstate.UpdateBatch, []*txmgr.TxStatInfo, error) {
    56  	block := blockAndPvtdata.Block
    57  	logger.Debugf("ValidateAndPrepareBatch() for block number = [%d]", block.Header.Number)
    58  	var internalBlock *internal.Block
    59  	var txsStatInfo []*txmgr.TxStatInfo
    60  	var pubAndHashUpdates *internal.PubAndHashUpdates
    61  	var pvtUpdates *privacyenabledstate.PvtUpdateBatch
    62  	var err error
    63  
    64  	logger.Debug("preprocessing ProtoBlock...")
    65  	if internalBlock, txsStatInfo, err = preprocessProtoBlock(
    66  		impl.txmgr,
    67  		impl.db.ValidateKeyValue,
    68  		block,
    69  		doMVCCValidation,
    70  		impl.customTxProcessors,
    71  	); err != nil {
    72  		return nil, nil, err
    73  	}
    74  
    75  	if pubAndHashUpdates, err = impl.internalValidator.ValidateAndPrepareBatch(internalBlock, doMVCCValidation); err != nil {
    76  		return nil, nil, err
    77  	}
    78  	logger.Debug("validating rwset...")
    79  	if pvtUpdates, err = validateAndPreparePvtBatch(
    80  		internalBlock,
    81  		impl.db,
    82  		pubAndHashUpdates,
    83  		blockAndPvtdata.PvtData,
    84  		impl.customTxProcessors,
    85  	); err != nil {
    86  		return nil, nil, err
    87  	}
    88  	logger.Debug("postprocessing ProtoBlock...")
    89  	postprocessProtoBlock(block, internalBlock)
    90  	logger.Debug("ValidateAndPrepareBatch() complete")
    91  
    92  	txsFilter := util.TxValidationFlags(block.Metadata.Metadata[common.BlockMetadataIndex_TRANSACTIONS_FILTER])
    93  	for i := range txsFilter {
    94  		txsStatInfo[i].ValidationCode = txsFilter.Flag(i)
    95  	}
    96  	return &privacyenabledstate.UpdateBatch{
    97  		PubUpdates:  pubAndHashUpdates.PubUpdates,
    98  		HashUpdates: pubAndHashUpdates.HashUpdates,
    99  		PvtUpdates:  pvtUpdates,
   100  	}, txsStatInfo, nil
   101  }