hyperledger/fabric · error
Invalid channel ID name during check policy on signed data.
Error message
Invalid channel ID name during check policy on signed data. Name must be different from nil.
What it means
Returned by CheckPolicyBySignedData as an argument validation guard when the channelID parameter is an empty string. The library cannot look up a channel policy manager without a channel name, so it rejects the call up front. Despite the wording 'different from nil', the actual check is for an empty string in Go.
Source
Thrown at core/policy/policy.go:159
return fmt.Errorf("Failed getting local MSP principal during channelless check policy with policy [%s]: [%s]", policyName, err)
}
// Verify that proposal's creator satisfies the principal
err = id.SatisfiesPrincipal(principal)
if err != nil {
logger.Warnw("Failed verifying that proposal's creator satisfies local MSP principal during channelless check policy", "error", err, "policyName", policyName, "requiredPrincipal", principal, "signingIdentity", protoutil.LogMessageForSerializedIdentity(shdr.Creator))
return fmt.Errorf("Failed verifying that proposal's creator satisfies local MSP principal during channelless check policy with policy [%s]: [%s]", policyName, err)
}
// Verify the signature
return id.Verify(signedProp.ProposalBytes, signedProp.Signature)
}
// CheckPolicyBySignedData checks that the passed signed data is valid with the respect to
// passed policy on the passed channel.
func (p *policyChecker) CheckPolicyBySignedData(channelID, policyName string, sd []*protoutil.SignedData) error {
if channelID == "" {
return errors.New("Invalid channel ID name during check policy on signed data. Name must be different from nil.")
}
if policyName == "" {
return fmt.Errorf("Invalid policy name during check policy on signed data on channel [%s]. Name must be different from nil.", channelID)
}
if sd == nil {
return fmt.Errorf("Invalid signed data during check policy on channel [%s] with policy [%s]", channelID, policyName)
}
// Get Policy
policyManager := p.channelPolicyManagerGetter.Manager(channelID)
if policyManager == nil {
return fmt.Errorf("Failed to get policy manager for channel [%s]", channelID)
}
// Recall that get policy always returns a policy object
policy, _ := policyManager.GetPolicy(policyName)View on GitHub (pinned to 2736b63f8f)
Solutions
- Set the channel ID in the proposal/channel header before invoking the policy check.
- Fix the caller's configuration so the channel name is non-empty (check env vars/config files).
- For genuinely channelless operations, use CheckPolicyNoChannel instead of CheckPolicyBySignedData.
Example fix
// before
err := checker.CheckPolicyBySignedData("", "CHANNEL_READERS", sd)
// after
if channelID == "" { return errors.New("channelID is required") }
err := checker.CheckPolicyBySignedData(channelID, "CHANNEL_READERS", sd) Defensive patterns
Strategy: validation
Validate before calling
if channelID == "" {
return errors.New("channel ID must be a non-empty string before calling CheckPolicyBySignedData")
} Type guard
func validChannelID(id string) bool {
if id == "" { return false }
// fabric channel name rules
re := regexp.MustCompile(`^[a-zA-Z0-9._-]+$`)
return re.MatchString(id)
} Prevention
- Read channel ID from configuration with explicit non-empty checks at startup.
- Set ChannelId in the channel header when constructing proposals; unit-test proposal builders.
- Use constants/env validation for channel names instead of ad hoc strings.
When it happens
Trigger: Calling CheckPolicyBySignedData("", policyName, sd), or calling it indirectly through CheckPolicy with a proposal whose channel header ChannelId is empty/unset (e.g. a malformed or channelless proposal passed to the channel path).
Common situations: Client SDK builds a proposal without setting the channel ID header field; a caller passes an empty config value for channel name (unset env var or empty YAML field); tests exercising invalid-argument paths.
Related errors
- channel ID illegal, cannot be empty
- channel ID illegal, cannot be longer than %d
- Invalid policy name during check policy on signed data on ch
- Invalid signed data during check policy on channel [%s] with
- %s is mandatory and cannot be empty
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/dddf55b68651dfd3.
Report an issue: GitHub.