github.com/Hnampk/fabric@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 }