1use std::{collections::HashMap, sync::Arc};
20
21use darkfi::{
22 net::{P2p, P2pPtr, Settings},
23 rpc::jsonrpc::JsonSubscriber,
24 system::ExecutorPtr,
25 validator::ValidatorPtr,
26 Result,
27};
28use log::info;
29
30mod protocol_proposal;
32pub use protocol_proposal::{ProposalMessage, ProtocolProposalHandler, ProtocolProposalHandlerPtr};
33
34mod protocol_sync;
36pub use protocol_sync::{
37 ForkHeaderHashRequest, ForkHeaderHashResponse, ForkHeadersRequest, ForkHeadersResponse,
38 ForkProposalsRequest, ForkProposalsResponse, ForkSyncRequest, ForkSyncResponse,
39 HeaderSyncRequest, HeaderSyncResponse, ProtocolSyncHandler, ProtocolSyncHandlerPtr,
40 SyncRequest, SyncResponse, TipRequest, TipResponse, BATCH,
41};
42
43mod protocol_tx;
45pub use protocol_tx::{ProtocolTxHandler, ProtocolTxHandlerPtr};
46
47pub type DarkfidP2pHandlerPtr = Arc<DarkfidP2pHandler>;
49
50pub struct DarkfidP2pHandler {
52 pub p2p: P2pPtr,
54 proposals: ProtocolProposalHandlerPtr,
56 sync: ProtocolSyncHandlerPtr,
58 txs: ProtocolTxHandlerPtr,
60}
61
62impl DarkfidP2pHandler {
63 pub async fn init(settings: &Settings, executor: &ExecutorPtr) -> Result<DarkfidP2pHandlerPtr> {
68 info!(
69 target: "darkfid::proto::mod::DarkfidP2pHandler::init",
70 "Initializing a new Darkfid P2P handler..."
71 );
72
73 let p2p = P2p::new(settings.clone(), executor.clone()).await?;
75
76 let proposals = ProtocolProposalHandler::init(&p2p).await;
78
79 let sync = ProtocolSyncHandler::init(&p2p).await;
81
82 let txs = ProtocolTxHandler::init(&p2p).await;
84
85 info!(
86 target: "darkfid::proto::mod::DarkfidP2pHandler::init",
87 "Darkfid P2P handler generated successfully!"
88 );
89
90 Ok(Arc::new(Self { p2p, proposals, sync, txs }))
91 }
92
93 pub async fn start(
95 &self,
96 executor: &ExecutorPtr,
97 validator: &ValidatorPtr,
98 subscribers: &HashMap<&'static str, JsonSubscriber>,
99 ) -> Result<()> {
100 info!(
101 target: "darkfid::proto::mod::DarkfidP2pHandler::start",
102 "Starting the Darkfid P2P handler..."
103 );
104
105 let proposals_sub = subscribers.get("proposals").unwrap().clone();
107 let blocks_sub = subscribers.get("blocks").unwrap().clone();
108 self.proposals.start(executor, validator, &self.p2p, proposals_sub, blocks_sub).await?;
109
110 self.sync.start(executor, validator).await?;
112
113 let subscriber = subscribers.get("txs").unwrap().clone();
115 self.txs.start(executor, validator, subscriber).await?;
116
117 self.p2p.clone().start().await?;
119
120 info!(
121 target: "darkfid::proto::mod::DarkfidP2pHandler::start",
122 "Darkfid P2P handler started successfully!"
123 );
124
125 Ok(())
126 }
127
128 pub async fn stop(&self) {
130 info!(target: "darkfid::proto::mod::DarkfidP2pHandler::stop", "Terminating Darkfid P2P handler...");
131
132 self.p2p.stop().await;
134
135 self.txs.stop().await;
137
138 self.sync.stop().await;
140
141 self.proposals.stop().await;
143
144 info!(target: "darkfid::proto::mod::DarkfidP2pHandler::stop", "Darkfid P2P handler terminated successfully!");
145 }
146}