{"record":{"id":"a4cfbcdc19d83a02","repo":"hyperledger/fabric","slug":"empty-policies-in-orderer-group","errorCode":null,"errorMessage":"empty policies in 'Orderer' group","messagePattern":"empty policies in 'Orderer' group","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/configverifier.go","lineNumber":156,"sourceCode":"\t\tidentities = append(identities, &msp.MSPPrincipal{\n\t\t\tPrincipalClassification: msp.MSPPrincipal_IDENTITY,\n\t\t\tPrincipal:               protoutil.MarshalOrPanic(&msp.SerializedIdentity{Mspid: consenter.MspId, IdBytes: consenter.Identity}),\n\t\t})\n\t}\n\n\tquorumSize := policies.ComputeBFTQuorum(n, f)\n\tsp := &common.SignaturePolicyEnvelope{\n\t\tRule:       policydsl.NOutOf(int32(quorumSize), pols),\n\t\tIdentities: identities,\n\t}\n\n\texpectedConfigPol := &common.Policy{\n\t\tType:  int32(common.Policy_SIGNATURE),\n\t\tValue: protoutil.MarshalOrPanic(sp),\n\t}\n\n\tif len(conf.ChannelGroup.Groups[\"Orderer\"].Policies) == 0 {\n\t\treturn fmt.Errorf(\"empty policies in 'Orderer' group\")\n\t}\n\n\tif conf.ChannelGroup.Groups[\"Orderer\"].Policies[\"BlockValidation\"] == nil {\n\t\treturn fmt.Errorf(\"block validation policy is not found in the policies of 'Orderer' group\")\n\t}\n\n\tactualPolicy := conf.ChannelGroup.Groups[\"Orderer\"].Policies[\"BlockValidation\"].Policy\n\n\tif !proto.Equal(expectedConfigPol, actualPolicy) {\n\t\treturn fmt.Errorf(\"block validation policy should be a signature policy: %v but it is %v instead\", expectedConfigPol, actualPolicy)\n\t}\n\n\tconsensusTypeConfigValue := conf.ChannelGroup.Groups[\"Orderer\"].Values[\"ConsensusType\"]\n\n\tif consensusTypeConfigValue == nil {\n\t\treturn fmt.Errorf(\"missing consensus type property in config\")\n\t}\n","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/configverifier.go#L138-L174","documentation":"checkConsentersMatchPolicy guard: the Orderer group in the config has an empty Policies map. The smartbft verifier needs at least the BlockValidation policy to compare against the expected BFT quorum policy, so an orderer group without policies is rejected.","triggerScenarios":"Thrown at orderer/consensus/smartbft/configverifier.go:156 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the config update preserves the Orderer group's policies","Regenerate the config from a known-good current config"],"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"}