Add more testing, additional checks

This commit is contained in:
Eitan Seri-Levi
2025-02-10 17:04:08 +02:00
parent f790c22123
commit 7eb040c70e
7 changed files with 44 additions and 24 deletions

View File

@@ -2178,6 +2178,8 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
.await
.map_err(|e| Error::ExecutionLayerGetInclusionListFailed(Box::new(e)))?;
debug!(self.log, "Inclusion list fetched from EL"; "tx_count" => inclusion_list.len());
Ok(Some(inclusion_list))
}
@@ -2373,11 +2375,8 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
})
}
/// Accepts some `Attestation` from the network and attempts to verify it, returning `Ok(_)` if
/// Accepts some `inclusion_list` from the network and attempts to verify it, returning `Ok(_)` if
/// it is valid to be (re)broadcast on the gossip network.
///
/// The attestation must be "unaggregated", that is it must have exactly one
/// aggregation bit set.
pub fn verify_inclusion_list_for_gossip(
&self,
inclusion_list: &SignedInclusionList<T::EthSpec>,
@@ -7393,9 +7392,10 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
}
pub fn on_verified_inclusion_list(&self, signed_il: SignedInclusionList<T::EthSpec>) {
debug!(self.log, "Adding verified inclusion list to the cache");
self.inclusion_list_cache
.write()
.on_inclusion_list(signed_il);
.on_inclusion_list(signed_il, &self.log);
}
pub fn metrics(&self) -> BeaconChainMetrics {

View File

@@ -103,12 +103,22 @@ impl<T: BeaconChainTypes> PayloadNotifier<T> {
Some(PayloadVerificationStatus::Irrelevant)
};
let inclusion_list_transactions = if chain
.spec
.is_focil_enabled_for_epoch(block.slot().epoch(T::EthSpec::slots_per_epoch()))
{
let inclusion_list_transactions = chain
.inclusion_list_cache
.read()
.get_inclusion_list_transactions(block.slot())
.unwrap_or(vec![].into());
debug!(chain.log, "Adding inclusion list transactions in the Payload Notifier"; "count" => inclusion_list_transactions.len());
inclusion_list_transactions
} else {
vec![].into()
};
Ok(Self {
chain,
block,

View File

@@ -64,8 +64,14 @@ pub async fn publish_inclusion_lists<T: BeaconChainTypes>(
&network_tx,
&inner_log,
) {
Ok(()) => PublishInclusionListResult::Success,
Err(e) => PublishInclusionListResult::Failure(e),
Ok(()) => {
debug!(inner_log, "Successfully verified gossip inclusion list");
PublishInclusionListResult::Success
},
Err(e) => {
debug!(inner_log, "Failed to verify gossip inclusion list"; "error" => format!("{:?}", e));
PublishInclusionListResult::Failure(e)
},
}
})
.map(Some)

View File

@@ -257,6 +257,7 @@ pub(crate) fn create_whitelist_filter(
add(BlsToExecutionChange);
add(LightClientFinalityUpdate);
add(LightClientOptimisticUpdate);
add(InclusionList);
for id in 0..spec.attestation_subnet_count {
add(Attestation(SubnetId::new(id)));
}

View File

@@ -42,6 +42,8 @@ pub const LIGHT_CLIENT_GOSSIP_TOPICS: [GossipKind; 2] = [
GossipKind::LightClientOptimisticUpdate,
];
pub const FULU_CORE_TOPICS: [GossipKind; 1] = [GossipKind::InclusionList];
/// Returns the core topics associated with each fork that are new to the previous fork
pub fn fork_core_topics<E: EthSpec>(fork_name: &ForkName, spec: &ChainSpec) -> Vec<GossipKind> {
match fork_name {
@@ -63,13 +65,9 @@ pub fn fork_core_topics<E: EthSpec>(fork_name: &ForkName, spec: &ChainSpec) -> V
for i in 0..spec.blob_sidecar_subnet_count(ForkName::Electra) {
electra_blob_topics.push(GossipKind::BlobSidecar(i));
}
if spec.is_focil_scheduled() {
electra_blob_topics.push(GossipKind::InclusionList)
}
electra_blob_topics
}
ForkName::Fulu => vec![],
ForkName::Fulu => FULU_CORE_TOPICS.to_vec(),
}
}

View File

@@ -1,6 +1,6 @@
use std::collections::{HashMap, HashSet};
use super::{EthSpec, InclusionListTransactions, SignedInclusionList, Slot, Transaction};
use slog::{debug, Logger};
use std::collections::{HashMap, HashSet};
/// Map from slot to inclusion lists
#[derive(Debug, Default, Clone, PartialEq)]
@@ -34,7 +34,7 @@ impl<E: EthSpec> InclusionListCache<E> {
self.inner_map.remove(&slot);
}
pub fn on_inclusion_list(&mut self, inclusion_list: SignedInclusionList<E>) {
pub fn on_inclusion_list(&mut self, inclusion_list: SignedInclusionList<E>, log: &Logger) {
let Some(inner) = self.inner_map.get_mut(&inclusion_list.message.slot) else {
return;
};
@@ -75,6 +75,11 @@ impl<E: EthSpec> InclusionListCache<E> {
.inclusion_lists_seen
.insert(inclusion_list.message.validator_index);
inner.inclusion_lists.insert(inclusion_list);
debug!(
log,
"Successfully added inclusion list transactions to the cache"
);
}
pub fn get_inclusion_list_transactions(

View File

@@ -118,9 +118,9 @@ impl<T: SlotClock + 'static, E: EthSpec> InclusionListService<T, E> {
_slot_duration: Duration,
spec: &ChainSpec,
) -> Result<(), String> {
let slot = self.slot_clock.now().ok_or("Failed to read slot clock")?;
let next_slot = self.slot_clock.now().ok_or("Failed to read slot clock")? + 1;
if !spec.is_focil_enabled_for_epoch(slot.epoch(E::slots_per_epoch())) {
if !spec.is_focil_enabled_for_epoch(next_slot.epoch(E::slots_per_epoch())) {
return Ok(());
}
@@ -130,10 +130,10 @@ impl<T: SlotClock + 'static, E: EthSpec> InclusionListService<T, E> {
.duration_to_next_slot()
.ok_or("Unable to determine duration to next slot")?;
let inclusion_list_duties = self.duties_service.inclusion_list_duties(slot);
let inclusion_list_duties = self.duties_service.inclusion_list_duties(next_slot);
self.inner.context.executor.spawn_ignoring_error(
self.clone()
.produce_and_publish_inclusion_lists(slot, inclusion_list_duties),
.produce_and_publish_inclusion_lists(next_slot, inclusion_list_duties),
"inclusion list publish",
);