{"record":{"id":"7f6ab12236388f17","repo":"hyperledger/fabric","slug":"consenter-d-in-the-mapping-is-empty","errorCode":null,"errorMessage":"consenter %d in the mapping is empty","messagePattern":"consenter (.+?) in the mapping is empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/configverifier.go","lineNumber":131,"sourceCode":"\t}\n\n\tif conf.ChannelGroup.Groups[\"Orderer\"].Values[\"Orderers\"] == nil {\n\t\treturn fmt.Errorf(\"no values in 'Orderer' group\")\n\t}\n\n\tords := &common.Orderers{}\n\tif err := proto.Unmarshal(conf.ChannelGroup.Groups[\"Orderer\"].Values[\"Orderers\"].Value, ords); err != nil {\n\t\treturn err\n\t}\n\n\tn := len(ords.ConsenterMapping)\n\tf := (n - 1) / 3\n\n\tvar identities []*msp.MSPPrincipal\n\tvar pols []*common.SignaturePolicy\n\tfor i, consenter := range ords.ConsenterMapping {\n\t\tif consenter == nil {\n\t\t\treturn fmt.Errorf(\"consenter %d in the mapping is empty\", i)\n\t\t}\n\t\tpols = append(pols, &common.SignaturePolicy{\n\t\t\tType: &common.SignaturePolicy_SignedBy{\n\t\t\t\tSignedBy: int32(i),\n\t\t\t},\n\t\t})\n\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","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/configverifier.go#L113-L149","documentation":"checkConsentersMatchPolicy guard: entry %d in the Orderers value's ConsenterMapping is nil while iterating the smartbft consenter list. A sparse/empty slot in the consenter mapping makes it impossible to build the expected signature policy.","triggerScenarios":"Thrown at orderer/consensus/smartbft/configverifier.go:131 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the config update so every ConsenterMapping entry is fully populated","Verify the tooling that produced the Orderers value did not drop an entry"],"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"}