{"record":{"id":"6910c206bc8a8349","repo":"hyperledger/fabric","slug":"failed-to-create-blockverificationassistant","errorCode":null,"errorMessage":"failed to create BlockVerificationAssistant","messagePattern":"failed to create BlockVerificationAssistant","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/synchronizer_bft.go","lineNumber":196,"sourceCode":"\treturn heights[f]\n}\n\n// createBFTDeliverer creates and initializes the BFT block deliverer.\nfunc (s *BFTSynchronizer) createBFTDeliverer(startHeight uint64, myEndpoint string) (BFTBlockDeliverer, error) {\n\tlastBlock := s.Support.Block(startHeight - 1)\n\tlastConfigBlock, err := cluster.LastConfigBlock(lastBlock, s.Support)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"failed to retrieve last config block\")\n\t}\n\tlastConfigEnv, err := deliverclient.ConfigFromBlock(lastConfigBlock)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"failed to retrieve last config envelope\")\n\t}\n\n\tvar updatableVerifier deliverclient.CloneableUpdatableBlockVerifier\n\tupdatableVerifier, err = s.VerifierFactory.CreateBlockVerifier(lastConfigBlock, lastBlock, s.CryptoProvider, s.Logger)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"failed to create BlockVerificationAssistant\")\n\t}\n\n\tclientConfig := s.ClusterDialer.Config // The cluster and block puller use slightly different options\n\tclientConfig.AsyncConnect = false\n\tclientConfig.SecOpts.VerifyCertificate = nil\n\n\t// The maximal amount of time to wait before retrying to connect.\n\tmaxRetryInterval := s.LocalConfigCluster.ReplicationRetryTimeout\n\t// The minimal amount of time to wait before retrying. The retry interval doubles after every unsuccessful attempt.\n\tminRetryInterval := maxRetryInterval / 50\n\t// The maximal duration of a Sync. After this time Sync returns with whatever it had pulled until that point.\n\tmaxRetryDuration := s.LocalConfigCluster.ReplicationPullTimeout * time.Duration(s.LocalConfigCluster.ReplicationMaxRetries)\n\t// If a remote orderer does not deliver blocks for this amount of time, even though it can do so, it is replaced as the block deliverer.\n\tblockCensorshipTimeOut := maxRetryDuration / 3\n\n\tbftDeliverer := s.BFTDelivererFactory.CreateBFTDeliverer(\n\t\ts.Support.ChannelID(),\n\t\ts.syncBuff,","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/synchronizer_bft.go#L178-L214","documentation":"createBFTDeliverer wraps a failure while constructing the updatable block verification assistant (from the last config block's bundle): the policy/consenter information needed to verify pulled blocks could not be assembled.","triggerScenarios":"Thrown at orderer/consensus/smartbft/synchronizer_bft.go:196 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the channel config in the last config block is valid","Re-join the node so a clean config is loaded"],"exampleFix":null,"handlingStrategy":"try-catch","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"}