hyperledger/fabric · error
service stream returned with invalid response type
Error message
service stream returned with invalid response type
What it means
BuildStepRespone only knows how to map a response whose payload is TranorderRes. If the ClusterNodeServiceStepResponse carries none of the recognized payload types, the conversion is impossible and this error is returned.
Source
Thrown at orderer/common/cluster/commauth.go:342
return nil, errors.New("service message type not valid")
}
func BuildStepRespone(stepResponse *orderer.ClusterNodeServiceStepResponse) (*orderer.StepResponse, error) {
if stepResponse == nil {
return nil, errors.New("input response object is nil")
}
if respPayload := stepResponse.GetTranorderRes(); respPayload != nil {
stepResponse := &orderer.StepResponse{
Payload: &orderer.StepResponse_SubmitRes{
SubmitRes: &orderer.SubmitResponse{
Channel: respPayload.Channel,
Status: respPayload.Status,
},
},
}
return stepResponse, nil
}
return nil, errors.New("service stream returned with invalid response type")
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Ensure all cluster nodes run a compatible fabric version so responses use the TranorderRes payload
- Log/inspect the raw response type to identify which variant was returned
- Return a typed error upstream so Recv can retry against a different node
Defensive patterns
Strategy: try-catch
Validate before calling
if stepResponse != nil && stepResponse.GetTranorderRes() == nil {
return fmt.Errorf("unsupported step response payload type")
} Type guard
func isTranorderRes(r *orderer.ClusterNodeServiceStepResponse) bool {
return r != nil && r.GetTranorderRes() != nil
} Try / catch
resp, err := BuildStepRespone(stepResponse)
if err != nil {
return fmt.Errorf("cannot convert node response: %w", err)
} Prevention
- Keep fabric versions uniform across orderer cluster nodes
- Switch on the response oneof explicitly and log unknown variants
- Add integration tests for every response payload variant
When it happens
Trigger: Calling BuildStepRespone with a response whose GetTranorderRes() returns nil — e.g. the peer sent a status-only or unrecognized response variant on the cluster Step stream.
Common situations: Mixed-version fabric nodes where the remote orderer responds with a payload type this node doesn't understand; a misrouted request hitting a node that answers with a non-TranorderRes message.
Related errors
- invalid request object
- Message is neither a Submit nor Consensus request
- input response object is nil
- message is neither a Submit nor a Consensus request
- First message needs to be a register
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/67e20ed09830524f.
Report an issue: GitHub.