{"record":{"id":"7225fca20db85113","repo":"hyperledger/fabric","slug":"failed-creating-endorser-object","errorCode":null,"errorMessage":"failed creating endorser object","messagePattern":"failed creating endorser object","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"discovery/client/client.go","lineNumber":521,"sourceCode":"\t\tendorsersByGroups: make(map[string][]*Peer),\n\t}\n\tfor _, l := range desc.Layouts {\n\t\tcurrentLayout := make(map[string]int)\n\t\tdescriptor.layouts = append(descriptor.layouts, currentLayout)\n\t\tfor grp, count := range l.QuantitiesByGroup {\n\t\t\tif _, exists := desc.EndorsersByGroups[grp]; !exists {\n\t\t\t\treturn nil, errors.Errorf(\"group %s isn't mapped to endorsers, but exists in a layout\", grp)\n\t\t\t}\n\t\t\tcurrentLayout[grp] = int(count)\n\t\t}\n\t}\n\n\tfor grp, peers := range desc.EndorsersByGroups {\n\t\tvar endorsers []*Peer\n\t\tfor _, p := range peers.Peers {\n\t\t\tpeer, err := endorser(p, desc.Chaincode, channel)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, \"failed creating endorser object\")\n\t\t\t}\n\t\t\tendorsers = append(endorsers, peer)\n\t\t}\n\t\tdescriptor.endorsersByGroups[grp] = endorsers\n\t}\n\n\treturn descriptor, nil\n}\n\nfunc endorser(peer *discovery.Peer, chaincode, channel string) (*Peer, error) {\n\tif peer.MembershipInfo == nil || peer.StateInfo == nil {\n\t\treturn nil, errors.Errorf(\"received empty envelope(s) for endorsers for chaincode %s, channel %s\", chaincode, channel)\n\t}\n\taliveMsg, err := gprotoext.EnvelopeToGossipMessage(peer.MembershipInfo)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed unmarshalling gossip envelope to alive message\")\n\t}\n\tstateInfMsg, err := gprotoext.EnvelopeToGossipMessage(peer.StateInfo)","sourceCodeStart":503,"sourceCodeEnd":539,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/discovery/client/client.go#L503-L539","documentation":"createEndorsementDescriptor wraps any failure from the endorser() helper (which converts a discovery Peer into a client Peer) with \"failed creating endorser object\". The inner error is usually an empty MembershipInfo/StateInfo envelope, gossip envelope unmarshalling failure, or alive/stateInfo validation failure. It means a peer listed as an endorser had malformed or missing discovery data.","triggerScenarios":"Iterating desc.EndorsersByGroups peers where a discovery.Peer has nil MembershipInfo or StateInfo, gossip envelopes that fail EnvelopeToGossipMessage, or payloads failing validateAliveMessage/validateStateInfoMessage.","commonSituations":"Peer recently joined and hasn't published StateInfo yet; discovery server returning partial data under load; corrupted or cross-version gossip payloads (v1 peer data read by v2 client); TLS/identity mismatch causing invalid envelopes.","solutions":["Unwrap the inner error (errors.Cause) to see whether envelopes were empty, unmarshalling failed, or validation failed","Ensure all endorsing peers are fully joined and synchronized with the channel","Retry the discovery query — a peer mid-join often produces transient empty envelopes","Check Fabric version consistency between client and all peers in the channel","Verify TLS and MSP configuration so gossip envelopes are signed/encrypted as expected"],"exampleFix":"// before: only wrapper shown\nreturn nil, errors.Wrap(err, \"failed creating endorser object\")\n// after: surface the cause\nlog.Printf(\"%+v\", errors.Cause(err))","handlingStrategy":"try-catch","validationCode":"// Filter peers lacking envelopes before descriptor creation\nusable := peers.Peers[:0]\nfor _, p := range peers.Peers {\n\tif p.MembershipInfo != nil && p.StateInfo != nil {\n\t\tusable = append(usable, p)\n\t}\n}","typeGuard":null,"tryCatchPattern":"peer, err := endorser(p, cc, channel)\nif err != nil {\n\tlog.Printf(\"endorsers of %s: %v (cause: %v)\", channel, err, errors.Cause(err))\n\tcontinue // or retry the query\n}","preventionTips":["Skip peers with nil MembershipInfo/StateInfo and retry later","Ensure peers complete channel join before serving discovery","Keep Fabric versions consistent across client and peers","Retry discovery queries that fail on a subset of endorsers"],"tags":["hyperledger-fabric","discovery-service","gossip","peer"],"backgroundTag":"endorser-envelope-invalid","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"}