{"record":{"id":"7f4d4dc58330b543","repo":"hyperledger/fabric","slug":"failed-unmarshalling-alive-message","errorCode":null,"errorMessage":"failed unmarshalling alive message","messagePattern":"failed unmarshalling alive message","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"discovery/client/client.go","lineNumber":418,"sourceCode":"\t\t}\n\n\t\tpeers, err2 := peersForChannel(membersRes, qt)\n\t\tif err2 != nil {\n\t\t\treturn errors.Wrap(err2, \"failed constructing peer membership out of response\")\n\t\t}\n\n\t\tresp[key] = peers\n\t}\n\treturn nil\n}\n\nfunc peersForChannel(membersRes *discovery.PeerMembershipResult, qt protoext.QueryType) ([]*Peer, error) {\n\tvar peers []*Peer\n\tfor org, peersOfCurrentOrg := range membersRes.PeersByOrg {\n\t\tfor _, peer := range peersOfCurrentOrg.Peers {\n\t\t\taliveMsg, err := gprotoext.EnvelopeToGossipMessage(peer.MembershipInfo)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, \"failed unmarshalling alive message\")\n\t\t\t}\n\t\t\tvar stateInfoMsg *gprotoext.SignedGossipMessage\n\t\t\tif isStateInfoExpected(qt) {\n\t\t\t\tstateInfoMsg, err = gprotoext.EnvelopeToGossipMessage(peer.StateInfo)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, errors.Wrap(err, \"failed unmarshalling stateInfo message\")\n\t\t\t\t}\n\t\t\t\tif err := validateStateInfoMessage(stateInfoMsg); err != nil {\n\t\t\t\t\treturn nil, errors.Wrap(err, \"failed validating stateInfo message\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif err := validateAliveMessage(aliveMsg); err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, \"failed validating alive message\")\n\t\t\t}\n\t\t\tpeers = append(peers, &Peer{\n\t\t\t\tMSPID:            org,\n\t\t\t\tIdentity:         peer.Identity,\n\t\t\t\tAliveMessage:     aliveMsg,","sourceCodeStart":400,"sourceCodeEnd":436,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/discovery/client/client.go#L400-L436","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Verify the peer discovery service version matches the client (fabric-sdk-go / fabric-cli vs peer version).","Re-run with debug logging on the discovery server to inspect what membership data it is returning.","Check TLS/network integrity — a proxy or MTM tampering can truncate envelopes.","Retry against a different peer in case the responding peer has corrupted membership state.","If persistent, restart the misbehaving peer so gossip rebuilds its membership state."],"exampleFix":"// before: blindly using membership result\nres, _ := discoveryClient.SendRequest(ctx, req)\npeers, err := peersForChannel(res.Results[0], qt) // fails on bad envelope\n// after: fail fast with the underlying cause logged\npeers, err := peersForChannel(res.Results[0], qt)\nif err != nil {\n  log.Errorf(\"discovery membership parse failed: %v\", errors.Unwrap(err))\n  return err\n}","handlingStrategy":"validation","validationCode":"func validMembershipEnvelope(env *common.Envelope) bool {\n  return env != nil && len(env.Payload) > 0\n}\n// check each peer.MembershipInfo in PeerMembershipResult before sending further requests","typeGuard":"func isAliveMessage(msg *gprotoext.SignedGossipMessage) bool {\n  return msg != nil && msg.IsAliveMsg()\n}","tryCatchPattern":"peers, err := peersForChannel(res, qt)\nif err != nil {\n  var wrapped error = errors.Unwrap(err)\n  log.Printf(\"membership parse failed: %v\", wrapped)\n  return nil, fmt.Errorf(\"discovery membership unavailable: %w\", err)\n}","preventionTips":["Keep client and peer Fabric versions aligned","Enable TLS verification to detect tampered responses","Retry discovery against alternate peers","Monitor peer gossip membership health"],"tags":["fabric","discovery","gossip","protobuf","unmarshal"],"backgroundTag":"protobuf-unmarshal-failed","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}