hyperledger/fabric · error
failed unmarshalling gossip envelope to state info message
Error message
failed unmarshalling gossip envelope to state info message
What it means
When converting the peer's StateInfo envelope to a SignedGossipMessage via gprotoext.EnvelopeToGossipMessage fails, the error is wrapped as "failed unmarshalling gossip envelope to state info message". The StateInfo payload bytes are invalid or not actually a StateInfo gossip message, so the client cannot determine the peer's ledger height/state on the channel.
Source
Thrown at discovery/client/client.go:541
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,
AliveMessage: aliveMsg,
MSPID: sID.Mspid,
}, nil
}View on GitHub (pinned to 2736b63f8f)
Solutions
- Unwrap the inner error for the specific unmarshal/type failure
- Ensure the discovery client and peers run compatible Fabric versions
- Retry the query for fresh StateInfo after the peer finishes joining the channel
- Inspect peer gossip logs for StateInfo publication errors
- Exclude/restart the offending peer if it consistently returns bad StateInfo
Defensive patterns
Strategy: retry
Validate before calling
if p.StateInfo == nil || len(p.StateInfo.Payload) == 0 {
return errors.New("peer stateInfo payload is empty")
} Try / catch
_, err := endorser(p, cc, channel)
if err != nil && strings.Contains(err.Error(), "state info message") {
// peer state data invalid; re-query after stabilization
time.Sleep(3 * time.Second)
return refreshDiscoveryAndRetry(ctx)
} Prevention
- Ensure peers publish StateInfo (fully joined) before discovery
- Align Fabric versions to avoid proto skew
- Clear stale discovery state after peer restarts
- Inspect gossip logs for StateInfo publication errors
When it happens
Trigger: discovery.Peer.StateInfo payload fails EnvelopeToGossipMessage while building an endorser for a channel chaincode query — payload not a valid GossipMessage of StateInfo type.
Common situations: Peer that published partial/invalid state data; Fabric proto version skew between discovery client and server; corrupted discovery response cached on the peer; mixing data from local membership (no StateInfo) into channel queries.
Related errors
- received empty envelope(s) for endorsers for chaincode %s, c
- failed unmarshalling gossip envelope to alive message
- message isn't a stateInfo message
- properties is nil
- 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/de5e698712097760.
Report an issue: GitHub.