hyperledger/fabric · error

could not get channelconfig for channel %s

Error message

could not get channelconfig for channel %s

What it means

ValidatorCommitter.ChaincodeImplicitCollections fetches the stable channel config for channelName and throws this when GetStableChannelConfig returns nil, i.e. no channelconfig is available for that channel in the resources. Implicit (per-org) collections require resolvable channel config.

Source

Thrown at core/chaincode/lifecycle/deployedcc_infoprovider.go:227

		SimpleQueryExecutor: qe,
	})
	if err != nil {
		return nil, errors.WithMessage(err, "could not get info about chaincode")
	}

	if !exists {
		// Implicit collections are a v2.0 lifecycle concept, if the chaincode is not in the new lifecycle, return nothing
		return nil, nil
	}

	return vc.ChaincodeImplicitCollections(channelName)
}

// ChaincodeImplicitCollections assumes the chaincode exists in the new lifecycle and returns the implicit collections
func (vc *ValidatorCommitter) ChaincodeImplicitCollections(channelName string) ([]*pb.StaticCollectionConfig, error) {
	channelConfig := vc.Resources.ChannelConfigSource.GetStableChannelConfig(channelName)
	if channelConfig == nil {
		return nil, errors.Errorf("could not get channelconfig for channel %s", channelName)
	}
	ac, ok := channelConfig.ApplicationConfig()
	if !ok {
		return nil, errors.Errorf("could not get application config for channel %s", channelName)
	}

	orgs := ac.Organizations()
	implicitCollections := make([]*pb.StaticCollectionConfig, 0, len(orgs))
	for _, org := range orgs {
		implicitCollections = append(implicitCollections, vc.GenerateImplicitCollectionForOrg(org.MSPID()))
	}

	return implicitCollections, nil
}

// GenerateImplicitCollectionForOrg generates implicit collection for the org
func (vc *ValidatorCommitter) GenerateImplicitCollectionForOrg(mspid string) *pb.StaticCollectionConfig {
	// set Required/MaxPeerCount to 0 if it is other org's implicit collection (mspid does not match peer's local mspid)

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify the channel exists and the peer joined it, so the config bundle is loaded.
  2. Ensure ChannelConfigSource is properly initialized before lifecycle validator/committer calls.
  3. Use the exact channel name as recorded in the ledger/configtx.
  4. In tests, register a mock channel config for the channel under test.

Example fix

// before
ccs, err := vc.ChaincodeImplicitCollections(channelName)
// after
if vc.Resources.ChannelConfigSource.GetStableChannelConfig(channelName) == nil {
    return nil, fmt.Errorf("channel %s config not loaded; join channel or fix config source", channelName)
}
ccs, err := vc.ChaincodeImplicitCollections(channelName)
Defensive patterns

Strategy: validation

Validate before calling

if vc.Resources.ChannelConfigSource.GetStableChannelConfig(channelName) == nil {
    return fmt.Errorf("no channel config available for %s", channelName)
}

Try / catch

ccs, err := vc.ChaincodeImplicitCollections(channelName)
if err != nil && strings.Contains(err.Error(), "could not get channelconfig") {
    return nil, fmt.Errorf("channel %s config not loaded: %w", channelName, err)
}

Prevention

When it happens

Trigger: Calling ChaincodeImplicitCollections(channelName) (via ImplicitCollections) when the channel config is not in the ChannelConfigSource — unknown channel, config bundle not yet loaded, or channel removed.

Common situations: Querying implicit collections on a channel the peer has not joined or whose config bundle was not loaded at startup; channel name mismatch between ledger and config source; config source not wired correctly in tests.

Related errors


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