From 74ee5270104b97adb380eb530cab9656e887c2be Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 23 Dec 2024 15:54:18 +0100 Subject: [PATCH 1/9] set the "subnets" field on our ENR --- Cargo.lock | 2 ++ anchor/network/Cargo.toml | 2 ++ anchor/network/src/discovery.rs | 13 +++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c6794d15..28c0248d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4891,10 +4891,12 @@ dependencies = [ "async-channel", "dirs 5.0.1", "discv5", + "ethereum_ssz", "futures", "libp2p", "lighthouse_network", "serde", + "ssz_types", "task_executor", "tokio", "tracing", diff --git a/anchor/network/Cargo.toml b/anchor/network/Cargo.toml index 8828b5951..11703bf4f 100644 --- a/anchor/network/Cargo.toml +++ b/anchor/network/Cargo.toml @@ -27,6 +27,8 @@ tokio = { workspace = true } tracing = { workspace = true } types = { workspace = true } version = { workspace = true } +ssz_types = "0.8" +ethereum_ssz = "0.7" [dev-dependencies] async-channel = { workspace = true } diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index 74640fb23..b364f4e00 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -12,6 +12,7 @@ use discv5::{Discv5, Enr}; use futures::stream::FuturesUnordered; use futures::FutureExt; use futures::{StreamExt, TryFutureExt}; +use libp2p::bytes::Bytes; use libp2p::core::transport::PortUse; use libp2p::core::Endpoint; use libp2p::swarm::dummy::ConnectionHandler; @@ -25,9 +26,11 @@ use lighthouse_network::{CombinedKeyExt, Subnet}; use tokio::sync::mpsc; use tracing::{debug, error, warn}; -use lighthouse_network::EnrExt; - use crate::Config; +use lighthouse_network::EnrExt; +use ssz::Encode; +use ssz_types::typenum::U128; +use ssz_types::BitVector; /// The number of closest peers to search for when doing a regular peer search. /// @@ -462,6 +465,12 @@ pub fn build_enr(enr_key: &CombinedKey, config: &Config) -> Result builder.tcp6(tcp6_port.get()); } + // set the "subnets" field on our ENR + let mut bitfield = BitVector::::new(); + bitfield.set(9, true).unwrap(); + + builder.add_value::("subnets", &bitfield.as_ssz_bytes().into()); + builder .build(enr_key) .map_err(|e| format!("Could not build Local ENR: {:?}", e)) From 60947edd0312d1436f819b882929d49656891b5d Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 23 Dec 2024 16:11:01 +0100 Subject: [PATCH 2/9] support additional_predicate in start_query --- anchor/network/src/discovery.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index b364f4e00..a4211abd4 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -247,7 +247,7 @@ impl Discovery { &mut self, query: QueryType, target_peers: usize, - _additional_predicate: impl Fn(&Enr) -> bool + Send + 'static, + additional_predicate: impl Fn(&Enr) -> bool + Send + 'static, ) { // let enr_fork_id = match self.local_enr().eth2() { // Ok(v) => v, @@ -268,8 +268,7 @@ impl Discovery { // General predicate let predicate: Box bool + Send> = - //Box::new(move |enr: &Enr| eth2_fork_predicate(enr) && additional_predicate(enr)); - Box::new(move |enr: &Enr| ssv_node_predicate(enr)); + Box::new(move |enr: &Enr| ssv_node_predicate(enr) && additional_predicate(enr)); // Build the future let query_future = self From 9bad193af6320883e6bcca6b55d01aac64efaf44 Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 23 Dec 2024 17:36:29 +0100 Subject: [PATCH 3/9] add start_subnet_query --- anchor/network/Cargo.toml | 5 +- anchor/network/src/discovery.rs | 98 +++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 6 deletions(-) diff --git a/anchor/network/Cargo.toml b/anchor/network/Cargo.toml index 11703bf4f..e7335a3b4 100644 --- a/anchor/network/Cargo.toml +++ b/anchor/network/Cargo.toml @@ -27,8 +27,9 @@ tokio = { workspace = true } tracing = { workspace = true } types = { workspace = true } version = { workspace = true } -ssz_types = "0.8" -ethereum_ssz = "0.7" +ssz_types = "0.10" +ethereum_ssz = "0.8.1" +ethereum_serde_utils = "1.0.0-beta.0" [dev-dependencies] async-channel = { workspace = true } diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index a4211abd4..24462e125 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::future::Future; use std::net::Ipv4Addr; +use std::ops::Deref; use std::pin::Pin; use std::task::{Context, Poll}; use std::time::Instant; @@ -22,25 +23,63 @@ use libp2p::swarm::{ }; use lighthouse_network::discovery::enr_ext::{QUIC6_ENR_KEY, QUIC_ENR_KEY}; use lighthouse_network::discovery::DiscoveredPeers; -use lighthouse_network::{CombinedKeyExt, Subnet}; +use lighthouse_network::CombinedKeyExt; use tokio::sync::mpsc; use tracing::{debug, error, warn}; use crate::Config; use lighthouse_network::EnrExt; -use ssz::Encode; +use serde::{Deserialize, Serialize}; +use ssz::{Decode, Encode}; +use ssz_types::length::Fixed; use ssz_types::typenum::U128; -use ssz_types::BitVector; +use ssz_types::{BitVector, Bitfield}; +/// Target number of peers to search for given a grouped subnet query. +const TARGET_PEERS_FOR_GROUPED_QUERY: usize = 6; /// The number of closest peers to search for when doing a regular peer search. /// /// We could reduce this constant to speed up queries however at the cost of security. It will /// make it easier to peers to eclipse this node. Kademlia suggests a value of 16. pub const FIND_NODE_QUERY_CLOSEST_PEERS: usize = 16; +/// Represents a subnet on an attestation or sync committee `SubnetId`. +/// +/// Used for subscribing to the appropriate gossipsub subnets and mark +/// appropriate metadata bitfields. +#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Hash)] +pub enum SSVSubnet { + /// Represents a gossipsub attestation subnet and the metadata `attnets` field. + Subnet(SubnetId), +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(transparent)] +pub struct SubnetId(#[serde(with = "serde_utils::quoted_u64")] u64); + +impl SubnetId { + pub fn new(id: u64) -> Self { + id.into() + } +} + +impl From for SubnetId { + fn from(x: u64) -> Self { + Self(x) + } +} + +impl Deref for SubnetId { + type Target = u64; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + #[derive(Debug, Clone, PartialEq)] struct SubnetQuery { - subnet: Subnet, + subnet: SSVSubnet, min_ttl: Option, retries: usize, } @@ -238,6 +277,25 @@ impl Discovery { self.start_query(QueryType::FindPeers, target_peers, |_| true); } + /// Runs a discovery request for a given group of subnets. + pub fn start_subnet_query(&mut self) { + let mut subnets: Vec = Vec::new(); + let subnet1 = SSVSubnet::Subnet(SubnetId::new(9)); + subnets.push(subnet1); + + let subnet_queries: Vec = vec![SubnetQuery { + subnet: subnet1, + min_ttl: None, + retries: 0, + }]; + + self.start_query( + QueryType::Subnet(subnet_queries), + TARGET_PEERS_FOR_GROUPED_QUERY, + subnet_predicate(subnets), + ); + } + /// Search for a specified number of new peers using the underlying discovery mechanism. /// /// This can optionally search for peers for a given predicate. Regardless of the predicate @@ -474,3 +532,35 @@ pub fn build_enr(enr_key: &CombinedKey, config: &Config) -> Result .build(enr_key) .map_err(|e| format!("Could not build Local ENR: {:?}", e)) } + +fn committee_bitfield(enr: &Enr) -> Result>, &'static str> { + let bitfield_bytes: Bytes = enr + .get_decodable("subnets") + .ok_or("ENR subnet bitfield non-existent")? + .map_err(|_| "Invalid RLP Encoding")?; + + BitVector::::from_ssz_bytes(&bitfield_bytes) + .map_err(|_| "Could not decode the ENR subnets bitfield") +} + +/// Returns the predicate for a given subnet. +pub fn subnet_predicate(subnets: Vec) -> impl Fn(&Enr) -> bool + Send { + move |enr: &Enr| { + let committee_bitfield: Bitfield> = match committee_bitfield(enr) { + Ok(b) => b, + Err(_e) => return false, + }; + + let predicate = subnets.iter().any(|subnet| match subnet { + SSVSubnet::Subnet(s) => committee_bitfield.get(*s.deref() as usize).unwrap_or(false), + }); + + if !predicate { + debug!( + peer_id = %enr.peer_id(), + "Peer found but not on any of the desired subnets", + ); + } + predicate + } +} From 414728c3aa1291b615e8aae70f21133c7562c41b Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 23 Dec 2024 18:42:06 +0100 Subject: [PATCH 4/9] start subnet query and process results --- anchor/network/src/discovery.rs | 28 ++++++++++++++++++++++++---- anchor/network/src/network.rs | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index 24462e125..5ecc94761 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -280,11 +280,11 @@ impl Discovery { /// Runs a discovery request for a given group of subnets. pub fn start_subnet_query(&mut self) { let mut subnets: Vec = Vec::new(); - let subnet1 = SSVSubnet::Subnet(SubnetId::new(9)); - subnets.push(subnet1); + let subnet = SSVSubnet::Subnet(SubnetId::new(9)); + subnets.push(subnet); let subnet_queries: Vec = vec![SubnetQuery { - subnet: subnet1, + subnet: subnet, min_ttl: None, retries: 0, }]; @@ -371,7 +371,27 @@ impl Discovery { } } } - _ => { + QueryType::Subnet(queries) => { + let subnets_searched_for: Vec = + queries.iter().map(|query| query.subnet).collect(); + + match query.result { + Ok(r) if r.is_empty() => { + debug!(subnets_searched_for = ?subnets_searched_for, "Grouped subnet discovery query yielded no results."); + // TODO queries.iter().for_each(|query| { + // self.add_subnet_query(query.subnet, query.min_ttl, query.retries + 1); + // }) + } + Ok(r) => { + debug!(peers_found = r.len(), subnets_searched_for = ?subnets_searched_for, "Peer grouped subnet discovery request completed"); + let results = r.into_iter().map(|enr| (enr, None)).collect(); + + return Some(results); + } + Err(e) => { + warn!(error = %e, "Subnet query failed"); + } + } // TODO handle subnet queries } } diff --git a/anchor/network/src/network.rs b/anchor/network/src/network.rs index 803438f76..7484bd63f 100644 --- a/anchor/network/src/network.rs +++ b/anchor/network/src/network.rs @@ -175,6 +175,7 @@ async fn build_anchor_behaviour( .unwrap(); // start searching for peers discovery.discover_peers(FIND_NODE_QUERY_CLOSEST_PEERS); + discovery.start_subnet_query(); discovery }; From 214664dacd70088f80e4072e7ddf55584d67e629 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 24 Dec 2024 14:39:51 +0100 Subject: [PATCH 5/9] cargo sort --- anchor/network/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/anchor/network/Cargo.toml b/anchor/network/Cargo.toml index e7335a3b4..9cfa54601 100644 --- a/anchor/network/Cargo.toml +++ b/anchor/network/Cargo.toml @@ -7,6 +7,8 @@ authors = ["Sigma Prime "] [dependencies] dirs = { workspace = true } discv5 = { workspace = true } +ethereum_serde_utils = "1.0.0-beta.0" +ethereum_ssz = "0.8.1" futures = { workspace = true } libp2p = { version = "0.54", default-features = false, features = [ "identify", @@ -22,14 +24,12 @@ libp2p = { version = "0.54", default-features = false, features = [ ] } lighthouse_network = { workspace = true } serde = { workspace = true } +ssz_types = "0.10" task_executor = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } types = { workspace = true } version = { workspace = true } -ssz_types = "0.10" -ethereum_ssz = "0.8.1" -ethereum_serde_utils = "1.0.0-beta.0" [dev-dependencies] async-channel = { workspace = true } From 3ed3f85a63ad4d893e7df62a7570d845317d8fd0 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 24 Dec 2024 14:41:05 +0100 Subject: [PATCH 6/9] cargo clippy --- anchor/network/src/discovery.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index 5ecc94761..278ca565f 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -284,7 +284,7 @@ impl Discovery { subnets.push(subnet); let subnet_queries: Vec = vec![SubnetQuery { - subnet: subnet, + subnet, min_ttl: None, retries: 0, }]; From 1299a0052f24c3264afff4b937f991f5664f8fd4 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 7 Jan 2025 21:19:33 +0100 Subject: [PATCH 7/9] add ProtocolId to discv5 --- anchor/network/src/discovery.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index 278ca565f..314f70f6b 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -9,7 +9,7 @@ use std::time::Instant; use discv5::enr::{CombinedKey, NodeId}; use discv5::libp2p_identity::{Keypair, PeerId}; use discv5::multiaddr::Multiaddr; -use discv5::{Discv5, Enr}; +use discv5::{Discv5, Enr, ProtocolIdentity}; use futures::stream::FuturesUnordered; use futures::FutureExt; use futures::{StreamExt, TryFutureExt}; @@ -111,12 +111,19 @@ enum EventStream { InActive, } +pub struct ProtocolId {} + +impl ProtocolIdentity for ProtocolId { + const PROTOCOL_ID_BYTES: [u8; 6] = *b"ssvdv5"; + const PROTOCOL_VERSION_BYTES: [u8; 2] = 0x0001_u16.to_be_bytes(); +} + pub struct Discovery { /// The handle for the underlying discv5 Server. /// /// This is behind a Reference counter to allow for futures to be spawned and polled with a /// static lifetime. - discv5: Discv5, + discv5: Discv5, /// Indicates if we are actively searching for peers. We only allow a single FindPeers query at /// a time, regardless of the query concurrency. @@ -152,7 +159,7 @@ impl Discovery { let enr_key: CombinedKey = CombinedKey::from_libp2p(local_keypair)?; let enr = build_enr(&enr_key, network_config).unwrap(); - let mut discv5 = Discv5::new(enr, enr_key, discv5_config) + let mut discv5 = Discv5::::new(enr, enr_key, discv5_config) .map_err(|e| format!("Discv5 service failed. Error: {:?}", e))?; // Add bootnodes to routing table @@ -315,18 +322,12 @@ impl Discovery { // } // }; - // predicate for finding ssv nodes with a valid tcp port - let ssv_node_predicate = move |enr: &Enr| { - if let Some(Ok(is_ssv)) = enr.get_decodable("ssv") { - is_ssv && enr.tcp4().is_some() || enr.tcp6().is_some() - } else { - false - } - }; + // predicate for finding nodes with a valid tcp port + let tcp_predicate = move |enr: &Enr| enr.tcp4().is_some() || enr.tcp6().is_some(); // General predicate let predicate: Box bool + Send> = - Box::new(move |enr: &Enr| ssv_node_predicate(enr) && additional_predicate(enr)); + Box::new(move |enr: &Enr| tcp_predicate(enr) && additional_predicate(enr)); // Build the future let query_future = self @@ -355,7 +356,6 @@ impl Discovery { debug!("Discovery query yielded no results."); } Ok(r) => { - debug!(peers_found = r.len(), "Discovery query completed"); let results = r .into_iter() .map(|enr| { @@ -364,6 +364,7 @@ impl Discovery { (enr, None) }) .collect(); + debug!(peers = ?results, "Discovery query completed"); return Some(results); } Err(e) => { @@ -383,8 +384,8 @@ impl Discovery { // }) } Ok(r) => { - debug!(peers_found = r.len(), subnets_searched_for = ?subnets_searched_for, "Peer grouped subnet discovery request completed"); let results = r.into_iter().map(|enr| (enr, None)).collect(); + debug!(peers = ?results, subnets_searched_for = ?subnets_searched_for, "Peer grouped subnet discovery request completed"); return Some(results); } From 32070565bdcc041f699087161ee31fb535cc8004 Mon Sep 17 00:00:00 2001 From: diegomrsantos Date: Wed, 8 Jan 2025 15:37:30 +0100 Subject: [PATCH 8/9] Apply suggestions from code review Co-authored-by: Daniel Knopik <107140945+dknopik@users.noreply.github.com> --- anchor/network/src/discovery.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/anchor/network/src/discovery.rs b/anchor/network/src/discovery.rs index 314f70f6b..c48f86c50 100644 --- a/anchor/network/src/discovery.rs +++ b/anchor/network/src/discovery.rs @@ -378,14 +378,21 @@ impl Discovery { match query.result { Ok(r) if r.is_empty() => { - debug!(subnets_searched_for = ?subnets_searched_for, "Grouped subnet discovery query yielded no results."); + debug!( + subnets_searched_for = ?subnets_searched_for, + "Grouped subnet discovery query yielded no results.", + ); // TODO queries.iter().for_each(|query| { // self.add_subnet_query(query.subnet, query.min_ttl, query.retries + 1); // }) } Ok(r) => { let results = r.into_iter().map(|enr| (enr, None)).collect(); - debug!(peers = ?results, subnets_searched_for = ?subnets_searched_for, "Peer grouped subnet discovery request completed"); + debug!( + peers = ?results, + subnets_searched_for = ?subnets_searched_for, + "Peer grouped subnet discovery request completed", + ); return Some(results); } From e396861421994b65c01c14dc73fccc53ab874cbe Mon Sep 17 00:00:00 2001 From: diego Date: Wed, 15 Jan 2025 20:53:38 +0100 Subject: [PATCH 9/9] fix conflict --- Cargo.lock | 159 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 132 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28c0248d9..7696b01db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1288,14 +1288,14 @@ dependencies = [ "arbitrary", "blst", "ethereum_hashing", - "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.7.1", "fixed_bytes", "hex", "rand", "safe_arith", "serde", - "tree_hash", + "tree_hash 0.8.0", "zeroize", ] @@ -1528,7 +1528,7 @@ dependencies = [ "clap", "dirs 3.0.2", "eth2_network_config", - "ethereum_ssz", + "ethereum_ssz 0.7.1", "hex", "serde", "serde_json", @@ -2421,8 +2421,8 @@ dependencies = [ "derivative", "enr", "eth2_keystore", - "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "futures", "futures-util", @@ -2437,7 +2437,7 @@ dependencies = [ "serde", "serde_json", "slashing_protection", - "ssz_types", + "ssz_types 0.8.0", "types", "zeroize", ] @@ -2519,6 +2519,33 @@ dependencies = [ "zip", ] +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint 0.9.5", +] + [[package]] name = "ethereum_hashing" version = "0.7.0" @@ -2543,6 +2570,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "ethereum_serde_utils" +version = "1.0.0-beta.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c927663d966e972b65dba434972dc158b3b07d0d40feadf2ecc095f90dfb79f6" +dependencies = [ + "ethereum-types", + "hex", + "serde", + "serde_derive", + "serde_json", +] + [[package]] name = "ethereum_ssz" version = "0.7.1" @@ -2554,6 +2594,21 @@ dependencies = [ "smallvec", ] +[[package]] +name = "ethereum_ssz" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862e41ea8eea7508f70cfd8cd560f0c34bb0af37c719a8e06c2672f0f031d8e5" +dependencies = [ + "alloy-primitives", + "ethereum_serde_utils 0.7.0", + "itertools 0.13.0", + "serde", + "serde_derive", + "smallvec", + "typenum", +] + [[package]] name = "ethereum_ssz_derive" version = "0.7.1" @@ -3714,6 +3769,24 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + [[package]] name = "impl-trait-for-tuples" version = "0.2.3" @@ -3894,14 +3967,14 @@ dependencies = [ "c-kzg", "derivative", "ethereum_hashing", - "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "hex", "rust_eth_kzg", "serde", "serde_json", - "tree_hash", + "tree_hash 0.8.0", ] [[package]] @@ -4455,7 +4528,7 @@ dependencies = [ "discv5", "either", "eth2", - "ethereum_ssz", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "fnv", "futures", @@ -4477,7 +4550,7 @@ dependencies = [ "slog", "smallvec", "snap", - "ssz_types", + "ssz_types 0.8.0", "strum 0.24.1", "superstruct", "task_executor", @@ -4697,14 +4770,14 @@ dependencies = [ "arbitrary", "derivative", "ethereum_hashing", - "ethereum_ssz", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "itertools 0.13.0", "parking_lot", "rayon", "serde", "smallvec", - "tree_hash", + "tree_hash 0.8.0", "triomphe", "typenum", "vec_map", @@ -4891,12 +4964,13 @@ dependencies = [ "async-channel", "dirs 5.0.1", "discv5", - "ethereum_ssz", + "ethereum_serde_utils 1.0.0-beta.0", + "ethereum_ssz 0.8.2", "futures", "libp2p", "lighthouse_network", "serde", - "ssz_types", + "ssz_types 0.10.0", "task_executor", "tokio", "tracing", @@ -5435,6 +5509,8 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", + "impl-serde", "uint 0.9.5", ] @@ -5581,7 +5657,7 @@ name = "proto_array" version = "0.2.0" source = "git+https://github.com/sigp/lighthouse?branch=anchor#997991f5513f22bb240816c2e2400cf6a1819a0c" dependencies = [ - "ethereum_ssz", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "safe_arith", "serde", @@ -6674,7 +6750,7 @@ version = "0.1.0" source = "git+https://github.com/sigp/lighthouse?branch=anchor#997991f5513f22bb240816c2e2400cf6a1819a0c" dependencies = [ "arbitrary", - "ethereum_serde_utils", + "ethereum_serde_utils 0.7.0", "filesystem", "r2d2", "r2d2_sqlite", @@ -6870,7 +6946,7 @@ dependencies = [ "openssl", "qbft", "rusqlite", - "tree_hash", + "tree_hash 0.8.0", "tree_hash_derive", "types", ] @@ -6883,13 +6959,29 @@ checksum = "35e0719d2b86ac738a55ae71a8429f52aa2741da988f1fd0975b4cc610fd1e08" dependencies = [ "arbitrary", "derivative", - "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.7.1", + "itertools 0.13.0", + "serde", + "serde_derive", + "smallvec", + "tree_hash 0.8.0", + "typenum", +] + +[[package]] +name = "ssz_types" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22bc24c8a61256950632fb6b68ea09f6b5c988070924c6292eb5933635202e00" +dependencies = [ + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.8.2", "itertools 0.13.0", "serde", "serde_derive", "smallvec", - "tree_hash", + "tree_hash 0.9.0", "typenum", ] @@ -7568,6 +7660,19 @@ dependencies = [ "smallvec", ] +[[package]] +name = "tree_hash" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc60ae4c4236ee721305d0f0b5aa3e8ef5b66f3fa61d17072430bc246d6694a" +dependencies = [ + "alloy-primitives", + "ethereum_hashing", + "ethereum_ssz 0.8.2", + "smallvec", + "typenum", +] + [[package]] name = "tree_hash_derive" version = "0.8.0" @@ -7636,8 +7741,8 @@ dependencies = [ "derivative", "eth2_interop_keypairs", "ethereum_hashing", - "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_serde_utils 0.7.0", + "ethereum_ssz 0.7.1", "ethereum_ssz_derive", "fixed_bytes", "hex", @@ -7662,12 +7767,12 @@ dependencies = [ "serde_yaml", "slog", "smallvec", - "ssz_types", + "ssz_types 0.8.0", "superstruct", "swap_or_not_shuffle", "tempfile", "test_random_derive", - "tree_hash", + "tree_hash 0.8.0", "tree_hash_derive", ] @@ -7864,7 +7969,7 @@ dependencies = [ "task_executor", "tokio", "tracing", - "tree_hash", + "tree_hash 0.8.0", "types", "validator_metrics", "validator_store",