Skip to content

Commit fea94ef

Browse files
apollo_network: using propeller in network manager
1 parent 8c54b64 commit fea94ef

35 files changed

+5530
-15
lines changed

Cargo.lock

Lines changed: 81 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ members = [
6464
"crates/apollo_p2p_sync_config",
6565
"crates/apollo_proc_macros",
6666
"crates/apollo_proc_macros_tests",
67+
"crates/apollo_propeller",
6768
"crates/apollo_protobuf",
6869
"crates/apollo_reverts",
6970
"crates/apollo_rpc",
@@ -179,6 +180,7 @@ apollo_p2p_sync.path = "crates/apollo_p2p_sync"
179180
apollo_p2p_sync_config.path = "crates/apollo_p2p_sync_config"
180181
apollo_proc_macros = { path = "crates/apollo_proc_macros", version = "0.0.0" }
181182
apollo_proc_macros_tests.path = "crates/apollo_proc_macros_tests"
183+
apollo_propeller.path = "crates/apollo_propeller"
182184
apollo_protobuf.path = "crates/apollo_protobuf"
183185
apollo_reverts.path = "crates/apollo_reverts"
184186
apollo_rpc.path = "crates/apollo_rpc"
@@ -209,6 +211,7 @@ assert_matches = "1.5.0"
209211
async-recursion = "1.1.0"
210212
async-stream = "0.3.3"
211213
async-trait = "0.1.79"
214+
asynchronous-codec = "0.7.0"
212215
atomic_refcell = "0.1.13"
213216
axum = "0.6.12"
214217
base64 = "0.13.0"
@@ -279,6 +282,7 @@ libp2p = "0.56.0"
279282
libp2p-swarm-test = "0.6.0"
280283
log = "0.4"
281284
lru = "0.12.0"
285+
lru_time_cache = "0.11.11"
282286
memmap2 = "0.8.0"
283287
mempool_test_utils.path = "crates/mempool_test_utils"
284288
metrics = "0.24.1"
@@ -315,10 +319,14 @@ prost-types = "0.12.1"
315319
protoc-prebuilt = "0.3.0"
316320
pyo3 = "0.19.1"
317321
pyo3-log = "0.8.1"
322+
quick-protobuf = "0.8.1"
323+
quick-protobuf-codec = "0.3.1"
324+
quickcheck = "1.0.3"
318325
quote = "1.0.26"
319326
rand = "0.8.5"
320327
rand_chacha = "0.3.1"
321328
rand_distr = "0.4.3"
329+
reed-solomon-simd = "3.1.0"
322330
regex = "1.10.4"
323331
replace_with = "0.1.7"
324332
reqwest = "0.12"

crates/apollo_network/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ testing = []
1212
apollo_config.workspace = true
1313
apollo_metrics.workspace = true
1414
apollo_network_types.workspace = true
15+
apollo_propeller.workspace = true
1516
async-stream.workspace = true
1617
async-trait.workspace = true
1718
bytes.workspace = true

crates/apollo_network/src/e2e_broadcast_test.rs

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,32 @@ use std::time::Duration;
33
use futures::{FutureExt, StreamExt};
44
use libp2p::core::multiaddr::Protocol;
55
use libp2p::swarm::SwarmEvent;
6-
use libp2p::{Multiaddr, Swarm};
6+
use libp2p::{Multiaddr, PeerId, Swarm};
77
use libp2p_swarm_test::SwarmExt;
88
use starknet_api::core::ChainId;
99

1010
use crate::discovery::DiscoveryConfig;
1111
use crate::gossipsub_impl::Topic;
1212
use crate::mixed_behaviour::MixedBehaviour;
13-
use crate::network_manager::{BroadcastTopicClientTrait, GenericNetworkManager};
13+
use crate::network_manager::{
14+
BroadcastTopicClientTrait,
15+
GenericNetworkManager,
16+
PropellerClientTrait,
17+
};
1418
use crate::peer_manager::PeerManagerConfig;
1519
use crate::{sqmr, Bytes};
1620

1721
const TIMEOUT: Duration = Duration::from_secs(5);
1822

19-
async fn create_swarm(bootstrap_peer_multiaddr: Option<Multiaddr>) -> Swarm<MixedBehaviour> {
23+
async fn create_swarm(bootstrap_peer_multiaddr: Option<Vec<Multiaddr>>) -> Swarm<MixedBehaviour> {
2024
let mut swarm = Swarm::new_ephemeral_tokio(|keypair| {
2125
MixedBehaviour::new(
2226
sqmr::Config::default(),
2327
DiscoveryConfig::default(),
2428
PeerManagerConfig::default(),
2529
None,
2630
keypair.clone(),
27-
bootstrap_peer_multiaddr.map(|multiaddr| vec![multiaddr]),
31+
bootstrap_peer_multiaddr,
2832
ChainId::Mainnet,
2933
None,
3034
)
@@ -60,6 +64,28 @@ fn create_network_manager(
6064
)
6165
}
6266

67+
async fn create_network_managers(
68+
num: usize,
69+
) -> Vec<(PeerId, GenericNetworkManager<Swarm<MixedBehaviour>>)> {
70+
let mut bootstrap_addresses = vec![];
71+
let mut network_managers = vec![];
72+
for _ in 0..num {
73+
let swarm = create_swarm(if bootstrap_addresses.is_empty() {
74+
None
75+
} else {
76+
Some(bootstrap_addresses.clone())
77+
})
78+
.await;
79+
let local_peer_id = swarm.local_peer_id();
80+
let address = swarm.external_addresses().next().unwrap().clone();
81+
// Add peer ID to the multiaddr for bootstrap addresses
82+
let bootstrap_address = address.with_p2p(*local_peer_id).unwrap();
83+
bootstrap_addresses.push(bootstrap_address);
84+
network_managers.push((*local_peer_id, create_network_manager(swarm)));
85+
}
86+
network_managers
87+
}
88+
6389
const BUFFER_SIZE: usize = 100;
6490

6591
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -92,9 +118,9 @@ async fn broadcast_subscriber_end_to_end_test() {
92118
bootstrap_peer_multiaddr.with_p2p(*bootstrap_swarm.local_peer_id()).unwrap();
93119
let bootstrap_network_manager = create_network_manager(bootstrap_swarm);
94120
let mut network_manager1 =
95-
create_network_manager(create_swarm(Some(bootstrap_peer_multiaddr.clone())).await);
121+
create_network_manager(create_swarm(Some(vec![bootstrap_peer_multiaddr.clone()])).await);
96122
let mut network_manager2 =
97-
create_network_manager(create_swarm(Some(bootstrap_peer_multiaddr)).await);
123+
create_network_manager(create_swarm(Some(vec![bootstrap_peer_multiaddr])).await);
98124

99125
let mut subscriber_channels1_1 =
100126
network_manager1.register_broadcast_topic::<Number>(topic1.clone(), BUFFER_SIZE).unwrap();
@@ -137,3 +163,47 @@ async fn broadcast_subscriber_end_to_end_test() {
137163
}
138164
}
139165
}
166+
167+
#[tokio::test]
168+
async fn propeller_message_forwarding_test() {
169+
// This test verifies that propeller messages are properly forwarded through channels
170+
// when received by the network manager, similar to how gossipsub messages work.
171+
172+
let mut network_managers = create_network_managers(2).await;
173+
let (peer_1, mut nm_1) = network_managers.remove(0);
174+
let (peer_2, mut nm_2) = network_managers.remove(0);
175+
176+
let peers = vec![(peer_1, 1000), (peer_2, 500)];
177+
178+
let mut channels_1 =
179+
nm_1.register_propeller_channels::<Vec<u8>>(BUFFER_SIZE, peers.clone()).unwrap();
180+
let mut channels_2 = nm_2.register_propeller_channels::<Vec<u8>>(BUFFER_SIZE, peers).unwrap();
181+
182+
let message = vec![123; 64]; // must be a multiple of 64
183+
let message_id = 1;
184+
185+
tokio::select! {
186+
_ = nm_1.run() => panic!("network manager ended"),
187+
_ = nm_2.run() => panic!("network manager ended"),
188+
result = tokio::time::timeout(
189+
TIMEOUT, async move {
190+
tokio::time::sleep(Duration::from_secs(1)).await;
191+
192+
println!("Sending message");
193+
channels_1.propeller_client.send_message(message.clone(), message_id).await.unwrap();
194+
195+
println!("Receiving message");
196+
let (received_message_id, received_message) =
197+
channels_2.propeller_messages_receiver.next().await.unwrap();
198+
199+
assert_eq!(received_message.unwrap(), message);
200+
assert_eq!(received_message_id, message_id);
201+
202+
assert!(channels_1.propeller_messages_receiver.next().now_or_never().is_none());
203+
assert!(channels_2.propeller_messages_receiver.next().now_or_never().is_none());
204+
}
205+
) => {
206+
result.unwrap()
207+
}
208+
}
209+
}

crates/apollo_network/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub mod misconduct_score;
1313
mod mixed_behaviour;
1414
pub mod network_manager;
1515
mod peer_manager;
16+
pub mod propeller_impl;
1617
mod sqmr;
1718
#[cfg(test)]
1819
mod test_utils;

0 commit comments

Comments
 (0)