@@ -3,19 +3,73 @@ use apollo_network::network_manager::{
33 BroadcastTopicClient ,
44 BroadcastTopicServer ,
55 NetworkManager ,
6+ PropellerChannels ,
7+ PropellerClient ,
8+ PropellerMessageServer ,
69 SqmrClientSender ,
710 SqmrServerReceiver ,
811} ;
912use apollo_network:: NetworkConfig ;
1013
1114use crate :: args:: NetworkProtocol ;
12- use crate :: message_handling:: { MessageReceiver , MessageSender } ;
15+ use crate :: message_handling:: { MessageReceiver , MessageSender , PropellerSender } ;
1316use crate :: metrics:: { create_network_metrics, TOPIC } ;
1417
1518pub type TopicType = Vec < u8 > ;
1619
1720pub const SQMR_PROTOCOL_NAME : & str = "/stress-test/1.0.0" ;
1821
22+ /// Creates peer configurations for Propeller protocol from bootstrap addresses
23+ /// Each peer gets equal weight (1000) for simplicity
24+ fn create_propeller_peers_from_bootstrap ( bootstrap_addrs : & [ String ] ) -> Vec < ( libp2p:: PeerId , u64 ) > {
25+ use std:: str:: FromStr ;
26+
27+ use libp2p:: Multiaddr ;
28+
29+ bootstrap_addrs
30+ . iter ( )
31+ . filter_map ( |addr_str| {
32+ // Parse the multiaddr and extract the peer ID
33+ match Multiaddr :: from_str ( addr_str. trim ( ) ) {
34+ Ok ( multiaddr) => {
35+ // Extract peer ID from the multiaddr (last component should be /p2p/<peer_id>)
36+ for protocol in multiaddr. iter ( ) {
37+ if let libp2p:: multiaddr:: Protocol :: P2p ( peer_id) = protocol {
38+ return Some ( ( peer_id, 1000 ) ) ; // Equal weight for all peers
39+ }
40+ }
41+ tracing:: warn!( "No peer ID found in bootstrap address: {}" , addr_str) ;
42+ None
43+ }
44+ Err ( e) => {
45+ tracing:: error!( "Failed to parse bootstrap address '{}': {}" , addr_str, e) ;
46+ None
47+ }
48+ }
49+ } )
50+ . collect ( )
51+ }
52+
53+ /// Fallback function to create peer configurations when no bootstrap addresses are provided
54+ /// This creates deterministic peer IDs from node indices for testing
55+ fn create_propeller_peers_fallback ( num_nodes : u64 ) -> Vec < ( libp2p:: PeerId , u64 ) > {
56+ use libp2p:: identity:: Keypair ;
57+
58+ ( 0 ..num_nodes)
59+ . map ( |node_id| {
60+ // Create deterministic peer ID from node ID (same as stress test node)
61+ let mut private_key = [ 0u8 ; 32 ] ;
62+ private_key[ 0 ..8 ] . copy_from_slice ( & node_id. to_le_bytes ( ) ) ;
63+
64+ let keypair = Keypair :: ed25519_from_bytes ( private_key)
65+ . expect ( "Failed to create keypair from private key" ) ;
66+ let peer_id = keypair. public ( ) . to_peer_id ( ) ;
67+
68+ ( peer_id, 1000 ) // Equal weight for all peers
69+ } )
70+ . collect ( )
71+ }
72+
1973/// Network communication channels for different protocols
2074pub enum NetworkChannels {
2175 Gossipsub {
@@ -30,6 +84,10 @@ pub enum NetworkChannels {
3084 sqmr_client : Option < SqmrClientSender < TopicType , TopicType > > ,
3185 sqmr_server : Option < SqmrServerReceiver < TopicType , TopicType > > ,
3286 } ,
87+ Propeller {
88+ propeller_client : Option < PropellerClient < TopicType > > ,
89+ propeller_messages_receiver : Option < PropellerMessageServer < TopicType > > ,
90+ } ,
3391}
3492
3593impl NetworkChannels {
@@ -49,6 +107,11 @@ impl NetworkChannels {
49107 sqmr_server. take ( ) . expect ( "sqmr_server should be available" ) ,
50108 ) )
51109 }
110+ NetworkChannels :: Propeller { propeller_client, propeller_messages_receiver : _ } => {
111+ MessageSender :: Propeller ( PropellerSender :: new (
112+ propeller_client. take ( ) . expect ( "propeller_client should be available" ) ,
113+ ) )
114+ }
52115 }
53116 }
54117
@@ -70,6 +133,13 @@ impl NetworkChannels {
70133 sqmr_client. take ( ) . expect ( "sqmr_client should be available" ) ,
71134 )
72135 }
136+ NetworkChannels :: Propeller { propeller_messages_receiver, propeller_client : _ } => {
137+ MessageReceiver :: Propeller (
138+ propeller_messages_receiver
139+ . take ( )
140+ . expect ( "propeller_messages_receiver should be available" ) ,
141+ )
142+ }
73143 }
74144 }
75145}
@@ -80,6 +150,9 @@ pub fn create_network_manager_with_channels(
80150 network_config : & NetworkConfig ,
81151 buffer_size : usize ,
82152 protocol : & NetworkProtocol ,
153+ num_nodes : u64 ,
154+ _current_node_id : u64 ,
155+ bootstrap_addrs : & [ String ] ,
83156) -> ( NetworkManager , NetworkChannels ) {
84157 let network_metrics = create_network_metrics ( ) ;
85158 let mut network_manager =
@@ -90,10 +163,8 @@ pub fn create_network_manager_with_channels(
90163 let network_channels = network_manager
91164 . register_broadcast_topic :: < TopicType > ( TOPIC . clone ( ) , buffer_size)
92165 . expect ( "Failed to register broadcast topic" ) ;
93- let BroadcastTopicChannels {
94- broadcasted_messages_receiver,
95- broadcast_topic_client,
96- } = network_channels;
166+ let BroadcastTopicChannels { broadcasted_messages_receiver, broadcast_topic_client } =
167+ network_channels;
97168
98169 NetworkChannels :: Gossipsub {
99170 broadcast_topic_client : Some ( broadcast_topic_client) ,
@@ -112,10 +183,7 @@ pub fn create_network_manager_with_channels(
112183 buffer_size,
113184 ) ;
114185
115- NetworkChannels :: Sqmr {
116- sqmr_client : Some ( sqmr_client) ,
117- sqmr_server : Some ( sqmr_server) ,
118- }
186+ NetworkChannels :: Sqmr { sqmr_client : Some ( sqmr_client) , sqmr_server : Some ( sqmr_server) }
119187 }
120188 NetworkProtocol :: ReveresedSqmr => {
121189 let sqmr_client = network_manager
@@ -134,6 +202,43 @@ pub fn create_network_manager_with_channels(
134202 sqmr_server : Some ( sqmr_server) ,
135203 }
136204 }
205+ NetworkProtocol :: Propeller => {
206+ // Create peer configurations from bootstrap addresses, or fallback to generated peers
207+ let peers = if !bootstrap_addrs. is_empty ( ) {
208+ tracing:: info!(
209+ "Creating Propeller peers from {} bootstrap addresses" ,
210+ bootstrap_addrs. len( )
211+ ) ;
212+ let peers = create_propeller_peers_from_bootstrap ( bootstrap_addrs) ;
213+ tracing:: info!(
214+ "Successfully created {} Propeller peers from bootstrap addresses" ,
215+ peers. len( )
216+ ) ;
217+ for ( peer_id, weight) in & peers {
218+ tracing:: debug!( "Propeller peer: {} (weight: {})" , peer_id, weight) ;
219+ }
220+ peers
221+ } else {
222+ tracing:: info!(
223+ "No bootstrap addresses provided, using fallback peer generation for {} nodes" ,
224+ num_nodes
225+ ) ;
226+ create_propeller_peers_fallback ( num_nodes)
227+ } ;
228+
229+ // Register propeller channels
230+ let propeller_channels = network_manager
231+ . register_propeller_channels :: < TopicType > ( buffer_size, peers)
232+ . expect ( "Failed to register propeller channels" ) ;
233+
234+ let PropellerChannels { propeller_messages_receiver, propeller_client } =
235+ propeller_channels;
236+
237+ NetworkChannels :: Propeller {
238+ propeller_client : Some ( propeller_client) ,
239+ propeller_messages_receiver : Some ( propeller_messages_receiver) ,
240+ }
241+ }
137242 } ;
138243
139244 ( network_manager, channels)
0 commit comments