{"record":{"id":"baf3e5c5c6827451","repo":"hyperledger/fabric","slug":"orderer-transactions-are-not-supported-in-v3","errorCode":null,"errorMessage":"orderer transactions are not supported in v3","messagePattern":"orderer transactions are not supported in v3","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/verifier.go","lineNumber":185,"sourceCode":"\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 {\n\t\t\tv.Logger.Errorf(\"Error verifying config update: %v\", err)\n\t\t\treturn types.RequestInfo{}, err\n\t\t}\n\n\t\treqID := v.ReqInspector.RequestID(rawRequest)\n\t\tif v.ReqInspector.isEmpty(reqID) {\n\t\t\treturn types.RequestInfo{}, errors.Errorf(\"request id is empty\")\n\t\t}\n\n\t\treturn reqID, nil","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/verifier.go#L167-L203","documentation":"verifier guard: the request's channel header type is not ENDORSER_TRANSACTION while other transactions are present (noConfigAllowed). In Fabric v3 channels, legacy orderer-type transactions can no longer be batched with endorser transactions, so such requests are rejected.","triggerScenarios":"Submitting an envelope with HeaderType_ORDERER_TRANSACTION (e.g. created by old channel-creation tooling) to a BFT v3 channel.","commonSituations":"Using pre-v3 channel creation scripts or system-channel-style workflows against a SmartBFT channel; legacy tooling generating orderer transactions.","solutions":["Use the modern channel participation API / config update flow instead of ORDERER_TRANSACTION envelopes","Regenerate the request as a CONFIG update or an endorsed application transaction","Upgrade or replace legacy channel-management tooling to be v3-compatible"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if hdr.Type == int32(cb.HeaderType_ORDERER_TRANSACTION) {\n    return errors.New(\"orderer transactions unsupported; use config update flow\")\n}","typeGuard":"func isV3AllowedType(t int32) bool {\n    return t == int32(cb.HeaderType_CONFIG) || t == int32(cb.HeaderType_ENDORSER_TRANSACTION)\n}","tryCatchPattern":"if _, err := VerifyRequest(req); err != nil {\n    if strings.Contains(err.Error(), \"not supported in v3\") {\n        // rebuild request using modern channel management API\n    }\n}","preventionTips":["Replace legacy channel-creation tooling with the participation API","Do not build raw ORDERER_TRANSACTION envelopes","Audit scripts for pre-v3 assumptions"],"tags":["hyperledger-fabric","smartbft","v3","orderer-transaction"],"backgroundTag":"orderer-transaction-unsupported","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"}