{"record":{"id":"6883a8a6116ba5f4","repo":"hyperledger/fabric","slug":"no-orderer-config-in-bundle-6883a8","errorCode":null,"errorMessage":"no orderer config in bundle","messagePattern":"no orderer config in bundle","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/consenter.go","lineNumber":262,"sourceCode":"\n\treturn chain, nil\n}\n\nfunc (c *Consenter) IsChannelMember(joinBlock *cb.Block) (bool, error) {\n\tif joinBlock == nil {\n\t\treturn false, errors.New(\"nil block\")\n\t}\n\tenvelopeConfig, err := protoutil.ExtractEnvelope(joinBlock, 0)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tbundle, err := channelconfig.NewBundleFromEnvelope(envelopeConfig, c.BCCSP)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\toc, exists := bundle.OrdererConfig()\n\tif !exists {\n\t\treturn false, errors.New(\"no orderer config in bundle\")\n\t}\n\tmember := false\n\n\tsantizedCert, err := crypto.SanitizeX509Cert(c.Identity)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Extract public key using the same approach as IsConsenterOfChannel\n\tbl, _ := pem.Decode(santizedCert)\n\tif bl == nil {\n\t\treturn false, errors.Errorf(\"node identity certificate %s is not a valid PEM\", string(santizedCert))\n\t}\n\n\tmyPublicKey, err := cluster.ExtractPublicKeyFromCert(bl.Bytes)\n\tif err != nil {\n\t\tc.Logger.Warningf(\"Failed to extract public key from own certificate: %v\", err)\n\t\treturn false, err","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/consenter.go#L244-L280","documentation":"After extracting the config envelope from the join block and building a channelconfig bundle, IsChannelMember needs the Orderer config group to read the ConsenterMapping. If the bundle has no Orderer group, this error is returned — the block is not a valid application channel config containing an orderer section.","triggerScenarios":"The supplied join block's first envelope yields a config bundle lacking an Orderer config group — e.g. joining with a non-config block, an application-channel-less config, or a corrupted/foreign block.","commonSituations":"Passing the wrong block (a data block or another channel's block) to osnadmin channel join; a genesis block generated from a profile missing the Orderer section; hand-edited config blocks stripped of the Orderer group.","solutions":["Use a proper channel config (genesis or latest config) block from the target channel: fetch the newest block with `peer channel fetch config` and join with that","Regenerate the genesis block with configtxgen using a profile that includes the Orderer: section","Verify block contents with `configtxlator proto_decode` to confirm the Orderer group is present"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Confirm the block is a channel config with an Orderer group before use\nenv, err := protoutil.ExtractEnvelope(block, 0)\nif err != nil { return err }\nbundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)\nif err != nil { return err }\nif _, ok := bundle.OrdererConfig(); !ok {\n    return errors.New(\"block has no Orderer config; use a proper channel config block\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Join with a genesis or latest config block, never a regular data block","Decode the block with configtxlator to verify it contains an Orderer group","Ensure configtx profiles define an Orderer section for every channel"],"tags":["fabric","channel-config","channel-join","consensus"],"backgroundTag":"missing-orderer-config","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"}