From 5ca61c499da14c1804437fb06a2a0cbd136b355a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:35:05 -0300 Subject: [PATCH 1/2] fix: subscribe to subnet when aggregating only --- bin/ethlambda/src/main.rs | 1 + crates/net/p2p/src/lib.rs | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/bin/ethlambda/src/main.rs b/bin/ethlambda/src/main.rs index a0b4c4b3..c42a4d28 100644 --- a/bin/ethlambda/src/main.rs +++ b/bin/ethlambda/src/main.rs @@ -134,6 +134,7 @@ async fn main() -> eyre::Result<()> { store.clone(), first_validator_id, options.attestation_committee_count, + options.is_aggregator, )); ethlambda_rpc::start_rpc_server(metrics_socket, store) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index 4e2a4651..9089d6ff 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -66,6 +66,7 @@ pub async fn start_p2p( store: Store, validator_id: Option, attestation_committee_count: u64, + is_aggregator: bool, ) { let config = libp2p::gossipsub::ConfigBuilder::default() // d @@ -176,22 +177,30 @@ pub async fn start_p2p( .subscribe(&aggregation_topic) .unwrap(); - // Subscribe to attestation subnet topic (validators subscribe to their committee's subnet) + // Build attestation subnet topic (needed for publishing even without subscribing) // attestation_committee_count is validated to be >= 1 by clap at CLI parse time. let subnet_id = validator_id.map(|vid| vid % attestation_committee_count); let attestation_topic_kind = match subnet_id { Some(id) => format!("{ATTESTATION_SUBNET_TOPIC_PREFIX}_{id}"), - // Non-validators subscribe to subnet 0 to receive attestations + // Non-validators use subnet 0 for publishing None => format!("{ATTESTATION_SUBNET_TOPIC_PREFIX}_0"), }; let attestation_topic_str = format!("/leanconsensus/{network}/{attestation_topic_kind}/ssz_snappy"); let attestation_topic = libp2p::gossipsub::IdentTopic::new(attestation_topic_str); - swarm - .behaviour_mut() - .gossipsub - .subscribe(&attestation_topic) - .unwrap(); + + // Only aggregators subscribe to attestation subnets; non-aggregators + // publish via gossipsub's fanout mechanism without subscribing. + if is_aggregator { + swarm + .behaviour_mut() + .gossipsub + .subscribe(&attestation_topic) + .unwrap(); + info!(%attestation_topic_kind, "Subscribed to attestation subnet"); + } else { + info!(%attestation_topic_kind, "Skipping attestation subnet subscription (not an aggregator)"); + } info!(socket=%listening_socket, "P2P node started"); From 44c8c56dd36b34ac0bff8718fc2ceeb31e2f6a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Fri, 27 Feb 2026 12:04:53 -0300 Subject: [PATCH 2/2] refactor: add error handling --- bin/ethlambda/src/main.rs | 4 ++-- crates/net/p2p/src/lib.rs | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/bin/ethlambda/src/main.rs b/bin/ethlambda/src/main.rs index c42a4d28..7b68abad 100644 --- a/bin/ethlambda/src/main.rs +++ b/bin/ethlambda/src/main.rs @@ -144,8 +144,8 @@ async fn main() -> eyre::Result<()> { info!("Node initialized"); tokio::select! { - _ = p2p_handle => { - panic!("P2P node task has exited unexpectedly"); + result = p2p_handle => { + panic!("P2P node task has exited unexpectedly: {result:?}"); } _ = tokio::signal::ctrl_c() => { // Ctrl-C received, shutting down diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index 9089d6ff..2ebec1d3 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -67,7 +67,7 @@ pub async fn start_p2p( validator_id: Option, attestation_committee_count: u64, is_aggregator: bool, -) { +) -> Result<(), libp2p::gossipsub::SubscriptionError> { let config = libp2p::gossipsub::ConfigBuilder::default() // d .mesh_n(8) @@ -195,11 +195,8 @@ pub async fn start_p2p( swarm .behaviour_mut() .gossipsub - .subscribe(&attestation_topic) - .unwrap(); + .subscribe(&attestation_topic)?; info!(%attestation_topic_kind, "Subscribed to attestation subnet"); - } else { - info!(%attestation_topic_kind, "Skipping attestation subnet subscription (not an aggregator)"); } info!(socket=%listening_socket, "P2P node started"); @@ -223,6 +220,7 @@ pub async fn start_p2p( }; event_loop(server).await; + Ok(()) } /// [libp2p Behaviour](libp2p::swarm::NetworkBehaviour) combining Gossipsub and Request-Response Behaviours