{"record":{"id":"c16d60333a590473","repo":"hyperledger/fabric","slug":"remote-nodes-cannot-be-computed-rejecting-config","errorCode":null,"errorMessage":"remote nodes cannot be computed, rejecting config block","messagePattern":"remote nodes cannot be computed, rejecting config block","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"orderer/consensus/smartbft/util.go","lineNumber":77,"sourceCode":"\t}\n\treturn RuntimeConfig{\n\t\tconsenters:             rtc.consenters,\n\t\tBFTConfig:              rtc.BFTConfig,\n\t\tid:                     rtc.id,\n\t\tlogger:                 rtc.logger,\n\t\tLastCommittedBlockHash: hex.EncodeToString(protoutil.BlockHeaderHash(block.Header)),\n\t\tNodes:                  rtc.Nodes,\n\t\tID2Identities:          rtc.ID2Identities,\n\t\tRemoteNodes:            rtc.RemoteNodes,\n\t\tLastBlock:              block,\n\t\tLastConfigBlock:        rtc.LastConfigBlock,\n\t}, nil\n}\n\nfunc (rtc RuntimeConfig) configBlockCommitted(block *cb.Block, bccsp bccsp.BCCSP) (RuntimeConfig, error) {\n\tnodeConf, err := remoteNodesFromConfigBlock(block, rtc.logger, bccsp)\n\tif err != nil {\n\t\treturn rtc, errors.Wrap(err, \"remote nodes cannot be computed, rejecting config block\")\n\t}\n\n\tbftConfig, err := configBlockToBFTConfig(rtc.id, block, bccsp)\n\tif err != nil {\n\t\treturn RuntimeConfig{}, err\n\t}\n\n\treturn RuntimeConfig{\n\t\tconsenters:             nodeConf.consenters,\n\t\tBFTConfig:              bftConfig,\n\t\tisConfig:               true,\n\t\tid:                     rtc.id,\n\t\tlogger:                 rtc.logger,\n\t\tLastCommittedBlockHash: hex.EncodeToString(protoutil.BlockHeaderHash(block.Header)),\n\t\tNodes:                  nodeConf.nodeIDs,\n\t\tID2Identities:          nodeConf.id2Identities,\n\t\tRemoteNodes:            nodeConf.remoteNodes,\n\t\tLastBlock:              block,","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/util.go#L59-L95","documentation":"When a config block is committed, RuntimeConfig.configBlockCommitted recomputes the consenter set via remoteNodesFromConfigBlock. If that fails (e.g. the block cannot be parsed, is not an orderer config block, consenter identities/certs are invalid, or MSP/crypto material can't be processed), the block commit is rejected with this wrapped error to avoid proceeding with an unknown remote-node set.","triggerScenarios":"BlockCommitted callback after a channel configuration transaction where the new config block lacks a valid orderer group or contains malformed consenter entries/TLS certs that remoteNodesFromConfigBlock cannot decode.","commonSituations":"Channel update that removed the orderer config section, consenter endpoints or certificates corrupted during configtxlator edits, or a non-config block passed as the latest config block due to LastConfig index issues.","solutions":["Inspect the new config block: ensure it has a valid Orderer group with consenter definitions and valid TLS/identity certs","Re-run the channel config update with correctly generated consenter entries (correct MSP IDs, certs, ports)","Verify the block's last-config index points at a real orderer config block","Check orderer logs for the inner wrapped error from remoteNodesFromConfigBlock to pinpoint the bad entry"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// before committing, decode the proposed config block\nenv, _ := protoutil.UnmarshalEnvelope(block.Data.Data[0])\npayload, _ := protoutil.UnmarshalPayload(env.Payload)\ncfgEnv, _ := configtx.UnmarshalConfigEnvelope(payload.Data)\nif cfgEnv.Config.ChannelGroups[\"Orderer\"] == nil || len(cfgEnv.Config.ChannelGroups[\"Orderer\"].Groups[\"Consortiums\"]) > 0 && cfgEnv.Config.ChannelGroups[\"Orderer\"].Values[\"Orderers\"] == nil {\n  return errors.New(\"proposed config has no valid orderer/consenter section\")\n}","typeGuard":null,"tryCatchPattern":"if err := chain.BlockCommitted(block); err != nil && strings.Contains(err.Error(), \"remote nodes cannot be computed\") {\n  logger.Panicf(\"config block unusable, halt orderer for manual recovery: %v\", err)\n}","preventionTips":["Always round-trip proposed channel config through configtxlator and verify consenter entries","Keep consenter TLS/identity certs and MSP IDs valid when updating endpoints","Never delete the Orderer group in channel updates","Back up the last good config block before applying updates"],"tags":["hyperledger-fabric","smartbft","config-block","msp"],"backgroundTag":"invalid-config-block","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"}