hyperledger/fabric · error
failed to retrieve last config envelope
Error message
failed to retrieve last config envelope
What it means
createBFTDeliverer wraps a failure of deliverclient.ConfigFromBlock on the last config block: the config envelope could not be extracted/unmarshalled from that block, so the channel configuration needed for block verification is unreadable.
Source
Thrown at orderer/consensus/smartbft/synchronizer_bft.go:190
if lenH < f+1 {
s.Logger.Debugf("Returning %d", heights[int(lenH)-1])
return heights[int(lenH)-1]
}
s.Logger.Debugf("Returning %d", heights[f])
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)View on GitHub (pinned to 2736b63f8f)
Solutions
- Verify the config block in the ledger is intact
- Restore the ledger or re-sync from other cluster members
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at orderer/consensus/smartbft/synchronizer_bft.go:190 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/e80225ad45fbebd5.
Report an issue: GitHub.