hyperledger/fabric · error

nil envelope

Error message

nil envelope

What it means

Sentinel guard in EnvelopeToGossipMessage: the caller passed a nil *gossip.Envelope, so there is nothing to unmarshal into a SignedGossipMessage. It is a defensive check against nil input, not a deserialization failure.

Source

Thrown at gossip/protoext/signing.go:62

// NoopSign creates a SignedGossipMessage with a nil signature
func NoopSign(m *gossip.GossipMessage) (*SignedGossipMessage, error) {
	signer := func(msg []byte) ([]byte, error) {
		return nil, nil
	}
	sMsg := &SignedGossipMessage{
		GossipMessage: m,
	}
	_, err := sMsg.Sign(signer)
	return sMsg, err
}

// EnvelopeToGossipMessage un-marshals a given envelope and creates a
// SignedGossipMessage out of it.
// Returns an error if un-marshaling fails.
func EnvelopeToGossipMessage(e *gossip.Envelope) (*SignedGossipMessage, error) {
	if e == nil {
		return nil, errors.New("nil envelope")
	}
	msg := &gossip.GossipMessage{}
	err := proto.Unmarshal(e.Payload, msg)
	if err != nil {
		return nil, fmt.Errorf("Failed unmarshalling GossipMessage from envelope: %v", err)
	}
	return &SignedGossipMessage{
		GossipMessage: msg,
		Envelope:      e,
	}, nil
}

// InternalEndpoint returns the internal endpoint in the secret envelope, or an
// empty string if a failure occurs.
func InternalEndpoint(s *gossip.SecretEnvelope) string {
	if s == nil {
		return ""
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Check the envelope for nil before calling EnvelopeToGossipMessage and skip nil entries
  2. Fix the producer that inserted a nil envelope into the collection
  3. Make the caller return/propagate a sentinel error instead of dereferencing nil

Example fix

// before
msg, err := protoext.EnvelopeToGossipMessage(env)
// after
if env == nil {
    return nil, errors.New("missing envelope")
}
msg, err := protoext.EnvelopeToGossipMessage(env)
Defensive patterns

Strategy: type-guard

Validate before calling

if env == nil {
    continue // skip nil envelopes in membership lists
}

Type guard

func isNilEnvelope(e *gossip.Envelope) bool { return e == nil }

Try / catch

msg, err := protoext.EnvelopeToGossipMessage(env)
if err != nil {
    if err.Error() == "nil envelope" {
        return nil, fmt.Errorf("peer %s has no envelope", peerID)
    }
    return nil, err
}

Prevention

When it happens

Trigger: Calling EnvelopeToGossipMessage(nil) — typically when iterating connection/membership structures that can contain nil envelopes, or when an earlier unwrap returned nil without being checked.

Common situations: Gossip membership/discovery code processing envelopes from peers where a field was never set; test helpers building peer lists with missing envelopes; callers ignoring a nil result from an upstream accessor.

Related errors


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