hyperledger/fabric · error
failed to create BlockVerificationAssistant
Error message
failed to create BlockVerificationAssistant
What it means
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.
Source
Thrown at orderer/consensus/smartbft/synchronizer_bft.go:196
return heights[f]
}
// createBFTDeliverer creates and initializes the BFT block deliverer.
func (s *BFTSynchronizer) createBFTDeliverer(startHeight uint64, myEndpoint string) (BFTBlockDeliverer, error) {
lastBlock := s.Support.Block(startHeight - 1)
lastConfigBlock, err := cluster.LastConfigBlock(lastBlock, s.Support)
if err != nil {
return nil, errors.Wrapf(err, "failed to retrieve last config block")
}
lastConfigEnv, err := deliverclient.ConfigFromBlock(lastConfigBlock)
if err != nil {
return nil, errors.Wrapf(err, "failed to retrieve last config envelope")
}
var updatableVerifier deliverclient.CloneableUpdatableBlockVerifier
updatableVerifier, err = s.VerifierFactory.CreateBlockVerifier(lastConfigBlock, lastBlock, s.CryptoProvider, s.Logger)
if err != nil {
return nil, errors.Wrapf(err, "failed to create BlockVerificationAssistant")
}
clientConfig := s.ClusterDialer.Config // The cluster and block puller use slightly different options
clientConfig.AsyncConnect = false
clientConfig.SecOpts.VerifyCertificate = nil
// The maximal amount of time to wait before retrying to connect.
maxRetryInterval := s.LocalConfigCluster.ReplicationRetryTimeout
// The minimal amount of time to wait before retrying. The retry interval doubles after every unsuccessful attempt.
minRetryInterval := maxRetryInterval / 50
// The maximal duration of a Sync. After this time Sync returns with whatever it had pulled until that point.
maxRetryDuration := s.LocalConfigCluster.ReplicationPullTimeout * time.Duration(s.LocalConfigCluster.ReplicationMaxRetries)
// 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.
blockCensorshipTimeOut := maxRetryDuration / 3
bftDeliverer := s.BFTDelivererFactory.CreateBFTDeliverer(
s.Support.ChannelID(),
s.syncBuff,View on GitHub (pinned to 2736b63f8f)
Solutions
- Check the channel config in the last config block is valid
- Re-join the node so a clean config is loaded
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at orderer/consensus/smartbft/synchronizer_bft.go:196 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/6910c206bc8a8349.
Report an issue: GitHub.