hyperledger/fabric · error
no collection config update below block sequence = <%d> coll
Error message
no collection config update below block sequence = <%d> collection name = <%s> for chaincode <%s> is available
What it means
After querying the config history, if MostRecentCollectionConfigBelow returns successfully but with nil configInfo, the retriever reports that no collection config update exists below the requested block sequence. The access policy for the private data cannot be reconstructed, so the request is rejected rather than answered with the wrong policy.
Source
Thrown at gossip/privdata/dataretriever.go:152
pvtRWSet := dr.extractPvtRWsets(data.WriteSet.NsPvtRwset, dig.Namespace, dig.Collection)
pvtRWSetWithConfig.RWSet = append(pvtRWSetWithConfig.RWSet, pvtRWSet...)
}
confHistoryRetriever, err := dr.committer.GetConfigHistoryRetriever()
if err != nil {
return nil, errors.Errorf("cannot obtain configuration history retriever, for collection <%s>"+
" txID <%s> block sequence number <%d> due to <%s>", dig.Collection, dig.TxId, dig.BlockSeq, err)
}
configInfo, err := confHistoryRetriever.MostRecentCollectionConfigBelow(dig.BlockSeq, dig.Namespace)
if err != nil {
return nil, errors.Errorf("cannot find recent collection config update below block sequence = %d,"+
" collection name = <%s> for chaincode <%s>", dig.BlockSeq, dig.Collection, dig.Namespace)
}
if configInfo == nil {
return nil, errors.Errorf("no collection config update below block sequence = <%d>"+
" collection name = <%s> for chaincode <%s> is available ", dig.BlockSeq, dig.Collection, dig.Namespace)
}
configs := extractCollectionConfig(configInfo.CollectionConfig, dig.Collection)
if configs == nil {
return nil, errors.Errorf("no collection config was found for collection <%s>"+
" namespace <%s> txID <%s>", dig.Collection, dig.Namespace, dig.TxId)
}
pvtRWSetWithConfig.CollectionConfig = configs
results[common.DigKey{
Namespace: dig.Namespace,
Collection: dig.Collection,
TxId: dig.TxId,
BlockSeq: dig.BlockSeq,
SeqInBlock: dig.SeqInBlock,
}] = pvtRWSetWithConfig
}
return results, nilView on GitHub (pinned to 2736b63f8f)
Solutions
- Confirm the collection was defined (chaincode upgraded with the collection config) before the requested blockSeq; don't request pvt data for earlier blocks.
- Use the block where the collection config was first committed as the lower bound for reconciliation.
- Re-sync config history from genesis by rebuilding peer DBs from a consistent backup.
- Fetch the data from a peer holding the correct historical config.
Example fix
// before
configInfo, err := confHistoryRetriever.MostRecentCollectionConfigBelow(dig.BlockSeq, dig.Namespace)
// after: check digest is newer than collection creation
if dig.BlockSeq < collectionCreatedAtSeq(dig.Namespace, dig.Collection) {
return nil, nil // collection didn't exist then
}
configInfo, err := confHistoryRetriever.MostRecentCollectionConfigBelow(dig.BlockSeq, dig.Namespace) Defensive patterns
Strategy: validation
Validate before calling
creationSeq, ok := collectionCreationBlockSeq(ns, collection)
if !ok || dig.BlockSeq <= creationSeq {
return errors.New("collection not defined at requested block sequence")
} Type guard
func collectionDefinedAt(ns, coll string, seq uint64) bool {
cs, ok := collectionCreationBlockSeq(ns, coll)
return ok && seq > cs
} Try / catch
configInfo, err := retriever.MostRecentCollectionConfigBelow(dig.BlockSeq, dig.Namespace)
if configInfo == nil {
logger.Debugf("collection %s not defined below seq %d; skipping digest", dig.Collection, dig.BlockSeq)
return
} Prevention
- Start reconciliation from the block where the collection was first configured.
- Keep config history from genesis (full backups only).
- Don't request pvt data predating the collection's chaincode upgrade.
- Track collection creation heights in tooling that builds digests.
When it happens
Trigger: Requesting private data for a digest whose BlockSeq precedes the first collection-config update for that chaincode/collection — e.g. the collection was introduced by a chaincode upgrade at a later block than the transaction being reconciled.
Common situations: Reconciliation of pvt data for blocks older than when the private collection was defined; peers restored from partial backups missing early config history; miscomputed BlockSeq in gossip digests.
Related errors
- collection-name: %s -- cannot unmarshal identity bytes into
- collection-name: %s -- collection member '%s' is not part of
- collection-name: %s -- cannot unmarshal identity bytes into
- collection-name: %s -- principal type %v is not supported
- signature policy is not an OR concatenation, NOutOf %d
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/3d79be832b048dbb.
Report an issue: GitHub.