{"record":{"id":"91344c0c1c79d430","repo":"hyperledger/fabric","slug":"errsystemchannelnotsupported","errorCode":"ErrSystemChannelNotSupported","errorMessage":"invalid config: contains consortiums","messagePattern":"invalid config: contains consortiums","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/channelparticipation/validator.go","lineNumber":56,"sourceCode":"\t\treturn \"\", errors.New(\"invalid block: Header.DataHash is different from Hash(block.Data)\")\n\t}\n\n\tenvelope, err := protoutil.ExtractEnvelope(configBlock, 0)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tcryptoProvider := factory.GetDefault()\n\tbundle, err := channelconfig.NewBundleFromEnvelope(envelope, cryptoProvider)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tchannelID = bundle.ConfigtxValidator().ChannelID()\n\n\t// Check channel type\n\t_, isSystemChannel := bundle.ConsortiumsConfig()\n\tif isSystemChannel {\n\t\treturn \"\", errors.WithMessage(types.ErrSystemChannelNotSupported, \"invalid config: contains consortiums\")\n\t}\n\n\t_, isAppChannel := bundle.ApplicationConfig()\n\tif !isAppChannel {\n\t\treturn \"\", errors.New(\"invalid config: must contain application config\")\n\t}\n\n\treturn channelID, err\n}\n\n// ValidateUpdateConfigEnvelope checks whether this envelope can be used as an update config for the channel participation API.\n// It returns the channel ID.\n// It verifies that it is not a system channel by checking that consortiums config does not exist.\n// It verifies it is an application channel by checking that the application group exists.\n// It returns an error when it cannot be used as a update config envelope.\nfunc ValidateUpdateConfigEnvelope(env *cb.Envelope) (channelID string, err error) {\n\tpayload, err := protoutil.UnmarshalPayload(env.Payload)","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/channelparticipation/validator.go#L38-L74","documentation":"ValidateJoinBlock guard: the config bundle derived from the join block contains a consortiums group, i.e. it is a system channel config. The channel participation API only accepts application channel configs, so joining with a system channel genesis block is rejected (wrapped with ErrSystemChannelNotSupported).","triggerScenarios":"Thrown at orderer/common/channelparticipation/validator.go:56 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Join with the application channel's genesis block instead of the system channel's","If migrating from a system channel, use the osnadmin migration flow to produce an application channel genesis block"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}