Skip to content

Commit 587c3e2

Browse files
authored
Implement changes for EIP 7691 (#6803)
* Add new config options * Use electra_enabled
1 parent 93f9c2c commit 587c3e2

File tree

5 files changed

+85
-28
lines changed

5 files changed

+85
-28
lines changed

beacon_node/lighthouse_network/src/service/mod.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::rpc::{
1616
use crate::types::{
1717
attestation_sync_committee_topics, fork_core_topics, subnet_from_topic_hash, GossipEncoding,
1818
GossipKind, GossipTopic, SnappyTransform, Subnet, SubnetDiscovery, ALTAIR_CORE_TOPICS,
19-
BASE_CORE_TOPICS, CAPELLA_CORE_TOPICS, DENEB_CORE_TOPICS, LIGHT_CLIENT_GOSSIP_TOPICS,
19+
BASE_CORE_TOPICS, CAPELLA_CORE_TOPICS, LIGHT_CLIENT_GOSSIP_TOPICS,
2020
};
2121
use crate::EnrExt;
2222
use crate::Eth2Enr;
@@ -285,26 +285,23 @@ impl<E: EthSpec> Network<E> {
285285

286286
let max_topics = ctx.chain_spec.attestation_subnet_count as usize
287287
+ SYNC_COMMITTEE_SUBNET_COUNT as usize
288-
+ ctx.chain_spec.blob_sidecar_subnet_count as usize
288+
+ ctx.chain_spec.blob_sidecar_subnet_count_electra as usize
289289
+ ctx.chain_spec.data_column_sidecar_subnet_count as usize
290290
+ BASE_CORE_TOPICS.len()
291291
+ ALTAIR_CORE_TOPICS.len()
292-
+ CAPELLA_CORE_TOPICS.len()
293-
+ DENEB_CORE_TOPICS.len()
292+
+ CAPELLA_CORE_TOPICS.len() // 0 core deneb and electra topics
294293
+ LIGHT_CLIENT_GOSSIP_TOPICS.len();
295294

296295
let possible_fork_digests = ctx.fork_context.all_fork_digests();
297296
let filter = gossipsub::MaxCountSubscriptionFilter {
298297
filter: utils::create_whitelist_filter(
299298
possible_fork_digests,
300-
ctx.chain_spec.attestation_subnet_count,
299+
&ctx.chain_spec,
301300
SYNC_COMMITTEE_SUBNET_COUNT,
302-
ctx.chain_spec.blob_sidecar_subnet_count,
303-
ctx.chain_spec.data_column_sidecar_subnet_count,
304301
),
305302
// during a fork we subscribe to both the old and new topics
306303
max_subscribed_topics: max_topics * 4,
307-
// 418 in theory = (64 attestation + 4 sync committee + 7 core topics + 6 blob topics + 128 column topics) * 2
304+
// 424 in theory = (64 attestation + 4 sync committee + 7 core topics + 9 blob topics + 128 column topics) * 2
308305
max_subscriptions_per_request: max_topics * 2,
309306
};
310307

beacon_node/lighthouse_network/src/service/utils.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,8 @@ pub fn load_or_build_metadata<E: EthSpec>(
236236
/// possible fork digests.
237237
pub(crate) fn create_whitelist_filter(
238238
possible_fork_digests: Vec<[u8; 4]>,
239-
attestation_subnet_count: u64,
239+
spec: &ChainSpec,
240240
sync_committee_subnet_count: u64,
241-
blob_sidecar_subnet_count: u64,
242-
data_column_sidecar_subnet_count: u64,
243241
) -> gossipsub::WhitelistSubscriptionFilter {
244242
let mut possible_hashes = HashSet::new();
245243
for fork_digest in possible_fork_digests {
@@ -259,16 +257,21 @@ pub(crate) fn create_whitelist_filter(
259257
add(BlsToExecutionChange);
260258
add(LightClientFinalityUpdate);
261259
add(LightClientOptimisticUpdate);
262-
for id in 0..attestation_subnet_count {
260+
for id in 0..spec.attestation_subnet_count {
263261
add(Attestation(SubnetId::new(id)));
264262
}
265263
for id in 0..sync_committee_subnet_count {
266264
add(SyncCommitteeMessage(SyncSubnetId::new(id)));
267265
}
268-
for id in 0..blob_sidecar_subnet_count {
266+
let blob_subnet_count = if spec.electra_fork_epoch.is_some() {
267+
spec.blob_sidecar_subnet_count_electra
268+
} else {
269+
spec.blob_sidecar_subnet_count
270+
};
271+
for id in 0..blob_subnet_count {
269272
add(BlobSidecar(id));
270273
}
271-
for id in 0..data_column_sidecar_subnet_count {
274+
for id in 0..spec.data_column_sidecar_subnet_count {
272275
add(DataColumnSidecar(DataColumnSubnetId::new(id)));
273276
}
274277
}

beacon_node/lighthouse_network/src/types/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ pub use sync_state::{BackFillState, SyncState};
1818
pub use topics::{
1919
attestation_sync_committee_topics, core_topics_to_subscribe, fork_core_topics,
2020
subnet_from_topic_hash, GossipEncoding, GossipKind, GossipTopic, ALTAIR_CORE_TOPICS,
21-
BASE_CORE_TOPICS, CAPELLA_CORE_TOPICS, DENEB_CORE_TOPICS, LIGHT_CLIENT_GOSSIP_TOPICS,
21+
BASE_CORE_TOPICS, CAPELLA_CORE_TOPICS, LIGHT_CLIENT_GOSSIP_TOPICS,
2222
};

beacon_node/lighthouse_network/src/types/topics.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ pub const LIGHT_CLIENT_GOSSIP_TOPICS: [GossipKind; 2] = [
4141
GossipKind::LightClientOptimisticUpdate,
4242
];
4343

44-
pub const DENEB_CORE_TOPICS: [GossipKind; 0] = [];
45-
4644
/// Returns the core topics associated with each fork that are new to the previous fork
4745
pub fn fork_core_topics<E: EthSpec>(fork_name: &ForkName, spec: &ChainSpec) -> Vec<GossipKind> {
4846
match fork_name {
@@ -56,11 +54,16 @@ pub fn fork_core_topics<E: EthSpec>(fork_name: &ForkName, spec: &ChainSpec) -> V
5654
for i in 0..spec.blob_sidecar_subnet_count {
5755
deneb_blob_topics.push(GossipKind::BlobSidecar(i));
5856
}
59-
let mut deneb_topics = DENEB_CORE_TOPICS.to_vec();
60-
deneb_topics.append(&mut deneb_blob_topics);
61-
deneb_topics
57+
deneb_blob_topics
58+
}
59+
ForkName::Electra => {
60+
// All of electra blob topics are core topics
61+
let mut electra_blob_topics = Vec::new();
62+
for i in 0..spec.blob_sidecar_subnet_count_electra {
63+
electra_blob_topics.push(GossipKind::BlobSidecar(i));
64+
}
65+
electra_blob_topics
6266
}
63-
ForkName::Electra => vec![],
6467
ForkName::Fulu => vec![],
6568
}
6669
}
@@ -88,7 +91,12 @@ pub fn core_topics_to_subscribe<E: EthSpec>(
8891
topics.extend(previous_fork_topics);
8992
current_fork = previous_fork;
9093
}
94+
// Remove duplicates
9195
topics
96+
.into_iter()
97+
.collect::<std::collections::HashSet<_>>()
98+
.into_iter()
99+
.collect()
92100
}
93101

94102
/// A gossipsub topic which encapsulates the type of messages that should be sent and received over
@@ -467,16 +475,19 @@ mod tests {
467475
type E = MainnetEthSpec;
468476
let spec = E::default_spec();
469477
let mut all_topics = Vec::new();
478+
let mut electra_core_topics = fork_core_topics::<E>(&ForkName::Electra, &spec);
470479
let mut deneb_core_topics = fork_core_topics::<E>(&ForkName::Deneb, &spec);
480+
all_topics.append(&mut electra_core_topics);
471481
all_topics.append(&mut deneb_core_topics);
472482
all_topics.extend(CAPELLA_CORE_TOPICS);
473483
all_topics.extend(ALTAIR_CORE_TOPICS);
474484
all_topics.extend(BASE_CORE_TOPICS);
475485

476486
let latest_fork = *ForkName::list_all().last().unwrap();
477-
assert_eq!(
478-
core_topics_to_subscribe::<E>(latest_fork, &spec),
479-
all_topics
480-
);
487+
let core_topics = core_topics_to_subscribe::<E>(latest_fork, &spec);
488+
// Need to check all the topics exist in an order independent manner
489+
for topic in all_topics {
490+
assert!(core_topics.contains(&topic));
491+
}
481492
}
482493
}

consensus/types/src/chain_spec.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ pub struct ChainSpec {
191191
pub max_pending_partials_per_withdrawals_sweep: u64,
192192
pub min_per_epoch_churn_limit_electra: u64,
193193
pub max_per_epoch_activation_exit_churn_limit: u64,
194-
pub max_blobs_per_block_electra: u64,
195194

196195
/*
197196
* Fulu hard fork params
@@ -240,6 +239,13 @@ pub struct ChainSpec {
240239
pub blob_sidecar_subnet_count: u64,
241240
max_blobs_per_block: u64,
242241

242+
/*
243+
* Networking Electra
244+
*/
245+
max_blobs_per_block_electra: u64,
246+
pub blob_sidecar_subnet_count_electra: u64,
247+
pub max_request_blob_sidecars_electra: u64,
248+
243249
/*
244250
* Networking Derived
245251
*
@@ -618,6 +624,14 @@ impl ChainSpec {
618624
}
619625
}
620626

627+
pub fn max_request_blob_sidecars(&self, fork_name: ForkName) -> usize {
628+
if fork_name.electra_enabled() {
629+
self.max_request_blob_sidecars_electra as usize
630+
} else {
631+
self.max_request_blob_sidecars as usize
632+
}
633+
}
634+
621635
/// Return the value of `MAX_BLOBS_PER_BLOCK` appropriate for the fork at `epoch`.
622636
pub fn max_blobs_per_block(&self, epoch: Epoch) -> u64 {
623637
self.max_blobs_per_block_by_fork(self.fork_name_at_epoch(epoch))
@@ -830,7 +844,6 @@ impl ChainSpec {
830844
u64::checked_pow(2, 8)?.checked_mul(u64::checked_pow(10, 9)?)
831845
})
832846
.expect("calculation does not overflow"),
833-
max_blobs_per_block_electra: default_max_blobs_per_block_electra(),
834847

835848
/*
836849
* Fulu hard fork params
@@ -886,6 +899,13 @@ impl ChainSpec {
886899
max_blobs_by_root_request: default_max_blobs_by_root_request(),
887900
max_data_columns_by_root_request: default_data_columns_by_root_request(),
888901

902+
/*
903+
* Networking Electra specific
904+
*/
905+
max_blobs_per_block_electra: default_max_blobs_per_block_electra(),
906+
blob_sidecar_subnet_count_electra: default_blob_sidecar_subnet_count_electra(),
907+
max_request_blob_sidecars_electra: default_max_request_blob_sidecars_electra(),
908+
889909
/*
890910
* Application specific
891911
*/
@@ -1161,7 +1181,6 @@ impl ChainSpec {
11611181
u64::checked_pow(2, 8)?.checked_mul(u64::checked_pow(10, 9)?)
11621182
})
11631183
.expect("calculation does not overflow"),
1164-
max_blobs_per_block_electra: default_max_blobs_per_block_electra(),
11651184

11661185
/*
11671186
* Fulu hard fork params
@@ -1216,6 +1235,13 @@ impl ChainSpec {
12161235
max_blobs_by_root_request: default_max_blobs_by_root_request(),
12171236
max_data_columns_by_root_request: default_data_columns_by_root_request(),
12181237

1238+
/*
1239+
* Networking Electra specific
1240+
*/
1241+
max_blobs_per_block_electra: default_max_blobs_per_block_electra(),
1242+
blob_sidecar_subnet_count_electra: default_blob_sidecar_subnet_count_electra(),
1243+
max_request_blob_sidecars_electra: default_max_request_blob_sidecars_electra(),
1244+
12191245
/*
12201246
* Application specific
12211247
*/
@@ -1421,6 +1447,12 @@ pub struct Config {
14211447
#[serde(default = "default_max_blobs_per_block_electra")]
14221448
#[serde(with = "serde_utils::quoted_u64")]
14231449
max_blobs_per_block_electra: u64,
1450+
#[serde(default = "default_blob_sidecar_subnet_count_electra")]
1451+
#[serde(with = "serde_utils::quoted_u64")]
1452+
pub blob_sidecar_subnet_count_electra: u64,
1453+
#[serde(default = "default_max_request_blob_sidecars_electra")]
1454+
#[serde(with = "serde_utils::quoted_u64")]
1455+
max_request_blob_sidecars_electra: u64,
14241456

14251457
#[serde(default = "default_custody_requirement")]
14261458
#[serde(with = "serde_utils::quoted_u64")]
@@ -1555,6 +1587,14 @@ const fn default_max_blobs_per_block() -> u64 {
15551587
6
15561588
}
15571589

1590+
const fn default_blob_sidecar_subnet_count_electra() -> u64 {
1591+
9
1592+
}
1593+
1594+
const fn default_max_request_blob_sidecars_electra() -> u64 {
1595+
1152
1596+
}
1597+
15581598
const fn default_min_per_epoch_churn_limit_electra() -> u64 {
15591599
128_000_000_000
15601600
}
@@ -1787,6 +1827,8 @@ impl Config {
17871827
max_per_epoch_activation_exit_churn_limit: spec
17881828
.max_per_epoch_activation_exit_churn_limit,
17891829
max_blobs_per_block_electra: spec.max_blobs_per_block_electra,
1830+
blob_sidecar_subnet_count_electra: spec.blob_sidecar_subnet_count_electra,
1831+
max_request_blob_sidecars_electra: spec.max_request_blob_sidecars_electra,
17901832

17911833
custody_requirement: spec.custody_requirement,
17921834
data_column_sidecar_subnet_count: spec.data_column_sidecar_subnet_count,
@@ -1865,6 +1907,8 @@ impl Config {
18651907
min_per_epoch_churn_limit_electra,
18661908
max_per_epoch_activation_exit_churn_limit,
18671909
max_blobs_per_block_electra,
1910+
blob_sidecar_subnet_count_electra,
1911+
max_request_blob_sidecars_electra,
18681912
custody_requirement,
18691913
data_column_sidecar_subnet_count,
18701914
number_of_columns,
@@ -1935,6 +1979,8 @@ impl Config {
19351979
min_per_epoch_churn_limit_electra,
19361980
max_per_epoch_activation_exit_churn_limit,
19371981
max_blobs_per_block_electra,
1982+
max_request_blob_sidecars_electra,
1983+
blob_sidecar_subnet_count_electra,
19381984

19391985
// We need to re-derive any values that might have changed in the config.
19401986
max_blocks_by_root_request: max_blocks_by_root_request_common(max_request_blocks),

0 commit comments

Comments
 (0)