hyperledger/fabric · error

failed unmarshalling gossip envelope to state info message

Error message

failed unmarshalling gossip envelope to state info message

What it means

When converting the peer's StateInfo envelope to a SignedGossipMessage via gprotoext.EnvelopeToGossipMessage fails, the error is wrapped as "failed unmarshalling gossip envelope to state info message". The StateInfo payload bytes are invalid or not actually a StateInfo gossip message, so the client cannot determine the peer's ledger height/state on the channel.

Source

Thrown at discovery/client/client.go:541

			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,
		AliveMessage:     aliveMsg,
		MSPID:            sID.Mspid,
	}, nil
}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Unwrap the inner error for the specific unmarshal/type failure
  2. Ensure the discovery client and peers run compatible Fabric versions
  3. Retry the query for fresh StateInfo after the peer finishes joining the channel
  4. Inspect peer gossip logs for StateInfo publication errors
  5. Exclude/restart the offending peer if it consistently returns bad StateInfo
Defensive patterns

Strategy: retry

Validate before calling

if p.StateInfo == nil || len(p.StateInfo.Payload) == 0 {
	return errors.New("peer stateInfo payload is empty")
}

Try / catch

_, err := endorser(p, cc, channel)
if err != nil && strings.Contains(err.Error(), "state info message") {
	// peer state data invalid; re-query after stabilization
	time.Sleep(3 * time.Second)
	return refreshDiscoveryAndRetry(ctx)
}

Prevention

When it happens

Trigger: discovery.Peer.StateInfo payload fails EnvelopeToGossipMessage while building an endorser for a channel chaincode query — payload not a valid GossipMessage of StateInfo type.

Common situations: Peer that published partial/invalid state data; Fabric proto version skew between discovery client and server; corrupted discovery response cached on the peer; mixing data from local membership (no StateInfo) into channel queries.

Related errors


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