Skip to content

Commit 856047e

Browse files
committed
feat: implement fulu ENR support
1 parent 85cf400 commit 856047e

5 files changed

Lines changed: 67 additions & 24 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ actix-web = "4.11.0"
7777
actix-web-lab = "0.24.3"
7878
aes = "0.8.4"
7979
alloy-consensus = { version = "1.0.41", default-features = false }
80-
alloy-primitives = { version = "1.4.1", features = ['serde'] }
80+
alloy-primitives = { version = "1.4.1", features = ['serde', 'rlp'] }
8181
alloy-rlp = { version = "0.3.12", default-features = false, features = [
8282
"derive",
8383
] }

crates/common/network_spec/src/networks/beacon.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,22 @@ pub struct BeaconNetworkSpec {
208208
impl BeaconNetworkSpec {
209209
pub fn fork_digest(&self, epoch: u64, genesis_validators_root: B256) -> B32 {
210210
let fork_data = ForkData {
211-
current_version: self.fulu_fork_version,
211+
current_version: self.current_fork_version(epoch),
212212
genesis_validators_root,
213213
};
214214
compute_fork_digest(fork_data, epoch)
215215
}
216216

217+
pub fn current_fork_version(&self, epoch: u64) -> B32 {
218+
self.fork_schedule()
219+
.0
220+
.iter()
221+
.rev()
222+
.find(|fork| fork.epoch <= epoch)
223+
.map(|fork| fork.current_version)
224+
.unwrap_or(self.genesis_fork_version)
225+
}
226+
217227
pub fn fork_schedule(&self) -> ForkSchedule {
218228
ForkSchedule([
219229
Fork {

crates/networking/discv5/src/discovery.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ use crate::{
3333
eth2::{ENR_ETH2_KEY, EnrForkId},
3434
subnet::{
3535
ATTESTATION_BITFIELD_ENR_KEY, AttestationSubnets, CUSTODY_GROUP_COUNT_ENR_KEY,
36-
EPOCHS_PER_SUBNET_SUBSCRIPTION, NEXT_FORK_DIGEST_ENR_KEY, NextForkDigest,
37-
SYNC_COMMITTEE_BITFIELD_ENR_KEY, attestation_subnet_predicate, compute_subscribed_subnets,
36+
EPOCHS_PER_SUBNET_SUBSCRIPTION, NEXT_FORK_DIGEST_ENR_KEY, SYNC_COMMITTEE_BITFIELD_ENR_KEY,
37+
attestation_subnet_predicate, compute_subscribed_subnets, next_fork_digest,
3838
sync_committee_subnet_predicate,
3939
},
4040
};
@@ -91,21 +91,25 @@ impl Discovery {
9191
) -> anyhow::Result<Self> {
9292
let enr_local =
9393
convert_to_enr(local_key).map_err(|err| anyhow!("Failed to convert key: {err:?}"))?;
94+
let current_epoch = compute_epoch_at_slot(current_slot);
9495

9596
let mut enr_builder = Enr::builder();
9697
enr_builder.ip(config.socket_address);
9798
enr_builder.tcp4(config.socket_port);
9899
enr_builder.udp4(config.discovery_port);
99100

100101
let enr = enr_builder
101-
.add_value(ENR_ETH2_KEY, &EnrForkId::electra(genesis_validators_root()))
102+
.add_value(
103+
ENR_ETH2_KEY,
104+
&EnrForkId::current(genesis_validators_root(), current_epoch),
105+
)
102106
.add_value(ATTESTATION_BITFIELD_ENR_KEY, &config.attestation_subnets)
103107
.add_value(
104108
SYNC_COMMITTEE_BITFIELD_ENR_KEY,
105109
&config.sync_committee_subnets,
106110
)
107111
.add_value(CUSTODY_GROUP_COUNT_ENR_KEY, &config.custody_group_count)
108-
.add_value(NEXT_FORK_DIGEST_ENR_KEY, &NextForkDigest::default())
112+
.add_value(NEXT_FORK_DIGEST_ENR_KEY, &next_fork_digest(current_epoch))
109113
.build(&enr_local)
110114
.map_err(|err| anyhow!("Failed to build ENR: {err}"))?;
111115

@@ -126,8 +130,7 @@ impl Discovery {
126130
}
127131

128132
// Compute and set attestation subnets
129-
let subnets =
130-
compute_subscribed_subnets(enr.node_id(), compute_epoch_at_slot(current_slot))?;
133+
let subnets = compute_subscribed_subnets(enr.node_id(), current_epoch)?;
131134
let mut config = config.clone();
132135
config.attestation_subnets = AttestationSubnets::new();
133136
for subnet_id in subnets {
@@ -136,7 +139,7 @@ impl Discovery {
136139
.enable_attestation_subnet(subnet_id)?;
137140
}
138141

139-
let subscription_epoch = compute_epoch_at_slot(current_slot);
142+
let subscription_epoch = current_epoch;
140143

141144
let event_stream = if !config.disable_discovery {
142145
discv5

crates/networking/discv5/src/eth2.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
use alloy_primitives::{B256, aliases::B32};
22
use alloy_rlp::{BufMut, Decodable, Encodable, bytes::Bytes};
3-
use ream_consensus_misc::{
4-
constants::beacon::{ELECTRA_FORK_EPOCH, FAR_FUTURE_EPOCH},
5-
fork_data::{ForkData, compute_fork_digest},
6-
};
3+
use ream_consensus_misc::constants::beacon::FAR_FUTURE_EPOCH;
74
use ream_network_spec::networks::beacon_network_spec;
85
use ssz::{Decode, Encode};
96
use ssz_derive::{Decode, Encode};
@@ -19,17 +16,32 @@ pub struct EnrForkId {
1916
}
2017

2118
impl EnrForkId {
22-
pub fn electra(genesis_validators_root: B256) -> Self {
23-
let current_fork_version = beacon_network_spec().electra_fork_version;
24-
let next_fork_version = current_fork_version;
25-
let next_fork_epoch = FAR_FUTURE_EPOCH;
26-
27-
let fork_data = ForkData {
28-
current_version: current_fork_version,
29-
genesis_validators_root,
30-
};
19+
pub fn current(genesis_validators_root: B256, epoch: u64) -> Self {
20+
let spec = beacon_network_spec();
21+
22+
let fork_digest = spec.fork_digest(epoch, genesis_validators_root);
23+
24+
let fork_schedule = spec.fork_schedule();
25+
26+
let current_version = spec.current_fork_version(epoch);
3127

32-
let fork_digest = compute_fork_digest(fork_data, ELECTRA_FORK_EPOCH);
28+
let next_regular_fork = fork_schedule.0.iter().find(|fork| fork.epoch > epoch);
29+
30+
let next_bpo_epoch = spec
31+
.blob_schedule
32+
.iter()
33+
.map(|params| params.epoch)
34+
.filter(|&bpo_epoch| bpo_epoch > epoch)
35+
.min();
36+
37+
let (next_fork_version, next_fork_epoch) = match (next_regular_fork, next_bpo_epoch) {
38+
(Some(regular), Some(bpo)) if regular.epoch <= bpo => {
39+
(regular.current_version, regular.epoch)
40+
}
41+
(Some(regular), None) => (regular.current_version, regular.epoch),
42+
(_, Some(bpo)) => (current_version, bpo),
43+
(None, None) => (current_version, FAR_FUTURE_EPOCH),
44+
};
3345

3446
Self {
3547
fork_digest,

crates/networking/discv5/src/subnet.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ use alloy_primitives::{B256, aliases::B32};
22
use alloy_rlp::{BufMut, Decodable, Encodable, bytes::Bytes};
33
use anyhow::{anyhow, ensure};
44
use discv5::{Enr, enr::NodeId};
5-
use ream_consensus_misc::misc::compute_shuffled_index;
5+
use ream_consensus_misc::{
6+
constants::beacon::{FAR_FUTURE_EPOCH, genesis_validators_root},
7+
misc::compute_shuffled_index,
8+
};
9+
use ream_network_spec::networks::beacon_network_spec;
610
use sha2::{Digest, Sha256};
711
use ssz::{Decode, Encode};
812
use ssz_types::{
@@ -11,6 +15,8 @@ use ssz_types::{
1115
};
1216
use tracing::{error, trace};
1317

18+
use crate::eth2::EnrForkId;
19+
1420
pub const ATTESTATION_BITFIELD_ENR_KEY: &str = "attnets";
1521
pub const ATTESTATION_SUBNET_COUNT: usize = 64;
1622
pub const SYNC_COMMITTEE_BITFIELD_ENR_KEY: &str = "syncnets";
@@ -206,6 +212,18 @@ impl Decodable for NextForkDigest {
206212
}
207213
}
208214

215+
pub fn next_fork_digest(current_epoch: u64) -> NextForkDigest {
216+
let fork_id = EnrForkId::current(genesis_validators_root(), current_epoch);
217+
218+
if fork_id.next_fork_epoch == FAR_FUTURE_EPOCH {
219+
NextForkDigest::default()
220+
} else {
221+
let digest =
222+
beacon_network_spec().fork_digest(fork_id.next_fork_epoch, genesis_validators_root());
223+
NextForkDigest(digest)
224+
}
225+
}
226+
209227
/// Compute a single subscribed subnet based on node_id, epoch, and index
210228
pub fn compute_subscribed_subnet(node_id: NodeId, epoch: u64, index: usize) -> anyhow::Result<u64> {
211229
let mut node_id_prefix_bytes = [0u8; 8];

0 commit comments

Comments
 (0)