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, nil

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Confirm the collection was defined (chaincode upgraded with the collection config) before the requested blockSeq; don't request pvt data for earlier blocks.
  2. Use the block where the collection config was first committed as the lower bound for reconciliation.
  3. Re-sync config history from genesis by rebuilding peer DBs from a consistent backup.
  4. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/3d79be832b048dbb. Report an issue: GitHub.