1+ //! Network Actors Integration Example
2+ //!
3+ //! Demonstrates how to use the completed network actor system for
4+ //! blockchain synchronization, peer management, and federation coordination.
5+
6+ use actix:: { Actor , System , Addr } ;
7+ use std:: time:: Duration ;
8+
9+ use crate :: actors:: network:: {
10+ NetworkSupervisor ,
11+ sync:: { SyncActor , SyncConfig } ,
12+ network:: { NetworkActor , NetworkConfig } ,
13+ peer:: { PeerActor , PeerConfig } ,
14+ messages:: * ,
15+ } ;
16+
17+ /// Example usage of the completed network actor system
18+ pub struct NetworkIntegrationExample {
19+ pub supervisor : Addr < NetworkSupervisor > ,
20+ pub sync_actor : Addr < SyncActor > ,
21+ pub network_actor : Addr < NetworkActor > ,
22+ pub peer_actor : Addr < PeerActor > ,
23+ }
24+
25+ impl NetworkIntegrationExample {
26+ /// Initialize the complete network actor system
27+ pub async fn initialize ( ) -> Result < Self , Box < dyn std:: error:: Error > > {
28+ // 1. Configure all network actors
29+ let sync_config = SyncConfig {
30+ production_threshold : 0.995 , // 99.5% threshold for block production
31+ max_parallel_downloads : 8 ,
32+ request_timeout : Duration :: from_secs ( 30 ) ,
33+ checkpoint_interval : 1000 , // Create checkpoint every 1000 blocks
34+ health_check_interval : Duration :: from_secs ( 60 ) ,
35+ ..Default :: default ( )
36+ } ;
37+
38+ let network_config = NetworkConfig {
39+ listen_addresses : vec ! [
40+ "/ip4/0.0.0.0/tcp/30303" . parse( ) ?,
41+ "/ip6/::/tcp/30303" . parse( ) ?,
42+ ] ,
43+ bootstrap_peers : vec ! [
44+ // Add your bootstrap peers here
45+ ] ,
46+ federation_config : crate :: actors:: network:: network:: config:: FederationNetworkConfig {
47+ federation_discovery : true ,
48+ federation_topics : vec ! [
49+ "alys/federation/consensus/v1" . to_string( ) ,
50+ "alys/federation/blocks/v1" . to_string( ) ,
51+ "alys/federation/emergency/v1" . to_string( ) ,
52+ ] ,
53+ ..Default :: default ( )
54+ } ,
55+ ..Default :: default ( )
56+ } ;
57+
58+ let peer_config = PeerConfig :: default ( ) ;
59+
60+ // 2. Start the actors
61+ let sync_actor = SyncActor :: new ( sync_config) ?. start ( ) ;
62+ let network_actor = NetworkActor :: new ( network_config) ?. start ( ) ;
63+ let peer_actor = PeerActor :: new ( peer_config) ?. start ( ) ;
64+
65+ // 3. Create and start the network supervisor
66+ let supervisor_config = crate :: actors:: network:: supervisor:: NetworkSupervisorConfig :: default ( ) ;
67+ let supervisor = NetworkSupervisor :: new (
68+ supervisor_config,
69+ sync_actor. clone ( ) ,
70+ network_actor. clone ( ) ,
71+ peer_actor. clone ( ) ,
72+ ) . start ( ) ;
73+
74+ // 4. Cross-reference actors for coordination
75+ sync_actor. send ( SetActorAddresses {
76+ chain_actor : None , // Would be provided by ChainActor
77+ network_actor : Some ( network_actor. clone ( ) ) ,
78+ peer_actor : Some ( peer_actor. clone ( ) ) ,
79+ } ) . await ??;
80+
81+ Ok ( Self {
82+ supervisor,
83+ sync_actor,
84+ network_actor,
85+ peer_actor,
86+ } )
87+ }
88+
89+ /// Start networking subsystem
90+ pub async fn start_network ( & self ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
91+ tracing:: info!( "🚀 Starting Alys network subsystem..." ) ;
92+
93+ // Start networking
94+ let start_msg = StartNetwork {
95+ listen_addresses : vec ! [
96+ "/ip4/0.0.0.0/tcp/30303" . parse( ) ?,
97+ "/ip6/::/tcp/30303" . parse( ) ?,
98+ ] ,
99+ bootstrap_peers : vec ! [ ] , // Add bootstrap peers as needed
100+ enable_mdns : true ,
101+ } ;
102+
103+ let network_status = self . network_actor . send ( start_msg) . await ??;
104+ tracing:: info!( "✅ Network started on {:?}" , network_status) ;
105+
106+ // Subscribe to essential topics
107+ for topic in [ "blocks" , "transactions" , "discovery" ] {
108+ let subscribe_msg = SubscribeToTopic {
109+ topic : match topic {
110+ "blocks" => GossipTopic :: Blocks ,
111+ "transactions" => GossipTopic :: Transactions ,
112+ "discovery" => GossipTopic :: Discovery ,
113+ _ => GossipTopic :: Custom ( topic. to_string ( ) ) ,
114+ } ,
115+ } ;
116+
117+ self . network_actor . send ( subscribe_msg) . await ??;
118+ tracing:: info!( "📡 Subscribed to topic: {}" , topic) ;
119+ }
120+
121+ Ok ( ( ) )
122+ }
123+
124+ /// Example: Start blockchain synchronization
125+ pub async fn start_sync ( & self , target_height : Option < u64 > ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
126+ tracing:: info!( "🔄 Starting blockchain synchronization..." ) ;
127+
128+ let sync_msg = sync_messages:: StartSync {
129+ from_height : None , // Start from current height
130+ target_height,
131+ sync_mode : sync_messages:: SyncMode :: Fast ,
132+ priority_peers : vec ! [ ] , // Let the system choose peers
133+ } ;
134+
135+ let sync_response = self . sync_actor . send ( sync_msg) . await ??;
136+ tracing:: info!( "✅ Sync started: {:?}" , sync_response) ;
137+
138+ Ok ( ( ) )
139+ }
140+
141+ /// Example: Check if ready for block production (99.5% threshold)
142+ pub async fn can_produce_blocks ( & self ) -> Result < bool , Box < dyn std:: error:: Error > > {
143+ let can_produce = self . sync_actor . send ( sync_messages:: CanProduceBlocks ) . await ??;
144+
145+ if can_produce {
146+ tracing:: info!( "🎯 Ready for block production - sync threshold reached!" ) ;
147+ } else {
148+ let status = self . sync_actor . send ( sync_messages:: GetSyncStatus ) . await ??;
149+ tracing:: info!(
150+ "⏳ Not ready for production - sync at {:.2}% (need 99.5%)" ,
151+ status. sync_progress * 100.0
152+ ) ;
153+ }
154+
155+ Ok ( can_produce)
156+ }
157+
158+ /// Example: Broadcast a new block to the network
159+ pub async fn broadcast_block ( & self , block_data : Vec < u8 > , height : u64 , hash : String ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
160+ tracing:: info!( "📤 Broadcasting block {} to network..." , height) ;
161+
162+ let broadcast_msg = BroadcastBlock {
163+ block_data,
164+ block_height : height,
165+ block_hash : hash,
166+ priority : true , // Mark as priority for federation
167+ } ;
168+
169+ let response = self . network_actor . send ( broadcast_msg) . await ??;
170+ tracing:: info!(
171+ "✅ Block broadcast complete - reached {} peers (message_id: {})" ,
172+ response. peers_reached,
173+ response. message_id
174+ ) ;
175+
176+ Ok ( ( ) )
177+ }
178+
179+ /// Example: Request blocks from peers for sync
180+ pub async fn request_blocks ( & self , start_height : u64 , count : u32 ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
181+ tracing:: info!( "📥 Requesting {} blocks starting from height {}" , count, start_height) ;
182+
183+ let request_msg = sync_messages:: RequestBlocks {
184+ start_height,
185+ count,
186+ preferred_peers : vec ! [ ] , // Let the system choose best peers
187+ } ;
188+
189+ let blocks_response = self . sync_actor . send ( request_msg) . await ??;
190+ tracing:: info!(
191+ "✅ Received {} blocks from sources: {:?}" ,
192+ blocks_response. blocks. len( ) ,
193+ blocks_response. source_peers
194+ ) ;
195+
196+ Ok ( ( ) )
197+ }
198+
199+ /// Example: Create a blockchain state checkpoint
200+ pub async fn create_checkpoint ( & self , height : Option < u64 > ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
201+ tracing:: info!( "💾 Creating blockchain checkpoint..." ) ;
202+
203+ let checkpoint_msg = sync_messages:: CreateCheckpoint {
204+ height,
205+ compression : true ,
206+ } ;
207+
208+ let checkpoint_response = self . sync_actor . send ( checkpoint_msg) . await ??;
209+ tracing:: info!(
210+ "✅ Checkpoint created: {} ({} bytes)" ,
211+ checkpoint_response. checkpoint_id,
212+ checkpoint_response. size_bytes
213+ ) ;
214+
215+ Ok ( ( ) )
216+ }
217+
218+ /// Example: Get comprehensive network status
219+ pub async fn get_network_status ( & self ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
220+ // Get sync status
221+ let sync_status = self . sync_actor . send ( sync_messages:: GetSyncStatus ) . await ??;
222+ tracing:: info!( "📊 Sync Status:" ) ;
223+ tracing:: info!( " Current Height: {}" , sync_status. current_height) ;
224+ tracing:: info!( " Target Height: {:?}" , sync_status. target_height) ;
225+ tracing:: info!( " Progress: {:.2}%" , sync_status. sync_progress * 100.0 ) ;
226+ tracing:: info!( " Can Produce Blocks: {}" , sync_status. can_produce_blocks) ;
227+ tracing:: info!( " Blocks/sec: {:.1}" , sync_status. blocks_per_second) ;
228+
229+ // Get network status
230+ let network_status = self . network_actor . send ( GetNetworkStatus ) . await ??;
231+ tracing:: info!( "🌐 Network Status:" ) ;
232+ tracing:: info!( " Connected Peers: {}" , network_status. connected_peers) ;
233+ tracing:: info!( " Listening Addresses: {:?}" , network_status. listening_addresses) ;
234+ tracing:: info!( " Bandwidth In: {} bytes" , network_status. total_bandwidth_in) ;
235+ tracing:: info!( " Bandwidth Out: {} bytes" , network_status. total_bandwidth_out) ;
236+
237+ Ok ( ( ) )
238+ }
239+
240+ /// Example: Graceful shutdown of the network system
241+ pub async fn shutdown ( & self ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
242+ tracing:: info!( "🛑 Shutting down network subsystem..." ) ;
243+
244+ // Stop sync operations
245+ let stop_sync_msg = sync_messages:: StopSync { force : false } ;
246+ self . sync_actor . send ( stop_sync_msg) . await ??;
247+
248+ // Stop network operations
249+ let stop_network_msg = StopNetwork { graceful : true } ;
250+ self . network_actor . send ( stop_network_msg) . await ??;
251+
252+ tracing:: info!( "✅ Network subsystem shutdown complete" ) ;
253+
254+ Ok ( ( ) )
255+ }
256+ }
257+
258+ /// Demo function showing the complete network actor integration
259+ pub async fn run_network_integration_demo ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
260+ tracing:: info!( "🎬 Starting Alys Network Actors Integration Demo" ) ;
261+
262+ // Initialize the complete network system
263+ let network_system = NetworkIntegrationExample :: initialize ( ) . await ?;
264+
265+ // Start networking
266+ network_system. start_network ( ) . await ?;
267+
268+ // Wait for network to initialize
269+ tokio:: time:: sleep ( Duration :: from_secs ( 5 ) ) . await ;
270+
271+ // Start synchronization
272+ network_system. start_sync ( Some ( 1000 ) ) . await ?;
273+
274+ // Monitor sync progress
275+ for i in 0 ..10 {
276+ tokio:: time:: sleep ( Duration :: from_secs ( 5 ) ) . await ;
277+
278+ let can_produce = network_system. can_produce_blocks ( ) . await ?;
279+ if can_produce {
280+ tracing:: info!( "🎯 Block production threshold reached!" ) ;
281+ break ;
282+ }
283+
284+ if i == 9 {
285+ tracing:: info!( "⏰ Demo timeout - sync still in progress" ) ;
286+ }
287+ }
288+
289+ // Get status report
290+ network_system. get_network_status ( ) . await ?;
291+
292+ // Demo block broadcasting (simulated)
293+ let dummy_block = vec ! [ 1 , 2 , 3 , 4 ] ; // Simulated block data
294+ network_system. broadcast_block ( dummy_block, 1001 , "dummy_hash" . to_string ( ) ) . await ?;
295+
296+ // Demo checkpoint creation
297+ network_system. create_checkpoint ( Some ( 1000 ) ) . await ?;
298+
299+ // Graceful shutdown
300+ network_system. shutdown ( ) . await ?;
301+
302+ tracing:: info!( "✅ Network Actors Integration Demo Complete!" ) ;
303+
304+ Ok ( ( ) )
305+ }
306+
307+ // Helper message types for actor coordination
308+
309+ #[ derive( actix:: Message ) ]
310+ #[ rtype( result = "Result<(), actix::MailboxError>" ) ]
311+ pub struct SetActorAddresses {
312+ pub chain_actor : Option < Addr < crate :: actors:: chain:: ChainActor > > ,
313+ pub network_actor : Option < Addr < NetworkActor > > ,
314+ pub peer_actor : Option < Addr < PeerActor > > ,
315+ }
316+
317+ #[ cfg( test) ]
318+ mod tests {
319+ use super :: * ;
320+ use actix:: System ;
321+
322+ #[ tokio:: test]
323+ async fn test_network_integration_example ( ) {
324+ // This test would require proper actor system setup
325+ // For now, just test that the structure compiles
326+ assert ! ( true ) ;
327+ }
328+
329+ #[ test]
330+ fn test_configuration_validity ( ) {
331+ let sync_config = SyncConfig {
332+ production_threshold : 0.995 ,
333+ ..Default :: default ( )
334+ } ;
335+
336+ assert ! ( sync_config. production_threshold >= 0.995 ) ;
337+ assert ! ( sync_config. max_parallel_downloads > 0 ) ;
338+ }
339+ }
0 commit comments