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.
This commit is contained in:
Derek Guenther 2025-05-09 03:31:50 -04:00 committed by MariusVanDerWijden
parent 10e76e820e
commit f203dfccc4

View file

@ -590,12 +590,12 @@ func (api *ConsensusAPI) GetBlobsV2(hashes []common.Hash) ([]*engine.BlobAndProo
// pull up the blob hashes // pull up the blob hashes
var ( var (
res = make([]*engine.BlobAndProofV2, len(hashes)) res = make([]*engine.BlobAndProofV2, len(hashes))
index = make(map[common.Hash]int) index = make(map[common.Hash][]int)
sidecars = api.eth.TxPool().GetBlobs(hashes) sidecars = api.eth.TxPool().GetBlobs(hashes)
) )
for i, hash := range hashes { for i, hash := range hashes {
index[hash] = i index[hash] = append(index[hash], i)
} }
for i, sidecar := range sidecars { for i, sidecar := range sidecars {
if res[i] != nil { if res[i] != nil {
@ -611,12 +611,13 @@ func (api *ConsensusAPI) GetBlobsV2(hashes []common.Hash) ([]*engine.BlobAndProo
} }
blobHashes := sidecar.BlobHashes() blobHashes := sidecar.BlobHashes()
for bIdx, hash := range blobHashes { for bIdx, hash := range blobHashes {
if idx, ok := index[hash]; ok { if idxes, ok := index[hash]; ok {
proofs := sidecar.CellProofsAt(bIdx) proofs := sidecar.CellProofsAt(bIdx)
var cellProofs []hexutil.Bytes var cellProofs []hexutil.Bytes
for _, proof := range proofs { for _, proof := range proofs {
cellProofs = append(cellProofs, proof[:]) cellProofs = append(cellProofs, proof[:])
} }
for _, idx := range idxes {
res[idx] = &engine.BlobAndProofV2{ res[idx] = &engine.BlobAndProofV2{
Blob: sidecar.Blobs[bIdx][:], Blob: sidecar.Blobs[bIdx][:],
CellProofs: cellProofs, CellProofs: cellProofs,
@ -624,6 +625,7 @@ func (api *ConsensusAPI) GetBlobsV2(hashes []common.Hash) ([]*engine.BlobAndProo
} }
} }
} }
}
return res, nil return res, nil
} }