From f203dfccc44686bb86280ce29a5a5d7b2295f592 Mon Sep 17 00:00:00 2001 From: Derek Guenther Date: Fri, 9 May 2025 03:31:50 -0400 Subject: [PATCH] eth/catalyst: allow duplicate blob hashes (#31788) While running kurtosis and spamoor, I noticed occasional `null` entries coming back from `getBlobsV2`. After investigating, I found that spamoor can use the same blob data across multiple transactions, so with larger blob counts, there's an increased chance that a blob is included in a block more than once. As a result, previous indexes in the hash-to-index map in `getBlobsV2` would get overwritten. I changed the map from `map[common.Hash]int` to `map[common.Hash][]int` to handle this case. I decided to go this route because it's the smallest-possible fix, but it could also make sense to update `blobpool.GetBlobs` to de-duplicate the hashes. --- eth/catalyst/api.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index a24923f104..623a09c585 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -590,12 +590,12 @@ func (api *ConsensusAPI) GetBlobsV2(hashes []common.Hash) ([]*engine.BlobAndProo // pull up the blob hashes var ( res = make([]*engine.BlobAndProofV2, len(hashes)) - index = make(map[common.Hash]int) + index = make(map[common.Hash][]int) sidecars = api.eth.TxPool().GetBlobs(hashes) ) for i, hash := range hashes { - index[hash] = i + index[hash] = append(index[hash], i) } for i, sidecar := range sidecars { if res[i] != nil { @@ -611,15 +611,17 @@ func (api *ConsensusAPI) GetBlobsV2(hashes []common.Hash) ([]*engine.BlobAndProo } blobHashes := sidecar.BlobHashes() for bIdx, hash := range blobHashes { - if idx, ok := index[hash]; ok { + if idxes, ok := index[hash]; ok { proofs := sidecar.CellProofsAt(bIdx) var cellProofs []hexutil.Bytes for _, proof := range proofs { cellProofs = append(cellProofs, proof[:]) } - res[idx] = &engine.BlobAndProofV2{ - Blob: sidecar.Blobs[bIdx][:], - CellProofs: cellProofs, + for _, idx := range idxes { + res[idx] = &engine.BlobAndProofV2{ + Blob: sidecar.Blobs[bIdx][:], + CellProofs: cellProofs, + } } } }