{"record":{"id":"9253a0015f6d6613","repo":"hyperledger/fabric","slug":"cannot-create-bft-block-deliverer","errorCode":null,"errorMessage":"cannot create BFT block deliverer","messagePattern":"cannot create BFT block deliverer","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/synchronizer_bft.go","lineNumber":109,"sourceCode":"\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"cannot get detect target height\")\n\t}\n\n\tstartHeight := s.Support.Height()\n\tif startHeight >= targetHeight {\n\t\treturn nil, errors.Errorf(\"already at target height of %d\", targetHeight)\n\t}\n\n\t// === Create a buffer to accept the blocks delivered from the BFTDeliverer.\n\tcapacityBlocks := max(uint(s.LocalConfigCluster.ReplicationBufferSize)/uint(s.Support.SharedConfig().BatchSize().AbsoluteMaxBytes), 100)\n\ts.mutex.Lock()\n\ts.syncBuff = NewSyncBuffer(capacityBlocks)\n\ts.mutex.Unlock()\n\n\t// === Create the BFT block deliverer and start a go-routine that fetches block and inserts them into the syncBuffer.\n\tbftDeliverer, err := s.createBFTDeliverer(startHeight, myEndpoint)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"cannot create BFT block deliverer\")\n\t}\n\n\tgo bftDeliverer.DeliverBlocks()\n\tdefer bftDeliverer.Stop()\n\n\t// === Loop on sync-buffer and pull blocks, writing them to the ledger, returning the last block pulled.\n\tlastPulledBlock, err := s.getBlocksFromSyncBuffer(startHeight, targetHeight)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"failed to get any blocks from SyncBuffer\")\n\t}\n\n\tdecision := s.BlockToDecision(lastPulledBlock)\n\ts.Logger.Infof(\"Returning decision from block [%d], decision: %+v\", lastPulledBlock.GetHeader().GetNumber(), decision)\n\treturn decision, nil\n}\n\n// detectTargetHeight probes remote endpoints and detects what is the target height this node needs to reach. It also\n// detects the self-endpoint.","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/synchronizer_bft.go#L91-L127","documentation":"Raised in BFTSynchronizer.synchronize when s.createBFTDeliverer(startHeight, myEndpoint) returns an error, wrapped as 'cannot create BFT block deliverer'. The BFT deliverer wires up the block-fetching machinery (BlockPuller/deliver clients) that streams blocks into the sync buffer; creation failures are configuration, TLS, or dialing problems detected before fetching starts.","triggerScenarios":"createBFTDeliverer fails while constructing the deliverer: BlockPuller creation errors (invalid cluster TLS config, dialer misconfiguration, crypto provider issues) — happens after target height detection succeeded but before DeliverBlocks is started.","commonSituations":"Malformed orderer.yaml cluster section (bad TLS cert/key paths, wrong dial timeout); missing or invalid MSP/TLS material for the cluster client; earlier height probing passed but deliverer-specific configuration is wrong.","solutions":["Read the wrapped inner error to see whether it is a TLS, dialer, or crypto failure","Validate orderer.yaml cluster settings: TLS.Enabled, client cert/key paths, dial timeouts","Ensure the cluster client certificate/key pair is valid and its CA is trusted in the channel config","Compare with a working node's configuration and fix deviations"],"exampleFix":"// before (orderer.yaml)\ncluster:\n  clientCertificate:\n    File: wrong-path.pem\n// after\ncluster:\n  clientCertificate:\n    File: /var/hyperledger/orderer/tls/server.crt\n  clientPrivateKey:\n    File: /var/hyperledger/orderer/tls/server.key","handlingStrategy":"validation","validationCode":"// Validate cluster config before starting the orderer\nif _, err := tls.LoadX509KeyPair(cluster.ClientCertificate.File, cluster.ClientPrivateKey.File); err != nil {\n    log.Fatalf(\"invalid cluster client keypair: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"resp := bftSynchronizer.Sync()\n// creation failures are deterministic (config), not retriable — fail fast and alert\nif syncFailed(resp) && delivererCreationFailedInLogs() {\n    alertOperator(\"BFT deliverer creation failed: fix orderer.yaml cluster section\")\n}","preventionTips":["Validate orderer.yaml cluster TLS paths and permissions at startup/deployment","Use config linting or dry-run to catch malformed cluster sections","Ensure the cluster client cert is trusted by all peers' channel CAs","Keep crypto material generation and deployment automated to avoid path drift"],"tags":["consensus","smartbft","fabric","configuration","tls"],"backgroundTag":"invalid-cluster-tls-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"}