From 557c93657d865951805c9622befa18f643542bcc Mon Sep 17 00:00:00 2001 From: Fedor Partanskiy Date: Wed, 27 Dec 2023 01:39:18 +0300 Subject: [PATCH] change evaluate RequestId for update config tx Signed-off-by: Fedor Partanskiy --- orderer/consensus/smartbft/chain.go | 5 +++-- orderer/consensus/smartbft/util.go | 22 +++++++++++++++++++++ orderer/consensus/smartbft/verifier.go | 13 +++++++++++- orderer/consensus/smartbft/verifier_test.go | 2 ++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/orderer/consensus/smartbft/chain.go b/orderer/consensus/smartbft/chain.go index 1f87bb0ae2d..9f006157258 100644 --- a/orderer/consensus/smartbft/chain.go +++ b/orderer/consensus/smartbft/chain.go @@ -107,14 +107,15 @@ func NewChain( metricsWalBFT *wal.Metrics, bccsp bccsp.BCCSP, ) (*BFTChain, error) { + logger := flogging.MustGetLogger("orderer.consensus.smartbft.chain").With(zap.String("channel", support.ChannelID())) + requestInspector := &RequestInspector{ ValidateIdentityStructure: func(_ *msp.SerializedIdentity) error { return nil }, + Logger: logger, } - logger := flogging.MustGetLogger("orderer.consensus.smartbft.chain").With(zap.String("channel", support.ChannelID())) - c := &BFTChain{ RuntimeConfig: &atomic.Value{}, Channel: support.ChannelID(), diff --git a/orderer/consensus/smartbft/util.go b/orderer/consensus/smartbft/util.go index e2bf9779c69..cf0a9383df0 100644 --- a/orderer/consensus/smartbft/util.go +++ b/orderer/consensus/smartbft/util.go @@ -254,6 +254,7 @@ type request struct { // RequestInspector inspects incomming requests and validates serialized identity type RequestInspector struct { ValidateIdentityStructure func(identity *msp.SerializedIdentity) error + Logger *flogging.FabricLogger } func (ri *RequestInspector) requestIDFromSigHeader(sigHdr *cb.SignatureHeader) (types.RequestInfo, error) { @@ -283,6 +284,22 @@ func (ri *RequestInspector) RequestID(rawReq []byte) types.RequestInfo { if err != nil { return types.RequestInfo{} } + + if req.chHdr.Type == int32(cb.HeaderType_CONFIG) { + configEnvelope := &cb.ConfigEnvelope{} + _, err = protoutil.UnmarshalEnvelopeOfType(req.envelope, cb.HeaderType_CONFIG, configEnvelope) + if err != nil { + ri.Logger.Errorf("can't get config envelope: %s", err.Error()) + return types.RequestInfo{} + } + + req, err = ri.unwrapReqFromEnvelop(configEnvelope.LastUpdate) + if err != nil { + ri.Logger.Errorf("can't unwrap request from last update: %s", err.Error()) + return types.RequestInfo{} + } + } + reqInfo, err := ri.requestIDFromSigHeader(req.sigHdr) if err != nil { return types.RequestInfo{} @@ -295,6 +312,11 @@ func (ri *RequestInspector) unwrapReq(req []byte) (*request, error) { if err != nil { return nil, err } + + return ri.unwrapReqFromEnvelop(envelope) +} + +func (ri *RequestInspector) unwrapReqFromEnvelop(envelope *cb.Envelope) (*request, error) { payload := &cb.Payload{} if err := proto.Unmarshal(envelope.Payload, payload); err != nil { return nil, errors.Wrap(err, "failed unmarshaling payload") diff --git a/orderer/consensus/smartbft/verifier.go b/orderer/consensus/smartbft/verifier.go index 70c2d662cfb..9b5a4a9b865 100644 --- a/orderer/consensus/smartbft/verifier.go +++ b/orderer/consensus/smartbft/verifier.go @@ -190,11 +190,22 @@ func (v *Verifier) verifyRequest(rawRequest []byte, noConfigAllowed bool) (types } if req.chHdr.Type == int32(cb.HeaderType_CONFIG) { - err := v.ConfigValidator.ValidateConfig(req.envelope) + err = v.ConfigValidator.ValidateConfig(req.envelope) if err != nil { v.Logger.Errorf("Error verifying config update: %v", err) return types.RequestInfo{}, err } + + configEnvelope := &cb.ConfigEnvelope{} + _, err = protoutil.UnmarshalEnvelopeOfType(req.envelope, cb.HeaderType_CONFIG, configEnvelope) + if err != nil { + return types.RequestInfo{}, err + } + + req, err = v.ReqInspector.unwrapReqFromEnvelop(configEnvelope.LastUpdate) + if err != nil { + return types.RequestInfo{}, nil + } } return v.ReqInspector.requestIDFromSigHeader(req.sigHdr) diff --git a/orderer/consensus/smartbft/verifier_test.go b/orderer/consensus/smartbft/verifier_test.go index e4da1686363..09bccbd2c04 100644 --- a/orderer/consensus/smartbft/verifier_test.go +++ b/orderer/consensus/smartbft/verifier_test.go @@ -111,6 +111,7 @@ func TestVerifyConsenterSig(t *testing.T) { ValidateIdentityStructure: func(_ *msp.SerializedIdentity) error { return nil }, + Logger: logger, } cv := &mocks.ConsenterVerifier{} @@ -415,6 +416,7 @@ func TestVerifyProposal(t *testing.T) { ValidateIdentityStructure: func(_ *msp.SerializedIdentity) error { return nil }, + Logger: logger, } lastHash := hex.EncodeToString(protoutil.BlockHeaderHash(lastBlock.Header))