erigontech / erigontech/erigon

cl/beacon: publishing a block with blobs fails on a beacon node that did not produce it

Open
#23,112 5 comments 0 reactions 1 assignee Claimed by @lystopad View on GitHub
Caplin
Dominant language
Go
Stars
3.6k
Forks
1.5k
Avg merge
1d 16h
Merged PRs (30d)
455

Description

## Problem

`broadcastBlock` resolves blobs from the node's local cache:

```go
bundle, has := a.blobBundles.Get(common.Bytes48(*commitment))
if !has {
return fmt.Errorf("missing blob bundle for commitment %x", commitment)
}
```

`blobBundles` is only populated when *that* node produced the payload, so any beacon node asked to publish a full block it did not build returns 500.

The blobs are already in the request. `parseRequestBeaconBlock` decodes a `DenebSignedBeaconBlock`, which carries `KZGProofs` and `Blobs`, but `postBeaconBlocks` passes only `block.SignedBlock` to `broadcastBlock` and the rest is dropped.

## Impact

Any setup where a validator client publishes to more than one beacon node. The producing node succeeds, the others fail. Only blob-carrying blocks are affected — a block with 0 blobs publishes fine on every node.

Seen on a mainnet validator with two beacon nodes:

```
Error from beacon node when publishing block: 500 "missing blob bundle for commitment &b80d7d60..."
```

The block itself was published by the producing node, so this is not currently a missed-block risk. It does mean the second node contributes nothing to blob propagation, and it produces a recurring error in validator client logs.

## Expected

Use the blobs and KZG proofs from the request body when present, falling back to the local cache only when they are absent.

## Pointers

- `cl/beacon/handler/block_production.go` — `broadcastBlock`, `postBeaconBlocks`, `parseRequestBeaconBlock`
- Both the pre-Fulu and Fulu paths do the same cache lookup.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.