{"record":{"id":"9a55da56b5bdd1a2","repo":"hyperledger/fabric","slug":"failed-validating-stateinfo-message","errorCode":null,"errorMessage":"failed validating stateInfo message","messagePattern":"failed validating stateInfo message","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"discovery/client/client.go","lineNumber":427,"sourceCode":"\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,\n\t\t\t\tStateInfoMessage: stateInfoMsg,\n\t\t\t})\n\t\t}\n\t}\n\treturn peers, nil\n}\n\nfunc isStateInfoExpected(qt protoext.QueryType) bool {\n\treturn qt != protoext.LocalMembershipQueryType","sourceCodeStart":409,"sourceCodeEnd":445,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/discovery/client/client.go#L409-L445","documentation":"The StateInfo envelope parsed successfully but failed validation in validateStateInfoMessage — typically the message payload is not a GossipMessage_StateInfo, or the envelope is unsigned/empty so its content cannot be authenticated. The client rejects the whole membership result for that channel.","triggerScenarios":"Chaincode/endorsement discovery queries where a peer returns StateInfo whose inner gossip message is not StateInfo type, or with a nil payload/signature so validation cannot verify it.","commonSituations":"Peers not fully synced with the channel; malformed responses from peers running mismatched Fabric versions; tampered or misconfigured discovery TLS endpoints.","solutions":["Check peer logs for gossip state-info errors on the channel.","Ensure all peers are joined to the channel and fully caught up on the ledger.","Align Fabric versions between peers and the discovery client.","Verify TLS configuration of the discovery service matches the client's expectations.","Retry discovery; if one peer consistently fails, exclude it from discovery endpoints."],"exampleFix":"// before: single peer endpoint\nconfig.Endpoints = []string{\"peer0:7051\"}\n// after: multiple healthy endpoints so one bad peer doesn't break discovery\nconfig.Endpoints = []string{\"peer0:7051\", \"peer1:7051\"}","handlingStrategy":"validation","validationCode":"func stateInfoIsSigned(msg *gprotoext.SignedGossipMessage) bool {\n  if msg == nil || msg.Envelope == nil {\n    return false\n  }\n  _, ok := msg.GetGossipMessage().Content.(*gossip.GossipMessage_StateInfo)\n  return ok && len(msg.Envelope.PayloadSig) > 0 || len(msg.Envelope.SecretEnvelope) > 0 || msg.Envelope != nil\n}","typeGuard":"func asStateInfo(msg *gprotoext.SignedGossipMessage) (*gossip.GossipMessage_StateInfo, bool) {\n  if msg == nil { return nil, false }\n  si, ok := msg.GetGossipMessage().Content.(*gossip.GossipMessage_StateInfo)\n  return si.StateInfo, ok\n}","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"failed validating stateInfo message\") {\n  log.Printf(\"peer returned invalid stateInfo, excluding peer: %v\", err)\n  return fallbackPeers(ctx)\n}","preventionTips":["Ensure peers are fully synced with channel ledger","Exclude persistently misbehaving peers from discovery endpoints","Keep proto definitions in sync (same Fabric release)","Verify TLS endpoints point at the intended peers"],"tags":["fabric","discovery","stateinfo","validation"],"backgroundTag":"message-validation-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"}