hyperledger/fabric · error
orderer transactions are not supported in v3
Error message
orderer transactions are not supported in v3
What it means
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.
Source
Thrown at orderer/consensus/smartbft/verifier.go:185
err = v.AccessController.Evaluate([]*protoutil.SignedData{
{Identity: req.sigHdr.Creator, Data: req.envelope.Payload, Signature: req.envelope.Signature},
})
if err != nil {
return types.RequestInfo{}, errors.Wrap(err, "access denied")
}
if noConfigAllowed && req.chHdr.Type != int32(cb.HeaderType_ENDORSER_TRANSACTION) {
return types.RequestInfo{}, errors.Errorf("only endorser transactions can be sent with other transactions")
}
if req.chHdr.ChannelId != v.Channel {
return types.RequestInfo{}, errors.Errorf("request is for channel %s but expected channel %s", req.chHdr.ChannelId, v.Channel)
}
switch req.chHdr.Type {
case int32(cb.HeaderType_CONFIG):
case int32(cb.HeaderType_ORDERER_TRANSACTION):
return types.RequestInfo{}, fmt.Errorf("orderer transactions are not supported in v3")
case int32(cb.HeaderType_ENDORSER_TRANSACTION):
default:
return types.RequestInfo{}, errors.Errorf("transaction of type %s is not allowed to be included in blocks", cb.HeaderType_name[req.chHdr.Type])
}
if req.chHdr.Type == int32(cb.HeaderType_CONFIG) {
err = v.ConfigValidator.ValidateConfig(req.envelope)
if err != nil {
v.Logger.Errorf("Error verifying config update: %v", err)
return types.RequestInfo{}, err
}
reqID := v.ReqInspector.RequestID(rawRequest)
if v.ReqInspector.isEmpty(reqID) {
return types.RequestInfo{}, errors.Errorf("request id is empty")
}
return reqID, nilView on GitHub (pinned to 2736b63f8f)
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
Defensive patterns
Strategy: validation
Validate before calling
if hdr.Type == int32(cb.HeaderType_ORDERER_TRANSACTION) {
return errors.New("orderer transactions unsupported; use config update flow")
} Type guard
func isV3AllowedType(t int32) bool {
return t == int32(cb.HeaderType_CONFIG) || t == int32(cb.HeaderType_ENDORSER_TRANSACTION)
} Try / catch
if _, err := VerifyRequest(req); err != nil {
if strings.Contains(err.Error(), "not supported in v3") {
// rebuild request using modern channel management API
}
} Prevention
- Replace legacy channel-creation tooling with the participation API
- Do not build raw ORDERER_TRANSACTION envelopes
- Audit scripts for pre-v3 assumptions
When it happens
Trigger: Submitting an envelope with HeaderType_ORDERER_TRANSACTION (e.g. created by old channel-creation tooling) to a BFT v3 channel.
Common situations: Using pre-v3 channel creation scripts or system-channel-style workflows against a SmartBFT channel; legacy tooling generating orderer transactions.
Related errors
- consenter options type mismatch
- failed to unmarshal BFT metadata configuration
- invalid BFT metadata configuration
- invalid BFT consenter mapping configuration
- failed to marshal request envelope: proto: Marshal called wi
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/baf3e5c5c6827451.
Report an issue: GitHub.