|
| 1 | +use crate::v5::{ |
| 2 | + address::{ReceiveAddressesFlow, SendAddressesFlow}, |
| 3 | + blockrelay::{flow::HandleRelayInvsFlow, handle_requests::HandleRelayBlockRequests}, |
| 4 | + ibd::IbdFlow, |
| 5 | + ping::{ReceivePingsFlow, SendPingsFlow}, |
| 6 | + request_antipast::HandleAntipastRequests, |
| 7 | + request_block_locator::RequestBlockLocatorFlow, |
| 8 | + request_headers::RequestHeadersFlow, |
| 9 | + request_ibd_blocks::HandleIbdBlockRequests, |
| 10 | + request_ibd_chain_block_locator::RequestIbdChainBlockLocatorFlow, |
| 11 | + request_pp_proof::RequestPruningPointProofFlow, |
| 12 | + request_pruning_point_utxo_set::RequestPruningPointUtxoSetFlow, |
| 13 | + txrelay::flow::{RelayTransactionsFlow, RequestTransactionsFlow}, |
| 14 | +}; |
| 15 | +use crate::{flow_context::FlowContext, flow_trait::Flow}; |
| 16 | + |
| 17 | +use kaspa_p2p_lib::{KaspadMessagePayloadType, Router, SharedIncomingRoute}; |
| 18 | +use kaspa_utils::channel; |
| 19 | +use std::sync::Arc; |
| 20 | + |
| 21 | +use crate::v6::request_pruning_point_and_anticone::PruningPointAndItsAnticoneRequestsFlow; |
| 22 | + |
| 23 | +pub fn register(ctx: FlowContext, router: Arc<Router>) -> Vec<Box<dyn Flow>> { |
| 24 | + // IBD flow <-> invs flow communication uses a job channel in order to always |
| 25 | + // maintain at most a single pending job which can be updated |
| 26 | + let (ibd_sender, relay_receiver) = channel::job(); |
| 27 | + |
| 28 | + let mut flows: Vec<Box<dyn Flow>> = vec![ |
| 29 | + Box::new(IbdFlow::new( |
| 30 | + ctx.clone(), |
| 31 | + router.clone(), |
| 32 | + router.subscribe(vec![ |
| 33 | + KaspadMessagePayloadType::BlockHeaders, |
| 34 | + KaspadMessagePayloadType::DoneHeaders, |
| 35 | + KaspadMessagePayloadType::IbdBlockLocatorHighestHash, |
| 36 | + KaspadMessagePayloadType::IbdBlockLocatorHighestHashNotFound, |
| 37 | + KaspadMessagePayloadType::BlockWithTrustedDataV4, |
| 38 | + KaspadMessagePayloadType::DoneBlocksWithTrustedData, |
| 39 | + KaspadMessagePayloadType::IbdChainBlockLocator, |
| 40 | + KaspadMessagePayloadType::IbdBlock, |
| 41 | + KaspadMessagePayloadType::TrustedData, |
| 42 | + KaspadMessagePayloadType::PruningPoints, |
| 43 | + KaspadMessagePayloadType::PruningPointProof, |
| 44 | + KaspadMessagePayloadType::UnexpectedPruningPoint, |
| 45 | + KaspadMessagePayloadType::PruningPointUtxoSetChunk, |
| 46 | + KaspadMessagePayloadType::DonePruningPointUtxoSetChunks, |
| 47 | + ]), |
| 48 | + relay_receiver, |
| 49 | + )), |
| 50 | + Box::new(HandleRelayBlockRequests::new( |
| 51 | + ctx.clone(), |
| 52 | + router.clone(), |
| 53 | + router.subscribe(vec![KaspadMessagePayloadType::RequestRelayBlocks]), |
| 54 | + )), |
| 55 | + Box::new(ReceivePingsFlow::new(ctx.clone(), router.clone(), router.subscribe(vec![KaspadMessagePayloadType::Ping]))), |
| 56 | + Box::new(SendPingsFlow::new(ctx.clone(), router.clone(), router.subscribe(vec![KaspadMessagePayloadType::Pong]))), |
| 57 | + Box::new(RequestHeadersFlow::new( |
| 58 | + ctx.clone(), |
| 59 | + router.clone(), |
| 60 | + router.subscribe(vec![KaspadMessagePayloadType::RequestHeaders, KaspadMessagePayloadType::RequestNextHeaders]), |
| 61 | + )), |
| 62 | + Box::new(RequestPruningPointProofFlow::new( |
| 63 | + ctx.clone(), |
| 64 | + router.clone(), |
| 65 | + router.subscribe(vec![KaspadMessagePayloadType::RequestPruningPointProof]), |
| 66 | + )), |
| 67 | + Box::new(RequestIbdChainBlockLocatorFlow::new( |
| 68 | + ctx.clone(), |
| 69 | + router.clone(), |
| 70 | + router.subscribe(vec![KaspadMessagePayloadType::RequestIbdChainBlockLocator]), |
| 71 | + )), |
| 72 | + Box::new(PruningPointAndItsAnticoneRequestsFlow::new( |
| 73 | + ctx.clone(), |
| 74 | + router.clone(), |
| 75 | + router.subscribe(vec![ |
| 76 | + KaspadMessagePayloadType::RequestPruningPointAndItsAnticone, |
| 77 | + KaspadMessagePayloadType::RequestNextPruningPointAndItsAnticoneBlocks, |
| 78 | + ]), |
| 79 | + )), |
| 80 | + Box::new(RequestPruningPointUtxoSetFlow::new( |
| 81 | + ctx.clone(), |
| 82 | + router.clone(), |
| 83 | + router.subscribe(vec![ |
| 84 | + KaspadMessagePayloadType::RequestPruningPointUtxoSet, |
| 85 | + KaspadMessagePayloadType::RequestNextPruningPointUtxoSetChunk, |
| 86 | + ]), |
| 87 | + )), |
| 88 | + Box::new(HandleIbdBlockRequests::new( |
| 89 | + ctx.clone(), |
| 90 | + router.clone(), |
| 91 | + router.subscribe(vec![KaspadMessagePayloadType::RequestIbdBlocks]), |
| 92 | + )), |
| 93 | + Box::new(HandleAntipastRequests::new( |
| 94 | + ctx.clone(), |
| 95 | + router.clone(), |
| 96 | + router.subscribe(vec![KaspadMessagePayloadType::RequestAntipast]), |
| 97 | + )), |
| 98 | + Box::new(RelayTransactionsFlow::new( |
| 99 | + ctx.clone(), |
| 100 | + router.clone(), |
| 101 | + router |
| 102 | + .subscribe_with_capacity(vec![KaspadMessagePayloadType::InvTransactions], RelayTransactionsFlow::invs_channel_size()), |
| 103 | + router.subscribe_with_capacity( |
| 104 | + vec![KaspadMessagePayloadType::Transaction, KaspadMessagePayloadType::TransactionNotFound], |
| 105 | + RelayTransactionsFlow::txs_channel_size(), |
| 106 | + ), |
| 107 | + )), |
| 108 | + Box::new(RequestTransactionsFlow::new( |
| 109 | + ctx.clone(), |
| 110 | + router.clone(), |
| 111 | + router.subscribe(vec![KaspadMessagePayloadType::RequestTransactions]), |
| 112 | + )), |
| 113 | + Box::new(ReceiveAddressesFlow::new(ctx.clone(), router.clone(), router.subscribe(vec![KaspadMessagePayloadType::Addresses]))), |
| 114 | + Box::new(SendAddressesFlow::new( |
| 115 | + ctx.clone(), |
| 116 | + router.clone(), |
| 117 | + router.subscribe(vec![KaspadMessagePayloadType::RequestAddresses]), |
| 118 | + )), |
| 119 | + Box::new(RequestBlockLocatorFlow::new( |
| 120 | + ctx.clone(), |
| 121 | + router.clone(), |
| 122 | + router.subscribe(vec![KaspadMessagePayloadType::RequestBlockLocator]), |
| 123 | + )), |
| 124 | + ]; |
| 125 | + |
| 126 | + let invs_route = router.subscribe_with_capacity(vec![KaspadMessagePayloadType::InvRelayBlock], ctx.block_invs_channel_size()); |
| 127 | + let shared_invs_route = SharedIncomingRoute::new(invs_route); |
| 128 | + |
| 129 | + let num_relay_flows = (ctx.config.bps().upper_bound() as usize / 2).max(1); |
| 130 | + flows.extend((0..num_relay_flows).map(|_| { |
| 131 | + Box::new(HandleRelayInvsFlow::new( |
| 132 | + ctx.clone(), |
| 133 | + router.clone(), |
| 134 | + shared_invs_route.clone(), |
| 135 | + router.subscribe(vec![]), |
| 136 | + ibd_sender.clone(), |
| 137 | + )) as Box<dyn Flow> |
| 138 | + })); |
| 139 | + |
| 140 | + // The reject message is handled as a special case by the router |
| 141 | + // KaspadMessagePayloadType::Reject, |
| 142 | + |
| 143 | + // We do not register the below two messages since they are deprecated also in go-kaspa |
| 144 | + // KaspadMessagePayloadType::BlockWithTrustedData, |
| 145 | + // KaspadMessagePayloadType::IbdBlockLocator, |
| 146 | + |
| 147 | + flows |
| 148 | +} |
0 commit comments