hyperledger/fabric · error

supplied system channel group does not appear to be system c

Error message

supplied system channel group does not appear to be system channel (missing consortiums group)

What it means

A genuine system channel config group must contain a Consortiums sub-group; ConfigTemplateFromGroup looks it up to graft the consortium into the new channel template. If the ConsortiumsGroupKey group is missing, the supplied group is not a system channel group, and this error is returned.

Source

Thrown at internal/configtxgen/encoder/encoder.go:518

	return channelGroup, nil
}

func ConfigTemplateFromGroup(conf *genesisconfig.Profile, cg *cb.ConfigGroup) (*cb.ConfigGroup, error) {
	template := proto.Clone(cg).(*cb.ConfigGroup)
	if template.Groups == nil {
		return nil, errors.Errorf("supplied system channel group has no sub-groups")
	}

	template.Groups[channelconfig.ApplicationGroupKey] = &cb.ConfigGroup{
		Groups: map[string]*cb.ConfigGroup{},
		Policies: map[string]*cb.ConfigPolicy{
			channelconfig.AdminsPolicyKey: {},
		},
	}

	consortiums, ok := template.Groups[channelconfig.ConsortiumsGroupKey]
	if !ok {
		return nil, errors.Errorf("supplied system channel group does not appear to be system channel (missing consortiums group)")
	}

	if consortiums.Groups == nil {
		return nil, errors.Errorf("system channel consortiums group appears to have no consortiums defined")
	}

	consortium, ok := consortiums.Groups[conf.Consortium]
	if !ok {
		return nil, errors.Errorf("supplied system channel group is missing '%s' consortium", conf.Consortium)
	}

	if conf.Application == nil {
		return nil, errors.Errorf("supplied channel creation profile does not contain an application section")
	}

	for _, organization := range conf.Application.Organizations {
		var ok bool
		template.Groups[channelconfig.ApplicationGroupKey].Groups[organization.Name], ok = consortium.Groups[organization.Name]

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Pass the ordering system channel's config group, which includes the Consortiums group.
  2. Verify the channel name used to fetch the config is the system channel (e.g. test-chainid / your system channel name).
  3. Confirm the system channel profile defines a Consortiums section and genesis was generated with it.

Example fix

// before
cg := getConfigGroupForChannel("mychannel") // application channel
// after
cg := getConfigGroupForChannel("test-chainid") // system channel with Consortiums
Defensive patterns

Strategy: validation

Validate before calling

if _, ok := cg.Groups[channelconfig.ConsortiumsGroupKey]; !ok {
    return errors.New("supplied group is not a system channel (missing Consortiums)")
}

Type guard

func hasConsortiumsGroup(cg *cb.ConfigGroup) bool {
    if cg == nil || cg.Groups == nil { return false }
    _, ok := cg.Groups[channelconfig.ConsortiumsGroupKey]
    return ok
}

Try / catch

tmpl, err := encoder.ConfigTemplateFromGroup(profile, cg)
if err != nil && strings.Contains(err.Error(), "missing consortiums group") {
    return errors.New("pass the ordering system channel's config group")
}

Prevention

When it happens

Trigger: Calling ConfigTemplateFromGroup (directly or via MakeChannelCreationTransactionWithSystemChannelContext) with a group that has sub-groups but no `Consortiums` group — e.g. an application channel's group or a system-channel config without consortiums.

Common situations: Fetching the wrong channel's config from the orderer (application channel instead of system channel); passing a post-migration config where consortiums no longer apply; hand-built groups omitting Consortiums.

Related errors


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