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

  1. Unwrap the inner error to see whether it's an unmarshal failure or a wrong message type
  2. Align Fabric client and peer versions (gossip proto compatibility)
  3. Retry the discovery query to get a fresh response from the server
  4. Restart the peer's gossip service / clear stale discovery state if corruption persists
  5. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/047df365619447b1. Report an issue: GitHub.