Use SignedExecutionPayloadBid directly in pending payload cache

- Replace the `PendingPayloadBid` projection (slot + blob_kzg_commitments)
  with `Arc<SignedExecutionPayloadBid<E>>`. Cloning becomes a cheap Arc
  bump and the bid carries enough context for future bid<->envelope
  cross-checks. Add a `signed_payload_bid_from_block` helper.
- `PendingColumn` switches from a pre-sized `Vec<Option<_>>` to a sparse
  `HashMap<usize, _>`; the `new_with_capacity(num_blobs)` constructor is
  gone since callers no longer need to know the blob count up front.
- `PendingComponents::merge_data_columns` takes a slice instead of an
  owning iterator (it only borrows + clones cells).
- Store `block_root` in `PendingComponents` so `make_available` and
  `get_cached_data_columns` no longer require it as an argument (the
  arg was misnamed `block_hash` in `make_available`).
- Rename `PendingComponents::empty` -> `new`; it is the only constructor.
This commit is contained in:
dapplion
2026-05-01 02:05:48 +02:00
parent 3e331ff207
commit 48b24e9029
6 changed files with 111 additions and 129 deletions

View File

@@ -1,6 +1,5 @@
use beacon_chain::blob_verification::GossipVerifiedBlob;
use beacon_chain::data_column_verification::GossipVerifiedDataColumn;
use beacon_chain::pending_payload_cache::PendingPayloadBid;
use beacon_chain::test_utils::{
BeaconChainHarness, fork_name_from_env, generate_data_column_sidecars_from_block, test_spec,
};
@@ -12,8 +11,8 @@ use types::data::FixedBlobSidecarList;
use types::test_utils::TestRandom;
use types::{
BlobSidecar, DataColumnSidecar, DataColumnSidecarFulu, DataColumnSidecarGloas, Domain, EthSpec,
KzgCommitments, MinimalEthSpec, PayloadAttestationData, PayloadAttestationMessage, SignedRoot,
Slot,
MinimalEthSpec, PayloadAttestationData, PayloadAttestationMessage, SignedExecutionPayloadBid,
SignedRoot, Slot,
};
type E = MinimalEthSpec;
@@ -88,13 +87,12 @@ async fn data_column_sidecar_event_on_process_gossip_data_column() {
random_sidecar.index = harness.chain.sampling_columns_for_epoch(epoch)[0];
// For gloas, the bid must be known, e.g. in the pending payload cache
harness.chain.pending_payload_cache.init_pending_bid(
random_sidecar.beacon_block_root,
PendingPayloadBid {
slot: Slot::new(10),
blob_kzg_commitments: KzgCommitments::<E>::empty(),
},
);
let mut bid = SignedExecutionPayloadBid::<E>::empty();
bid.message.slot = Slot::new(10);
harness
.chain
.pending_payload_cache
.init_pending_bid(random_sidecar.beacon_block_root, Arc::new(bid));
DataColumnSidecar::Gloas(random_sidecar)
} else {