hyperledger/fabric · error

ErrSystemChannelNotSupported

ErrSystemChannelNotSupported

Error message

system channel not supported

What it means

ErrSystemChannelNotSupported is returned by ValidateJoinBlock when the supplied config block contains a Consortiums section, i.e. it is a system-channel genesis block. Channel participation only accepts application channel config blocks, and joining with a system-channel block is rejected with this error.

Source

Thrown at orderer/common/types/errors.go:17

/*
Copyright IBM Corp. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package types

import "github.com/pkg/errors"

// ErrSystemChannelExists is returned when trying to join or remove an application channel when the system channel exists.
//
// Deprecated: system channel no longer supported
var ErrSystemChannelExists = errors.New("system channel exists")

// ErrSystemChannelNotSupported is returned when trying to join with a system channel config block.
var ErrSystemChannelNotSupported = errors.New("system channel not supported")

// ErrChannelAlreadyExists is returned when trying to join a app channel that already exists (when the system channel does not
// exist), or when trying to join the system channel when it already exists.
var ErrChannelAlreadyExists = errors.New("channel already exists")

// ErrAppChannelsAlreadyExists is returned when trying to join a system channel (that does not exist) when application channels
// already exist.
var ErrAppChannelsAlreadyExists = errors.New("application channels already exist")

// ErrChannelNotExist is returned when trying to remove or list a channel that does not exist
var ErrChannelNotExist = errors.New("channel does not exist")

// ErrChannelPendingRemoval is returned when trying to remove or list a channel that is being removed.
var ErrChannelPendingRemoval = errors.New("channel pending removal")

// ErrChannelRemovalFailure is returned when a removal attempt failure has been recorded.
var ErrChannelRemovalFailure = errors.New("channel removal failure")

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Generate an application-channel genesis block: 'configtxgen -profile <AppProfile> -channelID <channel> -outputBlock <file>'
  2. Ensure the configtx.yaml profile used does not include Consortiums (app-channel profiles reference consortium, not define it)
  3. Retry the join with the app-channel block

Example fix

// before
configtxgen -profile SampleSingleMSPKafka -outputBlock sys.block -channelID test-system-channel
osnadmin channel join --channelID mychannel --config-block sys.block  # not supported
// after
configtxgen -profile TwoOrgsChannel -outputBlock app.block -channelID mychannel
osnadmin channel join --channelID mychannel --config-block app.block
Defensive patterns

Strategy: validation

Validate before calling

bundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)
if err == nil {
    if _, isSys := bundle.ConsortiumsConfig(); isSys {
        return errors.New("join block must be an app-channel config block")
    }
}

Try / catch

if errors.Is(err, types.ErrSystemChannelNotSupported) {
    // regenerate the block from an app-channel profile
}

Prevention

When it happens

Trigger: POST /participation/v1/channels with a genesis block generated from a system-channel profile; ValidateJoinBlock detects bundle.ConsortiumsConfig() exists and wraps this error.

Common situations: Using 'configtxgen -profile SampleSystemChannel' (or legacy two-system-channel setups) output as the --config-block for osnadmin join; copying the old system channel genesis block out of habit during migration.

Related errors


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