{"record":{"id":"39aaf55f291685f5","repo":"hyperledger/fabric","slug":"initialized-with-an-invalid-config-block","errorCode":null,"errorMessage":"initialized with an invalid config block","messagePattern":"initialized with an invalid config block","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/util.go","lineNumber":437,"sourceCode":"\t\treturn nil, createErrorFunc(errors.New(\"block contains no data\"))\n\t}\n\n\tenv := &common.Envelope{}\n\tif err := proto.Unmarshal(block.Data.Data[0], env); err != nil {\n\t\treturn nil, createErrorFunc(err)\n\t}\n\n\tbundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)\n\tif err != nil {\n\t\treturn nil, createErrorFunc(err)\n\t}\n\n\treturn bundle, nil\n}\n\nfunc createErrorFunc(err error) protoutil.BlockVerifierFunc {\n\treturn func(_ *common.BlockHeader, _ *common.BlockMetadata) error {\n\t\treturn errors.Wrap(err, \"initialized with an invalid config block\")\n\t}\n}\n\n//go:generate mockery --dir . --name VerifierFactory --case underscore --output ./mocks/\n\n// VerifierFactory creates BlockVerifiers.\ntype VerifierFactory interface {\n\t// VerifierFromConfig creates a BlockVerifier from the given configuration.\n\tVerifierFromConfig(configuration *common.ConfigEnvelope, channel string) (protoutil.BlockVerifierFunc, error)\n}\n\n//go:generate mockery --dir . --name ChainPuller --case underscore --output mocks/\n\n// ChainPuller pulls blocks from a chain\ntype ChainPuller interface {\n\t// PullBlock pulls the given block from some orderer node\n\tPullBlock(seq uint64) *common.Block\n","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/util.go#L419-L455","documentation":"createErrorFunc returns a BlockVerifierFunc that permanently fails, wrapping the original initialization error with \"initialized with an invalid config block\". Every block signature verification performed by such a verifier returns this message, indicating the verifier was created from an invalid config block (bad policy, missing orderer section, empty data, etc.).","triggerScenarios":"Any VerifyBlockSignature call on a channel verifier whose creation failed — e.g. verifier built from a config block missing the BlockValidation policy, missing orderer section (BFT), or containing no data.","commonSituations":"A misconfigured channel propagates as signature-verification failures on every block; operators see this error in orderer logs for all incoming blocks until the verifier's source config block is corrected.","solutions":["Unwrap the error chain to find the underlying cause (missing policy / missing orderer config / empty data).","Fix the root cause in the channel config as indicated by the wrapped error, then restart the orderer so a valid verifier is built.","Re-pull a valid config block from a healthy orderer in the cluster.","If the channel is unrecoverable, recreate the channel from a correct genesis block and rejoin."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := verifier.VerifyBlockSignature(signedData); err != nil {\n    if strings.Contains(err.Error(), \"initialized with an invalid config block\") {\n        // verifier is permanently broken; re-acquire config block and rebuild\n        return rebuildVerifierFromHealthyOrderer(channel)\n    }\n    return err\n}","preventionTips":["Fix the underlying verifier-creation error immediately; every block will fail until then.","Monitor orderer logs for verifier initialization failures at startup.","Keep at least one healthy orderer to re-pull valid config blocks from."],"tags":["fabric","block-verification","config-block"],"backgroundTag":"invalid-config-block-verifier","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"}