hyperledger/fabric · error
failed unmarshalling gossip envelope to alive message
Error message
failed unmarshalling gossip envelope to alive message
What it means
When converting the peer's MembershipInfo envelope to a SignedGossipMessage via gprotoext.EnvelopeToGossipMessage fails, the error is wrapped as "failed unmarshalling gossip envelope to alive message". The payload bytes are not a valid gossip Alive message — corrupt, truncated, or of an unexpected message type (possibly from a different Fabric protocol version).
Source
Thrown at discovery/client/client.go:537
peer, err := endorser(p, desc.Chaincode, channel)
if err != nil {
return nil, errors.Wrap(err, "failed creating endorser object")
}
endorsers = append(endorsers, peer)
}
descriptor.endorsersByGroups[grp] = endorsers
}
return descriptor, nil
}
func endorser(peer *discovery.Peer, chaincode, channel string) (*Peer, error) {
if peer.MembershipInfo == nil || peer.StateInfo == nil {
return nil, errors.Errorf("received empty envelope(s) for endorsers for chaincode %s, channel %s", chaincode, channel)
}
aliveMsg, err := gprotoext.EnvelopeToGossipMessage(peer.MembershipInfo)
if err != nil {
return nil, errors.Wrap(err, "failed unmarshalling gossip envelope to alive message")
}
stateInfMsg, err := gprotoext.EnvelopeToGossipMessage(peer.StateInfo)
if err != nil {
return nil, errors.Wrap(err, "failed unmarshalling gossip envelope to state info message")
}
if err := validateAliveMessage(aliveMsg); err != nil {
return nil, errors.Wrap(err, "failed validating alive message")
}
if err := validateStateInfoMessage(stateInfMsg); err != nil {
return nil, errors.Wrap(err, "failed validating stateInfo message")
}
sID := &msp.SerializedIdentity{}
if err := proto.Unmarshal(peer.Identity, sID); err != nil {
return nil, errors.Wrap(err, "failed unmarshalling peer's identity")
}
return &Peer{
Identity: peer.Identity,
StateInfoMessage: stateInfMsg,View on GitHub (pinned to 2736b63f8f)
Solutions
- Unwrap the inner error to see whether it's an unmarshal failure or a wrong message type
- Align Fabric client and peer versions (gossip proto compatibility)
- Retry the discovery query to get a fresh response from the server
- Restart the peer's gossip service / clear stale discovery state if corruption persists
- Validate that no intermediary (proxy, cache) is mangling discovery responses
Defensive patterns
Strategy: retry
Validate before calling
// Sanity-check membership payload size before trusting it
if p.MembershipInfo == nil || len(p.MembershipInfo.Payload) == 0 {
return errors.New("peer membership payload is empty")
} Try / catch
_, err := endorser(p, cc, channel)
if err != nil && strings.Contains(err.Error(), "alive message") {
// could be version skew or corruption; refresh discovery
return refreshDiscoveryAndRetry(ctx)
} Prevention
- Run a Fabric client version matching the peers' gossip protocol
- Retry discovery on unmarshal failures before treating as fatal
- Avoid intermediaries that cache or transform discovery responses
- Monitor peer gossip health
When it happens
Trigger: discovery.Peer.MembershipInfo payload cannot be protobuf-unmarshalled or is not an AliveMsg (payload nil / wrong GossipMessage tag) during endorser construction in a chaincode query response.
Common situations: Fabric version skew between client and peers (changed gossip proto); a server bug or corrupted discovery cache; bytes from a non-gossip source substituted for membership data; network/proxy corruption in cached discovery responses.
Related errors
- failed unmarshalling gossip envelope to state info message
- failed to deserialize values
- Unexpected key %s
- consenter options type mismatch
- block from orderer could not be re-marshaled: proto: Marshal
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/047df365619447b1.
Report an issue: GitHub.