hyperledger/fabric · error

failed unmarshalling alive message

Error message

failed unmarshalling alive message

What it means

This error means the discovery service returned a peer membership result whose MembershipInfo envelope could not be parsed into a valid gossip AliveMessage. The client wraps the underlying unmarshalling error with this message when iterating peers for a channel in peersForChannel. It indicates malformed or non-gossip protobuf data in the server's response.

Source

Thrown at discovery/client/client.go:418

		}

		peers, err2 := peersForChannel(membersRes, qt)
		if err2 != nil {
			return errors.Wrap(err2, "failed constructing peer membership out of response")
		}

		resp[key] = peers
	}
	return nil
}

func peersForChannel(membersRes *discovery.PeerMembershipResult, qt protoext.QueryType) ([]*Peer, error) {
	var peers []*Peer
	for org, peersOfCurrentOrg := range membersRes.PeersByOrg {
		for _, peer := range peersOfCurrentOrg.Peers {
			aliveMsg, err := gprotoext.EnvelopeToGossipMessage(peer.MembershipInfo)
			if err != nil {
				return nil, errors.Wrap(err, "failed unmarshalling alive message")
			}
			var stateInfoMsg *gprotoext.SignedGossipMessage
			if isStateInfoExpected(qt) {
				stateInfoMsg, err = gprotoext.EnvelopeToGossipMessage(peer.StateInfo)
				if err != nil {
					return nil, errors.Wrap(err, "failed unmarshalling stateInfo message")
				}
				if err := validateStateInfoMessage(stateInfoMsg); err != nil {
					return nil, errors.Wrap(err, "failed validating stateInfo message")
				}
			}
			if err := validateAliveMessage(aliveMsg); err != nil {
				return nil, errors.Wrap(err, "failed validating alive message")
			}
			peers = append(peers, &Peer{
				MSPID:            org,
				Identity:         peer.Identity,
				AliveMessage:     aliveMsg,

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify the peer discovery service version matches the client (fabric-sdk-go / fabric-cli vs peer version).
  2. Re-run with debug logging on the discovery server to inspect what membership data it is returning.
  3. Check TLS/network integrity — a proxy or MTM tampering can truncate envelopes.
  4. Retry against a different peer in case the responding peer has corrupted membership state.
  5. If persistent, restart the misbehaving peer so gossip rebuilds its membership state.

Example fix

// before: blindly using membership result
res, _ := discoveryClient.SendRequest(ctx, req)
peers, err := peersForChannel(res.Results[0], qt) // fails on bad envelope
// after: fail fast with the underlying cause logged
peers, err := peersForChannel(res.Results[0], qt)
if err != nil {
  log.Errorf("discovery membership parse failed: %v", errors.Unwrap(err))
  return err
}
Defensive patterns

Strategy: validation

Validate before calling

func validMembershipEnvelope(env *common.Envelope) bool {
  return env != nil && len(env.Payload) > 0
}
// check each peer.MembershipInfo in PeerMembershipResult before sending further requests

Type guard

func isAliveMessage(msg *gprotoext.SignedGossipMessage) bool {
  return msg != nil && msg.IsAliveMsg()
}

Try / catch

peers, err := peersForChannel(res, qt)
if err != nil {
  var wrapped error = errors.Unwrap(err)
  log.Printf("membership parse failed: %v", wrapped)
  return nil, fmt.Errorf("discovery membership unavailable: %w", err)
}

Prevention

When it happens

Trigger: Calling discovery client SendRequest with a PeerMembershipQuery (NetworkPeerQuery/ChannelPeers) where a returned peer's MembershipInfo envelope is nil, truncated, or not a GossipMessage of type AliveMessage.

Common situations: Fabric peer (discovery server) and SDK/CLI (discovery client) version mismatch producing incompatible gossip proto definitions; corrupted discovery response over the wire; a compromised or misbehaving peer returning junk payloads.

Understand the failure class

Background: "cannot parse invalid wire-format data", "cannot unmarshal", "failed unmarshalling": protobuf unmarshal errors explained — this error's family across 10 libraries.

Related errors


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