hyperledger/fabric · error

message isn't a stateInfo message

Error message

message isn't a stateInfo message

What it means

validateStateInfoMessage rejects a SignedGossipMessage whose GetStateInfo() is nil — the envelope payload is not a StateInfo message. In the discovery client peers must present valid StateInfo (channel membership declaration) for the endorser flow; this error is wrapped as 'failed validating stateInfo message'.

Source

Thrown at discovery/client/client.go:592

func validateAliveMessage(message *gprotoext.SignedGossipMessage) error {
	am := message.GetAliveMsg()
	if am == nil {
		return errors.New("message isn't an alive message")
	}
	m := am.Membership
	if m == nil {
		return errors.New("membership is empty")
	}
	if am.Timestamp == nil {
		return errors.New("timestamp is nil")
	}
	return nil
}

func validateStateInfoMessage(message *gprotoext.SignedGossipMessage) error {
	si := message.GetStateInfo()
	if si == nil {
		return errors.New("message isn't a stateInfo message")
	}
	if si.Timestamp == nil {
		return errors.New("timestamp is nil")
	}
	if si.Properties == nil {
		return errors.New("properties is nil")
	}
	return nil
}

func validateInterests(interests ...*peer.ChaincodeInterest) error {
	if len(interests) == 0 {
		return errors.New("no chaincode interests given")
	}
	for _, interest := range interests {
		if interest == nil {
			return errors.New("chaincode interest is nil")
		}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Confirm the queried peer has joined the requested channel (peer channel list)
  2. Restart gossip / the peer to regenerate StateInfo messages
  3. Align Fabric versions across network components
  4. Retry discovery against a different peer in the channel
Defensive patterns

Strategy: validation

Validate before calling

func isStateInfo(m *gprotoext.SignedGossipMessage) bool { return m != nil && m.GetStateInfo() != nil }

Type guard

func isStateInfoMsg(m *gprotoext.SignedGossipMessage) bool { return m != nil && m.GetStateInfo() != nil }

Try / catch

if err != nil && strings.Contains(err.Error(), "message isn't a stateInfo message") {
    logger.Warnf("peer %s did not return state info; is it joined to the channel?", peerURL)
    return err
}

Prevention

When it happens

Trigger: A discovery response peer record contains a payload of a different gossip type (AliveMsg, DataMsg, empty) where a StateInfo is expected.

Common situations: Target peer not fully joined to the channel so it lacks state info; gossip store desync; Fabric version mismatch; corrupted envelope transport.

Related errors


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