hyperledger/fabric · error

system channel consortiums group appears to have no consorti

Error message

system channel consortiums group appears to have no consortiums defined

What it means

After finding the Consortiums group, ConfigTemplateFromGroup requires it to actually contain consortium entries. If its Groups map is nil, the system channel was created without any consortiums defined, and the profile's Consortium reference cannot be resolved, so this error is thrown.

Source

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

	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]
		if !ok {
			return nil, errors.Errorf("consortium %s does not contain member org %s", conf.Consortium, organization.Name)
		}
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Add a Consortiums section (e.g. SampleConsortium listing member orgs) to the system channel profile and regenerate/apply the system channel config update.
  2. Set conf.Consortium to an existing consortium and re-check the system channel's consortium definitions.
  3. Inspect the system channel config to confirm consortiums exist.

Example fix

# before
Profiles:
  OrdererGenesis:
    Orderer:
      ...
    # no Consortiums
# after
Profiles:
  OrdererGenesis:
    Orderer:
      ...
    Consortiums:
      SampleConsortium:
        Organizations:
          - *Org1
Defensive patterns

Strategy: validation

Validate before calling

consortiums := cg.Groups[channelconfig.ConsortiumsGroupKey]
if consortiums == nil || len(consortiums.Groups) == 0 {
    return errors.New("system channel defines no consortiums; add a Consortiums section to the genesis profile")
}

Type guard

func hasConsortiumsDefined(cg *cb.ConfigGroup) bool {
    c, ok := cg.Groups[channelconfig.ConsortiumsGroupKey]
    return ok && c.Groups != nil && len(c.Groups) > 0
}

Try / catch

tmpl, err := encoder.ConfigTemplateFromGroup(profile, cg)
if err != nil && strings.Contains(err.Error(), "no consortiums defined") {
    return errors.New("regenerate the system channel with a Consortiums section")
}

Prevention

When it happens

Trigger: Calling ConfigTemplateFromGroup / MakeChannelCreationTransactionWithSystemChannelContext against a system channel whose Consortiums group has no consortium sub-groups — i.e. the genesis profile's Consortiums section was empty or absent.

Common situations: System channel generated from a configtx.yaml without a Consortiums section; regenerating the system channel after removing consortiums while still creating channels that need them.

Related errors


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