diff --git a/node/src/reducer.rs b/node/src/reducer.rs index e507d57afd..33c2b8c78f 100644 --- a/node/src/reducer.rs +++ b/node/src/reducer.rs @@ -36,7 +36,7 @@ pub fn reducer( let time = meta.time(); let result = p2p::P2pState::reducer( Substate::new(state, dispatcher), - meta.with_action(action), + meta.with_action(action.clone()), ); if let Err(error) = result { diff --git a/node/src/rpc/mod.rs b/node/src/rpc/mod.rs index 71492b05c9..8f307b2097 100644 --- a/node/src/rpc/mod.rs +++ b/node/src/rpc/mod.rs @@ -587,7 +587,7 @@ pub mod discovery { } Ok(RpcDiscoveryRoutingTable { - this_key: value.this_key.clone(), + this_key: value.this_key, buckets, }) } @@ -643,8 +643,8 @@ pub mod discovery { Ok(RpcEntry { peer_id: value.peer_id, libp2p: value.peer_id.try_into()?, - key: value.key.clone(), - dist: this_key - &value.key, + key: value.key, + dist: this_key - value.key, addrs: value.addresses().clone(), connection: value.connection, }) diff --git a/p2p/src/channels/best_tip/p2p_channels_best_tip_reducer.rs b/p2p/src/channels/best_tip/p2p_channels_best_tip_reducer.rs index 2a64f7797f..c4bdf794d5 100644 --- a/p2p/src/channels/best_tip/p2p_channels_best_tip_reducer.rs +++ b/p2p/src/channels/best_tip/p2p_channels_best_tip_reducer.rs @@ -12,7 +12,7 @@ impl P2pChannelsBestTipState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsBestTipAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -90,10 +90,7 @@ impl P2pChannelsBestTipState { *last_received = Some(best_tip.clone()); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pPeerAction::BestTipUpdate { - peer_id, - best_tip: best_tip.clone(), - }); + dispatcher.push(P2pPeerAction::BestTipUpdate { peer_id, best_tip }); dispatcher.push(P2pChannelsBestTipAction::RequestSend { peer_id }); Ok(()) } @@ -115,7 +112,7 @@ impl P2pChannelsBestTipState { .callbacks .on_p2p_channels_best_tip_request_received { - dispatcher.push_callback(callback.clone(), *peer_id); + dispatcher.push_callback(callback.clone(), peer_id); } Ok(()) } @@ -141,7 +138,7 @@ impl P2pChannelsBestTipState { if !is_libp2p { dispatcher.push(P2pChannelsBestTipEffectfulAction::ResponseSend { peer_id, - best_tip: best_tip.clone(), + best_tip, }); return Ok(()); } diff --git a/p2p/src/channels/p2p_channels_reducer.rs b/p2p/src/channels/p2p_channels_reducer.rs index ecf2ce99a7..624f7e428d 100644 --- a/p2p/src/channels/p2p_channels_reducer.rs +++ b/p2p/src/channels/p2p_channels_reducer.rs @@ -34,7 +34,7 @@ use redux::{ActionWithMeta, Dispatcher}; impl P2pChannelsState { pub fn reducer( state_context: Substate, - action: ActionWithMeta<&P2pChannelsAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -75,7 +75,7 @@ impl P2pChannelsState { } fn dispatch_message( - action: ActionWithMeta<&P2pChannelsMessageReceivedAction>, + action: ActionWithMeta, dispatcher: &mut Dispatcher, state: &State, ) -> Result<(), String> @@ -91,7 +91,7 @@ impl P2pChannelsState { let mut is_enabled = |action: Action| dispatcher.push_if_enabled(action, state, time); - let was_expected = match *action.message.clone() { + let was_expected = match *action.message { ChannelMsg::SignalingDiscovery(msg) => match msg { SignalingDiscoveryChannelMsg::GetNext => is_enabled( P2pChannelsSignalingDiscoveryAction::RequestReceived { peer_id }.into(), diff --git a/p2p/src/channels/rpc/p2p_channels_rpc_reducer.rs b/p2p/src/channels/rpc/p2p_channels_rpc_reducer.rs index c0dbd8a156..04d4fa5cfe 100644 --- a/p2p/src/channels/rpc/p2p_channels_rpc_reducer.rs +++ b/p2p/src/channels/rpc/p2p_channels_rpc_reducer.rs @@ -17,7 +17,7 @@ impl P2pChannelsRpcState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsRpcAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -83,7 +83,7 @@ impl P2pChannelsRpcState { *next_local_rpc_id += 1; *local = P2pRpcLocalState::Requested { time: meta.time(), - id: *id, + id, request: request.clone(), }; @@ -92,7 +92,7 @@ impl P2pChannelsRpcState { #[cfg(feature = "p2p-libp2p")] if is_libp2p { if let Some((query, data)) = - super::libp2p::internal_request_into_libp2p(*request.clone(), *id) + super::libp2p::internal_request_into_libp2p(*request.clone(), id) { dispatcher.push(P2pNetworkRpcAction::OutgoingQuery { peer_id, @@ -101,7 +101,7 @@ impl P2pChannelsRpcState { }); } if let Some(on_init) = on_init { - dispatcher.push_callback(on_init.clone(), (peer_id, *id, *request.clone())); + dispatcher.push_callback(on_init, (peer_id, id, *request)); } return Ok(()); @@ -109,9 +109,9 @@ impl P2pChannelsRpcState { dispatcher.push(P2pChannelsRpcEffectfulAction::RequestSend { peer_id, - id: *id, - request: request.clone(), - on_init: on_init.clone(), + id, + request, + on_init, }); Ok(()) } @@ -120,7 +120,7 @@ impl P2pChannelsRpcState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_rpc_timeout { - dispatcher.push_callback(callback.clone(), (peer_id, *id)); + dispatcher.push_callback(callback.clone(), (peer_id, id)); } Ok(()) @@ -163,8 +163,7 @@ impl P2pChannelsRpcState { } if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_rpc_response_received { - dispatcher - .push_callback(callback.clone(), (peer_id, *rpc_id, response.clone())); + dispatcher.push_callback(callback.clone(), (peer_id, rpc_id, response)); } Ok(()) } @@ -180,8 +179,8 @@ impl P2pChannelsRpcState { .pending_requests .push_back(P2pRpcRemotePendingRequestState { time: meta.time(), - id: *id, - request: (**request).clone(), + id, + request: *request.clone(), is_pending: false, }); @@ -189,7 +188,7 @@ impl P2pChannelsRpcState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_rpc_request_received { - dispatcher.push_callback(callback.clone(), (peer_id, *id, request.clone())); + dispatcher.push_callback(callback.clone(), (peer_id, id, request)); } Ok(()) } @@ -201,7 +200,7 @@ impl P2pChannelsRpcState { ); return Ok(()); }; - if let Some(req) = remote.pending_requests.iter_mut().find(|r| r.id == *id) { + if let Some(req) = remote.pending_requests.iter_mut().find(|r| r.id == id) { req.is_pending = true; } Ok(()) @@ -215,7 +214,7 @@ impl P2pChannelsRpcState { return Ok(()); }; - if let Some(pos) = remote.pending_requests.iter().position(|r| r.id == *id) { + if let Some(pos) = remote.pending_requests.iter().position(|r| r.id == id) { remote.pending_requests.remove(pos); remote.last_responded = meta.time(); } @@ -226,7 +225,7 @@ impl P2pChannelsRpcState { if is_libp2p { if let Some(response) = response { if let Some((response, data)) = - super::libp2p::internal_response_into_libp2p(*response.clone(), *id) + super::libp2p::internal_response_into_libp2p(*response, id) { dispatcher.push(P2pNetworkRpcAction::OutgoingResponse { peer_id, @@ -241,8 +240,8 @@ impl P2pChannelsRpcState { dispatcher.push(P2pChannelsRpcEffectfulAction::ResponseSend { peer_id, - id: *id, - response: response.clone(), + id, + response, }); Ok(()) } diff --git a/p2p/src/channels/signaling/discovery/p2p_channels_signaling_discovery_reducer.rs b/p2p/src/channels/signaling/discovery/p2p_channels_signaling_discovery_reducer.rs index e043255b63..b934647c95 100644 --- a/p2p/src/channels/signaling/discovery/p2p_channels_signaling_discovery_reducer.rs +++ b/p2p/src/channels/signaling/discovery/p2p_channels_signaling_discovery_reducer.rs @@ -23,7 +23,7 @@ impl P2pChannelsSignalingDiscoveryState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsSignalingDiscoveryAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -405,7 +405,7 @@ impl P2pChannelsSignalingDiscoveryState { P2pConnectionResponse::Rejected(reason) => { dispatcher.push(P2pConnectionOutgoingAction::AnswerRecvError { peer_id: target_public_key.peer_id(), - error: P2pConnectionErrorResponse::Rejected(*reason), + error: P2pConnectionErrorResponse::Rejected(reason), }) } P2pConnectionResponse::SignalDecryptionFailed => { diff --git a/p2p/src/channels/signaling/exchange/p2p_channels_signaling_exchange_reducer.rs b/p2p/src/channels/signaling/exchange/p2p_channels_signaling_exchange_reducer.rs index 3c4d8dc7c4..737d6e2e78 100644 --- a/p2p/src/channels/signaling/exchange/p2p_channels_signaling_exchange_reducer.rs +++ b/p2p/src/channels/signaling/exchange/p2p_channels_signaling_exchange_reducer.rs @@ -24,7 +24,7 @@ impl P2pChannelsSignalingExchangeState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsSignalingExchangeAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, diff --git a/p2p/src/channels/snark/p2p_channels_snark_reducer.rs b/p2p/src/channels/snark/p2p_channels_snark_reducer.rs index c78f8933c2..8fa06efa63 100644 --- a/p2p/src/channels/snark/p2p_channels_snark_reducer.rs +++ b/p2p/src/channels/snark/p2p_channels_snark_reducer.rs @@ -11,7 +11,7 @@ use mina_p2p_messages::{gossip::GossipNetMessageV2, v2}; impl P2pChannelsSnarkState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsSnarkAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -32,7 +32,7 @@ impl P2pChannelsSnarkState { *state = Self::Init { time: meta.time() }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsSnarkEffectfulAction::Init { peer_id: *peer_id }); + dispatcher.push(P2pChannelsSnarkEffectfulAction::Init { peer_id }); Ok(()) } P2pChannelsSnarkAction::Pending { .. } => { @@ -61,14 +61,11 @@ impl P2pChannelsSnarkState { }; *local = SnarkPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsSnarkEffectfulAction::RequestSend { - peer_id: *peer_id, - limit: *limit, - }); + dispatcher.push(P2pChannelsSnarkEffectfulAction::RequestSend { peer_id, limit }); Ok(()) } P2pChannelsSnarkAction::PromiseReceived { promised_count, .. } => { @@ -89,7 +86,7 @@ impl P2pChannelsSnarkState { *local = SnarkPropagationState::Responding { time: meta.time(), requested_limit: *requested_limit, - promised_count: *promised_count, + promised_count, current_count: 0, }; Ok(()) @@ -129,7 +126,7 @@ impl P2pChannelsSnarkState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_snark_received { - dispatcher.push_callback(callback.clone(), (*peer_id, snark.clone())); + dispatcher.push_callback(callback.clone(), (peer_id, snark)); } Ok(()) @@ -145,7 +142,7 @@ impl P2pChannelsSnarkState { }; *remote = SnarkPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; Ok(()) } @@ -181,16 +178,13 @@ impl P2pChannelsSnarkState { }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsSnarkEffectfulAction::ResponseSend { - peer_id: *peer_id, - snarks: snarks.clone(), - }); + dispatcher.push(P2pChannelsSnarkEffectfulAction::ResponseSend { peer_id, snarks }); Ok(()) } #[cfg(feature = "p2p-libp2p")] P2pChannelsSnarkAction::Libp2pBroadcast { snark, nonce } => { let dispatcher = state_context.into_dispatcher(); - let message = Box::new((snark.statement(), (snark).into())); + let message = Box::new((snark.statement(), (&snark).into())); let message = v2::NetworkPoolSnarkPoolDiffVersionedStableV2::AddSolvedWork(message); let nonce = nonce.into(); let message = Box::new(GossipNetMessageV2::SnarkPoolDiff { message, nonce }); @@ -204,7 +198,7 @@ impl P2pChannelsSnarkState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_snark_libp2p_received { - dispatcher.push_callback(callback.clone(), (*peer_id, snark.clone())); + dispatcher.push_callback(callback.clone(), (peer_id, snark)); } Ok(()) diff --git a/p2p/src/channels/snark_job_commitment/p2p_channels_snark_job_commitment_reducer.rs b/p2p/src/channels/snark_job_commitment/p2p_channels_snark_job_commitment_reducer.rs index ab1617a134..14586ab34e 100644 --- a/p2p/src/channels/snark_job_commitment/p2p_channels_snark_job_commitment_reducer.rs +++ b/p2p/src/channels/snark_job_commitment/p2p_channels_snark_job_commitment_reducer.rs @@ -17,7 +17,7 @@ impl P2pChannelsSnarkJobCommitmentState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsSnarkJobCommitmentAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -73,14 +73,12 @@ impl P2pChannelsSnarkJobCommitmentState { }; *local = SnarkJobCommitmentPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsSnarkJobCommitmentAction::RequestSend { - peer_id, - limit: *limit, - }); + dispatcher + .push(P2pChannelsSnarkJobCommitmentAction::RequestSend { peer_id, limit }); Ok(()) } P2pChannelsSnarkJobCommitmentAction::PromiseReceived { promised_count, .. } => { @@ -105,7 +103,7 @@ impl P2pChannelsSnarkJobCommitmentState { *local = SnarkJobCommitmentPropagationState::Responding { time: meta.time(), requested_limit: *requested_limit, - promised_count: *promised_count, + promised_count, current_count: 0, }; Ok(()) @@ -151,7 +149,7 @@ impl P2pChannelsSnarkJobCommitmentState { .callbacks .on_p2p_channels_snark_job_commitment_received { - dispatcher.push_callback(callback.clone(), (peer_id, commitment.clone())); + dispatcher.push_callback(callback.clone(), (peer_id, commitment)); } Ok(()) } @@ -165,7 +163,7 @@ impl P2pChannelsSnarkJobCommitmentState { }; *remote = SnarkJobCommitmentPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; Ok(()) } @@ -201,7 +199,7 @@ impl P2pChannelsSnarkJobCommitmentState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pChannelsSnarkJobCommitmentEffectfulAction::ResponseSend { peer_id, - commitments: commitments.clone(), + commitments, }); Ok(()) } diff --git a/p2p/src/channels/streaming_rpc/p2p_channels_streaming_rpc_reducer.rs b/p2p/src/channels/streaming_rpc/p2p_channels_streaming_rpc_reducer.rs index 7b4d425ceb..eb394d8e59 100644 --- a/p2p/src/channels/streaming_rpc/p2p_channels_streaming_rpc_reducer.rs +++ b/p2p/src/channels/streaming_rpc/p2p_channels_streaming_rpc_reducer.rs @@ -13,7 +13,7 @@ use super::{ impl P2pChannelsStreamingRpcState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsStreamingRpcAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -66,16 +66,19 @@ impl P2pChannelsStreamingRpcState { .. } => { let Self::Ready { local, .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::RequestSend` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; *next_local_rpc_id += 1; *local = P2pStreamingRpcLocalState::Requested { time: meta.time(), - id: *id, + id, request: request.clone(), - progress: match &**request { + progress: match &*request { P2pStreamingRpcRequest::StagedLedgerParts(_) => { Into::into(StagedLedgerPartsReceiveProgress::BasePending { time: meta.time(), @@ -87,9 +90,9 @@ impl P2pChannelsStreamingRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pChannelsStreamingRpcEffectfulAction::RequestSend { peer_id, - id: *id, - request: request.clone(), - on_init: on_init.clone(), + id, + request, + on_init, }); Ok(()) } @@ -98,7 +101,7 @@ impl P2pChannelsStreamingRpcState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_channels_streaming_rpc_timeout { - dispatcher.push_callback(callback.clone(), (peer_id, *id)); + dispatcher.push_callback(callback.clone(), (peer_id, id)); } Ok(()) @@ -123,10 +126,7 @@ impl P2pChannelsStreamingRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push( - P2pChannelsStreamingRpcEffectfulAction::ResponseNextPartGet { - peer_id, - id: *id, - }, + P2pChannelsStreamingRpcEffectfulAction::ResponseNextPartGet { peer_id, id }, ); Ok(()) } @@ -136,11 +136,14 @@ impl P2pChannelsStreamingRpcState { .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponsePartReceived` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; if !progress.update(meta.time(), response) { - bug_condition!("progress response mismatch! {progress:?}\n{response:?}"); + bug_condition!("progress response mismatch! {progress:?}"); } let (dispatcher, state) = state_context.into_dispatcher_and_state(); @@ -152,13 +155,12 @@ impl P2pChannelsStreamingRpcState { if let Some(response) = peer.channels.streaming_rpc.local_done_response() { dispatcher.push(P2pChannelsStreamingRpcAction::ResponseReceived { peer_id, - id: *id, + id, response: Some(response), }); return Ok(()); } - dispatcher - .push(P2pChannelsStreamingRpcAction::ResponseNextPartGet { peer_id, id: *id }); + dispatcher.push(P2pChannelsStreamingRpcAction::ResponseNextPartGet { peer_id, id }); Ok(()) } P2pChannelsStreamingRpcAction::ResponseReceived { @@ -167,11 +169,17 @@ impl P2pChannelsStreamingRpcState { .. } => { let Self::Ready { local, .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponseReceived` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; let P2pStreamingRpcLocalState::Requested { id, request, .. } = local else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponseReceived` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; *local = P2pStreamingRpcLocalState::Responded { @@ -187,20 +195,23 @@ impl P2pChannelsStreamingRpcState { .callbacks .on_p2p_channels_streaming_rpc_response_received { - dispatcher.push_callback(callback.clone(), (peer_id, *rpc_id, response.clone())) + dispatcher.push_callback(callback.clone(), (peer_id, rpc_id, response)) } Ok(()) } P2pChannelsStreamingRpcAction::RequestReceived { id, request, .. } => { let Self::Ready { remote, .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::RequestReceived` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; *remote = P2pStreamingRpcRemoteState::Requested { time: meta.time(), - id: *id, - request: request.clone(), + id, + request, progress: StagedLedgerPartsSendProgress::LedgerGetIdle { time: meta.time() } .into(), }; @@ -236,10 +247,13 @@ impl P2pChannelsStreamingRpcState { .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponseSendInit` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; - match (&**request, response) { + match (&**request, &response) { (_, Some(P2pStreamingRpcResponseFull::StagedLedgerParts(data))) => { *progress = StagedLedgerPartsSendProgress::LedgerGetSuccess { time: meta.time(), @@ -256,8 +270,8 @@ impl P2pChannelsStreamingRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pChannelsStreamingRpcEffectfulAction::ResponseSendInit { peer_id, - id: *id, - response: response.clone(), + id, + response, }); Ok(()) } @@ -274,7 +288,7 @@ impl P2pChannelsStreamingRpcState { dispatcher.push(P2pChannelsStreamingRpcAction::ResponsePartSend { peer_id, - id: *id, + id, response, }); @@ -286,7 +300,10 @@ impl P2pChannelsStreamingRpcState { .. } = streaming_rpc_state else { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponsePartSend` with state {:?}", + streaming_rpc_state + ); return Ok(()); }; match progress { @@ -352,8 +369,8 @@ impl P2pChannelsStreamingRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pChannelsStreamingRpcEffectfulAction::ResponsePartSend { peer_id, - id: *id, - response: response.clone(), + id, + response, }); Ok(()) } @@ -365,18 +382,24 @@ impl P2pChannelsStreamingRpcState { (remote, request) } _ => { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponseSent` with state {:?}", + streaming_rpc_state + ); return Ok(()); } }, _ => { - bug_condition!("{:?} with state {:?}", action, streaming_rpc_state); + bug_condition!( + "`P2pChannelsStreamingRpcAction::ResponseSent` with state {:?}", + streaming_rpc_state + ); return Ok(()); } }; *remote = P2pStreamingRpcRemoteState::Responded { time: meta.time(), - id: *id, + id, request, }; diff --git a/p2p/src/channels/streaming_rpc/rpcs/mod.rs b/p2p/src/channels/streaming_rpc/rpcs/mod.rs index 76f4d84ebb..140127bc3d 100644 --- a/p2p/src/channels/streaming_rpc/rpcs/mod.rs +++ b/p2p/src/channels/streaming_rpc/rpcs/mod.rs @@ -144,7 +144,7 @@ impl P2pStreamingRpcReceiveProgress { } } - pub fn update(&mut self, time: redux::Timestamp, resp: &P2pStreamingRpcResponse) -> bool { + pub fn update(&mut self, time: redux::Timestamp, resp: P2pStreamingRpcResponse) -> bool { match (self, resp) { ( Self::StagedLedgerParts(progress), diff --git a/p2p/src/channels/streaming_rpc/rpcs/staged_ledger_parts.rs b/p2p/src/channels/streaming_rpc/rpcs/staged_ledger_parts.rs index 1d3a70b71a..ff9a17d26f 100644 --- a/p2p/src/channels/streaming_rpc/rpcs/staged_ledger_parts.rs +++ b/p2p/src/channels/streaming_rpc/rpcs/staged_ledger_parts.rs @@ -192,13 +192,10 @@ impl Default for StagedLedgerPartsSendProgress { } impl StagedLedgerPartsReceiveProgress { - pub fn update(&mut self, time: redux::Timestamp, resp: &StagedLedgerPartsResponse) -> bool { + pub fn update(&mut self, time: redux::Timestamp, resp: StagedLedgerPartsResponse) -> bool { match (std::mem::take(self), resp) { (Self::BasePending { .. }, StagedLedgerPartsResponse::Base(base)) => { - *self = Self::BaseSuccess { - time, - base: base.clone(), - }; + *self = Self::BaseSuccess { time, base }; true } ( @@ -208,7 +205,7 @@ impl StagedLedgerPartsReceiveProgress { *self = Self::ScanStateBaseSuccess { time, base, - scan_state_base: data.clone(), + scan_state_base: data, }; true } @@ -224,7 +221,7 @@ impl StagedLedgerPartsReceiveProgress { time, base, scan_state_base, - previous_incomplete_zkapp_updates: data.clone(), + previous_incomplete_zkapp_updates: data, }; true } @@ -238,7 +235,7 @@ impl StagedLedgerPartsReceiveProgress { }, StagedLedgerPartsResponse::ScanStateTree(tree), ) => { - trees.extend(std::iter::once(tree.clone())); + trees.extend(std::iter::once(tree)); *self = if trees.len() >= scan_state_base.trees.as_u32() as usize { // base, scan_state_base, previous_incomplete_zkapp_updates, trees diff --git a/p2p/src/channels/transaction/p2p_channels_transaction_reducer.rs b/p2p/src/channels/transaction/p2p_channels_transaction_reducer.rs index 5a85bcc568..c7f7a8c60a 100644 --- a/p2p/src/channels/transaction/p2p_channels_transaction_reducer.rs +++ b/p2p/src/channels/transaction/p2p_channels_transaction_reducer.rs @@ -12,7 +12,7 @@ use redux::ActionWithMeta; impl P2pChannelsTransactionState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pChannelsTransactionAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -33,7 +33,7 @@ impl P2pChannelsTransactionState { *state = Self::Init { time: meta.time() }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsTransactionEffectfulAction::Init { peer_id: *peer_id }); + dispatcher.push(P2pChannelsTransactionEffectfulAction::Init { peer_id }); Ok(()) } P2pChannelsTransactionAction::Pending { .. } => { @@ -62,14 +62,12 @@ impl P2pChannelsTransactionState { }; *local = TransactionPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pChannelsTransactionEffectfulAction::RequestSend { - peer_id: *peer_id, - limit: *limit, - }); + dispatcher + .push(P2pChannelsTransactionEffectfulAction::RequestSend { peer_id, limit }); Ok(()) } P2pChannelsTransactionAction::PromiseReceived { promised_count, .. } => { @@ -94,7 +92,7 @@ impl P2pChannelsTransactionState { *local = TransactionPropagationState::Responding { time: meta.time(), requested_limit: *requested_limit, - promised_count: *promised_count, + promised_count, current_count: 0, }; Ok(()) @@ -138,7 +136,7 @@ impl P2pChannelsTransactionState { }; *remote = TransactionPropagationState::Requested { time: meta.time(), - requested_limit: *limit, + requested_limit: limit, }; Ok(()) } @@ -175,8 +173,8 @@ impl P2pChannelsTransactionState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pChannelsTransactionEffectfulAction::ResponseSend { - peer_id: *peer_id, - transactions: transactions.clone(), + peer_id, + transactions, }); Ok(()) } @@ -188,7 +186,7 @@ impl P2pChannelsTransactionState { .callbacks .on_p2p_channels_transaction_libp2p_received { - dispatcher.push_callback(callback.clone(), transaction.clone()); + dispatcher.push_callback(callback.clone(), transaction); } Ok(()) @@ -199,7 +197,7 @@ impl P2pChannelsTransactionState { P2pChannelsTransactionAction::Libp2pBroadcast { transaction, nonce } => { let dispatcher = state_context.into_dispatcher(); let message = v2::NetworkPoolTransactionPoolDiffVersionedStableV2( - std::iter::once(*transaction.clone()).collect(), + std::iter::once(*transaction).collect(), ); let nonce = nonce.into(); let message = Box::new(GossipNetMessageV2::TransactionPoolDiff { message, nonce }); diff --git a/p2p/src/connection/incoming/mod.rs b/p2p/src/connection/incoming/mod.rs index 6290765252..e4f1b81fe6 100644 --- a/p2p/src/connection/incoming/mod.rs +++ b/p2p/src/connection/incoming/mod.rs @@ -19,7 +19,7 @@ pub struct P2pConnectionIncomingInitOpts { } // TODO(binier): maybe move to `crate::webrtc`? -#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)] +#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone, Copy)] pub enum IncomingSignalingMethod { /// Http rpc is used for sending offer and getting answer as a response. Http, diff --git a/p2p/src/connection/incoming/p2p_connection_incoming_reducer.rs b/p2p/src/connection/incoming/p2p_connection_incoming_reducer.rs index a3716bb4e6..06a99bbf59 100644 --- a/p2p/src/connection/incoming/p2p_connection_incoming_reducer.rs +++ b/p2p/src/connection/incoming/p2p_connection_incoming_reducer.rs @@ -26,7 +26,7 @@ impl P2pConnectionIncomingState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pConnectionIncomingAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -57,20 +57,20 @@ impl P2pConnectionIncomingState { }; Some(P2pConnectionOutgoingInitOpts::WebRTC { peer_id, signaling }) }), - status: P2pPeerStatus::Connecting(P2pConnectionState::incoming_init(opts)), + status: P2pPeerStatus::Connecting(P2pConnectionState::incoming_init(&opts)), identify: None, }); state.status = P2pPeerStatus::Connecting(P2pConnectionState::Incoming(Self::Init { time: meta.time(), - signaling: opts.signaling.clone(), + signaling: opts.signaling, offer: opts.offer.clone(), - rpc_id: *rpc_id, + rpc_id, })); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pConnectionIncomingEffectfulAction::Init { opts: opts.clone() }); + dispatcher.push(P2pConnectionIncomingEffectfulAction::Init { opts }); Ok(()) } P2pConnectionIncomingAction::AnswerSdpCreatePending { .. } => { @@ -86,7 +86,7 @@ impl P2pConnectionIncomingState { { *state = Self::AnswerSdpCreatePending { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), rpc_id: rpc_id.take(), }; @@ -101,15 +101,15 @@ impl P2pConnectionIncomingState { P2pConnectionIncomingAction::AnswerSdpCreateError { peer_id, error } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pConnectionIncomingAction::Error { - peer_id: *peer_id, + peer_id, error: P2pConnectionIncomingError::SdpCreateError(error.to_owned()), }); Ok(()) } P2pConnectionIncomingAction::AnswerSdpCreateSuccess { sdp, .. } => { - let state = p2p_state - .incoming_peer_connection_mut(&peer_id) - .ok_or_else(|| format!("Invalid state for: {:?}", action))?; + let state = p2p_state.incoming_peer_connection_mut(&peer_id).ok_or( + "Missing state for `P2pConnectionIncomingAction::AnswerSdpCreateSuccess`", + )?; if let Self::AnswerSdpCreatePending { signaling, offer, @@ -119,7 +119,7 @@ impl P2pConnectionIncomingState { { *state = Self::AnswerSdpCreateSuccess { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), sdp: sdp.clone(), rpc_id: rpc_id.take(), @@ -135,7 +135,7 @@ impl P2pConnectionIncomingState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; let answer = Box::new(crate::webrtc::Answer { - sdp: sdp.to_owned(), + sdp, identity_pub_key: p2p_state.config.identity_pub_key.clone(), target_peer_id: peer_id, }); @@ -144,8 +144,8 @@ impl P2pConnectionIncomingState { } P2pConnectionIncomingAction::AnswerReady { peer_id, answer } => { let state = p2p_state - .incoming_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state for: {:?}", action))?; + .incoming_peer_connection_mut(&peer_id) + .ok_or("Invalid state for: `P2pConnectionIncomingAction::AnswerReady`")?; let Self::AnswerSdpCreateSuccess { signaling, @@ -160,10 +160,10 @@ impl P2pConnectionIncomingState { ); return Ok(()); }; - let signaling = signaling.clone(); + let signaling = *signaling; *state = Self::AnswerReady { time: meta.time(), - signaling: signaling.clone(), + signaling, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -175,7 +175,7 @@ impl P2pConnectionIncomingState { match signaling { IncomingSignalingMethod::Http => { dispatcher.push(P2pConnectionIncomingEffectfulAction::AnswerSend { - peer_id: *peer_id, + peer_id, answer: answer.clone(), }); } @@ -187,17 +187,13 @@ impl P2pConnectionIncomingState { } } - if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(peer_id) { + if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(&peer_id) { if let Some(callback) = &p2p_state.callbacks.on_p2p_connection_incoming_answer_ready { dispatcher.push_callback( callback.clone(), - ( - rpc_id, - *peer_id, - P2pConnectionResponse::Accepted(answer.clone()), - ), + (rpc_id, peer_id, P2pConnectionResponse::Accepted(answer)), ); } } @@ -218,7 +214,7 @@ impl P2pConnectionIncomingState { { *state = Self::AnswerSendSuccess { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -249,7 +245,7 @@ impl P2pConnectionIncomingState { { *state = Self::FinalizePending { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -284,7 +280,7 @@ impl P2pConnectionIncomingState { { *state = Self::FinalizeSuccess { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -331,12 +327,13 @@ impl P2pConnectionIncomingState { P2pConnectionIncomingAction::Error { error, .. } => { let state = p2p_state .incoming_peer_connection_mut(&peer_id) - .ok_or_else(|| format!("Invalid state for: {:?}", action))?; + .ok_or("Missing state for `P2pConnectionIncomingAction::Error`")?; let rpc_id = state.rpc_id(); + let str_error = format!("{:?}", error); *state = Self::Error { time: meta.time(), - error: error.clone(), + error, rpc_id, }; @@ -345,8 +342,7 @@ impl P2pConnectionIncomingState { if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(&peer_id) { if let Some(callback) = &p2p_state.callbacks.on_p2p_connection_incoming_error { - dispatcher - .push_callback(callback.clone(), (rpc_id, format!("{:?}", error))); + dispatcher.push_callback(callback.clone(), (rpc_id, str_error)); } } @@ -367,7 +363,7 @@ impl P2pConnectionIncomingState { { *state = Self::Success { time: meta.time(), - signaling: signaling.clone(), + signaling: *signaling, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -409,7 +405,7 @@ impl P2pConnectionIncomingState { identify: None, }); - Self::reduce_finalize_libp2p_pending(state, *addr, time, my_id, peer_id); + Self::reduce_finalize_libp2p_pending(state, addr, time, my_id, peer_id); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; @@ -455,7 +451,7 @@ impl P2pConnectionIncomingState { my_id: PeerId, peer_id: PeerId, time: Timestamp, - addr: &SocketAddr, + addr: SocketAddr, ) where State: crate::P2pStateTrait, Action: crate::P2pActionTrait, @@ -492,7 +488,7 @@ impl P2pConnectionIncomingState { incoming, }| { *incoming - && sock_addr != addr + && sock_addr != &addr && close_duplicates.contains(sock_addr) }, ) @@ -514,7 +510,7 @@ impl P2pConnectionIncomingState { warn!(time; node_id = display(my_id), summary = "rejecting incoming connection as duplicate", peer_id = display(peer_id)); dispatcher.push(P2pNetworkSchedulerAction::Disconnect { addr: ConnectionAddr { - sock_addr: *addr, + sock_addr: addr, incoming: true, }, reason: P2pDisconnectionReason::Libp2pIncomingRejected( diff --git a/p2p/src/connection/outgoing/p2p_connection_outgoing_actions.rs b/p2p/src/connection/outgoing/p2p_connection_outgoing_actions.rs index 17214837bf..c758c7633e 100644 --- a/p2p/src/connection/outgoing/p2p_connection_outgoing_actions.rs +++ b/p2p/src/connection/outgoing/p2p_connection_outgoing_actions.rs @@ -8,9 +8,6 @@ use crate::{webrtc, P2pState, PeerId}; use super::{P2pConnectionOutgoingError, P2pConnectionOutgoingInitOpts}; -pub type P2pConnectionOutgoingActionWithMetaRef<'a> = - redux::ActionWithMeta<&'a P2pConnectionOutgoingAction>; - #[derive(Serialize, Deserialize, Debug, Clone, ActionEvent)] #[action_event(fields(display(opts), display(peer_id), display(error)))] pub enum P2pConnectionOutgoingAction { diff --git a/p2p/src/connection/outgoing/p2p_connection_outgoing_reducer.rs b/p2p/src/connection/outgoing/p2p_connection_outgoing_reducer.rs index 5768a9249c..2dc1723297 100644 --- a/p2p/src/connection/outgoing/p2p_connection_outgoing_reducer.rs +++ b/p2p/src/connection/outgoing/p2p_connection_outgoing_reducer.rs @@ -1,6 +1,7 @@ use std::net::SocketAddr; use openmina_core::{bug_condition, warn, Substate}; +use redux::ActionWithMeta; use crate::{ channels::signaling::discovery::P2pChannelsSignalingDiscoveryAction, @@ -15,21 +16,22 @@ use crate::{ use super::{ libp2p_opts::P2pConnectionOutgoingInitLibp2pOptsTryToSocketAddrError, - P2pConnectionOutgoingAction, P2pConnectionOutgoingActionWithMetaRef, - P2pConnectionOutgoingError, P2pConnectionOutgoingInitOpts, P2pConnectionOutgoingState, + P2pConnectionOutgoingAction, P2pConnectionOutgoingError, P2pConnectionOutgoingInitOpts, + P2pConnectionOutgoingState, }; impl P2pConnectionOutgoingState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: P2pConnectionOutgoingActionWithMetaRef<'_>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, Action: crate::P2pActionTrait, { let (action, meta) = action.split(); + let time = meta.time(); let p2p_state = state_context.get_substate_mut()?; match action { @@ -47,22 +49,22 @@ impl P2pConnectionOutgoingState { is_libp2p: opts.is_libp2p(), dial_opts: Some(opts.clone()).filter(|v| v.can_connect_directly()), status: P2pPeerStatus::Connecting(P2pConnectionState::outgoing_init( - opts, + &opts, )), identify: None, }); peer_state.status = P2pPeerStatus::Connecting(P2pConnectionState::Outgoing(Self::Init { - time: meta.time(), + time, opts: opts.clone(), - rpc_id: *rpc_id, + rpc_id, })); let dispatcher = state_context.into_dispatcher(); #[cfg(feature = "p2p-libp2p")] - if let P2pConnectionOutgoingInitOpts::LibP2P(libp2p_opts) = opts { + if let P2pConnectionOutgoingInitOpts::LibP2P(libp2p_opts) = &opts { match SocketAddr::try_from(libp2p_opts) { Ok(addr) => { dispatcher.push(P2pNetworkSchedulerAction::OutgoingConnect { addr }); @@ -82,29 +84,26 @@ impl P2pConnectionOutgoingState { return Ok(()); } - dispatcher.push(P2pConnectionOutgoingEffectfulAction::Init { - opts: opts.clone(), - rpc_id: *rpc_id, - }); + dispatcher.push(P2pConnectionOutgoingEffectfulAction::Init { opts, rpc_id }); Ok(()) } P2pConnectionOutgoingAction::Reconnect { opts, rpc_id } => { let peer_state = p2p_state .peers .get_mut(opts.peer_id()) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + .ok_or("Missing peer state for: `P2pConnectionOutgoingAction::Reconnect`")?; peer_state.status = P2pPeerStatus::Connecting(P2pConnectionState::Outgoing(Self::Init { - time: meta.time(), + time, opts: opts.clone(), - rpc_id: *rpc_id, + rpc_id, })); let dispatcher = state_context.into_dispatcher(); #[cfg(feature = "p2p-libp2p")] - if let P2pConnectionOutgoingInitOpts::LibP2P(libp2p_opts) = opts { + if let P2pConnectionOutgoingInitOpts::LibP2P(libp2p_opts) = &opts { match SocketAddr::try_from(libp2p_opts) { Ok(addr) => { dispatcher.push(P2pNetworkSchedulerAction::OutgoingConnect { addr }); @@ -124,20 +123,17 @@ impl P2pConnectionOutgoingState { return Ok(()); } - dispatcher.push(P2pConnectionOutgoingEffectfulAction::Init { - opts: opts.clone(), - rpc_id: *rpc_id, - }); + dispatcher.push(P2pConnectionOutgoingEffectfulAction::Init { opts, rpc_id }); Ok(()) } P2pConnectionOutgoingAction::OfferSdpCreatePending { peer_id, .. } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + .outgoing_peer_connection_mut(&peer_id) + .ok_or("Missing connection state for: `P2pConnectionOutgoingAction::OfferSdpCreatePending`")?; if let Self::Init { opts, rpc_id, .. } = state { *state = Self::OfferSdpCreatePending { - time: meta.time(), + time, opts: opts.clone(), rpc_id: rpc_id.take(), }; @@ -150,19 +146,19 @@ impl P2pConnectionOutgoingState { P2pConnectionOutgoingAction::OfferSdpCreateError { error, peer_id, .. } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pConnectionOutgoingAction::Error { - peer_id: *peer_id, + peer_id, error: P2pConnectionOutgoingError::SdpCreateError(error.to_owned()), }); Ok(()) } P2pConnectionOutgoingAction::OfferSdpCreateSuccess { sdp, peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + .outgoing_peer_connection_mut(&peer_id) + .ok_or("Missing peer connection for `P2pConnectionOutgoingAction::OfferSdpCreateSuccess`")?; if let Self::OfferSdpCreatePending { opts, rpc_id, .. } = state { *state = Self::OfferSdpCreateSuccess { - time: meta.time(), + time, opts: opts.clone(), sdp: sdp.clone(), rpc_id: rpc_id.take(), @@ -173,24 +169,22 @@ impl P2pConnectionOutgoingState { } let offer = Box::new(crate::webrtc::Offer { - sdp: sdp.to_owned(), + sdp, identity_pub_key: p2p_state.config.identity_pub_key.clone(), - target_peer_id: *peer_id, + target_peer_id: peer_id, // TODO(vlad9486): put real address host: Host::Ipv4([127, 0, 0, 1].into()), listen_port: p2p_state.config.listen_port, }); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pConnectionOutgoingAction::OfferReady { - peer_id: *peer_id, - offer, - }); + dispatcher.push(P2pConnectionOutgoingAction::OfferReady { peer_id, offer }); Ok(()) } P2pConnectionOutgoingAction::OfferReady { offer, peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + .outgoing_peer_connection_mut(&peer_id) + .ok_or("Invalid state for `P2pConnectionOutgoingAction::OfferReady`")?; + let Self::OfferSdpCreateSuccess { opts, rpc_id, .. } = state else { bug_condition!( "Invalid state for `P2pConnectionOutgoingAction::OfferReady`: {:?}", @@ -215,7 +209,7 @@ impl P2pConnectionOutgoingState { }); } else { dispatcher.push(P2pConnectionOutgoingEffectfulAction::OfferSend { - peer_id: *peer_id, + peer_id, offer: offer.clone(), }); } @@ -223,7 +217,7 @@ impl P2pConnectionOutgoingState { } P2pConnectionOutgoingAction::OfferSendSuccess { peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) + .outgoing_peer_connection_mut(&peer_id) .ok_or_else(|| format!("Invalid state: {:?}", action))?; if let Self::OfferReady { opts, @@ -233,7 +227,7 @@ impl P2pConnectionOutgoingState { } = state { *state = Self::OfferSendSuccess { - time: meta.time(), + time, opts: opts.clone(), offer: offer.clone(), rpc_id: rpc_id.take(), @@ -247,13 +241,12 @@ impl P2pConnectionOutgoingState { } let dispatcher = state_context.into_dispatcher(); - dispatcher - .push(P2pConnectionOutgoingAction::AnswerRecvPending { peer_id: *peer_id }); + dispatcher.push(P2pConnectionOutgoingAction::AnswerRecvPending { peer_id }); Ok(()) } P2pConnectionOutgoingAction::AnswerRecvPending { peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) + .outgoing_peer_connection_mut(&peer_id) .ok_or_else(|| format!("Invalid state: {:?}", action))?; if let Self::OfferSendSuccess { opts, @@ -263,7 +256,7 @@ impl P2pConnectionOutgoingState { } = state { *state = Self::AnswerRecvPending { - time: meta.time(), + time, opts: opts.clone(), offer: offer.clone(), rpc_id: rpc_id.take(), @@ -280,10 +273,10 @@ impl P2pConnectionOutgoingState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pConnectionOutgoingAction::Error { - peer_id: *peer_id, + peer_id, error: match error { P2pConnectionErrorResponse::Rejected(reason) => { - P2pConnectionOutgoingError::Rejected(*reason) + P2pConnectionOutgoingError::Rejected(reason) } P2pConnectionErrorResponse::SignalDecryptionFailed => { P2pConnectionOutgoingError::RemoteSignalDecryptionFailed @@ -296,9 +289,9 @@ impl P2pConnectionOutgoingState { Ok(()) } P2pConnectionOutgoingAction::AnswerRecvSuccess { answer, peer_id } => { - let state = p2p_state - .outgoing_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + let state = p2p_state.outgoing_peer_connection_mut(&peer_id).ok_or( + "Missing peer connection for `P2pConnectionOutgoingAction::AnswerRecvSuccess`", + )?; if let Self::AnswerRecvPending { opts, @@ -308,7 +301,7 @@ impl P2pConnectionOutgoingState { } = state { *state = Self::AnswerRecvSuccess { - time: meta.time(), + time, opts: opts.clone(), offer: offer.clone(), answer: answer.clone(), @@ -320,23 +313,20 @@ impl P2pConnectionOutgoingState { state ); } - state_context.into_dispatcher().push( - P2pConnectionOutgoingEffectfulAction::AnswerSet { - peer_id: *peer_id, - answer: answer.clone(), - }, - ); + state_context + .into_dispatcher() + .push(P2pConnectionOutgoingEffectfulAction::AnswerSet { peer_id, answer }); Ok(()) } P2pConnectionOutgoingAction::FinalizePending { peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) + .outgoing_peer_connection_mut(&peer_id) .ok_or_else(|| format!("Invalid state: {:?}", action))?; match state { Self::Init { opts, rpc_id, .. } => { *state = Self::FinalizePending { - time: meta.time(), + time, opts: opts.clone(), offer: None, answer: None, @@ -352,7 +342,7 @@ impl P2pConnectionOutgoingState { .. } => { *state = Self::FinalizePending { - time: meta.time(), + time, opts: opts.clone(), offer: Some(offer.clone()), answer: Some(answer.clone()), @@ -372,14 +362,14 @@ impl P2pConnectionOutgoingState { P2pConnectionOutgoingAction::FinalizeError { error, peer_id } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pConnectionOutgoingAction::Error { - peer_id: *peer_id, + peer_id, error: P2pConnectionOutgoingError::FinalizeError(error.to_owned()), }); Ok(()) } P2pConnectionOutgoingAction::FinalizeSuccess { peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) + .outgoing_peer_connection_mut(&peer_id) .ok_or_else(|| format!("Invalid state: {:?}", action))?; if let Self::FinalizePending { @@ -391,7 +381,7 @@ impl P2pConnectionOutgoingState { } = state { *state = Self::FinalizeSuccess { - time: meta.time(), + time, opts: opts.clone(), offer: offer.clone(), answer: answer.clone(), @@ -406,25 +396,25 @@ impl P2pConnectionOutgoingState { } let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pConnectionOutgoingAction::Success { peer_id: *peer_id }); + dispatcher.push(P2pConnectionOutgoingAction::Success { peer_id }); Ok(()) } P2pConnectionOutgoingAction::Timeout { peer_id } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pConnectionOutgoingAction::Error { - peer_id: *peer_id, + peer_id, error: P2pConnectionOutgoingError::Timeout, }); Ok(()) } P2pConnectionOutgoingAction::Error { error, peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) - .ok_or_else(|| format!("Invalid state: {:?}", action))?; + .outgoing_peer_connection_mut(&peer_id) + .ok_or("Missing peer connection for `P2pConnectionOutgoingAction::Error`")?; let rpc_id = state.rpc_id(); *state = Self::Error { - time: meta.time(), + time, error: error.clone(), rpc_id, }; @@ -438,26 +428,26 @@ impl P2pConnectionOutgoingState { .network .scheduler .discovery_state() - .and_then(|discovery_state| discovery_state.request(peer_id)) + .and_then(|discovery_state| discovery_state.request(&peer_id)) .is_some() { dispatcher.push(P2pNetworkKadRequestAction::Error { - peer_id: *peer_id, + peer_id, error: error.to_string(), }); } } - if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(peer_id) { + if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(&peer_id) { if let Some(callback) = &p2p_state.callbacks.on_p2p_connection_outgoing_error { - dispatcher.push_callback(callback.clone(), (rpc_id, error.clone())); + dispatcher.push_callback(callback.clone(), (rpc_id, error)); } } Ok(()) } P2pConnectionOutgoingAction::Success { peer_id } => { let state = p2p_state - .outgoing_peer_connection_mut(peer_id) + .outgoing_peer_connection_mut(&peer_id) .ok_or_else(|| format!("Invalid state: {:?}", action))?; if let Self::FinalizeSuccess { @@ -468,7 +458,7 @@ impl P2pConnectionOutgoingState { } = state { *state = Self::Success { - time: meta.time(), + time, offer: offer.clone(), answer: answer.clone(), rpc_id: rpc_id.take(), @@ -484,11 +474,11 @@ impl P2pConnectionOutgoingState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; dispatcher.push(P2pPeerAction::Ready { - peer_id: *peer_id, + peer_id, incoming: false, }); - if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(peer_id) { + if let Some(rpc_id) = p2p_state.peer_connection_rpc_id(&peer_id) { if let Some(callback) = &p2p_state.callbacks.on_p2p_connection_outgoing_success { dispatcher.push_callback(callback.clone(), rpc_id); diff --git a/p2p/src/connection/p2p_connection_reducer.rs b/p2p/src/connection/p2p_connection_reducer.rs index cdee0e18b3..b4efdfafc3 100644 --- a/p2p/src/connection/p2p_connection_reducer.rs +++ b/p2p/src/connection/p2p_connection_reducer.rs @@ -10,7 +10,7 @@ use crate::P2pState; impl P2pConnectionState { pub fn reducer( state_context: Substate, - action: ActionWithMeta<&P2pConnectionAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, diff --git a/p2p/src/connection/p2p_connection_state.rs b/p2p/src/connection/p2p_connection_state.rs index 2585100b13..6c956ec073 100644 --- a/p2p/src/connection/p2p_connection_state.rs +++ b/p2p/src/connection/p2p_connection_state.rs @@ -26,7 +26,7 @@ impl P2pConnectionState { pub fn incoming_init(opts: &P2pConnectionIncomingInitOpts) -> Self { Self::Incoming(P2pConnectionIncomingState::Init { time: Timestamp::ZERO, - signaling: opts.signaling.clone(), + signaling: opts.signaling, offer: opts.offer.clone(), rpc_id: None, }) diff --git a/p2p/src/disconnection/p2p_disconnection_reducer.rs b/p2p/src/disconnection/p2p_disconnection_reducer.rs index 673327019b..9b4e55860f 100644 --- a/p2p/src/disconnection/p2p_disconnection_reducer.rs +++ b/p2p/src/disconnection/p2p_disconnection_reducer.rs @@ -11,7 +11,7 @@ use super::{P2pDisconnectedState, P2pDisconnectionAction}; impl P2pDisconnectedState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pDisconnectionAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -23,37 +23,34 @@ impl P2pDisconnectedState { match action { P2pDisconnectionAction::Init { peer_id, reason } => { #[cfg(feature = "p2p-libp2p")] - if p2p_state.is_libp2p_peer(peer_id) { + if p2p_state.is_libp2p_peer(&peer_id) { if let Some((&addr, _)) = p2p_state .network .scheduler .connections .iter() - .find(|(_, conn_state)| conn_state.peer_id() == Some(peer_id)) + .find(|(_, conn_state)| conn_state.peer_id() == Some(&peer_id)) { - let Some(peer) = p2p_state.peers.get_mut(peer_id) else { + let Some(peer) = p2p_state.peers.get_mut(&peer_id) else { bug_condition!("Invalid state for: `P2pDisconnectionAction::Finish`"); return Ok(()); }; peer.status = P2pPeerStatus::Disconnecting { time: meta.time() }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkSchedulerAction::Disconnect { - addr, - reason: reason.clone(), - }); - dispatcher.push(P2pDisconnectionAction::Finish { peer_id: *peer_id }); + dispatcher.push(P2pNetworkSchedulerAction::Disconnect { addr, reason }); + dispatcher.push(P2pDisconnectionAction::Finish { peer_id }); } return Ok(()); } let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pDisconnectionEffectfulAction::Init { peer_id: *peer_id }); + dispatcher.push(P2pDisconnectionEffectfulAction::Init { peer_id }); Ok(()) } #[cfg(not(feature = "p2p-libp2p"))] P2pDisconnectionAction::Finish { peer_id } => { - let Some(peer) = p2p_state.peers.get_mut(peer_id) else { + let Some(peer) = p2p_state.peers.get_mut(&peer_id) else { bug_condition!("Invalid state for: `P2pDisconnectionAction::Finish`"); return Ok(()); }; @@ -61,10 +58,10 @@ impl P2pDisconnectedState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; - dispatcher.push(P2pPeerAction::Remove { peer_id: *peer_id }); + dispatcher.push(P2pPeerAction::Remove { peer_id }); if let Some(callback) = &p2p_state.callbacks.on_p2p_disconnection_finish { - dispatcher.push_callback(callback.clone(), *peer_id); + dispatcher.push_callback(callback.clone(), peer_id); } Ok(()) } @@ -76,13 +73,13 @@ impl P2pDisconnectedState { .connections .iter() .any(|(_addr, conn_state)| { - conn_state.peer_id() == Some(peer_id) && conn_state.closed.is_none() + conn_state.peer_id() == Some(&peer_id) && conn_state.closed.is_none() }) { return Ok(()); } - let Some(peer) = p2p_state.peers.get_mut(peer_id) else { + let Some(peer) = p2p_state.peers.get_mut(&peer_id) else { bug_condition!("Invalid state for: `P2pDisconnectionAction::Finish`"); return Ok(()); }; @@ -90,10 +87,10 @@ impl P2pDisconnectedState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; - dispatcher.push(P2pPeerAction::Remove { peer_id: *peer_id }); + dispatcher.push(P2pPeerAction::Remove { peer_id }); if let Some(callback) = &p2p_state.callbacks.on_p2p_disconnection_finish { - dispatcher.push_callback(callback.clone(), *peer_id); + dispatcher.push_callback(callback.clone(), peer_id); } Ok(()) diff --git a/p2p/src/identify/p2p_identify_reducer.rs b/p2p/src/identify/p2p_identify_reducer.rs index 2adc42e26a..d0a5c1f0d4 100644 --- a/p2p/src/identify/p2p_identify_reducer.rs +++ b/p2p/src/identify/p2p_identify_reducer.rs @@ -14,7 +14,7 @@ impl P2pState { #[cfg(feature = "p2p-libp2p")] pub fn identify_reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pIdentifyAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -30,7 +30,7 @@ impl P2pState { let scheduler = &p2p_state.network.scheduler; let stream_id = scheduler .connections - .get(addr) + .get(&addr) .ok_or_else(|| format!("connection with {addr} not found")) .and_then(|conn| { conn.mux @@ -45,7 +45,7 @@ impl P2pState { })?; dispatcher.push(P2pNetworkYamuxAction::OpenStream { - addr: *addr, + addr, stream_id, stream_kind: StreamKind::Identify(IdentifyAlgorithm::Identify1_0_0), }); @@ -57,8 +57,9 @@ impl P2pState { info, addr, } => { - if let Some(peer) = p2p_state.peers.get_mut(peer_id) { - peer.identify = Some(*info.clone()); + let info = *info; + if let Some(peer) = p2p_state.peers.get_mut(&peer_id) { + peer.identify = Some(info.clone()); } else { bug_condition!( "Peer state not found for `P2pIdentifyAction::UpdatePeerInformation`" @@ -67,11 +68,10 @@ impl P2pState { } let (dispatcher, state) = state_context.into_dispatcher_and_state(); - let peer_id = *peer_id; dispatcher.push(P2pNetworkKademliaAction::UpdateRoutingTable { peer_id, - addrs: info.listen_addrs.clone(), + addrs: info.listen_addrs, }); let stream_id = YamuxStreamKind::Rpc.stream_id(addr.incoming); @@ -91,7 +91,7 @@ impl P2pState { } dispatcher.push(P2pNetworkYamuxAction::OpenStream { - addr: *addr, + addr, stream_id, stream_kind, }); @@ -99,7 +99,7 @@ impl P2pState { let stream_kind = StreamKind::Broadcast(BroadcastAlgorithm::Meshsub1_1_0); if info.protocols.contains(&stream_kind) { dispatcher.push(P2pNetworkYamuxAction::OpenStream { - addr: *addr, + addr, stream_id: stream_id + 2, stream_kind, }); @@ -110,10 +110,7 @@ impl P2pState { if kad_state.map_or(false, |state| state.request(&peer_id).is_some()) && info.protocols.contains(&protocol) { - dispatcher.push(P2pNetworkKadRequestAction::MuxReady { - peer_id, - addr: *addr, - }); + dispatcher.push(P2pNetworkKadRequestAction::MuxReady { peer_id, addr }); } Ok(()) diff --git a/p2p/src/network/identify/p2p_network_identify_reducer.rs b/p2p/src/network/identify/p2p_network_identify_reducer.rs index 7cc2f68238..76fc2d9157 100644 --- a/p2p/src/network/identify/p2p_network_identify_reducer.rs +++ b/p2p/src/network/identify/p2p_network_identify_reducer.rs @@ -6,7 +6,7 @@ use redux::ActionWithMeta; impl super::P2pNetworkIdentifyState { pub fn reducer( state_context: Substate, - action: ActionWithMeta<&P2pNetworkIdentifyAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where diff --git a/p2p/src/network/identify/stream/p2p_network_identify_stream_reducer.rs b/p2p/src/network/identify/stream/p2p_network_identify_stream_reducer.rs index 49674d6c88..dd6c04dc1a 100644 --- a/p2p/src/network/identify/stream/p2p_network_identify_stream_reducer.rs +++ b/p2p/src/network/identify/stream/p2p_network_identify_stream_reducer.rs @@ -19,7 +19,7 @@ use redux::{ActionWithMeta, Dispatcher}; impl P2pNetworkIdentifyStreamState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkIdentifyStreamAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where @@ -28,7 +28,7 @@ impl P2pNetworkIdentifyStreamState { { let (action, meta) = action.split(); let substate = state_context.get_substate_mut()?; - let stream_state = match action { + let stream_state = match &action { P2pNetworkIdentifyStreamAction::New { peer_id, stream_id, .. } => substate @@ -46,7 +46,7 @@ impl P2pNetworkIdentifyStreamState { } a => substate .find_identify_stream_state_mut(a.peer_id(), a.stream_id()) - .ok_or_else(|| format!("Identify stream not found for action {action:?}"))?, + .ok_or_else(|| format!("Identify stream not found for action {a:?}"))?, }; match &stream_state { @@ -63,7 +63,7 @@ impl P2pNetworkIdentifyStreamState { return Ok(()); }; - let kind = P2pNetworkIdentifyStreamKind::from(*incoming); + let kind = P2pNetworkIdentifyStreamKind::from(incoming); *stream_state = match kind { // For incoming streams we prepare to send the Identify message @@ -80,9 +80,9 @@ impl P2pNetworkIdentifyStreamState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkIdentifyStreamEffectfulAction::SendIdentify { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); } @@ -129,14 +129,14 @@ impl P2pNetworkIdentifyStreamState { stream_state { dispatcher.push(P2pIdentifyAction::UpdatePeerInformation { - peer_id: *peer_id, + peer_id, info: data, - addr: *addr, + addr, }); dispatcher.push(P2pNetworkIdentifyStreamAction::Close { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); } else { let P2pNetworkIdentifyStreamState::Error(error) = stream_state else { @@ -146,7 +146,7 @@ impl P2pNetworkIdentifyStreamState { warn!(meta.time(); summary = "error handling Identify action", error = display(&error)); dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::IdentifyStreamError( P2pNetworkIdentifyStreamError::from(error), ), @@ -166,7 +166,7 @@ impl P2pNetworkIdentifyStreamState { stream_id, } => { let dispatcher = state_context.into_dispatcher(); - Self::disconnect(dispatcher, *addr, *peer_id, *stream_id) + Self::disconnect(dispatcher, addr, peer_id, stream_id) } _ => { // State and connection cleanup should be handled by timeout @@ -182,7 +182,7 @@ impl P2pNetworkIdentifyStreamState { stream_id, } => { let mut data = data.clone(); - data.extend_from_slice(&new_data.0); + data.extend_from_slice(&new_data); if *len > data.len() { *stream_state = @@ -197,14 +197,14 @@ impl P2pNetworkIdentifyStreamState { let data = data.clone(); let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pIdentifyAction::UpdatePeerInformation { - peer_id: *peer_id, + peer_id, info: data, - addr: *addr, + addr, }); dispatcher.push(P2pNetworkIdentifyStreamAction::Close { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); } else { let P2pNetworkIdentifyStreamState::Error(error) = stream_state else { @@ -217,7 +217,7 @@ impl P2pNetworkIdentifyStreamState { warn!(meta.time(); summary = "error handling Identify action", error = display(&error)); dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::IdentifyStreamError( P2pNetworkIdentifyStreamError::from(error), ), @@ -238,7 +238,7 @@ impl P2pNetworkIdentifyStreamState { stream_id, } => { let dispatcher = state_context.into_dispatcher(); - Self::disconnect(dispatcher, *addr, *peer_id, *stream_id) + Self::disconnect(dispatcher, addr, peer_id, stream_id) } _ => { // State and connection cleanup should be handled by timeout @@ -258,9 +258,9 @@ impl P2pNetworkIdentifyStreamState { stream_id, } => { let dispatcher = state_context.into_dispatcher(); - Self::disconnect(dispatcher, *addr, *peer_id, *stream_id) + Self::disconnect(dispatcher, addr, peer_id, stream_id) } - _ => { + action => { // State and connection cleanup should be handled by timeout bug_condition!("Received action {:?} in SendIdentify state", action); Ok(()) @@ -278,7 +278,7 @@ impl P2pNetworkIdentifyStreamState { stream_id, } => { let dispatcher = state_context.into_dispatcher(); - Self::disconnect(dispatcher, *addr, *peer_id, *stream_id) + Self::disconnect(dispatcher, addr, peer_id, stream_id) } _ => Ok(()), }, @@ -300,7 +300,7 @@ impl P2pNetworkIdentifyStreamState { } }; - let data = match P2pNetworkIdentify::try_from(message.clone()) { + let data = match P2pNetworkIdentify::try_from(message) { Ok(v) => v, Err(e) => { *self = P2pNetworkIdentifyStreamState::Error(e.into()); diff --git a/p2p/src/network/kad/bootstrap/p2p_network_kad_bootstrap_reducer.rs b/p2p/src/network/kad/bootstrap/p2p_network_kad_bootstrap_reducer.rs index 789fbf778d..3b0e592297 100644 --- a/p2p/src/network/kad/bootstrap/p2p_network_kad_bootstrap_reducer.rs +++ b/p2p/src/network/kad/bootstrap/p2p_network_kad_bootstrap_reducer.rs @@ -18,7 +18,7 @@ use super::{P2pNetworkKadBootstrapAction, P2pNetworkKadBootstrapState}; impl P2pNetworkKadBootstrapState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKadBootstrapAction>, + action: ActionWithMeta, filter_addrs: bool, ) -> Result<(), String> where @@ -63,7 +63,7 @@ impl P2pNetworkKadBootstrapState { let state: &mut Self = state_context.get_substate_mut()?.substate_mut()?; state.requests_number -= 1; if let Some(request) = request { - state.peer_id_req_vec.push((*peer_id, request.clone())); + state.peer_id_req_vec.push((peer_id, request)); } if state.peer_id_req_vec.len() == 3 || state.requests_number == 0 { let dispatcher = state_context.into_dispatcher(); @@ -121,12 +121,12 @@ impl P2pNetworkKadBootstrapState { } => { let state: &mut P2pNetworkKadBootstrapState = state_context.get_substate_mut()?.substate_mut()?; - let Some(req) = state.requests.remove(peer_id) else { + let Some(req) = state.requests.remove(&peer_id) else { bug_condition!("cannot find request for peer {peer_id}"); return Ok(()); }; state.successful_requests += 1; - let address = P2pConnectionOutgoingInitOpts::LibP2P((*peer_id, req.addr).into()); + let address = P2pConnectionOutgoingInitOpts::LibP2P((peer_id, req.addr).into()); if let Some(request_stats) = state.stats.requests.iter_mut().rev().find(|req_stat| { @@ -143,11 +143,11 @@ impl P2pNetworkKadBootstrapState { { *request_stats = P2pNetworkKadBootstrapRequestStat::Successful( P2pNetworkKadBootstrapSuccessfulRequest { - peer_id: *peer_id, + peer_id, address, start: req.time, finish: meta.time(), - closest_peers: closest_peers.clone(), + closest_peers, }, ); } else { @@ -165,12 +165,12 @@ impl P2pNetworkKadBootstrapState { let bootstrap_state: &mut P2pNetworkKadBootstrapState = state_context.get_substate_mut()?.substate_mut()?; - let Some(req) = bootstrap_state.requests.remove(peer_id) else { + let Some(req) = bootstrap_state.requests.remove(&peer_id) else { bug_condition!("cannot find request for peer {peer_id}"); return Ok(()); }; - let address = P2pConnectionOutgoingInitOpts::LibP2P((*peer_id, req.addr).into()); + let address = P2pConnectionOutgoingInitOpts::LibP2P((peer_id, req.addr).into()); if let Some(request_stats) = bootstrap_state .stats @@ -191,11 +191,11 @@ impl P2pNetworkKadBootstrapState { { *request_stats = P2pNetworkKadBootstrapRequestStat::Failed( P2pNetworkKadBootstrapFailedRequest { - peer_id: *peer_id, + peer_id, address, start: req.time, finish: meta.time(), - error: error.clone(), + error, }, ); } else { diff --git a/p2p/src/network/kad/p2p_network_kad_internals.rs b/p2p/src/network/kad/p2p_network_kad_internals.rs index e7e4c011c6..3246db4126 100644 --- a/p2p/src/network/kad/p2p_network_kad_internals.rs +++ b/p2p/src/network/kad/p2p_network_kad_internals.rs @@ -63,7 +63,7 @@ mod u256_serde { } /// Kademlia key, sha256 of the node's peer id. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] pub struct P2pNetworkKadKey(#[serde(with = "u256_serde")] U256); #[derive(Clone, Debug, Serialize, PartialEq, Deserialize, thiserror::Error)] @@ -244,7 +244,7 @@ pub struct P2pNetworkKadRoutingTableInsertError; impl P2pNetworkKadRoutingTable { pub fn new(this_entry: P2pNetworkKadEntry) -> Self { - let this_key = this_entry.key.clone(); + let this_key = this_entry.key; let global_bucket = P2pNetworkKadBucket(vec![this_entry]); let buckets = vec![global_bucket]; P2pNetworkKadRoutingTable { this_key, buckets } @@ -269,7 +269,7 @@ impl P2pNetworkKadRoutingTable { return Err(P2pNetworkKadRoutingTableInsertError); } // distance to this node - let dist = &self.this_key - &entry.key; + let dist = self.this_key - entry.key; // index of the closest k-bucket that can contain this node. let index = dist.to_index(); @@ -291,7 +291,7 @@ impl P2pNetworkKadRoutingTable { let Some((bucket1, bucket2)) = self .buckets .pop() - .map(|b| b.split(|e| (&self.this_key - &e.key) >= split_dist)) + .map(|b| b.split(|e| (self.this_key - e.key) >= split_dist)) else { bug_condition!("should be unreachable"); return Err(P2pNetworkKadRoutingTableInsertError); @@ -304,7 +304,7 @@ impl P2pNetworkKadRoutingTable { /// Looks up a Kademlia entry with the specified `key`. pub fn look_up(&self, key: &P2pNetworkKadKey) -> Option<&P2pNetworkKadEntry> { // distance to this node - let dist = &self.this_key - key; + let dist = self.this_key - key; // index of the closest k-bucket that can contain this node. let index = dist.to_index().min(self.buckets.len() - 1); @@ -338,18 +338,18 @@ impl P2pNetworkKadRoutingTable { let dist = P2pNetworkKadDist::from(i); for entry in &bucket.0 { assert!( - &self.this_key - &entry.key <= dist, + self.this_key - entry.key <= dist, "for {:#?} at {i} distance {:#?} is too big, expecting at most {dist:#?}\nrouting table:\n{self:+#?}", entry.key, - &self.this_key - &entry.key, + self.this_key - entry.key, ); if let Some(prev_dist) = &prev_dist { assert!( - &(&self.this_key - &entry.key) > prev_dist, + &(self.this_key - entry.key) > prev_dist, "distance too small: {:#?}\nrouting table:\n{:+#?}\ndist: {:#?}\nprev_dist: {:#?}", entry.key, self, - &self.this_key - &entry.key, + self.this_key - entry.key, prev_dist, ); } @@ -397,7 +397,7 @@ impl P2pNetworkKadEntry { } pub fn dist(&self, other: &P2pNetworkKadEntry) -> P2pNetworkKadDist { - &self.key - &other.key + self.key - other.key } pub fn addresses(&self) -> &Vec { @@ -462,7 +462,7 @@ pub struct ClosestPeers<'a, const K: usize> { impl<'a, const K: usize> ClosestPeers<'a, K> { fn new(table: &'a P2pNetworkKadRoutingTable, key: &'a P2pNetworkKadKey) -> Self { - let dist = &table.this_key - key; + let dist = table.this_key - key; let mut index_iter = Self::bucket_index_iterator(dist, table.buckets.len()); let bucket_index = index_iter .next() @@ -500,7 +500,7 @@ impl<'a, const K: usize> ClosestPeers<'a, K> { .into_iter() .filter(|e| &e.key != key && &e.key != this_key), ); - vec.sort_by_cached_key(|entry| key - &entry.key); + vec.sort_by_cached_key(|entry| key - entry.key); vec.into_iter() } } @@ -637,7 +637,7 @@ mod tests { const THIS_KEY: P2pNetworkKadKey = P2pNetworkKadKey(U256::ZERO); fn this_key() -> P2pNetworkKadKey { - THIS_KEY.clone() + THIS_KEY } fn key_pow_2(pow: usize) -> P2pNetworkKadKey { diff --git a/p2p/src/network/kad/p2p_network_kad_reducer.rs b/p2p/src/network/kad/p2p_network_kad_reducer.rs index 06e8a1a3c5..50f0327472 100644 --- a/p2p/src/network/kad/p2p_network_kad_reducer.rs +++ b/p2p/src/network/kad/p2p_network_kad_reducer.rs @@ -14,7 +14,7 @@ use super::{ impl super::P2pNetworkKadState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKadAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where @@ -47,7 +47,7 @@ impl super::P2pNetworkKadState { pub fn system_reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKademliaAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: SubstateAccess, @@ -66,7 +66,7 @@ impl super::P2pNetworkKadState { key, }, ) => { - let kad_key = P2pNetworkKadKey::from(key.clone()); + let kad_key = P2pNetworkKadKey::from(key); let closer_peers: Vec<_> = state.routing_table.find_node(&kad_key).cloned().collect(); debug!(meta.time(); "found {} peers", closer_peers.len()); @@ -74,9 +74,9 @@ impl super::P2pNetworkKadState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkKademliaStreamAction::SendResponse { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, data: message, }); Ok(()) @@ -91,7 +91,7 @@ impl super::P2pNetworkKadState { }, ) => { let mut latest_request_peers = Vec::new(); - for entry in closest_peers { + for entry in &closest_peers { let kind = match state.routing_table.insert(entry.clone()) { Ok(true) => P2pNetworkKadLatestRequestPeerKind::New, Ok(false) => P2pNetworkKadLatestRequestPeerKind::Existing, @@ -101,19 +101,18 @@ impl super::P2pNetworkKadState { } state.latest_request_peers = latest_request_peers.into(); - let data = closest_peers.clone(); let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkKadRequestAction::ReplyReceived { - peer_id: *peer_id, - stream_id: *stream_id, - data, + peer_id, + stream_id, + data: closest_peers, }); Ok(()) } (_, P2pNetworkKademliaAction::StartBootstrap { key }) => { state.status = P2pNetworkKadStatus::Bootstrapping( - P2pNetworkKadBootstrapState::new(*key).map_err(|k| k.to_string())?, + P2pNetworkKadBootstrapState::new(key).map_err(|k| k.to_string())?, ); if state.bootstrap_state().map_or(false, |bootstrap_state| { @@ -137,7 +136,7 @@ impl super::P2pNetworkKadState { } (_, P2pNetworkKademliaAction::UpdateRoutingTable { peer_id, addrs }) => { let _ = state.routing_table.insert( - P2pNetworkKadEntry::new(*peer_id, addrs.clone()).map_err(|e| e.to_string())?, + P2pNetworkKadEntry::new(peer_id, addrs.clone()).map_err(|e| e.to_string())?, ); Ok(()) } diff --git a/p2p/src/network/kad/request/p2p_network_kad_request_reducer.rs b/p2p/src/network/kad/request/p2p_network_kad_request_reducer.rs index 8a873f0157..941350c9c2 100644 --- a/p2p/src/network/kad/request/p2p_network_kad_request_reducer.rs +++ b/p2p/src/network/kad/request/p2p_network_kad_request_reducer.rs @@ -13,7 +13,7 @@ use super::{P2pNetworkKadRequestAction, P2pNetworkKadRequestState, P2pNetworkKad impl P2pNetworkKadRequestState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKadRequestAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: SubstateAccess + SubstateAccess, @@ -25,12 +25,12 @@ impl P2pNetworkKadRequestState { let request_state = match action { P2pNetworkKadRequestAction::New { peer_id, addr, key } => state - .create_request(*addr, *peer_id, *key) + .create_request(addr, peer_id, key) .map_err(|_request| format!("kademlia request to {addr} is already in progress"))?, P2pNetworkKadRequestAction::Prune { peer_id } => { return state .requests - .remove(peer_id) + .remove(&peer_id) .map(|_| ()) .ok_or_else(|| "kademlia request for {peer_id} is not found".to_owned()); } @@ -44,10 +44,7 @@ impl P2pNetworkKadRequestState { P2pNetworkKadRequestAction::New { peer_id, addr, .. } => { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; - let peer_state = p2p_state.peers.get(peer_id); - - let peer_id = *peer_id; - let addr = *addr; + let peer_state = p2p_state.peers.get(&peer_id); let on_initialize_connection = |dispatcher: &mut Dispatcher| { // initialize connection to the peer. @@ -140,7 +137,7 @@ impl P2pNetworkKadRequestState { .network .scheduler .connections - .get(addr) + .get(&addr) .ok_or_else(|| format!("connection with {addr} not found")) .and_then(|conn| { conn.mux @@ -156,20 +153,18 @@ impl P2pNetworkKadRequestState { // TODO: add callbacks dispatcher.push(P2pNetworkYamuxAction::OpenStream { - addr: *addr, + addr, stream_id, stream_kind: crate::token::StreamKind::Discovery( crate::token::DiscoveryAlgorithm::Kademlia1_0_0, ), }); - dispatcher.push(P2pNetworkKadRequestAction::StreamIsCreating { - peer_id: *peer_id, - stream_id, - }); + dispatcher + .push(P2pNetworkKadRequestAction::StreamIsCreating { peer_id, stream_id }); Ok(()) } P2pNetworkKadRequestAction::StreamIsCreating { stream_id, .. } => { - request_state.status = P2pNetworkKadRequestStatus::WaitingForKadStream(*stream_id); + request_state.status = P2pNetworkKadRequestStatus::WaitingForKadStream(stream_id); Ok(()) } @@ -197,9 +192,7 @@ impl P2pNetworkKadRequestState { }, super::P2pNetworkKadRequestStatus::Request, ); - let peer_id = *peer_id; - let stream_id = *stream_id; - let addr = *addr; + let key = request_state.key; let dispatcher = state_context.into_dispatcher(); @@ -230,7 +223,7 @@ impl P2pNetworkKadRequestState { let bootstrap_request = state .bootstrap_state() - .and_then(|bootstrap_state| bootstrap_state.request(peer_id)) + .and_then(|bootstrap_state| bootstrap_state.request(&peer_id)) .is_some(); let closest_peers = bootstrap_request @@ -241,7 +234,7 @@ impl P2pNetworkKadRequestState { if bootstrap_request { dispatcher.push(P2pNetworkKadBootstrapAction::RequestDone { - peer_id: *peer_id, + peer_id, closest_peers, }); } @@ -263,10 +256,10 @@ impl P2pNetworkKadRequestState { sock_addr: addr, incoming: false, }, - peer_id: *peer_id, - stream_id: *stream_id, + peer_id, + stream_id, }); - dispatcher.push(P2pNetworkKadRequestAction::Prune { peer_id: *peer_id }); + dispatcher.push(P2pNetworkKadRequestAction::Prune { peer_id }); Ok(()) } P2pNetworkKadRequestAction::Prune { .. } => { @@ -277,19 +270,16 @@ impl P2pNetworkKadRequestState { request_state.status = P2pNetworkKadRequestStatus::Error(error.clone()); let bootstrap_request = state .bootstrap_state() - .and_then(|bootstrap_state| bootstrap_state.request(peer_id)) + .and_then(|bootstrap_state| bootstrap_state.request(&peer_id)) .is_some(); let dispatcher = state_context.into_dispatcher(); if bootstrap_request { - dispatcher.push(P2pNetworkKadBootstrapAction::RequestError { - peer_id: *peer_id, - error: error.clone(), - }); + dispatcher.push(P2pNetworkKadBootstrapAction::RequestError { peer_id, error }); } - dispatcher.push(P2pNetworkKadRequestAction::Prune { peer_id: *peer_id }); + dispatcher.push(P2pNetworkKadRequestAction::Prune { peer_id }); Ok(()) } } diff --git a/p2p/src/network/kad/stream/p2p_network_kad_stream_reducer.rs b/p2p/src/network/kad/stream/p2p_network_kad_stream_reducer.rs index fdfe7c1b68..c69a779477 100644 --- a/p2p/src/network/kad/stream/p2p_network_kad_stream_reducer.rs +++ b/p2p/src/network/kad/stream/p2p_network_kad_stream_reducer.rs @@ -17,7 +17,7 @@ use super::{ impl P2pNetworkKadIncomingStreamState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKademliaStreamAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where @@ -36,7 +36,7 @@ impl P2pNetworkKadIncomingStreamState { ( P2pNetworkKadIncomingStreamState::Default, P2pNetworkKademliaStreamAction::New { incoming, .. }, - ) if *incoming => { + ) if incoming => { *state = P2pNetworkKadIncomingStreamState::WaitingForRequest { expect_close: false, }; @@ -97,20 +97,20 @@ impl P2pNetworkKadIncomingStreamState { } => { // TODO: add callback dispatcher.push(P2pNetworkKademliaStreamAction::WaitOutgoing { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); dispatcher.push(P2pNetworkKademliaAction::AnswerFindNodeRequest { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, key, }); } P2pNetworkKadIncomingStreamState::Error(error) => { dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::from( P2pNetworkKadIncomingStreamError::from(error), ), @@ -151,21 +151,21 @@ impl P2pNetworkKadIncomingStreamState { } => { // TODO: add callbacks dispatcher.push(P2pNetworkKademliaStreamAction::WaitOutgoing { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); dispatcher.push(P2pNetworkKademliaAction::AnswerFindNodeRequest { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, key, }); } P2pNetworkKadIncomingStreamState::Error(error) => { warn!(meta.time(); summary = "error handling kademlia action", error = display(&error)); dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::from( P2pNetworkKadIncomingStreamError::from(error), ), @@ -192,26 +192,26 @@ impl P2pNetworkKadIncomingStreamState { stream_id, }, ) => { - let message = Message::try_from(data).map_err(|e| e.to_string())?; + let message = Message::try_from(&data).map_err(|e| e.to_string())?; let bytes = serialize_into_vec(&message).map_err(|e| format!("{e}"))?; *state = P2pNetworkKadIncomingStreamState::ResponseBytesAreReady { bytes: bytes.clone(), }; let dispatcher = state_context.into_dispatcher(); - let data = fuzzed_maybe!(bytes.clone().into(), crate::fuzzer::mutate_kad_data); + let data = fuzzed_maybe!(Data::from(bytes), crate::fuzzer::mutate_kad_data); let flags = fuzzed_maybe!(Default::default(), crate::fuzzer::mutate_yamux_flags); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data, flags, }); dispatcher.push(P2pNetworkKademliaStreamAction::WaitIncoming { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); Ok(()) } @@ -234,19 +234,19 @@ impl P2pNetworkKadIncomingStreamState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data: Data::empty(), flags: YamuxFlags::FIN, }); dispatcher.push(P2pNetworkKademliaStreamAction::Prune { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); Ok(()) } - _ => Err(format!( + action => Err(format!( "kademlia incoming stream state {state:?} is incorrect for action {action:?}", )), } @@ -265,7 +265,7 @@ impl P2pNetworkKadIncomingStreamState { } }; - let data = match P2pNetworkKademliaRpcRequest::try_from(message.clone()) { + let data = match P2pNetworkKademliaRpcRequest::try_from(message) { Ok(v) => v, Err(e) => { *self = P2pNetworkKadIncomingStreamState::Error(e.into()); @@ -281,7 +281,7 @@ impl P2pNetworkKadIncomingStreamState { impl P2pNetworkKadOutgoingStreamState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKademliaStreamAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where @@ -301,7 +301,7 @@ impl P2pNetworkKadOutgoingStreamState { ( P2pNetworkKadOutgoingStreamState::Default, P2pNetworkKademliaStreamAction::New { incoming, .. }, - ) if !*incoming => { + ) if !incoming => { *state = P2pNetworkKadOutgoingStreamState::WaitingForRequest { expect_close: false, }; @@ -317,26 +317,26 @@ impl P2pNetworkKadOutgoingStreamState { peer_id, }, ) => { - let message = Message::from(data); + let message = Message::from(&data); let bytes = serialize_into_vec(&message).map_err(|e| format!("{e}"))?; *state = P2pNetworkKadOutgoingStreamState::RequestBytesAreReady { bytes: bytes.clone(), }; let dispatcher = state_context.into_dispatcher(); - let data = fuzzed_maybe!(bytes.clone().into(), crate::fuzzer::mutate_kad_data); + let data = fuzzed_maybe!(Data::from(bytes), crate::fuzzer::mutate_kad_data); let flags = fuzzed_maybe!(Default::default(), crate::fuzzer::mutate_yamux_flags); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data, flags, }); dispatcher.push(P2pNetworkKademliaStreamAction::WaitIncoming { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); Ok(()) } @@ -406,21 +406,21 @@ impl P2pNetworkKadOutgoingStreamState { }, } => { dispatcher.push(P2pNetworkKademliaStreamAction::WaitOutgoing { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); dispatcher.push(P2pNetworkKademliaAction::UpdateFindNodeRequest { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, closest_peers, }); } P2pNetworkKadOutgoingStreamState::Error(error) => { warn!(meta.time(); summary = "error handling kademlia action", error = display(&error)); dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::from( P2pNetworkKadOutgoingStreamError::from(error), ), @@ -443,7 +443,7 @@ impl P2pNetworkKadOutgoingStreamState { }, ) => { let mut data = data.clone(); - data.extend_from_slice(&new_data.0); + data.extend_from_slice(&new_data); if *len > data.len() { *state = @@ -463,21 +463,21 @@ impl P2pNetworkKadOutgoingStreamState { }, } => { dispatcher.push(P2pNetworkKademliaStreamAction::WaitOutgoing { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); dispatcher.push(P2pNetworkKademliaAction::UpdateFindNodeRequest { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, closest_peers, }); } P2pNetworkKadOutgoingStreamState::Error(error) => { warn!(meta.time(); summary = "error handling kademlia action", error = display(&error)); dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::from( P2pNetworkKadOutgoingStreamError::from(error), ), @@ -508,15 +508,15 @@ impl P2pNetworkKadOutgoingStreamState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data: Data::empty(), flags: YamuxFlags::FIN, }); dispatcher.push(P2pNetworkKademliaStreamAction::Prune { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); Ok(()) } @@ -531,13 +531,13 @@ impl P2pNetworkKadOutgoingStreamState { *state = P2pNetworkKadOutgoingStreamState::Closed; let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkKademliaStreamAction::Prune { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, }); Ok(()) } - _ => Err(format!( + (state, action) => Err(format!( "kademlia outgoing stream state {state:?} is incorrect for action {action:?}", )), } @@ -556,7 +556,7 @@ impl P2pNetworkKadOutgoingStreamState { } }; - let data = match P2pNetworkKademliaRpcReply::try_from(message.clone()) { + let data = match P2pNetworkKademliaRpcReply::try_from(message) { Ok(v) => v, Err(e) => { *self = P2pNetworkKadOutgoingStreamState::Error(e.into()); @@ -572,7 +572,7 @@ impl P2pNetworkKadOutgoingStreamState { impl P2pNetworkKadStreamState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pNetworkKademliaStreamAction>, + action: ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where @@ -580,8 +580,8 @@ impl P2pNetworkKadStreamState { Action: crate::P2pActionTrait, { let state = state_context.get_substate_mut()?; - let action_ = action.action(); - let stream_state = match action_ { + let (action, meta) = action.split(); + let stream_state = match &action { P2pNetworkKademliaStreamAction::New { peer_id, stream_id, @@ -601,17 +601,21 @@ impl P2pNetworkKadStreamState { .ok_or_else(|| format!("kademlia stream not found for action {action:?}")) } _ => state - .find_kad_stream_state(action_.peer_id(), action_.stream_id()) + .find_kad_stream_state(action.peer_id(), action.stream_id()) .ok_or_else(|| format!("kademlia stream not found for action {action:?}"))?, }; match stream_state { - P2pNetworkKadStreamState::Incoming(_) => { - P2pNetworkKadIncomingStreamState::reducer(state_context, action, limits) - } - P2pNetworkKadStreamState::Outgoing(_) => { - P2pNetworkKadOutgoingStreamState::reducer(state_context, action, limits) - } + P2pNetworkKadStreamState::Incoming(_) => P2pNetworkKadIncomingStreamState::reducer( + state_context, + meta.with_action(action), + limits, + ), + P2pNetworkKadStreamState::Outgoing(_) => P2pNetworkKadOutgoingStreamState::reducer( + state_context, + meta.with_action(action), + limits, + ), } } } diff --git a/p2p/src/network/noise/p2p_network_noise_reducer.rs b/p2p/src/network/noise/p2p_network_noise_reducer.rs index 392c5086cc..27b06329b9 100644 --- a/p2p/src/network/noise/p2p_network_noise_reducer.rs +++ b/p2p/src/network/noise/p2p_network_noise_reducer.rs @@ -22,13 +22,13 @@ const MAX_CHUNK_SIZE: usize = u16::MAX as usize - 19; impl P2pNetworkNoiseState { pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkNoiseAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, Action: crate::P2pActionTrait, { - let action = action.action(); + let (action, _meta) = action.split(); let noise_state = state_context .get_substate_mut()? .connection_state_mut(action.addr()) @@ -38,18 +38,15 @@ impl P2pNetworkNoiseState { match action { P2pNetworkNoiseAction::Init { incoming, - ephemeral_sk, - static_sk, - signature, + ephemeral_sk: esk, + static_sk: ssk, + signature: payload, addr, } => { - let esk = ephemeral_sk.clone(); let epk = esk.pk(); - let ssk = static_sk.clone(); let spk = ssk.pk(); - let payload = signature.clone(); - noise_state.inner = if *incoming { + noise_state.inner = if incoming { // Luckily the name is 32 bytes long, if it were longer you would have to take a sha2_256 hash of it. let mut noise = NoiseState::new(*b"Noise_XX_25519_ChaChaPoly_SHA256"); noise.mix_hash(b""); @@ -90,13 +87,13 @@ impl P2pNetworkNoiseState { let mut outgoing = noise_state.outgoing_chunks.clone(); let dispatcher = state_context.into_dispatcher(); while let Some(data) = outgoing.pop_front() { - dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr: *addr, data }); + dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr, data }); } Ok(()) } P2pNetworkNoiseAction::IncomingData { data, addr } => { - noise_state.buffer.extend_from_slice(data); + noise_state.buffer.extend_from_slice(&data); let mut offset = 0; loop { let buf = &noise_state.buffer[offset..]; @@ -123,11 +120,11 @@ impl P2pNetworkNoiseState { let incoming_chunks = noise_state.incoming_chunks.len(); let dispatcher = state_context.into_dispatcher(); for _ in 0..incoming_chunks { - dispatcher.push(P2pNetworkNoiseAction::IncomingChunk { addr: *addr }); + dispatcher.push(P2pNetworkNoiseAction::IncomingChunk { addr }); } Ok(()) } - action @ P2pNetworkNoiseAction::IncomingChunk { addr } => { + ref action @ P2pNetworkNoiseAction::IncomingChunk { addr } => { let Some(state) = &mut noise_state.inner else { bug_condition!("action {:?}: no inner state", action); return Ok(()); @@ -230,7 +227,7 @@ impl P2pNetworkNoiseState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); if let Some(error) = error { dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::Noise(error), }); } else { @@ -253,12 +250,12 @@ impl P2pNetworkNoiseState { } while let Some(data) = outgoing.pop_front() { - dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr: *addr, data }); + dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr, data }); } if let Some(data) = decrypted { dispatcher.push(P2pNetworkNoiseAction::DecryptedData { - addr: *addr, + addr, peer_id: remote_peer_id, data, }); @@ -266,7 +263,7 @@ impl P2pNetworkNoiseState { if middle_initiator || middle_responder { dispatcher.push(P2pNetworkNoiseAction::OutgoingData { - addr: *addr, + addr, data: Data::empty(), }); } @@ -274,8 +271,8 @@ impl P2pNetworkNoiseState { Ok(()) } - action @ P2pNetworkNoiseAction::OutgoingChunk { addr, data } - | action @ P2pNetworkNoiseAction::OutgoingChunkSelectMux { addr, data } => { + ref action @ P2pNetworkNoiseAction::OutgoingChunk { addr, ref data } + | ref action @ P2pNetworkNoiseAction::OutgoingChunkSelectMux { addr, ref data } => { noise_state.outgoing_chunks.pop_front(); let handshake_done = noise_state.handshake_done(action); @@ -289,10 +286,10 @@ impl P2pNetworkNoiseState { .into(), crate::fuzzer::mutate_noise ); - dispatcher.push(P2pNetworkPnetAction::OutgoingData { addr: *addr, data }); + dispatcher.push(P2pNetworkPnetAction::OutgoingData { addr, data }); if let Some((peer_id, incoming)) = handshake_done { dispatcher.push(P2pNetworkNoiseAction::HandshakeDone { - addr: *addr, + addr, peer_id, incoming, }); @@ -302,7 +299,7 @@ impl P2pNetworkNoiseState { } P2pNetworkNoiseAction::OutgoingData { data, addr } => { let Some(state) = &mut noise_state.inner else { - bug_condition!("action {:?}: no inner state", action); + bug_condition!("action `P2pNetworkNoiseAction::OutgoingData`: no inner state"); return Ok(()); }; @@ -346,7 +343,7 @@ impl P2pNetworkNoiseState { noise_state.outgoing_chunks.push_back(chunks); } P2pNetworkNoiseStateInner::Initiator(i) => { - match (i.generate(data), i.remote_pk.clone()) { + match (i.generate(&data), i.remote_pk.clone()) { ( Ok(Some(InitiatorOutput { send_key, @@ -388,7 +385,7 @@ impl P2pNetworkNoiseState { } } P2pNetworkNoiseStateInner::Responder(r) => { - if let Some(chunk) = r.generate(data) { + if let Some(chunk) = r.generate(&data) { noise_state.outgoing_chunks.push_back(vec![chunk.into()]); } } @@ -402,12 +399,12 @@ impl P2pNetworkNoiseState { if let Some(error) = error { dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::Noise(error), }); } else { while let Some(data) = outgoing.pop_front() { - dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr: *addr, data }); + dispatcher.push(P2pNetworkNoiseAction::OutgoingChunk { addr, data }); } } Ok(()) @@ -419,7 +416,9 @@ impl P2pNetworkNoiseState { .. }) = &mut noise_state.inner else { - bug_condition!("action {:?}: no inner state", action); + bug_condition!( + "action `P2pNetworkNoiseAction::OutgoingDataSelectMux`: no inner state" + ); return Ok(()); }; @@ -427,7 +426,7 @@ impl P2pNetworkNoiseState { let mut chunk = Vec::with_capacity(18 + data.len()); chunk.extend_from_slice(&((data.len() + 16) as u16).to_be_bytes()); - chunk.extend_from_slice(data); + chunk.extend_from_slice(&data); let mut nonce = GenericArray::default(); nonce[4..].clone_from_slice(&send_nonce.to_le_bytes()); @@ -450,12 +449,11 @@ impl P2pNetworkNoiseState { if let Some(error) = error { dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::Noise(error), }); } else if let Some(data) = outgoing { - dispatcher - .push(P2pNetworkNoiseAction::OutgoingChunkSelectMux { addr: *addr, data }) + dispatcher.push(P2pNetworkNoiseAction::OutgoingChunkSelectMux { addr, data }) } Ok(()) @@ -470,9 +468,9 @@ impl P2pNetworkNoiseState { let remote_peer_id = noise_state.remote_peer_id(); let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkSelectAction::IncomingDataMux { - addr: *addr, - peer_id: (*peer_id).or(remote_peer_id), - data: data.clone(), + addr, + peer_id: peer_id.or(remote_peer_id), + data, fin: false, }); @@ -485,9 +483,9 @@ impl P2pNetworkNoiseState { } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkSelectAction::Init { - addr: *addr, - kind: SelectKind::Multiplexing(*peer_id), - incoming: *incoming, + addr, + kind: SelectKind::Multiplexing(peer_id), + incoming, }); Ok(()) } diff --git a/p2p/src/network/p2p_network_reducer.rs b/p2p/src/network/p2p_network_reducer.rs index fcf796f5d3..c0560551c0 100644 --- a/p2p/src/network/p2p_network_reducer.rs +++ b/p2p/src/network/p2p_network_reducer.rs @@ -7,7 +7,7 @@ use super::*; impl P2pNetworkState { pub fn reducer( state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkAction>, + action: redux::ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where diff --git a/p2p/src/network/pnet/p2p_network_pnet_reducer.rs b/p2p/src/network/pnet/p2p_network_pnet_reducer.rs index c7cd98ca70..3e7fb1b3b4 100644 --- a/p2p/src/network/pnet/p2p_network_pnet_reducer.rs +++ b/p2p/src/network/pnet/p2p_network_pnet_reducer.rs @@ -43,7 +43,7 @@ impl P2pNetworkPnetState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkPnetAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -58,13 +58,13 @@ impl P2pNetworkPnetState { match action { P2pNetworkPnetAction::IncomingData { data, addr } => { - pnet_state.incoming.reduce(&pnet_state.shared_secret, data); + pnet_state.incoming.reduce(&pnet_state.shared_secret, &data); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let scheduler_state: &P2pNetworkSchedulerState = state.substate()?; let pnet_state = &scheduler_state - .connection_state(addr) - .ok_or_else(|| format!("Missing connection for action: {:?}", action))? + .connection_state(&addr) + .ok_or("Missing connection for action: `P2pNetworkPnetAction::IncomingData`")? .pnet; let Half::Done { to_send, .. } = &pnet_state.incoming else { @@ -75,7 +75,7 @@ impl P2pNetworkPnetState { if !to_send.is_empty() { let data = Data::from(to_send.clone()); dispatcher.push(P2pNetworkSelectAction::IncomingDataAuth { - addr: *addr, + addr, data, fin: false, }); @@ -84,13 +84,13 @@ impl P2pNetworkPnetState { Ok(()) } P2pNetworkPnetAction::OutgoingData { data, addr } => { - pnet_state.outgoing.reduce(&pnet_state.shared_secret, data); + pnet_state.outgoing.reduce(&pnet_state.shared_secret, &data); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let scheduler_state: &P2pNetworkSchedulerState = state.substate()?; let pnet_state = &scheduler_state - .connection_state(addr) - .ok_or_else(|| format!("Missing connection for action: {:?}", action))? + .connection_state(&addr) + .ok_or("Missing connection for action: `P2pNetworkPnetAction::OutgoingData`")? .pnet; let Half::Done { to_send, .. } = &pnet_state.outgoing else { @@ -100,7 +100,7 @@ impl P2pNetworkPnetState { if !to_send.is_empty() { dispatcher.push(P2pNetworkPnetEffectfulAction::OutgoingData { - addr: *addr, + addr, data: to_send.clone(), }); } @@ -111,13 +111,15 @@ impl P2pNetworkPnetState { addr, incoming, } => { - pnet_state.outgoing.reduce(&pnet_state.shared_secret, nonce); + pnet_state + .outgoing + .reduce(&pnet_state.shared_secret, &nonce); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let scheduler_state: &P2pNetworkSchedulerState = state.substate()?; let pnet_state = &scheduler_state - .connection_state(addr) - .ok_or_else(|| format!("Missing connection for action: {:?}", action))? + .connection_state(&addr) + .ok_or("Missing connection for action: `P2pNetworkPnetAction::SetupNonce`")? .pnet; if !matches!(&pnet_state.outgoing, Half::Done { .. }) { @@ -129,16 +131,16 @@ impl P2pNetworkPnetState { }; dispatcher.push(P2pNetworkPnetEffectfulAction::SetupNonce { - addr: *addr, - nonce: nonce.clone(), - incoming: *incoming, + addr, + nonce, + incoming, }); Ok(()) } P2pNetworkPnetAction::Timeout { addr } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkSchedulerAction::Disconnect { - addr: *addr, + addr, reason: P2pDisconnectionReason::Timeout, }); Ok(()) diff --git a/p2p/src/network/pubsub/p2p_network_pubsub_reducer.rs b/p2p/src/network/pubsub/p2p_network_pubsub_reducer.rs index 3eedd38f32..ed8eae6802 100644 --- a/p2p/src/network/pubsub/p2p_network_pubsub_reducer.rs +++ b/p2p/src/network/pubsub/p2p_network_pubsub_reducer.rs @@ -21,15 +21,16 @@ use super::{ impl P2pNetworkPubsubState { pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkPubsubAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, Action: crate::P2pActionTrait, { let pubsub_state = state_context.get_substate_mut()?; + let (action, _meta) = action.split(); - match action.action() { + match action { P2pNetworkPubsubAction::NewStream { incoming: true, peer_id, @@ -37,15 +38,15 @@ impl P2pNetworkPubsubState { protocol, .. } => { - let entry = pubsub_state.clients.entry(*peer_id); + let entry = pubsub_state.clients.entry(peer_id); // preserve it let outgoing_stream_id = match &entry { Entry::Occupied(v) => v.get().outgoing_stream_id, Entry::Vacant(_) => None, }; let state = entry.or_insert_with(|| P2pNetworkPubsubClientState { - protocol: *protocol, - addr: *addr, + protocol, + addr, outgoing_stream_id, message: pb::Rpc { subscriptions: vec![], @@ -55,8 +56,8 @@ impl P2pNetworkPubsubState { buffer: vec![], incoming_messages: vec![], }); - state.protocol = *protocol; - state.addr = *addr; + state.protocol = protocol; + state.addr = addr; pubsub_state .topics @@ -71,11 +72,11 @@ impl P2pNetworkPubsubState { addr, protocol, } => { - let state = pubsub_state.clients.entry(*peer_id).or_insert_with(|| { + let state = pubsub_state.clients.entry(peer_id).or_insert_with(|| { P2pNetworkPubsubClientState { - protocol: *protocol, - addr: *addr, - outgoing_stream_id: Some(*stream_id), + protocol, + addr, + outgoing_stream_id: Some(stream_id), message: pb::Rpc { subscriptions: vec![], publish: vec![], @@ -85,9 +86,9 @@ impl P2pNetworkPubsubState { incoming_messages: vec![], } }); - state.outgoing_stream_id = Some(*stream_id); - state.protocol = *protocol; - state.addr = *addr; + state.outgoing_stream_id = Some(stream_id); + state.protocol = protocol; + state.addr = addr; let (dispatcher, state) = state_context.into_dispatcher_and_state(); let config: &P2pConfig = state.substate()?; @@ -106,12 +107,12 @@ impl P2pNetworkPubsubState { publish: vec![], control: None, }, - peer_id: *peer_id, + peer_id, }); let mesh_size = map.values().filter(|s| s.on_mesh()).count(); if mesh_size < config.meshsub.outbound_degree_desired { dispatcher.push(P2pNetworkPubsubAction::Graft { - peer_id: *peer_id, + peer_id, topic_id: TOPIC.to_owned(), }); } @@ -124,12 +125,12 @@ impl P2pNetworkPubsubState { seen_limit, .. } => { - pubsub_state.reduce_incoming_data(peer_id, data)?; + pubsub_state.reduce_incoming_data(&peer_id, data)?; let dispatcher: &mut Dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkPubsubEffectfulAction::IncomingData { - peer_id: *peer_id, - seen_limit: *seen_limit, + peer_id, + seen_limit, }); Ok(()) @@ -139,12 +140,11 @@ impl P2pNetworkPubsubState { message, seen_limit, } => { - pubsub_state.reduce_incoming_message(peer_id, message, *seen_limit)?; + pubsub_state.reduce_incoming_message(peer_id, message, seen_limit)?; let (dispatcher, global_state) = state_context.into_dispatcher_and_state(); let state: &Self = global_state.substate()?; let config: &P2pConfig = global_state.substate()?; - let peer_id = *peer_id; let incoming_block = state.incoming_block.as_ref().cloned(); let incoming_transactions = state.incoming_transactions.clone(); @@ -189,8 +189,8 @@ impl P2pNetworkPubsubState { P2pNetworkPubsubAction::Graft { peer_id, topic_id } => { let Some(state) = pubsub_state .topics - .get_mut(topic_id) - .and_then(|m| m.get_mut(peer_id)) + .get_mut(&topic_id) + .and_then(|m| m.get_mut(&peer_id)) else { return Ok(()); }; @@ -205,25 +205,22 @@ impl P2pNetworkPubsubState { ihave: vec![], iwant: vec![], graft: vec![pb::ControlGraft { - topic_id: Some(topic_id.clone()), + topic_id: Some(topic_id), }], prune: vec![], }), }; - dispatcher.push(P2pNetworkPubsubAction::OutgoingMessage { - msg, - peer_id: *peer_id, - }); + dispatcher.push(P2pNetworkPubsubAction::OutgoingMessage { msg, peer_id }); Ok(()) } P2pNetworkPubsubAction::Prune { peer_id, topic_id } => { let Some(state) = pubsub_state .topics - .get_mut(topic_id) - .and_then(|m| m.get_mut(peer_id)) + .get_mut(&topic_id) + .and_then(|m| m.get_mut(&peer_id)) else { - bug_condition!("State not found for action: {action:?}"); + bug_condition!("State not found for action: `P2pNetworkPubsubAction::Prune`"); return Ok(()); }; @@ -238,7 +235,7 @@ impl P2pNetworkPubsubState { iwant: vec![], graft: vec![], prune: vec![pb::ControlPrune { - topic_id: Some(topic_id.clone()), + topic_id: Some(topic_id), peers: vec![pb::PeerInfo { peer_id: None, signed_peer_record: None, @@ -248,33 +245,30 @@ impl P2pNetworkPubsubState { }), }; - dispatcher.push(P2pNetworkPubsubAction::OutgoingMessage { - msg, - peer_id: *peer_id, - }); + dispatcher.push(P2pNetworkPubsubAction::OutgoingMessage { msg, peer_id }); Ok(()) } P2pNetworkPubsubAction::OutgoingMessage { peer_id, msg } => { - if let Some(v) = pubsub_state.clients.get_mut(peer_id) { + if let Some(v) = pubsub_state.clients.get_mut(&peer_id) { v.message.subscriptions.clear(); v.message.publish.clear(); v.message.control = None; } else { - bug_condition!("Invalid state for action: {action:?}"); + bug_condition!( + "Invalid state for action: `P2pNetworkPubsubAction::OutgoingMessage`" + ); } let dispatcher = state_context.into_dispatcher(); - if !message_is_empty(msg) { + if !message_is_empty(&msg) { let mut data = vec![]; - if prost::Message::encode_length_delimited(msg, &mut data).is_err() { - dispatcher.push(P2pNetworkPubsubAction::OutgoingMessageError { - msg: msg.clone(), - peer_id: *peer_id, - }); + if prost::Message::encode_length_delimited(&msg, &mut data).is_err() { + dispatcher + .push(P2pNetworkPubsubAction::OutgoingMessageError { msg, peer_id }); } else { dispatcher.push(P2pNetworkPubsubAction::OutgoingData { data: Data::from(data), - peer_id: *peer_id, + peer_id, }); } } @@ -289,7 +283,7 @@ impl P2pNetworkPubsubState { let mut buffer = vec![0; 8]; - if binprot::BinProtWrite::binprot_write(message, &mut buffer).is_err() { + if binprot::BinProtWrite::binprot_write(&message, &mut buffer).is_err() { bug_condition!("binprot serialization error"); return Ok(()); } @@ -315,21 +309,18 @@ impl P2pNetworkPubsubState { pubsub_state.seq += 1; let libp2p_peer_id = - libp2p_identity::PeerId::try_from(*author).expect("valid peer_id"); // This can't happen unless something is broken in the configuration + libp2p_identity::PeerId::try_from(author).expect("valid peer_id"); // This can't happen unless something is broken in the configuration pubsub_state.to_sign.push_back(pb::Message { from: Some(libp2p_peer_id.to_bytes()), - data: Some(data.0.clone().into_vec()), - seqno: Some((*seqno).to_be_bytes().to_vec()), + data: Some(data.0.into_vec()), + seqno: Some(seqno.to_be_bytes().to_vec()), topic: topic.clone(), signature: None, key: None, }); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkPubsubEffectfulAction::Sign { - author: *author, - topic: topic.clone(), - }); + dispatcher.push(P2pNetworkPubsubEffectfulAction::Sign { author, topic }); Ok(()) } P2pNetworkPubsubAction::SignError { .. } => { @@ -338,7 +329,7 @@ impl P2pNetworkPubsubState { } P2pNetworkPubsubAction::BroadcastSigned { signature } => { if let Some(mut message) = pubsub_state.to_sign.pop_front() { - message.signature = Some(signature.clone().0.to_vec()); + message.signature = Some(signature.0.to_vec()); pubsub_state .clients .iter_mut() @@ -348,12 +339,14 @@ impl P2pNetworkPubsubState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); broadcast(dispatcher, state) } - P2pNetworkPubsubAction::OutgoingData { data, peer_id } => { + P2pNetworkPubsubAction::OutgoingData { mut data, peer_id } => { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let state: &Self = state.substate()?; - let mut data = data.clone(); - let Some(state) = state.clients.get(peer_id) else { - bug_condition!("Missing state for action: {action:?}"); + + let Some(state) = state.clients.get(&peer_id) else { + bug_condition!( + "Missing state for action: `P2pNetworkPubsubAction::OutgoingData`" + ); return Ok(()); }; fuzz_maybe!(&mut data, crate::fuzzer::mutate_pubsub); @@ -374,14 +367,14 @@ impl P2pNetworkPubsubState { fn reduce_incoming_message( &mut self, - peer_id: &PeerId, - message: &Message, + peer_id: PeerId, + message: Message, seen_limit: usize, ) -> Result<(), String> { self.incoming_transactions.clear(); self.incoming_snarks.clear(); - let Some(state) = self.clients.get_mut(peer_id) else { + let Some(state) = self.clients.get_mut(&peer_id) else { bug_condition!("State not found for action P2pNetworkPubsubAction::IncomingMessage"); return Ok(()); }; @@ -408,7 +401,7 @@ impl P2pNetworkPubsubState { .iter_mut() .filter(|(c, _)| { // don't send back to who sent this - **c != *peer_id + *c != &peer_id }) .for_each(|(c, state)| { let Some(topic_state) = topic.get(c) else { @@ -430,7 +423,7 @@ impl P2pNetworkPubsubState { let mut slice = &data[8..]; match gossip::GossipNetMessageV2::binprot_read(&mut slice) { Ok(gossip::GossipNetMessageV2::NewState(block)) => { - self.incoming_block = Some((*peer_id, block)); + self.incoming_block = Some((peer_id, block)); } Ok(gossip::GossipNetMessageV2::TransactionPoolDiff { message, nonce }) => { let nonce = nonce.as_u32(); @@ -454,16 +447,16 @@ impl P2pNetworkPubsubState { Ok(()) } - fn reduce_incoming_data(&mut self, peer_id: &PeerId, data: &Data) -> Result<(), String> { + fn reduce_incoming_data(&mut self, peer_id: &PeerId, data: Data) -> Result<(), String> { let Some(state) = self.clients.get_mut(peer_id) else { // TODO: investigate, cannot reproduce this // bug_condition!("State not found for action: P2pNetworkPubsubAction::IncomingData"); return Ok(()); }; let slice = if state.buffer.is_empty() { - &**data + &*data } else { - state.buffer.extend_from_slice(data); + state.buffer.extend_from_slice(&data); &state.buffer }; let mut subscriptions = vec![]; diff --git a/p2p/src/network/rpc/p2p_network_rpc_reducer.rs b/p2p/src/network/rpc/p2p_network_rpc_reducer.rs index f5ef15fa57..1899fbdf5d 100644 --- a/p2p/src/network/rpc/p2p_network_rpc_reducer.rs +++ b/p2p/src/network/rpc/p2p_network_rpc_reducer.rs @@ -31,20 +31,20 @@ impl P2pNetworkRpcState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkRpcAction>, + action: redux::ActionWithMeta, limits: &P2pLimits, ) -> Result<(), String> where State: crate::P2pStateTrait, Action: crate::P2pActionTrait, { + let (action, meta) = action.split(); let rpc_state = state_context .get_substate_mut()? - .find_rpc_state_mut(action.action()) - .ok_or_else(|| format!("RPC state not found for action: {:?}", action.action())) + .find_rpc_state_mut(&action) + .ok_or_else(|| format!("RPC state not found for action: {:?}", action)) .inspect_err(|e| bug_condition!("{}", e))?; - let (action, meta) = action.split(); match action { P2pNetworkRpcAction::Init { incoming, @@ -52,13 +52,13 @@ impl P2pNetworkRpcState { peer_id, stream_id, } => { - rpc_state.is_incoming = *incoming; + rpc_state.is_incoming = incoming; let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkRpcAction::OutgoingData { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, data: Data::from(RpcMessage::Handshake.into_bytes()), fin: false, }); @@ -70,7 +70,7 @@ impl P2pNetworkRpcState { peer_id, stream_id, } => { - rpc_state.buffer.extend_from_slice(data); + rpc_state.buffer.extend_from_slice(&data); let mut offset = 0; // TODO(akoptelov): there shouldn't be the case where we have multiple incoming messages at once (or at least other than heartbeat) loop { @@ -127,22 +127,22 @@ impl P2pNetworkRpcState { if let Some(message) = incoming { dispatcher.push(P2pNetworkRpcAction::IncomingMessage { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, message, }) } Ok(()) } - action @ P2pNetworkRpcAction::IncomingMessage { - message, + ref action @ P2pNetworkRpcAction::IncomingMessage { + ref message, addr, peer_id, stream_id, } => { - if let RpcMessage::Response { header, .. } = message { + if let RpcMessage::Response { header, .. } = &message { if let Some(QueryHeader { id, tag, version }) = &rpc_state.pending { *rpc_state .total_stats @@ -154,7 +154,7 @@ impl P2pNetworkRpcState { } else { error!(meta.time(); "receiving response without query"); } - } else if let RpcMessage::Query { header, .. } = message { + } else if let RpcMessage::Query { header, .. } = &message { if rpc_state.pending.is_none() { rpc_state.pending = Some(header.clone()); } else { @@ -173,14 +173,14 @@ impl P2pNetworkRpcState { match &message { RpcMessage::Handshake => { if !state.is_incoming { - dispatcher.push(P2pChannelsRpcAction::Ready { peer_id: *peer_id }); + dispatcher.push(P2pChannelsRpcAction::Ready { peer_id }); } } RpcMessage::Heartbeat => {} RpcMessage::Query { header, bytes } => { - if let Err(e) = dispatch_rpc_query(*peer_id, header, bytes, dispatcher) { + if let Err(e) = dispatch_rpc_query(peer_id, header, bytes, dispatcher) { dispatcher.push(P2pDisconnectionAction::Init { - peer_id: *peer_id, + peer_id, reason: P2pDisconnectionReason::P2pChannelReceiveFailed( e.to_string(), ), @@ -203,16 +203,13 @@ impl P2pNetworkRpcState { } }; // unset pending - dispatcher.push(P2pNetworkRpcAction::PrunePending { - peer_id: *peer_id, - stream_id: *stream_id, - }); + dispatcher.push(P2pNetworkRpcAction::PrunePending { peer_id, stream_id }); if let Err(e) = - dispatch_rpc_response(*peer_id, &query_header, bytes, dispatcher) + dispatch_rpc_response(peer_id, &query_header, bytes, dispatcher) { dispatcher.push(P2pDisconnectionAction::Init { - peer_id: *peer_id, + peer_id, reason: P2pDisconnectionReason::P2pChannelReceiveFailed( e.to_string(), ), @@ -223,9 +220,9 @@ impl P2pNetworkRpcState { if let Some(message) = state.incoming.front().cloned() { dispatcher.push(P2pNetworkRpcAction::IncomingMessage { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, message, }); } @@ -245,9 +242,9 @@ impl P2pNetworkRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkRpcAction::OutgoingData { - addr: *addr, - peer_id: *peer_id, - stream_id: *stream_id, + addr, + peer_id, + stream_id, data: Data::from(RpcMessage::Heartbeat.into_bytes()), fin: false, }); @@ -267,12 +264,12 @@ impl P2pNetworkRpcState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkRpcAction::OutgoingData { addr, - peer_id: *peer_id, + peer_id, stream_id, data: Data::from( RpcMessage::Query { - header: query.clone(), - bytes: data.clone(), + header: query, + bytes: data, } .into_bytes(), ), @@ -284,17 +281,16 @@ impl P2pNetworkRpcState { P2pNetworkRpcAction::OutgoingData { addr, stream_id, - data, + mut data, .. } => { let dispatcher = state_context.into_dispatcher(); - let mut data = data.clone(); fuzz_maybe!(&mut data, crate::fuzzer::mutate_rpc_data); let flags = fuzzed_maybe!(Default::default(), crate::fuzzer::mutate_yamux_flags); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data, flags, }); @@ -314,18 +310,15 @@ impl P2pNetworkRpcState { let addr = rpc_state.addr; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkRpcAction::PrunePending { - peer_id: *peer_id, - stream_id, - }); + dispatcher.push(P2pNetworkRpcAction::PrunePending { peer_id, stream_id }); dispatcher.push(P2pNetworkRpcAction::OutgoingData { addr, - peer_id: *peer_id, + peer_id, stream_id, data: Data::from( RpcMessage::Response { - header: response.clone(), - bytes: data.clone(), + header: response, + bytes: data, } .into_bytes(), ), diff --git a/p2p/src/network/rpc/p2p_network_rpc_state.rs b/p2p/src/network/rpc/p2p_network_rpc_state.rs index eb3eaca572..37c127969c 100644 --- a/p2p/src/network/rpc/p2p_network_rpc_state.rs +++ b/p2p/src/network/rpc/p2p_network_rpc_state.rs @@ -85,7 +85,7 @@ impl RpcMessage { .unwrap_or_default(); } Self::Query { header, bytes } => { - MessageHeader::Query(header.clone()) + MessageHeader::Query(header) .binprot_write(&mut v) .unwrap_or_default(); v.extend_from_slice(&bytes); diff --git a/p2p/src/network/scheduler/p2p_network_scheduler_reducer.rs b/p2p/src/network/scheduler/p2p_network_scheduler_reducer.rs index 5f1245f771..566041f343 100644 --- a/p2p/src/network/scheduler/p2p_network_scheduler_reducer.rs +++ b/p2p/src/network/scheduler/p2p_network_scheduler_reducer.rs @@ -24,7 +24,7 @@ use super::{super::*, p2p_network_scheduler_state::P2pNetworkConnectionState, *} impl P2pNetworkSchedulerState { pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkSchedulerAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -35,36 +35,34 @@ impl P2pNetworkSchedulerState { match action { P2pNetworkSchedulerAction::InterfaceDetected { ip, .. } => { - scheduler_state.interfaces.insert(*ip); + scheduler_state.interfaces.insert(ip); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_config: &P2pConfig = state.substate()?; if let Some(port) = p2p_config.libp2p_port { - dispatcher.push(P2pNetworkSchedulerEffectfulAction::InterfaceDetected { - ip: *ip, - port, - }); + dispatcher + .push(P2pNetworkSchedulerEffectfulAction::InterfaceDetected { ip, port }); } Ok(()) } P2pNetworkSchedulerAction::InterfaceExpired { ip, .. } => { - scheduler_state.interfaces.remove(ip); + scheduler_state.interfaces.remove(&ip); Ok(()) } P2pNetworkSchedulerAction::ListenerReady { listener } => { - scheduler_state.listeners.insert(*listener); + scheduler_state.listeners.insert(listener); Ok(()) } P2pNetworkSchedulerAction::ListenerError { listener, .. } => { - scheduler_state.listeners.remove(listener); + scheduler_state.listeners.remove(&listener); Ok(()) } P2pNetworkSchedulerAction::IncomingDataIsReady { addr } => { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let scheduler: &Self = state.substate()?; - let Some(connection_state) = scheduler.connection_state(addr) else { + let Some(connection_state) = scheduler.connection_state(&addr) else { bug_condition!( "Invalid state for `P2pNetworkSchedulerAction::IncomingDataIsReady`" ); @@ -74,7 +72,7 @@ impl P2pNetworkSchedulerState { let limit = connection_state.limit(); if limit > 0 { dispatcher.push(P2pNetworkSchedulerEffectfulAction::IncomingDataIsReady { - addr: *addr, + addr, limit, }); } @@ -84,7 +82,7 @@ impl P2pNetworkSchedulerState { P2pNetworkSchedulerAction::IncomingDidAccept { addr, result } => { if let Some(addr) = addr { scheduler_state.connections.insert( - *addr, + addr, P2pNetworkConnectionState { incoming: true, pnet: P2pNetworkPnetState::new(scheduler_state.pnet_key, meta.time()), @@ -102,8 +100,8 @@ impl P2pNetworkSchedulerState { let dispatcher = state_context.into_dispatcher(); if let Some(addr) = addr { dispatcher.push(P2pNetworkSchedulerEffectfulAction::IncomingDidAccept { - addr: *addr, - result: result.clone(), + addr, + result, }); } @@ -112,7 +110,7 @@ impl P2pNetworkSchedulerState { P2pNetworkSchedulerAction::OutgoingConnect { addr } => { scheduler_state.connections.insert( ConnectionAddr { - sock_addr: *addr, + sock_addr: addr, incoming: false, }, P2pNetworkConnectionState { @@ -135,8 +133,7 @@ impl P2pNetworkSchedulerState { ); let dispatcher = state_context.into_dispatcher(); - dispatcher - .push(P2pNetworkSchedulerEffectfulAction::OutgoingConnect { addr: *addr }); + dispatcher.push(P2pNetworkSchedulerEffectfulAction::OutgoingConnect { addr }); Ok(()) } P2pNetworkSchedulerAction::OutgoingDidConnect { addr, result } => { @@ -147,12 +144,11 @@ impl P2pNetworkSchedulerState { match result { Ok(()) => { - dispatcher.push(P2pNetworkSchedulerEffectfulAction::OutgoingDidConnect { - addr: *addr, - }); + dispatcher + .push(P2pNetworkSchedulerEffectfulAction::OutgoingDidConnect { addr }); } Err(error) => { - let Some((peer_id, peer_state)) = p2p_state.peer_with_connection(*addr) + let Some((peer_id, peer_state)) = p2p_state.peer_with_connection(addr) else { bug_condition!( "outgoing connection to {addr} failed, but there is no peer for it" @@ -176,26 +172,23 @@ impl P2pNetworkSchedulerState { } P2pNetworkSchedulerAction::IncomingDataDidReceive { result, addr } => { // since both actions dispatcher later require connection state, if we can't find it we shouldn't dispatcher them - let Some(state) = scheduler_state.connection_state_mut(addr) else { + let Some(state) = scheduler_state.connection_state_mut(&addr) else { bug_condition!("Unable to find connection for `P2pNetworkSchedulerAction::IncomingDataDidReceive`"); return Ok(()); }; - if let Ok(data) = result { + if let Ok(data) = &result { state.consume(data.len()); }; let dispatcher = state_context.into_dispatcher(); match result { Ok(data) => { - dispatcher.push(P2pNetworkPnetAction::IncomingData { - addr: *addr, - data: data.clone(), - }); + dispatcher.push(P2pNetworkPnetAction::IncomingData { addr, data }); } Err(error) => dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, - error: P2pNetworkConnectionError::MioError(error.clone()), + addr, + error: P2pNetworkConnectionError::MioError(error), }), } Ok(()) @@ -208,18 +201,16 @@ impl P2pNetworkSchedulerState { expected_peer_id, } => { scheduler_state.reducer_select_done( - *addr, - *kind, - *protocol, - *incoming, - *expected_peer_id, + addr, + kind, + protocol, + incoming, + expected_peer_id, ); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let p2p_state: &P2pState = state.substate()?; - Self::forward_select_done( - dispatcher, p2p_state, *protocol, *addr, *incoming, *kind, - ); + Self::forward_select_done(dispatcher, p2p_state, protocol, addr, incoming, kind); Ok(()) } P2pNetworkSchedulerAction::SelectError { addr, kind, error } => { @@ -232,28 +223,26 @@ impl P2pNetworkSchedulerState { warn!(meta.time(); summary="select error for stream", addr = display(addr), peer_id = display(peer_id)); // just close the stream dispatcher.push(P2pNetworkYamuxAction::OutgoingData { - addr: *addr, - stream_id: *stream_id, + addr, + stream_id, data: Data::default(), flags: YamuxFlags::RST, }); - dispatcher.push(P2pNetworkSchedulerAction::PruneStream { - peer_id: *peer_id, - stream_id: *stream_id, - }); + dispatcher + .push(P2pNetworkSchedulerAction::PruneStream { peer_id, stream_id }); } _ => { dispatcher.push(P2pNetworkSchedulerAction::Error { - addr: *addr, + addr, error: P2pNetworkConnectionError::SelectError, }); } } dispatcher.push(P2pNetworkSchedulerEffectfulAction::SelectError { - addr: *addr, - kind: *kind, - error: error.to_owned(), + addr, + kind, + error, }); Ok(()) @@ -263,7 +252,7 @@ impl P2pNetworkSchedulerState { message_size_limit, peer_id, } => { - let Some(cn) = scheduler_state.connections.get_mut(addr) else { + let Some(cn) = scheduler_state.connections.get_mut(&addr) else { bug_condition!( "Missing connection state for `P2pNetworkSchedulerAction::YamuxDidInit`" ); @@ -271,12 +260,11 @@ impl P2pNetworkSchedulerState { }; if let Some(P2pNetworkConnectionMuxState::Yamux(yamux)) = &mut cn.mux { yamux.init = true; - yamux.message_size_limit = *message_size_limit; + yamux.message_size_limit = message_size_limit; } let incoming = cn.incoming; let dispatcher = state_context.into_dispatcher(); - let peer_id = *peer_id; if incoming { dispatcher.push(P2pConnectionIncomingAction::Libp2pReceived { peer_id }); @@ -284,14 +272,11 @@ impl P2pNetworkSchedulerState { dispatcher.push(P2pConnectionOutgoingAction::FinalizeSuccess { peer_id }); } - dispatcher.push(P2pIdentifyAction::NewRequest { - peer_id, - addr: *addr, - }); + dispatcher.push(P2pIdentifyAction::NewRequest { peer_id, addr }); Ok(()) } P2pNetworkSchedulerAction::Disconnect { addr, reason } => { - let Some(conn_state) = scheduler_state.connections.get_mut(addr) else { + let Some(conn_state) = scheduler_state.connections.get_mut(&addr) else { bug_condition!( "`P2pNetworkSchedulerAction::Disconnect`: connection {addr} does not exist" ); @@ -306,15 +291,12 @@ impl P2pNetworkSchedulerState { conn_state.closed = Some(reason.clone().into()); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkSchedulerEffectfulAction::Disconnect { - addr: *addr, - reason: reason.clone(), - }); + dispatcher.push(P2pNetworkSchedulerEffectfulAction::Disconnect { addr, reason }); Ok(()) } P2pNetworkSchedulerAction::Error { addr, error } => { - let Some(conn_state) = scheduler_state.connections.get_mut(addr) else { + let Some(conn_state) = scheduler_state.connections.get_mut(&addr) else { bug_condition!( "`P2pNetworkSchedulerAction::Error`: connection {addr} does not exist" ); @@ -329,14 +311,11 @@ impl P2pNetworkSchedulerState { conn_state.closed = Some(error.clone().into()); let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkSchedulerEffectfulAction::Error { - addr: *addr, - error: error.clone(), - }); + dispatcher.push(P2pNetworkSchedulerEffectfulAction::Error { addr, error }); Ok(()) } P2pNetworkSchedulerAction::Disconnected { addr, reason } => { - let Some(cn) = scheduler_state.connections.get_mut(addr) else { + let Some(cn) = scheduler_state.connections.get_mut(&addr) else { bug_condition!( "P2pNetworkSchedulerAction::Disconnected: connection {addr} does not exist" ); @@ -352,7 +331,7 @@ impl P2pNetworkSchedulerState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let state: &P2pState = state.substate()?; - let peer_with_state = state.peer_with_connection(*addr); + let peer_with_state = state.peer_with_connection(addr); if reason.is_disconnected() { // statemachine behaviour should continue with this, i.e. dispatch P2pDisconnectionAction::Finish @@ -406,7 +385,7 @@ impl P2pNetworkSchedulerState { Ok(()) } P2pNetworkSchedulerAction::Prune { addr } => { - if let Some(old) = scheduler_state.connections.remove(addr) { + if let Some(old) = scheduler_state.connections.remove(&addr) { if let Some(peer_id) = old.peer_id() { scheduler_state.prune_peer_state(peer_id); } @@ -419,13 +398,13 @@ impl P2pNetworkSchedulerState { let Some((_, conn_state)) = scheduler_state .connections .iter_mut() - .find(|(_, conn_state)| conn_state.peer_id() == Some(peer_id)) + .find(|(_, conn_state)| conn_state.peer_id() == Some(&peer_id)) else { bug_condition!("PruneStream: peer {peer_id} not found"); return Ok(()); }; - if conn_state.streams.remove(stream_id).is_none() { + if conn_state.streams.remove(&stream_id).is_none() { bug_condition!("PruneStream: peer {peer_id} does not have stream {stream_id}"); } @@ -434,9 +413,7 @@ impl P2pNetworkSchedulerState { P2pNetworkSchedulerAction::IncomingConnectionIsReady { listener } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push( - P2pNetworkSchedulerEffectfulAction::IncomingConnectionIsReady { - listener: *listener, - }, + P2pNetworkSchedulerEffectfulAction::IncomingConnectionIsReady { listener }, ); Ok(()) } diff --git a/p2p/src/network/select/p2p_network_select_reducer.rs b/p2p/src/network/select/p2p_network_select_reducer.rs index 4ba52933f6..eac32b761a 100644 --- a/p2p/src/network/select/p2p_network_select_reducer.rs +++ b/p2p/src/network/select/p2p_network_select_reducer.rs @@ -1,4 +1,4 @@ -use openmina_core::{bug_condition, error, fuzz_maybe, fuzzed_maybe, warn, Substate}; +use openmina_core::{bug_condition, error, fuzz_maybe, fuzzed_maybe, Substate}; use redux::Timestamp; use token::{ AuthKind, DiscoveryAlgorithm, IdentifyAlgorithm, MuxKind, Protocol, RpcAlgorithm, StreamKind, @@ -20,7 +20,7 @@ use super::*; impl P2pNetworkSelectState { pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkSelectAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -61,8 +61,8 @@ impl P2pNetworkSelectState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let state: &P2pNetworkSchedulerState = state.substate()?; let state = state - .connection_state(addr) - .and_then(|state| state.select_state(kind)) + .connection_state(&addr) + .and_then(|state| state.select_state(&kind)) .ok_or_else(|| format!("Select state not found for {action:?}"))?; if state.negotiated.is_none() && !incoming { @@ -78,11 +78,7 @@ impl P2pNetworkSelectState { } _ => {} }; - dispatcher.push(P2pNetworkSelectAction::OutgoingTokens { - addr: *addr, - kind: *kind, - tokens, - }); + dispatcher.push(P2pNetworkSelectAction::OutgoingTokens { addr, kind, tokens }); } Ok(()) @@ -94,26 +90,24 @@ impl P2pNetworkSelectState { | P2pNetworkSelectAction::IncomingDataMux { data, addr, fin, .. } => { - select_state.handle_incoming_data(data); + select_state.handle_incoming_data(&data); let (dispatcher, state) = state_context.into_dispatcher_and_state(); let state: &P2pNetworkSchedulerState = state.substate()?; let select_state = state - .connection_state(action.addr()) + .connection_state(&addr) .and_then(|conn| conn.select_state(&select_kind)) - .ok_or_else(|| format!("Select state not found for {action:?}"))?; + .ok_or("Select state not found for incoming data")?; if let P2pNetworkSelectStateInner::Error(error) = &select_state.inner { dispatcher.push(P2pNetworkSchedulerAction::SelectError { - addr: *addr, + addr, kind: select_kind, error: error.to_owned(), }) } else { - for action in - select_state.forward_incoming_data(select_kind, *addr, data.clone(), *fin) - { + for action in select_state.forward_incoming_data(select_kind, addr, data, fin) { dispatcher.push(action) } } @@ -134,7 +128,7 @@ impl P2pNetworkSelectState { select_kind, addr, data, - *fin, + fin, meta.time(), ) } @@ -148,14 +142,14 @@ impl P2pNetworkSelectState { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let scheduler: &P2pNetworkSchedulerState = state.substate()?; let select_state = scheduler - .connection_state(addr) - .and_then(|stream| stream.select_state(kind)) + .connection_state(&addr) + .and_then(|stream| stream.select_state(&kind)) .ok_or_else(|| format!("Select state not found for {action:?}"))?; if let P2pNetworkSelectStateInner::Error(error) = &select_state.inner { dispatcher.push(P2pNetworkSchedulerAction::SelectError { - addr: *addr, - kind: *kind, + addr, + kind, error: error.to_owned(), }); return Ok(()); @@ -163,8 +157,8 @@ impl P2pNetworkSelectState { if let Some(token) = &select_state.to_send { dispatcher.push(P2pNetworkSelectAction::OutgoingTokens { - addr: *addr, - kind: *kind, + addr, + kind, tokens: vec![token.clone()], }) } @@ -173,7 +167,7 @@ impl P2pNetworkSelectState { let p2p_state: &P2pState = state.substate()?; let expected_peer_id = p2p_state - .peer_with_connection(*addr) + .peer_with_connection(addr) .map(|(peer_id, _)| peer_id); let incoming = matches!( @@ -181,8 +175,8 @@ impl P2pNetworkSelectState { P2pNetworkSelectStateInner::Responder { .. } ); dispatcher.push(P2pNetworkSchedulerAction::SelectDone { - addr: *addr, - kind: *kind, + addr, + kind, protocol, incoming, expected_peer_id, @@ -196,13 +190,12 @@ impl P2pNetworkSelectState { let mut data = { let mut data = vec![]; - for token in tokens { + for token in &tokens { data.extend_from_slice(token.name()) } data.into() }; - let addr = *addr; match kind { SelectKind::Authentication => { fuzz_maybe!(&mut data, mutate_select_authentication); @@ -217,7 +210,7 @@ impl P2pNetworkSelectState { if let Some(na) = tokens.iter().find(|t| t.name() == Token::Na.name()) { dispatcher.push(P2pNetworkYamuxAction::OutgoingData { addr, - stream_id: *stream_id, + stream_id, data: na.name().to_vec().into(), flags: YamuxFlags::FIN, }); @@ -229,7 +222,7 @@ impl P2pNetworkSelectState { ); dispatcher.push(P2pNetworkYamuxAction::OutgoingData { addr, - stream_id: *stream_id, + stream_id, data, flags: Default::default(), }); @@ -243,14 +236,8 @@ impl P2pNetworkSelectState { P2pNetworkSelectAction::Timeout { addr, kind } => { let error = "timeout".to_owned(); select_state.inner = P2pNetworkSelectStateInner::Error(error.clone()); - warn!(meta.time(); "timeout"); - let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkSchedulerAction::SelectError { - addr: *addr, - kind: *kind, - error, - }); + dispatcher.push(P2pNetworkSchedulerAction::SelectError { addr, kind, error }); Ok(()) } } @@ -418,8 +405,8 @@ impl P2pNetworkSelectState { fn handle_negotiated_token( state_context: Substate, select_kind: SelectKind, - addr: &ConnectionAddr, - data: &Data, + addr: ConnectionAddr, + data: Data, fin: bool, time: Timestamp, ) -> Result<(), String> @@ -431,7 +418,7 @@ impl P2pNetworkSelectState { let p2p_state: &P2pState = state.substate()?; let state: &P2pNetworkSchedulerState = state.substate()?; let state = state - .connection_state(addr) + .connection_state(&addr) .and_then(|state| state.select_state(&select_kind)) .ok_or_else(|| "Select state not found incoming payload".to_owned())?; @@ -442,8 +429,6 @@ impl P2pNetworkSelectState { ); return Ok(()); }; - let addr = *addr; - let data = data.clone(); match negotiated { Protocol::Auth(AuthKind::Noise) => { diff --git a/p2p/src/network/yamux/p2p_network_yamux_reducer.rs b/p2p/src/network/yamux/p2p_network_yamux_reducer.rs index fad0dedd58..48454331b0 100644 --- a/p2p/src/network/yamux/p2p_network_yamux_reducer.rs +++ b/p2p/src/network/yamux/p2p_network_yamux_reducer.rs @@ -21,7 +21,7 @@ impl P2pNetworkYamuxState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: redux::ActionWithMeta<&P2pNetworkYamuxAction>, + action: redux::ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -45,7 +45,7 @@ impl P2pNetworkYamuxState { match action { P2pNetworkYamuxAction::IncomingData { data, addr } => { - yamux_state.buffer.extend_from_slice(data); + yamux_state.buffer.extend_from_slice(&data); let mut offset = 0; loop { let buf = &yamux_state.buffer[offset..]; @@ -144,7 +144,7 @@ impl P2pNetworkYamuxState { let incoming_data = yamux_state.incoming.clone(); let dispatcher = state_context.into_dispatcher(); incoming_data.into_iter().for_each(|frame| { - dispatcher.push(P2pNetworkYamuxAction::IncomingFrame { addr: *addr, frame }) + dispatcher.push(P2pNetworkYamuxAction::IncomingFrame { addr, frame }) }); Ok(()) @@ -153,15 +153,13 @@ impl P2pNetworkYamuxState { addr, stream_id, data, - flags, + mut flags, } => { let yamux_state = yamux_state .streams - .get(stream_id) + .get(&stream_id) .ok_or_else(|| format!("Stream with id {stream_id} not found for `P2pNetworkYamuxAction::OutgoingData`"))?; - let mut flags = *flags; - if !yamux_state.incoming && !yamux_state.established && !yamux_state.syn_sent { flags.insert(YamuxFlags::SYN); } else if yamux_state.incoming && !yamux_state.established { @@ -172,12 +170,12 @@ impl P2pNetworkYamuxState { let frame = YamuxFrame { flags, - stream_id: *stream_id, - inner: YamuxFrameInner::Data(data.clone()), + stream_id, + inner: YamuxFrameInner::Data(data), }; let dispatcher = state_context.into_dispatcher(); - dispatcher.push(P2pNetworkYamuxAction::OutgoingFrame { addr: *addr, frame }); + dispatcher.push(P2pNetworkYamuxAction::OutgoingFrame { addr, frame }); Ok(()) } @@ -225,13 +223,12 @@ impl P2pNetworkYamuxState { } let (dispatcher, state) = state_context.into_dispatcher_and_state(); - let addr = *addr; let limits: &P2pLimits = state.substate()?; let max_streams = limits.max_streams(); let connection_state = >::substate(state)? .connection_state(&addr) - .ok_or_else(|| format!("Connection not found {}", action.addr()))?; + .ok_or_else(|| format!("Connection not found {}", addr))?; let stream = connection_state .yamux_state() @@ -357,16 +354,16 @@ impl P2pNetworkYamuxState { let dispatcher = state_context.into_dispatcher(); let data = fuzzed_maybe!( - Data::from(frame.clone().into_bytes()), + Data::from(frame.into_bytes()), crate::fuzzer::mutate_yamux_frame ); - dispatcher.push(P2pNetworkNoiseAction::OutgoingData { addr: *addr, data }); + dispatcher.push(P2pNetworkNoiseAction::OutgoingData { addr, data }); Ok(()) } P2pNetworkYamuxAction::PingStream { addr, ping } => { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkYamuxAction::OutgoingFrame { - addr: *addr, + addr, frame: ping.into_frame(), }); @@ -379,10 +376,10 @@ impl P2pNetworkYamuxState { } => { yamux_state .streams - .insert(*stream_id, YamuxStreamState::default()); + .insert(stream_id, YamuxStreamState::default()); connection_state.streams.insert( - *stream_id, - P2pNetworkStreamState::new(*stream_kind, meta.time()), + stream_id, + P2pNetworkStreamState::new(stream_kind, meta.time()), ); let peer_id = match connection_state @@ -396,8 +393,8 @@ impl P2pNetworkYamuxState { let dispatcher = state_context.into_dispatcher(); dispatcher.push(P2pNetworkSelectAction::Init { - addr: *addr, - kind: SelectKind::Stream(peer_id, *stream_id), + addr, + kind: SelectKind::Stream(peer_id, stream_id), incoming: false, }); Ok(()) diff --git a/p2p/src/p2p_reducer.rs b/p2p/src/p2p_reducer.rs index 9cf1022202..e200dbd275 100644 --- a/p2p/src/p2p_reducer.rs +++ b/p2p/src/p2p_reducer.rs @@ -17,7 +17,7 @@ use redux::{ActionMeta, ActionWithMeta, Dispatcher, Timestamp}; impl P2pState { pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, diff --git a/p2p/src/p2p_state.rs b/p2p/src/p2p_state.rs index e03d4b1906..16c7a26811 100644 --- a/p2p/src/p2p_state.rs +++ b/p2p/src/p2p_state.rs @@ -296,7 +296,7 @@ impl P2pState { pub fn peer_with_connection( &self, conn_id: crate::ConnectionAddr, - ) -> Option<(PeerId, P2pPeerState)> { + ) -> Option<(PeerId, &P2pPeerState)> { let result = if let crate::ConnectionAddr { sock_addr, incoming: false, @@ -326,7 +326,7 @@ impl P2pState { .and_then(|peer_id| self.peers.iter().find(|(id, _)| *id == peer_id)) }) }) - .map(|(peer_id, peer_state)| (*peer_id, peer_state.clone())) + .map(|(peer_id, peer_state)| (*peer_id, peer_state)) } pub fn incoming_peer_connection_mut( diff --git a/p2p/src/peer/p2p_peer_reducer.rs b/p2p/src/peer/p2p_peer_reducer.rs index 23f5a532dc..ec10196a22 100644 --- a/p2p/src/peer/p2p_peer_reducer.rs +++ b/p2p/src/peer/p2p_peer_reducer.rs @@ -9,7 +9,7 @@ impl P2pPeerState { /// Substate is accessed pub fn reducer( mut state_context: Substate, - action: ActionWithMeta<&P2pPeerAction>, + action: ActionWithMeta, ) -> Result<(), String> where State: crate::P2pStateTrait, @@ -23,10 +23,10 @@ impl P2pPeerState { // TODO: add bound to peers let peer_state = p2p_state .peers - .entry(*peer_id) + .entry(peer_id) .or_insert_with(|| P2pPeerState { is_libp2p: true, - dial_opts: dial_opts.clone(), + dial_opts: None, identify: None, status: P2pPeerStatus::Disconnected { time: Timestamp::ZERO, @@ -34,16 +34,16 @@ impl P2pPeerState { }); if let Some(dial_opts) = dial_opts { - peer_state.dial_opts.get_or_insert(dial_opts.clone()); + peer_state.dial_opts.get_or_insert(dial_opts); } Ok(()) } P2pPeerAction::Ready { peer_id, incoming } => { - let Some(peer) = p2p_state.peers.get_mut(peer_id) else { + let Some(peer) = p2p_state.peers.get_mut(&peer_id) else { return Ok(()); }; peer.status = P2pPeerStatus::Ready(P2pPeerStatusReady::new( - *incoming, + incoming, meta.time(), &p2p_state.config.enabled_channels, )); @@ -51,13 +51,13 @@ impl P2pPeerState { if !peer.is_libp2p { let (dispatcher, state) = state_context.into_dispatcher_and_state(); let state: &P2pState = state.substate()?; - state.channels_init(dispatcher, *peer_id); + state.channels_init(dispatcher, peer_id); } Ok(()) } P2pPeerAction::BestTipUpdate { peer_id, best_tip } => { - let Some(peer) = p2p_state.get_ready_peer_mut(peer_id) else { + let Some(peer) = p2p_state.get_ready_peer_mut(&peer_id) else { bug_condition!("Peer state not found for `P2pPeerAction::BestTipUpdate`"); return Ok(()); }; @@ -67,12 +67,12 @@ impl P2pPeerState { let p2p_state: &P2pState = state.substate()?; if let Some(callback) = &p2p_state.callbacks.on_p2p_peer_best_tip_update { - dispatcher.push_callback(callback.clone(), best_tip.clone()); + dispatcher.push_callback(callback.clone(), best_tip); } Ok(()) } P2pPeerAction::Remove { peer_id } => { - if p2p_state.peers.remove(peer_id).is_none() { + if p2p_state.peers.remove(&peer_id).is_none() { bug_condition!( "Missing state for peer {peer_id} action: `P2pPeerAction::Remove`" ); diff --git a/p2p/testing/src/cluster.rs b/p2p/testing/src/cluster.rs index a419016385..8440a26f2e 100644 --- a/p2p/testing/src/cluster.rs +++ b/p2p/testing/src/cluster.rs @@ -367,6 +367,7 @@ impl Cluster { pub fn add_rust_node(&mut self, config: RustNodeConfig) -> Result { let override_fn = config.override_fn; + let reducer_override_fn = config.override_reducer; let node_idx = self.rust_nodes.len(); let (event_sender, event_receiver) = mpsc::unbounded_channel(); let (config, secret_key) = self.rust_node_config(config)?; @@ -381,7 +382,7 @@ impl Cluster { ); let store = crate::redux::Store::new( - |state, action, dispatcher| { + reducer_override_fn.unwrap_or(|state, action, dispatcher| { let meta = action.meta().clone(); let action = action.action(); @@ -391,7 +392,7 @@ impl Cluster { let state_context = Substate::new(state, dispatcher); let result = match action { Action::P2p(action) => { - P2pState::reducer(state_context, meta.with_action(action)) + P2pState::reducer(state_context, meta.with_action(action.clone())) } Action::Idle(_) => P2pState::p2p_timeout_dispatch(state_context, &meta), Action::P2pEffectful(_) => Ok(()), @@ -400,7 +401,7 @@ impl Cluster { if let Err(error) = result { openmina_core::warn!(time; "error = {error}"); } - }, + }), override_fn.unwrap_or(|store, action| { let (action, meta) = action.split(); match action { diff --git a/p2p/testing/src/redux.rs b/p2p/testing/src/redux.rs index 86b386bf5c..674680705c 100644 --- a/p2p/testing/src/redux.rs +++ b/p2p/testing/src/redux.rs @@ -60,6 +60,9 @@ impl State { pub fn state(&self) -> &P2pState { &self.0 } + pub fn state_mut(&mut self) -> &mut P2pState { + &mut self.0 + } } impl EnablingCondition for Action { diff --git a/p2p/testing/src/rust_node.rs b/p2p/testing/src/rust_node.rs index 28992572d8..8067ee6b0c 100644 --- a/p2p/testing/src/rust_node.rs +++ b/p2p/testing/src/rust_node.rs @@ -6,7 +6,7 @@ use std::{ use futures::Stream; use p2p::{P2pAction, P2pEvent, P2pLimits, P2pState, P2pTimeouts, PeerId}; -use redux::{Effects, EnablingCondition, SubStore}; +use redux::{Effects, EnablingCondition, Reducer, SubStore}; use tokio::sync::mpsc; use crate::{ @@ -28,6 +28,7 @@ pub struct RustNodeConfig { pub limits: P2pLimits, pub discovery: bool, pub override_fn: Option>, + pub override_reducer: Option>, } impl RustNodeConfig { @@ -63,6 +64,11 @@ impl RustNodeConfig { self.override_fn = Some(override_fn); self } + + pub fn with_override_reducer(mut self, override_fn: Reducer) -> Self { + self.override_reducer = Some(override_fn); + self + } } pub struct RustNode { diff --git a/p2p/tests/identify.rs b/p2p/tests/identify.rs index eb6f391d4e..2753caece4 100644 --- a/p2p/tests/identify.rs +++ b/p2p/tests/identify.rs @@ -7,15 +7,15 @@ use multiaddr::{multiaddr, Multiaddr}; use p2p::{ identity::SecretKey, network::identify::{ - stream::P2pNetworkIdentifyStreamState, P2pNetworkIdentify, P2pNetworkIdentifyAction, - P2pNetworkIdentifyStreamAction, + stream_effectful::P2pNetworkIdentifyStreamEffectfulAction, P2pNetworkIdentify, + P2pNetworkIdentifyEffectfulAction, P2pNetworkIdentifyStreamAction, }, token::{self, DiscoveryAlgorithm}, - Data, P2pAction, P2pNetworkAction, P2pNetworkYamuxAction, PeerId, + Data, P2pEffectfulAction, P2pNetworkEffectfulAction, P2pNetworkYamuxAction, PeerId, }; use p2p_testing::{ cluster::{Cluster, ClusterBuilder, ClusterEvent, Listener}, - event::{event_mapper_effect, RustNodeEvent}, + event::{allow_disconnections, event_mapper_effect, RustNodeEvent}, futures::TryStreamExt, predicates::{async_fn, listener_is_ready, peer_is_connected}, redux::{Action, State}, @@ -103,12 +103,12 @@ async fn rust_node_to_rust_node() -> anyhow::Result<()> { } #[tokio::test] -#[ignore = "TODO: Add override for reducer"] /// Test that even if bad node spams many different listen_addrs we don't end up with duplicates async fn test_bad_node() -> anyhow::Result<()> { let mut cluster = ClusterBuilder::new() .ports_with_len(100) .idle_duration(Duration::from_millis(100)) + .is_error(allow_disconnections) .start() .await?; @@ -154,6 +154,9 @@ async fn test_bad_node() -> anyhow::Result<()> { let expected_addrs = [ multiaddr!(Ip4([127, 0, 0, 1]), Tcp(bad_node_port)), + multiaddr!(Unix("domain.com")), + multiaddr!(Dns("domain.com"), Tcp(10530u16)), + multiaddr!(Https), multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)), multiaddr!(Ip6([0; 16]), Tcp(10500u16)), multiaddr!(Ip6([1; 16]), Tcp(10500u16)), @@ -171,103 +174,81 @@ fn bad_node_effects( action: ActionWithMeta, ) { { - let (action, _meta) = action.split(); + let (action, meta) = action.split(); match action { Action::P2p(a) => { - match a.clone() { - P2pAction::Network(P2pNetworkAction::Identify( - P2pNetworkIdentifyAction::Stream(P2pNetworkIdentifyStreamAction::New { - addr, - peer_id, - stream_id, - .. - }), - )) => { - let state = store - .state() - .state() - .network - .scheduler - .identify_state - .find_identify_stream_state(&peer_id, &stream_id) - .expect("Unable to find identify stream"); - - if let P2pNetworkIdentifyStreamState::SendIdentify = state { - let listen_addrs = vec![ - multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)), - multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)), - multiaddr!(Ip6([0; 16]), Tcp(10500u16)), - multiaddr!(Ip6([0; 16]), Tcp(10500u16)), - multiaddr!(Ip6([1; 16]), Tcp(10500u16)), - multiaddr!(Ip6([1; 16]), Tcp(10500u16)), - multiaddr!(Dns("domain.com"), Tcp(10530u16)), - multiaddr!(Dns("domain.com"), Tcp(10530u16)), - multiaddr!(Dns("domain.com"), Tcp(10530u16)), - multiaddr!(Dns("domain.com"), Tcp(10530u16)), - multiaddr!(Unix("domain.com")), - multiaddr!(Https), - ]; - - let public_key = Some(SecretKey::rand().public_key()); - - let protocols = vec![ - token::StreamKind::Identify( - token::IdentifyAlgorithm::Identify1_0_0, - ), - token::StreamKind::Broadcast( - p2p::token::BroadcastAlgorithm::Meshsub1_1_0, - ), - p2p::token::StreamKind::Rpc(token::RpcAlgorithm::Rpc0_0_1), - p2p::token::StreamKind::Discovery( - DiscoveryAlgorithm::Kademlia1_0_0, - ), - ]; - - let identify_msg = P2pNetworkIdentify { - protocol_version: Some("ipfs/0.1.0".to_string()), - agent_version: Some("openmina".to_owned()), - public_key, - listen_addrs, - observed_addr: None, - protocols, - }; - - let mut out = Vec::new(); - let identify_msg_proto = - identify_msg.to_proto_message().expect("serialized message"); - - prost::Message::encode_length_delimited(&identify_msg_proto, &mut out) - .expect("Error converting message"); - - store.dispatch(Action::P2p( - P2pNetworkYamuxAction::OutgoingData { - addr, - stream_id, - data: Data(out.into_boxed_slice()), - flags: Default::default(), - } - .into(), - )); - - store.dispatch(Action::P2p( - P2pNetworkIdentifyStreamAction::Close { - addr, - peer_id, - stream_id, - } - .into(), - )); - } - } - _ => { - // p2p_effects(store, meta.with_action(a.clone())); - } - } event_mapper_effect(store, a); } - Action::Idle(_) | Action::P2pEffectful(_) => { - // p2p_timeout_effects(store, &meta); + Action::P2pEffectful(P2pEffectfulAction::Network( + P2pNetworkEffectfulAction::Identify(P2pNetworkIdentifyEffectfulAction::Stream( + P2pNetworkIdentifyStreamEffectfulAction::SendIdentify { + addr, + peer_id, + stream_id, + }, + )), + )) => { + let listen_addrs = vec![ + multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)), + multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)), + multiaddr!(Ip6([0; 16]), Tcp(10500u16)), + multiaddr!(Ip6([0; 16]), Tcp(10500u16)), + multiaddr!(Ip6([1; 16]), Tcp(10500u16)), + multiaddr!(Ip6([1; 16]), Tcp(10500u16)), + multiaddr!(Dns("domain.com"), Tcp(10530u16)), + multiaddr!(Dns("domain.com"), Tcp(10530u16)), + multiaddr!(Dns("domain.com"), Tcp(10530u16)), + multiaddr!(Dns("domain.com"), Tcp(10530u16)), + multiaddr!(Unix("domain.com")), + multiaddr!(Https), + ]; + + let public_key = Some(SecretKey::rand().public_key()); + + let protocols = vec![ + token::StreamKind::Identify(token::IdentifyAlgorithm::Identify1_0_0), + token::StreamKind::Broadcast(p2p::token::BroadcastAlgorithm::Meshsub1_1_0), + p2p::token::StreamKind::Rpc(token::RpcAlgorithm::Rpc0_0_1), + p2p::token::StreamKind::Discovery(DiscoveryAlgorithm::Kademlia1_0_0), + ]; + + let identify_msg = P2pNetworkIdentify { + protocol_version: Some("ipfs/0.1.0".to_string()), + agent_version: Some("openmina".to_owned()), + public_key, + listen_addrs, + observed_addr: None, + protocols, + }; + + let mut out = Vec::new(); + let identify_msg_proto = + identify_msg.to_proto_message().expect("serialized message"); + + prost::Message::encode_length_delimited(&identify_msg_proto, &mut out) + .expect("Error converting message"); + + store.dispatch(Action::P2p( + P2pNetworkYamuxAction::OutgoingData { + addr, + stream_id, + data: Data(out.into_boxed_slice()), + flags: Default::default(), + } + .into(), + )); + + store.dispatch(Action::P2p( + P2pNetworkIdentifyStreamAction::Close { + addr, + peer_id, + stream_id, + } + .into(), + )); } + Action::P2pEffectful(action) => action.effects(meta, store), + _ => {} }; } } diff --git a/p2p/tests/kademlia.rs b/p2p/tests/kademlia.rs index a0d146f695..3b93112ea2 100644 --- a/p2p/tests/kademlia.rs +++ b/p2p/tests/kademlia.rs @@ -1,15 +1,16 @@ +use openmina_core::Substate; use p2p::{ identity::SecretKey, P2pAction, P2pNetworkAction, P2pNetworkKadAction, P2pNetworkKadBucket, - P2pNetworkKademliaAction, P2pNetworkKademliaRpcReply, P2pNetworkKademliaStreamAction, PeerId, + P2pNetworkKademliaAction, P2pNetworkKademliaRpcReply, P2pNetworkKademliaStreamAction, P2pState, + PeerId, }; use p2p_testing::{ cluster::{Cluster, ClusterBuilder, ClusterEvent, Listener}, - event::{allow_disconnections, event_mapper_effect, RustNodeEvent}, + event::{allow_disconnections, RustNodeEvent}, futures::{StreamExt, TryStreamExt}, predicates::kad_finished_bootstrap, redux::{Action, State}, rust_node::{RustNodeConfig, RustNodeId}, - service::ClusterService, stream::ClusterStreamExt, test_node::TestNode, utils::{ @@ -17,7 +18,7 @@ use p2p_testing::{ try_wait_for_nodes_to_listen, }, }; -use redux::{ActionWithMeta, Store}; +use redux::{ActionWithMeta, Dispatcher}; use std::{future::ready, net::Ipv4Addr, time::Duration}; #[tokio::test] @@ -311,7 +312,6 @@ async fn discovery_seed_multiple_peers() -> anyhow::Result<()> { } #[tokio::test] -#[ignore = "TODO: Add override for reducer"] async fn test_bad_node() -> anyhow::Result<()> { std::env::set_var("OPENMINA_DISCOVERY_FILTER_ADDR", "false"); @@ -324,7 +324,7 @@ async fn test_bad_node() -> anyhow::Result<()> { let bad_node = cluster.add_rust_node( RustNodeConfig::default() .with_discovery(true) - .with_override(bad_node_effects), + .with_override_reducer(bad_node_reducer), )?; let node = cluster.add_rust_node( @@ -352,57 +352,56 @@ async fn test_bad_node() -> anyhow::Result<()> { Ok(()) } -fn bad_node_effects( - store: &mut Store, - action: ActionWithMeta, +fn bad_node_reducer( + state: &mut State, + action: &ActionWithMeta, + dispatcher: &mut Dispatcher, ) { { - let (action, _meta) = action.split(); + let meta = action.meta().clone(); + let action = action.action(); + let time = meta.time(); match action { - Action::P2p(a) => { - match a.clone() { - P2pAction::Network(P2pNetworkAction::Kad(P2pNetworkKadAction::System( - P2pNetworkKademliaAction::AnswerFindNodeRequest { - addr, - peer_id, - stream_id, - .. - }, - ))) => { - let closer_peers = store - .state - .get() - .state() - .network - .scheduler - .discovery_state() - .expect("Error getting discovery state") - .routing_table - .buckets - .iter() - .flat_map(|bucket| bucket.clone().into_iter()) - .collect(); - - let message = P2pNetworkKademliaRpcReply::FindNode { closer_peers }; - store.dispatch(Action::P2p( - P2pNetworkKademliaStreamAction::SendResponse { - addr, - peer_id, - stream_id, - data: message, - } - .into(), - )); + Action::P2p(P2pAction::Network(P2pNetworkAction::Kad( + P2pNetworkKadAction::System(P2pNetworkKademliaAction::AnswerFindNodeRequest { + addr, + peer_id, + stream_id, + .. + }), + ))) => { + let closer_peers = state + .state() + .network + .scheduler + .discovery_state() + .expect("Error getting discovery state") + .routing_table + .buckets + .iter() + .flat_map(|bucket| bucket.clone().into_iter()) + .collect(); + + let message = P2pNetworkKademliaRpcReply::FindNode { closer_peers }; + dispatcher.push(Action::P2p( + P2pNetworkKademliaStreamAction::SendResponse { + addr: *addr, + peer_id: *peer_id, + stream_id: *stream_id, + data: message, } - _ => { - // p2p_effects(store, meta.with_action(a.clone())); - } - } - event_mapper_effect(store, a); + .into(), + )); } - Action::Idle(_) | Action::P2pEffectful(_) => { - // p2p_timeout_effects(store, &meta); + Action::P2p(action) => { + if let Err(error) = P2pState::reducer( + Substate::new(state, dispatcher), + meta.with_action(action.clone()), + ) { + openmina_core::warn!(time; "error = {error}"); + } } + Action::Idle(_) | Action::P2pEffectful(_) => {} }; } }