diff --git a/swap/src/network/request_response.rs b/swap/src/network/request_response.rs index 88f7c491..a7589e8a 100644 --- a/swap/src/network/request_response.rs +++ b/swap/src/network/request_response.rs @@ -1,8 +1,6 @@ use crate::protocol::{ - alice, - alice::{Message1, Message3, TransferProof}, - bob, - bob::{EncryptedSignature, Message0, Message2, Message4}, + alice::{SwapResponse, TransferProof}, + bob::{EncryptedSignature, SwapRequest}, }; use async_trait::async_trait; use futures::prelude::*; @@ -19,38 +17,16 @@ pub const TIMEOUT: u64 = 3600; // One hour. /// Message receive buffer. pub const BUF_SIZE: usize = 1024 * 1024; -// TODO: Think about whether there is a better way to do this, e.g., separate -// Codec for each Message and a macro that implements them. - -/// Messages Bob sends to Alice. -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum BobToAlice { - SwapRequest(Box), - Message0(Box), - Message2(Box), - Message4(Box), -} - -/// Messages Alice sends to Bob. -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum AliceToBob { - SwapResponse(Box), - Message1(Box), - Message3(Box), - Message2, -} - -/// Messages sent from one party to the other. -/// All responses are empty #[derive(Clone, Debug, Serialize, Deserialize)] pub enum Request { + SwapRequest(Box), TransferProof(Box), EncryptedSignature(Box), } -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -/// Response are only used for acknowledgement purposes. +#[derive(Clone, Debug, Serialize, Deserialize)] pub enum Response { + SwapResponse(Box), TransferProof, EncryptedSignature, } @@ -58,15 +34,6 @@ pub enum Response { #[derive(Debug, Clone, Copy, Default)] pub struct Swap; -#[derive(Debug, Clone, Copy, Default)] -pub struct Message0Protocol; - -#[derive(Debug, Clone, Copy, Default)] -pub struct Message1Protocol; - -#[derive(Debug, Clone, Copy, Default)] -pub struct Message2Protocol; - #[derive(Debug, Clone, Copy, Default)] pub struct TransferProofProtocol; @@ -79,24 +46,6 @@ impl ProtocolName for Swap { } } -impl ProtocolName for Message0Protocol { - fn protocol_name(&self) -> &[u8] { - b"/xmr/btc/message0/1.0.0" - } -} - -impl ProtocolName for Message1Protocol { - fn protocol_name(&self) -> &[u8] { - b"/xmr/btc/message1/1.0.0" - } -} - -impl ProtocolName for Message2Protocol { - fn protocol_name(&self) -> &[u8] { - b"/xmr/btc/message2/1.0.0" - } -} - impl ProtocolName for TransferProofProtocol { fn protocol_name(&self) -> &[u8] { b"/xmr/btc/transfer_proof/1.0.0" @@ -109,92 +58,6 @@ impl ProtocolName for EncryptedSignatureProtocol { } } -#[derive(Clone, Copy, Debug, Default)] -pub struct Codec

{ - phantom: PhantomData

, -} - -#[async_trait] -impl

RequestResponseCodec for Codec

-where - P: Send + Sync + Clone + ProtocolName, -{ - type Protocol = P; - type Request = BobToAlice; - type Response = AliceToBob; - - async fn read_request(&mut self, _: &Self::Protocol, io: &mut T) -> io::Result - where - T: AsyncRead + Unpin + Send, - { - let message = upgrade::read_one(io, BUF_SIZE) - .await - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - let mut de = serde_cbor::Deserializer::from_slice(&message); - let msg = BobToAlice::deserialize(&mut de).map_err(|e| { - tracing::debug!("serde read_request error: {:?}", e); - io::Error::new(io::ErrorKind::Other, e) - })?; - - Ok(msg) - } - - async fn read_response( - &mut self, - _: &Self::Protocol, - io: &mut T, - ) -> io::Result - where - T: AsyncRead + Unpin + Send, - { - let message = upgrade::read_one(io, BUF_SIZE) - .await - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - let mut de = serde_cbor::Deserializer::from_slice(&message); - let msg = AliceToBob::deserialize(&mut de).map_err(|e| { - tracing::debug!("serde read_response error: {:?}", e); - io::Error::new(io::ErrorKind::InvalidData, e) - })?; - - Ok(msg) - } - - async fn write_request( - &mut self, - _: &Self::Protocol, - io: &mut T, - req: Self::Request, - ) -> io::Result<()> - where - T: AsyncWrite + Unpin + Send, - { - let bytes = - serde_cbor::to_vec(&req).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - - upgrade::write_one(io, &bytes).await?; - - Ok(()) - } - - async fn write_response( - &mut self, - _: &Self::Protocol, - io: &mut T, - res: Self::Response, - ) -> io::Result<()> - where - T: AsyncWrite + Unpin + Send, - { - let bytes = serde_cbor::to_vec(&res).map_err(|e| { - tracing::debug!("serde write_reponse error: {:?}", e); - io::Error::new(io::ErrorKind::InvalidData, e) - })?; - upgrade::write_one(io, &bytes).await?; - - Ok(()) - } -} - #[derive(Clone, Copy, Debug, Default)] pub struct OneShotCodec

