{"record":{"id":"586c91d6c902aa3f","repo":"hyperledger/fabric","slug":"only-endorser-transactions-can-be-sent-with-other","errorCode":null,"errorMessage":"only endorser transactions can be sent with other transactions","messagePattern":"only endorser transactions can be sent with other transactions","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/verifier.go","lineNumber":175,"sourceCode":"func (v *Verifier) VerifyRequest(rawRequest []byte) (types.RequestInfo, error) {\n\treturn v.verifyRequest(rawRequest, false)\n}\n\nfunc (v *Verifier) verifyRequest(rawRequest []byte, noConfigAllowed bool) (types.RequestInfo, error) {\n\treq, err := v.ReqInspector.unwrapReq(rawRequest)\n\tif err != nil {\n\t\treturn types.RequestInfo{}, err\n\t}\n\n\terr = v.AccessController.Evaluate([]*protoutil.SignedData{\n\t\t{Identity: req.sigHdr.Creator, Data: req.envelope.Payload, Signature: req.envelope.Signature},\n\t})\n\tif err != nil {\n\t\treturn types.RequestInfo{}, errors.Wrap(err, \"access denied\")\n\t}\n\n\tif noConfigAllowed && req.chHdr.Type != int32(cb.HeaderType_ENDORSER_TRANSACTION) {\n\t\treturn types.RequestInfo{}, errors.Errorf(\"only endorser transactions can be sent with other transactions\")\n\t}\n\n\tif req.chHdr.ChannelId != v.Channel {\n\t\treturn types.RequestInfo{}, errors.Errorf(\"request is for channel %s but expected channel %s\", req.chHdr.ChannelId, v.Channel)\n\t}\n\n\tswitch req.chHdr.Type {\n\tcase int32(cb.HeaderType_CONFIG):\n\tcase int32(cb.HeaderType_ORDERER_TRANSACTION):\n\t\treturn types.RequestInfo{}, fmt.Errorf(\"orderer transactions are not supported in v3\")\n\tcase int32(cb.HeaderType_ENDORSER_TRANSACTION):\n\tdefault:\n\t\treturn types.RequestInfo{}, errors.Errorf(\"transaction of type %s is not allowed to be included in blocks\", cb.HeaderType_name[req.chHdr.Type])\n\t}\n\n\tif req.chHdr.Type == int32(cb.HeaderType_CONFIG) {\n\t\terr = v.ConfigValidator.ValidateConfig(req.envelope)\n\t\tif err != nil {","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/verifier.go#L157-L193","documentation":"In Smart BFT (v3) channels, when a batch already contains other transactions, configuration-like requests cannot be mixed in. verifyRequest rejects non-ENDORSER_TRANSACTION types when noConfigAllowed is set.","triggerScenarios":"A client submits a CONFIG or ORDERER_TRANSACTION envelope to the same batch/queue as regular transactions while config requests are disallowed in that context.","commonSituations":"Submitting channel config updates concurrently with application traffic through the request path; tooling that injects orderer transactions into a BFT v3 channel.","solutions":["Submit config updates when they can be processed separately from endorser transactions, per the channel's batching policy","Use the standard config-update flow so the leader sequences the config alone","Remove any ORDERER_TRANSACTION submissions — unsupported in v3"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if noConfigAllowed && hdr.Type != int32(cb.HeaderType_ENDORSER_TRANSACTION) {\n    return errors.New(\"config-like requests must be sent separately\")\n}","typeGuard":"func isEndorserTx(hdr *common.ChannelHeader) bool {\n    return hdr.Type == int32(cb.HeaderType_ENDORSER_TRANSACTION)\n}","tryCatchPattern":"if _, err := VerifyRequest(req); err != nil {\n    if strings.Contains(err.Error(), \"only endorser transactions\") {\n        // resubmit config update via its own path\n    }\n}","preventionTips":["Submit config updates separately from application traffic","Understand BFT v3 batching rules before mixing request types","Avoid legacy orderer transaction submissions"],"tags":["hyperledger-fabric","smartbft","transaction-type","batching"],"backgroundTag":"transaction-type-not-allowed","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}