{"record":{"id":"0650a1c964d70a11","repo":"hyperledger/fabric","slug":"the-block-isn-t-a-system-channel-block-because-it","errorCode":null,"errorMessage":"the block isn't a system channel block because it lacks ConsortiumsConfig","messagePattern":"the block isn't a system channel block because it lacks ConsortiumsConfig","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/server/util.go","lineNumber":64,"sourceCode":"\t}\n\n\tif block.Data == nil || len(block.Data.Data) == 0 {\n\t\treturn errors.New(\"empty block data\")\n\t}\n\n\tfirstTransaction := &common.Envelope{}\n\tif err := proto.Unmarshal(block.Data.Data[0], firstTransaction); err != nil {\n\t\treturn errors.Wrap(err, \"failed extracting envelope from block\")\n\t}\n\n\tbundle, err := channelconfig.NewBundleFromEnvelope(firstTransaction, bccsp)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, exists := bundle.ConsortiumsConfig()\n\tif !exists {\n\t\treturn errors.New(\"the block isn't a system channel block because it lacks ConsortiumsConfig\")\n\t}\n\treturn nil\n}\n\ntype clock struct{}\n\nfunc (c *clock) Now() time.Time {\n\treturn time.Now()\n}\n\nfunc (c *clock) After(d time.Duration) <-chan time.Time {\n\treturn time.After(d)\n}\n\nfunc newRateLimiter(rate int, timeout time.Duration) *throttle.SharedRateLimiter {\n\treturn &throttle.SharedRateLimiter{\n\t\tLimit:             rate,\n\t\tTime:              &clock{},","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/server/util.go#L46-L82","documentation":"validateBootstrapBlock builds a channelconfig bundle from the first envelope and requires ConsortiumsConfig to exist, which only system channel genesis blocks have. Since the system channel is no longer supported, a block lacking it is rejected with this message when the legacy validation path is invoked.","triggerScenarios":"Joining with a block that passes envelope parsing but whose config bundle has no Consortiums section — i.e. an application-channel config block supplied where a system-channel block is expected (legacy validation path).","commonSituations":"Operators migrating off the deprecated system channel mistakenly joining an app-channel genesis block through legacy system-channel validation; mixing old (2.x system-channel) workflows with new channel-participation APIs.","solutions":["Do not create/join a system channel; use channel participation to join application channels directly","If using a newer Fabric where the system channel is removed, this validation path no longer applies — upgrade orderer","If you truly need the legacy system channel, use an older Fabric (2.3-style) ordering service setup","Regenerate the block with a profile that includes Consortiums if you intentionally operate a legacy system channel"],"exampleFix":"// before (legacy system-channel bootstrap)\nconfigtxgen -profile SampleDevModeKafka -outputBlock sys.block -channelID test-system-channel\n// after (app channel via participation API)\nconfigtxgen -profile TwoOrgsChannel -outputBlock app.block -channelID mychannel\nosnadmin channel join --channelID mychannel --config-block app.block","handlingStrategy":"validation","validationCode":"bundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)\nif err != nil { return err }\nif _, ok := bundle.ConsortiumsConfig(); ok {\n    return errors.New(\"block is a system-channel block; not usable here\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Stop using system channels; use app-channel profiles in configtx.yaml","Verify with 'configtxgen -inspectBlock' whether the block contains Consortiums","During migration, re-bootstrap orderers without system channel genesis"],"tags":["fabric","orderer","system-channel","channel-participation","config"],"backgroundTag":"system-channel-not-supported","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"}