{ phantom: PhantomData

, diff --git a/swap/src/protocol/alice.rs b/swap/src/protocol/alice.rs index 27d71c12..dffafc85 100644 --- a/swap/src/protocol/alice.rs +++ b/swap/src/protocol/alice.rs @@ -7,7 +7,6 @@ use crate::{ monero, network::{ peer_tracker::{self, PeerTracker}, - request_response::AliceToBob, transport::build, Seed as NetworkSeed, }, @@ -31,6 +30,7 @@ pub use self::{ swap_response::*, transfer_proof::TransferProof, }; +use crate::network::request_response::Response; pub use execution_setup::Message3; mod encrypted_signature; @@ -280,7 +280,7 @@ impl Behaviour { /// Alice always sends her messages as a response to a request from Bob. pub fn send_swap_response( &mut self, - channel: ResponseChannel, + channel: ResponseChannel, swap_response: SwapResponse, ) -> Result<()> { self.amounts.send(channel, swap_response)?; diff --git a/swap/src/protocol/alice/event_loop.rs b/swap/src/protocol/alice/event_loop.rs index 12858179..01af9288 100644 --- a/swap/src/protocol/alice/event_loop.rs +++ b/swap/src/protocol/alice/event_loop.rs @@ -1,5 +1,5 @@ use crate::{ - network::{request_response::AliceToBob, transport::SwapTransport, TokioExecutor}, + network::{request_response::Response, transport::SwapTransport, TokioExecutor}, protocol::{ alice::{Behaviour, OutEvent, State0, State3, SwapResponse, TransferProof}, bob::EncryptedSignature, @@ -37,7 +37,7 @@ pub struct EventLoopHandle { recv_encrypted_signature: Receiver, request: Receiver, conn_established: Receiver, - send_swap_response: Sender<(ResponseChannel, SwapResponse)>, + send_swap_response: Sender<(ResponseChannel, SwapResponse)>, start_execution_setup: Sender<(PeerId, State0)>, send_transfer_proof: Sender<(PeerId, TransferProof)>, recv_transfer_proof_ack: Receiver<()>, @@ -81,7 +81,7 @@ impl EventLoopHandle { pub async fn send_swap_response( &mut self, - channel: ResponseChannel, + channel: ResponseChannel, swap_response: SwapResponse, ) -> Result<()> { let _ = self @@ -110,7 +110,7 @@ pub struct EventLoop { recv_encrypted_signature: Sender, request: Sender, conn_established: Sender, - send_swap_response: Receiver<(ResponseChannel, SwapResponse)>, + send_swap_response: Receiver<(ResponseChannel, SwapResponse)>, send_transfer_proof: Receiver<(PeerId, TransferProof)>, recv_transfer_proof_ack: Sender<()>, } diff --git a/swap/src/protocol/alice/swap_response.rs b/swap/src/protocol/alice/swap_response.rs index 62c1626c..98b23a51 100644 --- a/swap/src/protocol/alice/swap_response.rs +++ b/swap/src/protocol/alice/swap_response.rs @@ -1,6 +1,6 @@ use crate::{ monero, - network::request_response::{AliceToBob, BobToAlice, Codec, Swap, TIMEOUT}, + network::request_response::{OneShotCodec, Request, Response, Swap, TIMEOUT}, protocol::bob, }; use anyhow::{anyhow, Result}; @@ -23,7 +23,7 @@ use tracing::{debug, error}; #[derive(Debug)] pub struct OutEvent { pub msg: bob::SwapRequest, - pub channel: ResponseChannel, + pub channel: ResponseChannel, } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] @@ -37,15 +37,15 @@ pub struct SwapResponse { #[behaviour(out_event = "OutEvent", poll_method = "poll")] #[allow(missing_debug_implementations)] pub struct Behaviour { - rr: RequestResponse>, + rr: RequestResponse>, #[behaviour(ignore)] events: VecDeque, } impl Behaviour { /// Alice always sends her messages as a response to a request from Bob. - pub fn send(&mut self, channel: ResponseChannel, msg: SwapResponse) -> Result<()> { - let msg = AliceToBob::SwapResponse(Box::new(msg)); + pub fn send(&mut self, channel: ResponseChannel, msg: SwapResponse) -> Result<()> { + let msg = Response::SwapResponse(Box::new(msg)); self.rr .send_response(channel, msg) .map_err(|_| anyhow!("Sending swap response failed")) @@ -55,7 +55,7 @@ impl Behaviour { &mut self, _: &mut Context<'_>, _: &mut impl PollParameters, - ) -> Poll>, OutEvent>> { + ) -> Poll>, OutEvent>> { if let Some(event) = self.events.pop_front() { return Poll::Ready(NetworkBehaviourAction::GenerateEvent(event)); } @@ -73,8 +73,8 @@ impl Default for Behaviour { Self { rr: RequestResponse::new( - Codec::default(), - vec![(Swap, ProtocolSupport::Full)], + OneShotCodec::default(), + vec![(Swap, ProtocolSupport::Inbound)], config, ), events: Default::default(), @@ -82,8 +82,8 @@ impl Default for Behaviour { } } -impl NetworkBehaviourEventProcess> for Behaviour { - fn inject_event(&mut self, event: RequestResponseEvent) { +impl NetworkBehaviourEventProcess> for Behaviour { + fn inject_event(&mut self, event: RequestResponseEvent) { match event { RequestResponseEvent::Message { message: @@ -92,7 +92,7 @@ impl NetworkBehaviourEventProcess> }, .. } => { - if let BobToAlice::SwapRequest(msg) = request { + if let Request::SwapRequest(msg) = request { debug!("Received swap request"); self.events.push_back(OutEvent { msg: *msg, channel }) } diff --git a/swap/src/protocol/bob/swap_request.rs b/swap/src/protocol/bob/swap_request.rs index 8e1440fb..ab84f506 100644 --- a/swap/src/protocol/bob/swap_request.rs +++ b/swap/src/protocol/bob/swap_request.rs @@ -1,5 +1,5 @@ use crate::{ - network::request_response::{AliceToBob, BobToAlice, Codec, Swap, TIMEOUT}, + network::request_response::{OneShotCodec, Request, Response, Swap, TIMEOUT}, protocol::alice::SwapResponse, }; use anyhow::Result; @@ -35,14 +35,14 @@ pub struct OutEvent { #[behaviour(out_event = "OutEvent", poll_method = "poll")] #[allow(missing_debug_implementations)] pub struct Behaviour { - rr: RequestResponse>, + rr: RequestResponse>, #[behaviour(ignore)] events: VecDeque, } impl Behaviour { pub fn send(&mut self, alice: PeerId, swap_request: SwapRequest) -> Result { - let msg = BobToAlice::SwapRequest(Box::new(swap_request)); + let msg = Request::SwapRequest(Box::new(swap_request)); let id = self.rr.send_request(&alice, msg); Ok(id) @@ -52,7 +52,7 @@ impl Behaviour { &mut self, _: &mut Context<'_>, _: &mut impl PollParameters, - ) -> Poll>, OutEvent>> { + ) -> Poll>, OutEvent>> { if let Some(event) = self.events.pop_front() { return Poll::Ready(NetworkBehaviourAction::GenerateEvent(event)); } @@ -70,7 +70,7 @@ impl Default for Behaviour { Self { rr: RequestResponse::new( - Codec::default(), + OneShotCodec::default(), vec![(Swap, ProtocolSupport::Outbound)], config, ), @@ -79,8 +79,8 @@ impl Default for Behaviour { } } -impl NetworkBehaviourEventProcess> for Behaviour { - fn inject_event(&mut self, event: RequestResponseEvent) { +impl NetworkBehaviourEventProcess> for Behaviour { + fn inject_event(&mut self, event: RequestResponseEvent) { match event { RequestResponseEvent::Message { message: RequestResponseMessage::Request { .. }, @@ -90,7 +90,7 @@ impl NetworkBehaviourEventProcess> message: RequestResponseMessage::Response { response, .. }, .. } => { - if let AliceToBob::SwapResponse(swap_response) = response { + if let Response::SwapResponse(swap_response) = response { debug!("Received swap response"); self.events.push_back(OutEvent { swap_response: *swap_response,