hyperledger/fabric · error

node %d is not member of channel %s

Error message

node %d is not member of channel %s

What it means

VerifyAuthRequest guard: the request's FromId or ToId has no entry in the channel's MemberMapping, so the sending or receiving node ID is not part of the etcdraft/BFT consenters set for that channel. The node ID-to-identity mapping derived from the channel config does not contain that ID.

Source

Thrown at orderer/common/cluster/clusterservice.go:158

		Version:        int64(authReq.Version),
		Timestamp:      EncodeTimestamp(authReq.Timestamp),
		FromId:         strconv.FormatUint(authReq.FromId, 10),
		ToId:           strconv.FormatUint(authReq.ToId, 10),
		SessionBinding: tlsBinding,
		Channel:        authReq.Channel,
	})
	if err != nil {
		return nil, errors.Wrap(err, "ASN encoding failed")
	}

	membership := s.MembershipByChannel[authReq.Channel]
	if membership == nil {
		return nil, errors.Errorf("channel %s not found in config", authReq.Channel)
	}

	fromIdentity := membership.MemberMapping[authReq.FromId]
	if fromIdentity == nil {
		return nil, errors.Errorf("node %d is not member of channel %s", authReq.FromId, authReq.Channel)
	}

	toIdentity := membership.MemberMapping[authReq.ToId]
	if toIdentity == nil {
		return nil, errors.Errorf("node %d is not member of channel %s", authReq.ToId, authReq.Channel)
	}

	equal, err := CompareCertPublicKeys(toIdentity, s.NodeIdentity)
	if err != nil {
		return nil, errors.Wrap(err, "failed to compare cert public keys")
	}
	if !equal {
		s.Logger.Debugf("node id mismatch for node %d, toIdentity: %s, s.NodeIdentity: %s", authReq.FromId, string(toIdentity), string(s.NodeIdentity))
		return nil, errors.Errorf("node id mismatch")
	}

	err = VerifySignature(fromIdentity, SHA256Digest(msg), authReq.Signature)
	if err != nil {

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Check the consenters set in the channel config includes both nodes
  2. Ensure node IDs are not stale after a consenter set update
  3. Verify TLS certificates match the ones configured in the channel
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at orderer/common/cluster/clusterservice.go:158 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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