From fe38f1862d625321aee11eb20a8f511f09b3ea69 Mon Sep 17 00:00:00 2001 From: ozkanonur Date: Mon, 17 Apr 2023 12:58:21 +0300 Subject: [PATCH 1/9] optimize p2p network layer Signed-off-by: ozkanonur --- CHANGELOG.md | 12 +++ mm2src/gossipsub/src/protocol.rs | 17 +++- mm2src/mm2_libp2p/src/lib.rs | 2 +- mm2src/mm2_main/src/lp_network.rs | 94 +++++++++++++++----- mm2src/mm2_main/src/lp_ordermatch.rs | 95 +++++++++++++++++---- mm2src/mm2_main/src/lp_swap.rs | 20 ++--- mm2src/mm2_main/src/lp_swap/swap_watcher.rs | 18 ++-- 7 files changed, 195 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e23dc19aa..06ae155dfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## ${next-version} - ${release-date} + +**Features:** + +**Enhancements/Fixes:** +- p2p stack is improved [#1755](https://github.com/KomodoPlatform/atomicDEX-API/pull/1755) +- - Validate topics if they are mixed or not. +- - Do early return if the message data is not valid (since no point to iterate over and over on the invalid message) +- - Avoid decoding messages that have more than 25 topics +- - Break the loop right after processing any of `SWAP_PREFIX`, `WATCHER_PREFIX`, `TX_HELPER_PREFIX` topic. + + ## v1.0.2-beta - 2023-04-11 **Features:** diff --git a/mm2src/gossipsub/src/protocol.rs b/mm2src/gossipsub/src/protocol.rs index 1173a89b22..a580821d87 100644 --- a/mm2src/gossipsub/src/protocol.rs +++ b/mm2src/gossipsub/src/protocol.rs @@ -212,6 +212,8 @@ impl Decoder for GossipsubCodec { type Error = io::Error; fn decode(&mut self, src: &mut BytesMut) -> Result, Self::Error> { + const MAX_TOPICS: usize = 25; + let packet = some_or_return_ok_none!(self.length_codec.decode(src)?); let rpc = rpc_proto::Rpc::decode(&packet[..])?; @@ -228,12 +230,25 @@ impl Decoder for GossipsubCodec { "sequence number has an incorrect size", )); } + + let topics = publish.topic_ids.into_iter().map(TopicHash::from_raw); + if topics.len() > MAX_TOPICS { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + format!( + "Too many topics provided. Allowed topic count: {}, Received topic count: {}", + MAX_TOPICS, + topics.len() + ), + )); + } + messages.push(GossipsubMessage { source: PeerId::from_bytes(&publish.from.unwrap_or_default()) .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid Peer Id"))?, data: publish.data.unwrap_or_default(), sequence_number: BigEndian::read_u64(&seq_no), - topics: publish.topic_ids.into_iter().map(TopicHash::from_raw).collect(), + topics: topics.collect(), }); } diff --git a/mm2src/mm2_libp2p/src/lib.rs b/mm2src/mm2_libp2p/src/lib.rs index 8027121c8f..a99841329e 100644 --- a/mm2src/mm2_libp2p/src/lib.rs +++ b/mm2src/mm2_libp2p/src/lib.rs @@ -16,7 +16,7 @@ use secp256k1::{Message as SecpMessage, PublicKey as Secp256k1Pubkey, Secp256k1, use sha2::{Digest, Sha256}; pub use atomicdex_behaviour::{spawn_gossipsub, AdexBehaviourError, NodeType, WssCerts}; -pub use atomicdex_gossipsub::{GossipsubEvent, GossipsubMessage, MessageId}; +pub use atomicdex_gossipsub::{GossipsubEvent, GossipsubMessage, MessageId, TopicHash}; pub use libp2p::identity::error::DecodingError; pub use libp2p::identity::secp256k1::PublicKey as Libp2pSecpPublic; pub use libp2p::identity::PublicKey as Libp2pPublic; diff --git a/mm2src/mm2_main/src/lp_network.rs b/mm2src/mm2_main/src/lp_network.rs index ba10ee46c3..fb2136c7ad 100644 --- a/mm2src/mm2_main/src/lp_network.rs +++ b/mm2src/mm2_main/src/lp_network.rs @@ -30,7 +30,7 @@ use mm2_libp2p::atomicdex_behaviour::{AdexBehaviourCmd, AdexBehaviourEvent, Adex AdexResponseChannel}; use mm2_libp2p::peers_exchange::PeerAddresses; use mm2_libp2p::{decode_message, encode_message, DecodingError, GossipsubMessage, Libp2pPublic, Libp2pSecpPublic, - MessageId, NetworkPorts, PeerId, TOPIC_SEPARATOR}; + MessageId, NetworkPorts, PeerId, TopicHash, TOPIC_SEPARATOR}; use mm2_metrics::{mm_label, mm_timing}; #[cfg(test)] use mocktopus::macros::*; use parking_lot::Mutex as PaMutex; @@ -39,7 +39,8 @@ use std::net::ToSocketAddrs; use std::sync::Arc; use wasm_timer::Instant; -use crate::mm2::{lp_ordermatch, lp_stats, lp_swap}; +use crate::mm2::lp_ordermatch; +use crate::mm2::{lp_stats, lp_swap}; pub type P2PRequestResult = Result>; @@ -138,36 +139,94 @@ async fn process_p2p_message( mut message: GossipsubMessage, i_am_relay: bool, ) { + fn is_valid(topics: &[TopicHash]) -> Result<(), String> { + if topics.is_empty() { + return Err("At least one topic must be provided.".to_string()); + } + + let first_topic_prefix = topics[0].as_str().split(TOPIC_SEPARATOR).next().unwrap_or_default(); + for item in topics.iter().skip(1) { + if !item.as_str().starts_with(first_topic_prefix) { + return Err(format!( + "Topics are invalid, received more than one topic kind. Topics '{:?}", + topics + )); + } + } + + Ok(()) + } + let mut to_propagate = false; - let mut orderbook_pairs = vec![]; message.topics.dedup(); drop_mutability!(message); - for topic in message.topics { + if let Err(err) = is_valid(&message.topics) { + log::error!("{}", err); + return; + } + + let inform_about_break = |used: &str, all: &[TopicHash]| { + log::debug!( + "Topic '{}' proceed and loop is killed. Whole topic list was '{:?}'", + used, + all + ); + }; + + for topic in message.topics.iter() { let mut split = topic.as_str().split(TOPIC_SEPARATOR); + match split.next() { Some(lp_ordermatch::ORDERBOOK_PREFIX) => { - if let Some(pair) = split.next() { - orderbook_pairs.push(pair.to_string()); + let fut = lp_ordermatch::handle_orderbook_msg( + ctx.clone(), + &message.topics, + peer_id.to_string(), + &message.data, + i_am_relay, + ); + + if let Err(e) = fut.await { + log::error!("{}", e); + return; } + + to_propagate = true; + break; }, Some(lp_swap::SWAP_PREFIX) => { - lp_swap::process_msg(ctx.clone(), split.next().unwrap_or_default(), &message.data).await; + if let Err(e) = lp_swap::process_msg(ctx.clone(), split.next().unwrap_or_default(), &message.data).await + { + log::error!("{}", e); + return; + } + to_propagate = true; + + inform_about_break(topic.as_str(), &message.topics); + break; }, Some(lp_swap::WATCHER_PREFIX) => { if ctx.is_watcher() { - lp_swap::process_watcher_msg(ctx.clone(), &message.data).await; + if let Err(e) = lp_swap::process_watcher_msg(ctx.clone(), &message.data) { + log::error!("{}", e); + return; + } } + to_propagate = true; + + inform_about_break(topic.as_str(), &message.topics); + break; }, Some(lp_swap::TX_HELPER_PREFIX) => { if let Some(pair) = split.next() { if let Ok(Some(coin)) = lp_coinfind(&ctx, pair).await { if let Err(e) = coin.tx_enum_from_bytes(&message.data) { log::error!("Message cannot continue the process due to: {:?}", e); - continue; + return; }; let fut = coin.send_raw_tx_bytes(&message.data); @@ -182,25 +241,14 @@ async fn process_p2p_message( }) } } + + inform_about_break(topic.as_str(), &message.topics); + break; }, None | Some(_) => (), } } - if !orderbook_pairs.is_empty() { - let process_fut = lp_ordermatch::process_msg( - ctx.clone(), - orderbook_pairs, - peer_id.to_string(), - &message.data, - i_am_relay, - ); - - if process_fut.await { - to_propagate = true; - } - } - if to_propagate && i_am_relay { propagate_message(&ctx, message_id, peer_id); } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 5fc9d248db..1bf261ef4a 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -42,7 +42,8 @@ use http::Response; use keys::{AddressFormat, KeyPair}; use mm2_core::mm_ctx::{from_ctx, MmArc, MmWeak}; use mm2_err_handle::prelude::*; -use mm2_libp2p::{decode_signed, encode_and_sign, encode_message, pub_sub_topic, TopicPrefix, TOPIC_SEPARATOR}; +use mm2_libp2p::{decode_signed, encode_and_sign, encode_message, pub_sub_topic, TopicHash, TopicPrefix, + TOPIC_SEPARATOR}; use mm2_metrics::mm_gauge; use mm2_number::{construct_detailed, BigDecimal, BigRational, Fraction, MmNumber, MmNumberMultiRepr}; #[cfg(test)] use mocktopus::macros::*; @@ -90,7 +91,8 @@ pub use lp_bot::{start_simple_market_maker_bot, stop_simple_market_maker_bot, St #[path = "lp_ordermatch/my_orders_storage.rs"] mod my_orders_storage; -#[path = "lp_ordermatch/new_protocol.rs"] mod new_protocol; +#[path = "lp_ordermatch/new_protocol.rs"] +pub(crate) mod new_protocol; #[path = "lp_ordermatch/order_requests_tracker.rs"] mod order_requests_tracker; #[path = "lp_ordermatch/orderbook_depth.rs"] mod orderbook_depth; @@ -123,6 +125,22 @@ const TRIE_ORDER_HISTORY_TIMEOUT: u64 = 300; #[cfg(test)] const TRIE_ORDER_HISTORY_TIMEOUT: u64 = 3; +pub type OrderbookP2PHandlerResult = Result<(), MmError>; + +#[derive(Display)] +pub enum OrderbookP2PHandlerError { + #[display(fmt = "'{}' is an invalid topic for the orderbook handler.", _0)] + InvalidTopic(String), + + #[display(fmt = "Message decoding was failed. Error: {}", _0)] + DecodeError(String), + + #[display(fmt = "Pubkey '{}' is not allowed.", _0)] + PubkeyNotAllowed(String), + + Internal(String), +} + /// Alphabetically ordered orderbook pair type AlbOrderedOrderbookPair = String; type PubkeyOrders = Vec<(Uuid, OrderbookP2PItem)>; @@ -468,56 +486,101 @@ fn remove_pubkey_pair_orders(orderbook: &mut Orderbook, pubkey: &str, alb_pair: pubkey_state.trie_roots.remove(alb_pair); } +pub async fn handle_orderbook_msg( + ctx: MmArc, + topics: &[TopicHash], + from_peer: String, + msg: &[u8], + i_am_relay: bool, +) -> OrderbookP2PHandlerResult { + if let Err(e) = decode_signed::(msg) { + return MmError::err(OrderbookP2PHandlerError::DecodeError(e.to_string())); + }; + + let mut orderbook_pairs = vec![]; + + for topic in topics { + let mut split = topic.as_str().split(TOPIC_SEPARATOR); + match (split.next(), split.next()) { + (Some(ORDERBOOK_PREFIX), Some(pair)) => { + orderbook_pairs.push(pair.to_string()); + }, + _ => { + return MmError::err(OrderbookP2PHandlerError::InvalidTopic(topic.as_str().to_owned())); + }, + }; + } + + if !orderbook_pairs.is_empty() { + process_msg(ctx, orderbook_pairs, from_peer, msg, i_am_relay).await?; + } + + Ok(()) +} + /// Attempts to decode a message and process it returning whether the message is valid and worth rebroadcasting -pub async fn process_msg(ctx: MmArc, _topics: Vec, from_peer: String, msg: &[u8], i_am_relay: bool) -> bool { +pub async fn process_msg( + ctx: MmArc, + _topics: Vec, + from_peer: String, + msg: &[u8], + i_am_relay: bool, +) -> OrderbookP2PHandlerResult { match decode_signed::(msg) { Ok((message, _sig, pubkey)) => { if is_pubkey_banned(&ctx, &pubkey.unprefixed().into()) { - log::warn!("Pubkey {} is banned", pubkey.to_hex()); - return false; + return MmError::err(OrderbookP2PHandlerError::PubkeyNotAllowed(pubkey.to_hex())); } match message { new_protocol::OrdermatchMessage::MakerOrderCreated(created_msg) => { let order: OrderbookItem = (created_msg, hex::encode(pubkey.to_bytes().as_slice())).into(); insert_or_update_order(&ctx, order); - true + Ok(()) }, new_protocol::OrdermatchMessage::PubkeyKeepAlive(keep_alive) => { - process_orders_keep_alive(ctx, from_peer, pubkey.to_hex(), keep_alive, i_am_relay).await + process_orders_keep_alive(ctx, from_peer, pubkey.to_hex(), keep_alive, i_am_relay) + .await + .then_some(()) + .ok_or_else(|| { + OrderbookP2PHandlerError::Internal("`process_orders_keep_alive` was failed.".to_string()) + .into() + }) }, new_protocol::OrdermatchMessage::TakerRequest(taker_request) => { let msg = TakerRequest::from_new_proto_and_pubkey(taker_request, pubkey.unprefixed().into()); process_taker_request(ctx, pubkey.unprefixed().into(), msg).await; - true + Ok(()) }, new_protocol::OrdermatchMessage::MakerReserved(maker_reserved) => { let msg = MakerReserved::from_new_proto_and_pubkey(maker_reserved, pubkey.unprefixed().into()); // spawn because process_maker_reserved may take significant time to run let spawner = ctx.spawner(); spawner.spawn(process_maker_reserved(ctx, pubkey.unprefixed().into(), msg)); - true + Ok(()) }, new_protocol::OrdermatchMessage::TakerConnect(taker_connect) => { process_taker_connect(ctx, pubkey.unprefixed().into(), taker_connect.into()).await; - true + Ok(()) }, new_protocol::OrdermatchMessage::MakerConnected(maker_connected) => { process_maker_connected(ctx, pubkey.unprefixed().into(), maker_connected.into()).await; - true + Ok(()) }, new_protocol::OrdermatchMessage::MakerOrderCancelled(cancelled_msg) => { delete_order(&ctx, &pubkey.to_hex(), cancelled_msg.uuid.into()); - true + Ok(()) }, new_protocol::OrdermatchMessage::MakerOrderUpdated(updated_msg) => { process_maker_order_updated(ctx, pubkey.to_hex(), updated_msg) + .then_some(()) + .ok_or_else(|| { + OrderbookP2PHandlerError::Internal("`process_maker_order_updated` was failed.".to_string()) + .into() + }) }, } }, - Err(e) => { - error!("Error {} while decoding signed message", e); - false - }, + Err(e) => MmError::err(OrderbookP2PHandlerError::DecodeError(e.to_string())), } } diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index 53d5c1a1e2..858b84a8cd 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -57,7 +57,8 @@ // marketmaker // -use crate::mm2::lp_network::{broadcast_p2p_msg, Libp2pPeerId}; +use super::lp_network::P2PRequestResult; +use crate::mm2::lp_network::{broadcast_p2p_msg, Libp2pPeerId, P2PRequestError}; use bitcrypto::{dhash160, sha256}; use coins::eth::Web3RpcError; use coins::{lp_coinfind, lp_coinfind_or_err, CoinFindError, MmCoinEnum, TradeFee, TransactionEnum}; @@ -97,7 +98,7 @@ use std::sync::atomic::{AtomicU64, Ordering}; #[path = "lp_swap/recreate_swap_data.rs"] mod recreate_swap_data; #[path = "lp_swap/saved_swap.rs"] mod saved_swap; #[path = "lp_swap/swap_lock.rs"] mod swap_lock; -#[path = "lp_swap/swap_watcher.rs"] mod swap_watcher; +#[path = "lp_swap/swap_watcher.rs"] pub(crate) mod swap_watcher; #[path = "lp_swap/taker_swap.rs"] mod taker_swap; #[path = "lp_swap/trade_preimage.rs"] mod trade_preimage; @@ -236,11 +237,8 @@ pub fn broadcast_p2p_tx_msg(ctx: &MmArc, topic: String, msg: &TransactionEnum, p broadcast_p2p_msg(ctx, vec![topic], encoded_msg, from); } -pub async fn process_msg(ctx: MmArc, topic: &str, msg: &[u8]) { - let uuid = match Uuid::from_str(topic) { - Ok(u) => u, - Err(_) => return, - }; +pub async fn process_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequestResult<()> { + let uuid = Uuid::from_str(topic).map_to_mm(|e| P2PRequestError::DecodeError(e.to_string()))?; let msg = match decode_signed::(msg) { Ok(m) => m, @@ -258,9 +256,7 @@ pub async fn process_msg(ctx: MmArc, topic: &str, msg: &[u8]) { error!("Couldn't deserialize 'SwapStatus': {:?}", swap_status_err); }, }; - // Drop it to avoid dead_code warning - drop(swap_msg_err); - return; + return MmError::err(P2PRequestError::DecodeError(swap_msg_err.to_string())); }, }; @@ -280,7 +276,9 @@ pub async fn process_msg(ctx: MmArc, topic: &str, msg: &[u8]) { } else { warn!("Received message from unexpected sender for swap {}", uuid); } - } + }; + + Ok(()) } pub fn swap_topic(uuid: &Uuid) -> String { pub_sub_topic(SWAP_PREFIX, &uuid.to_string()) } diff --git a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs index 7441a4a855..536e8fc691 100644 --- a/mm2src/mm2_main/src/lp_swap/swap_watcher.rs +++ b/mm2src/mm2_main/src/lp_swap/swap_watcher.rs @@ -1,5 +1,6 @@ use super::{broadcast_p2p_tx_msg, get_payment_locktime, lp_coinfind, min_watcher_reward, taker_payment_spend_deadline, tx_helper_topic, H256Json, SwapsContext, WAIT_CONFIRM_INTERVAL}; +use crate::mm2::lp_network::{P2PRequestError, P2PRequestResult}; use crate::mm2::MmError; use async_trait::async_trait; use coins::{CanRefundHtlc, ConfirmPaymentInput, FoundSwapTxSpend, MmCoinEnum, RefundPaymentArgs, @@ -11,6 +12,7 @@ use common::state_machine::prelude::*; use common::{now_ms, DEX_FEE_ADDR_RAW_PUBKEY}; use futures::compat::Future01CompatExt; use mm2_core::mm_ctx::MmArc; +use mm2_err_handle::prelude::MapToMmResult; use mm2_libp2p::{decode_signed, pub_sub_topic, TopicPrefix}; use serde::{Deserialize, Serialize}; use serde_json as json; @@ -513,16 +515,8 @@ impl LastState for Stopped { async fn on_changed(self: Box, _watcher_ctx: &mut Self::Ctx) -> Self::Result {} } -pub async fn process_watcher_msg(ctx: MmArc, msg: &[u8]) { - let msg = match decode_signed::(msg) { - Ok(m) => m, - Err(watcher_msg_err) => { - error!("Couldn't deserialize 'SwapWatcherMsg': {:?}", watcher_msg_err); - // Drop it to avoid dead_code warning - drop(watcher_msg_err); - return; - }, - }; +pub fn process_watcher_msg(ctx: MmArc, msg: &[u8]) -> P2PRequestResult<()> { + let msg = decode_signed::(msg).map_to_mm(|e| P2PRequestError::DecodeError(e.to_string()))?; let watcher_data = msg.0; let verified_pubkey = msg.2; @@ -530,7 +524,9 @@ pub async fn process_watcher_msg(ctx: MmArc, msg: &[u8]) { SwapWatcherMsg::TakerSwapWatcherMsg(watcher_data) => { spawn_taker_swap_watcher(ctx, watcher_data, verified_pubkey.to_bytes()) }, - } + }; + + Ok(()) } /// Currently, Taker Swap Watcher is supported only. From 0da7d9ef8f7b959d115123178c9be1fc9715b2c7 Mon Sep 17 00:00:00 2001 From: ozkanonur Date: Mon, 17 Apr 2023 14:31:58 +0300 Subject: [PATCH 2/9] update default gas limit for tendermint Signed-off-by: ozkanonur --- mm2src/coins/tendermint/tendermint_coin.rs | 2 +- .../dummy_files/iris_nimda_history.json | 20 ++++++------ .../dummy_files/iris_test_history.json | 32 +++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 594508a3af..6e5b4dad32 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -92,7 +92,7 @@ const ABCI_REQUEST_PROVE: bool = false; /// 0.25 is good average gas price on atom and iris const DEFAULT_GAS_PRICE: f64 = 0.25; pub(super) const TIMEOUT_HEIGHT_DELTA: u64 = 100; -pub const GAS_LIMIT_DEFAULT: u64 = 100_000; +pub const GAS_LIMIT_DEFAULT: u64 = 125_000; pub(crate) const TX_DEFAULT_MEMO: &str = ""; // https://github.com/irisnet/irismod/blob/5016c1be6fdbcffc319943f33713f4a057622f0a/modules/htlc/types/validation.go#L19-L22 diff --git a/mm2src/mm2_test_helpers/dummy_files/iris_nimda_history.json b/mm2src/mm2_test_helpers/dummy_files/iris_nimda_history.json index c3a6ff1580..e75d8aaf5a 100644 --- a/mm2src/mm2_test_helpers/dummy_files/iris_nimda_history.json +++ b/mm2src/mm2_test_helpers/dummy_files/iris_nimda_history.json @@ -16,7 +16,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.027385", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "3930374535314439384537304239343431413230443630420000000000000000", @@ -45,7 +45,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.028433", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "4138433845353931363133303743353941344143374536320000000000000000", @@ -74,7 +74,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026403", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "3436313245464444363537373544434341433838463935340000000000000000", @@ -103,7 +103,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.028433", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "3931453345363544374341333833394331463141394435320000000000000000", @@ -134,7 +134,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.025763", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "3643343243423346353232433844414333343138443338440000000000000000", @@ -162,7 +162,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.022114", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "4631313139343742323142303344373639303343333441370000000000000000", @@ -190,7 +190,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026861", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "3236413546344639343144434531363135373046373530330000000000000000", @@ -218,7 +218,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026861", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "4344413036444433353735413332323330363430414634310000000000000000", @@ -246,7 +246,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.022114", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "4339384239303045393643333738453237333945314344330000000000000000", @@ -274,7 +274,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.02316", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-NIMDA", "internal_id": "4136303630343838314237323638453734433246453537450000000000000000", diff --git a/mm2src/mm2_test_helpers/dummy_files/iris_test_history.json b/mm2src/mm2_test_helpers/dummy_files/iris_test_history.json index 6577282ea3..a5cc44de43 100644 --- a/mm2src/mm2_test_helpers/dummy_files/iris_test_history.json +++ b/mm2src/mm2_test_helpers/dummy_files/iris_test_history.json @@ -18,7 +18,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.022145", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3338384245443830413744344633314337443043303141460000000000000000", @@ -42,7 +42,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.027215", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3644333931323846453142423238354542363542413237300000000000000000", @@ -71,7 +71,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.027385", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "0000000000000000423036443032413134343942303745383944313545373039", @@ -95,7 +95,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.028433", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "0000000000000000323645374341344139354337303331363139354538433841", @@ -119,7 +119,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026403", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "0000000000000000343539463838434143434435373735364444464532313634", @@ -143,7 +143,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.02856", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3533313331314334433333384341323539443144423441380000000000000000", @@ -174,7 +174,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.022085", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3332313535443541424134344134343736463332363433370000000000000000", @@ -198,7 +198,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026446", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3945383530394438433442384645464138413133443235320000000000000000", @@ -227,7 +227,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026426", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "4538314545353844354538344630413743344437364142360000000000000000", @@ -256,7 +256,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.028455", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "4135353530353436314138373531433631443333364331460000000000000000", @@ -285,7 +285,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.02648", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "4444394136304639344533383037313336353232394430310000000000000000", @@ -314,7 +314,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.028433", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "0000000000000000323544394131463143393338334143374435364533453139", @@ -338,7 +338,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.025763", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "0000000000000000443833443831343343414438433232354633424332344336", @@ -364,7 +364,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026861", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3236413546344639343144434531363135373046373530330000000000000001", @@ -390,7 +390,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.026861", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "4344413036444433353735413332323330363430414634310000000000000001", @@ -416,7 +416,7 @@ "type": "Tendermint", "coin": "IRIS-TEST", "amount": "0.2", - "gas_limit": 100000 + "gas_limit": 125000 }, "coin": "IRIS-TEST", "internal_id": "3846394537344334443745414531314244303741424145410000000000000000", From 292614fb9d039c4e932536f0c5e9f992fef63075 Mon Sep 17 00:00:00 2001 From: ozkanonur Date: Tue, 18 Apr 2023 00:46:16 +0300 Subject: [PATCH 3/9] rollback topic limit Signed-off-by: ozkanonur --- CHANGELOG.md | 1 - mm2src/gossipsub/src/protocol.rs | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06ae155dfb..d296f166ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,6 @@ - p2p stack is improved [#1755](https://github.com/KomodoPlatform/atomicDEX-API/pull/1755) - - Validate topics if they are mixed or not. - - Do early return if the message data is not valid (since no point to iterate over and over on the invalid message) -- - Avoid decoding messages that have more than 25 topics - - Break the loop right after processing any of `SWAP_PREFIX`, `WATCHER_PREFIX`, `TX_HELPER_PREFIX` topic. diff --git a/mm2src/gossipsub/src/protocol.rs b/mm2src/gossipsub/src/protocol.rs index a580821d87..1173a89b22 100644 --- a/mm2src/gossipsub/src/protocol.rs +++ b/mm2src/gossipsub/src/protocol.rs @@ -212,8 +212,6 @@ impl Decoder for GossipsubCodec { type Error = io::Error; fn decode(&mut self, src: &mut BytesMut) -> Result, Self::Error> { - const MAX_TOPICS: usize = 25; - let packet = some_or_return_ok_none!(self.length_codec.decode(src)?); let rpc = rpc_proto::Rpc::decode(&packet[..])?; @@ -230,25 +228,12 @@ impl Decoder for GossipsubCodec { "sequence number has an incorrect size", )); } - - let topics = publish.topic_ids.into_iter().map(TopicHash::from_raw); - if topics.len() > MAX_TOPICS { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!( - "Too many topics provided. Allowed topic count: {}, Received topic count: {}", - MAX_TOPICS, - topics.len() - ), - )); - } - messages.push(GossipsubMessage { source: PeerId::from_bytes(&publish.from.unwrap_or_default()) .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid Peer Id"))?, data: publish.data.unwrap_or_default(), sequence_number: BigEndian::read_u64(&seq_no), - topics: topics.collect(), + topics: publish.topic_ids.into_iter().map(TopicHash::from_raw).collect(), }); } From 86ee2b53b7ce6e788463fe258324ebc7723f4073 Mon Sep 17 00:00:00 2001 From: ozkanonur Date: Tue, 18 Apr 2023 19:17:07 +0300 Subject: [PATCH 4/9] remove unused arg from `lp_ordermatch::process_msg` Signed-off-by: ozkanonur --- mm2src/mm2_main/src/lp_ordermatch.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 1bf261ef4a..f4e7f309ed 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -511,21 +511,17 @@ pub async fn handle_orderbook_msg( }; } + drop_mutability!(orderbook_pairs); + if !orderbook_pairs.is_empty() { - process_msg(ctx, orderbook_pairs, from_peer, msg, i_am_relay).await?; + process_msg(ctx, from_peer, msg, i_am_relay).await?; } Ok(()) } /// Attempts to decode a message and process it returning whether the message is valid and worth rebroadcasting -pub async fn process_msg( - ctx: MmArc, - _topics: Vec, - from_peer: String, - msg: &[u8], - i_am_relay: bool, -) -> OrderbookP2PHandlerResult { +pub async fn process_msg(ctx: MmArc, from_peer: String, msg: &[u8], i_am_relay: bool) -> OrderbookP2PHandlerResult { match decode_signed::(msg) { Ok((message, _sig, pubkey)) => { if is_pubkey_banned(&ctx, &pubkey.unprefixed().into()) { From 87cd284a4ce11c267801c02d2d031e30a9fe9e5b Mon Sep 17 00:00:00 2001 From: shamardy Date: Wed, 19 Apr 2023 00:08:20 +0200 Subject: [PATCH 5/9] use OrderbookP2PHandlerResult for process_orders_keep_alive and process_maker_order_updated --- mm2src/mm2_main/src/lp_network.rs | 6 +- mm2src/mm2_main/src/lp_ordermatch.rs | 89 ++++++++++++++++------------ 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/mm2src/mm2_main/src/lp_network.rs b/mm2src/mm2_main/src/lp_network.rs index fb2136c7ad..88a78df2f0 100644 --- a/mm2src/mm2_main/src/lp_network.rs +++ b/mm2src/mm2_main/src/lp_network.rs @@ -189,7 +189,11 @@ async fn process_p2p_message( ); if let Err(e) = fut.await { - log::error!("{}", e); + if e.get_inner().is_warning() { + log::warn!("{}", e); + } else { + log::error!("{}", e); + } return; } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index f4e7f309ed..4b1a3f52fc 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -62,7 +62,8 @@ use std::time::Duration; use trie_db::NodeCodec as NodeCodecT; use uuid::Uuid; -use crate::mm2::lp_network::{broadcast_p2p_msg, request_any_relay, request_one_peer, subscribe_to_topic, P2PRequest}; +use crate::mm2::lp_network::{broadcast_p2p_msg, request_any_relay, request_one_peer, subscribe_to_topic, P2PRequest, + P2PRequestError}; use crate::mm2::lp_swap::{calc_max_maker_vol, check_balance_for_maker_swap, check_balance_for_taker_swap, check_other_coin_balance_for_swap, get_max_maker_vol, insert_new_swap_to_db, is_pubkey_banned, lp_atomic_locktime, p2p_keypair_and_peer_id_to_broadcast, @@ -138,9 +139,26 @@ pub enum OrderbookP2PHandlerError { #[display(fmt = "Pubkey '{}' is not allowed.", _0)] PubkeyNotAllowed(String), + #[display(fmt = "P2P request error: {}", _0)] + P2PRequestError(String), + + #[display( + fmt = "Couldn't find an order {}, ignoring, it will be synced upon pubkey keep alive", + _0 + )] + OrderNotFound(Uuid), + Internal(String), } +impl OrderbookP2PHandlerError { + pub(crate) fn is_warning(&self) -> bool { matches!(self, OrderbookP2PHandlerError::OrderNotFound(_)) } +} + +impl From for OrderbookP2PHandlerError { + fn from(e: P2PRequestError) -> Self { OrderbookP2PHandlerError::P2PRequestError(e.to_string()) } +} + /// Alphabetically ordered orderbook pair type AlbOrderedOrderbookPair = String; type PubkeyOrders = Vec<(Uuid, OrderbookP2PItem)>; @@ -265,7 +283,7 @@ async fn process_orders_keep_alive( from_pubkey: String, keep_alive: new_protocol::PubkeyKeepAlive, i_am_relay: bool, -) -> bool { +) -> OrderbookP2PHandlerResult { let ordermatch_ctx = OrdermatchContext::from_ctx(&ctx).expect("from_ctx failed"); let to_request = ordermatch_ctx .orderbook @@ -275,17 +293,21 @@ async fn process_orders_keep_alive( let req = match to_request { Some(req) => req, // The message was processed, simply forward it - None => return true, + None => return Ok(()), }; - let resp = - request_one_peer::(ctx.clone(), P2PRequest::Ordermatch(req), propagated_from_peer) - .await; - - let response = match resp { - Ok(Some(resp)) => resp, - _ => return false, - }; + let response = request_one_peer::( + ctx.clone(), + P2PRequest::Ordermatch(req), + propagated_from_peer.clone(), + ) + .await? + .ok_or_else(|| { + MmError::new(OrderbookP2PHandlerError::P2PRequestError(format!( + "No response was received from peer {} for SyncPubkeyOrderbookState request!", + propagated_from_peer + ))) + })?; let mut orderbook = ordermatch_ctx.orderbook.lock(); for (pair, diff) in response.pair_orders_diff { @@ -300,27 +322,27 @@ async fn process_orders_keep_alive( DeltaOrFullTrie::FullTrie(values) => process_pubkey_full_trie(&mut orderbook, values, params), }; } - true + + Ok(()) } -fn process_maker_order_updated(ctx: MmArc, from_pubkey: String, updated_msg: new_protocol::MakerOrderUpdated) -> bool { +fn process_maker_order_updated( + ctx: MmArc, + from_pubkey: String, + updated_msg: new_protocol::MakerOrderUpdated, +) -> OrderbookP2PHandlerResult { let ordermatch_ctx = OrdermatchContext::from_ctx(&ctx).expect("from_ctx failed"); let uuid = updated_msg.uuid(); let mut orderbook = ordermatch_ctx.orderbook.lock(); - match orderbook.find_order_by_uuid_and_pubkey(&uuid, &from_pubkey) { - Some(mut order) => { - order.apply_updated(&updated_msg); - orderbook.insert_or_update_order_update_trie(order); - true - }, - None => { - log::warn!( - "Couldn't find an order {}, ignoring, it will be synced upon pubkey keep alive", - uuid - ); - false - }, - } + + let mut order = orderbook + .find_order_by_uuid_and_pubkey(&uuid, &from_pubkey) + .ok_or_else(|| MmError::new(OrderbookP2PHandlerError::OrderNotFound(uuid)))?; + order.apply_updated(&updated_msg); + drop_mutability!(order); + orderbook.insert_or_update_order_update_trie(order); + + Ok(()) } // fn verify_pubkey_orderbook(orderbook: &GetOrderbookPubkeyItem) -> Result<(), String> { @@ -534,13 +556,7 @@ pub async fn process_msg(ctx: MmArc, from_peer: String, msg: &[u8], i_am_relay: Ok(()) }, new_protocol::OrdermatchMessage::PubkeyKeepAlive(keep_alive) => { - process_orders_keep_alive(ctx, from_peer, pubkey.to_hex(), keep_alive, i_am_relay) - .await - .then_some(()) - .ok_or_else(|| { - OrderbookP2PHandlerError::Internal("`process_orders_keep_alive` was failed.".to_string()) - .into() - }) + process_orders_keep_alive(ctx, from_peer, pubkey.to_hex(), keep_alive, i_am_relay).await }, new_protocol::OrdermatchMessage::TakerRequest(taker_request) => { let msg = TakerRequest::from_new_proto_and_pubkey(taker_request, pubkey.unprefixed().into()); @@ -568,11 +584,6 @@ pub async fn process_msg(ctx: MmArc, from_peer: String, msg: &[u8], i_am_relay: }, new_protocol::OrdermatchMessage::MakerOrderUpdated(updated_msg) => { process_maker_order_updated(ctx, pubkey.to_hex(), updated_msg) - .then_some(()) - .ok_or_else(|| { - OrderbookP2PHandlerError::Internal("`process_maker_order_updated` was failed.".to_string()) - .into() - }) }, } }, From 240506f460995a70e6fbc864f0a802e7a8171978 Mon Sep 17 00:00:00 2001 From: shamardy Date: Thu, 20 Apr 2023 02:03:09 +0200 Subject: [PATCH 6/9] return one error for failed SwapMsg, SwapStatus deserialization --- mm2src/mm2_main/src/lp_network.rs | 3 ++- mm2src/mm2_main/src/lp_swap.rs | 18 +++++++++++------- .../tests/mm2_tests/mm2_tests_inner.rs | 9 ++++++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/mm2src/mm2_main/src/lp_network.rs b/mm2src/mm2_main/src/lp_network.rs index 88a78df2f0..c1c58a722c 100644 --- a/mm2src/mm2_main/src/lp_network.rs +++ b/mm2src/mm2_main/src/lp_network.rs @@ -201,7 +201,8 @@ async fn process_p2p_message( break; }, Some(lp_swap::SWAP_PREFIX) => { - if let Err(e) = lp_swap::process_msg(ctx.clone(), split.next().unwrap_or_default(), &message.data).await + if let Err(e) = + lp_swap::process_swap_msg(ctx.clone(), split.next().unwrap_or_default(), &message.data).await { log::error!("{}", e); return; diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index 858b84a8cd..6cf441f8a0 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -237,26 +237,30 @@ pub fn broadcast_p2p_tx_msg(ctx: &MmArc, topic: String, msg: &TransactionEnum, p broadcast_p2p_msg(ctx, vec![topic], encoded_msg, from); } -pub async fn process_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequestResult<()> { +pub async fn process_swap_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequestResult<()> { let uuid = Uuid::from_str(topic).map_to_mm(|e| P2PRequestError::DecodeError(e.to_string()))?; let msg = match decode_signed::(msg) { Ok(m) => m, - Err(swap_msg_err) => { + Err(swap_msg_err) => + { #[cfg(not(target_arch = "wasm32"))] - match json::from_slice::(msg) { + return match json::from_slice::(msg) { Ok(mut status) => { status.data.fetch_and_set_usd_prices().await; if let Err(e) = save_stats_swap(&ctx, &status.data).await { error!("Error saving the swap {} status: {}", status.data.uuid(), e); } + Ok(()) }, Err(swap_status_err) => { - error!("Couldn't deserialize 'SwapMsg': {:?}", swap_msg_err); - error!("Couldn't deserialize 'SwapStatus': {:?}", swap_status_err); + let error = format!( + "Couldn't deserialize swap msg to either 'SwapMsg': {} or to 'SwapStatus': {}", + swap_msg_err, swap_status_err + ); + MmError::err(P2PRequestError::DecodeError(error)) }, - }; - return MmError::err(P2PRequestError::DecodeError(swap_msg_err.to_string())); + } }, }; diff --git a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs index eb7dc91735..be706d1ccb 100644 --- a/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs +++ b/mm2src/mm2_main/tests/mm2_tests/mm2_tests_inner.rs @@ -894,7 +894,14 @@ fn trade_test_electrum_and_eth_coins() { let bob_policy = Mm2InitPrivKeyPolicy::Iguana; let alice_policy = Mm2InitPrivKeyPolicy::GlobalHDAccount(0); let pairs = &[("ETH", "JST")]; - block_on(trade_base_rel_electrum(bob_policy, alice_policy, pairs, 1., 2., 0.01)); + block_on(trade_base_rel_electrum( + bob_policy, + alice_policy, + pairs, + 1., + 2., + 0.000001, + )); } #[test] From 1233e9b4b4bc84fa8abe54fc22240616a49423a5 Mon Sep 17 00:00:00 2001 From: shamardy Date: Thu, 20 Apr 2023 02:27:13 +0200 Subject: [PATCH 7/9] fix process_swap_msg in wasm to return error if SwapMsg can't be deserialized --- mm2src/mm2_main/src/lp_swap.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index 6cf441f8a0..6a5d349311 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -242,8 +242,7 @@ pub async fn process_swap_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequest let msg = match decode_signed::(msg) { Ok(m) => m, - Err(swap_msg_err) => - { + Err(swap_msg_err) => { #[cfg(not(target_arch = "wasm32"))] return match json::from_slice::(msg) { Ok(mut status) => { @@ -260,7 +259,12 @@ pub async fn process_swap_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequest ); MmError::err(P2PRequestError::DecodeError(error)) }, - } + }; + #[cfg(target_arch = "wasm32")] + return MmError::err(P2PRequestError::DecodeError(format!( + "Couldn't deserialize 'SwapMsg': {}", + swap_msg_err + ))); }, }; From 24e5f56800d814d3ebcb39aee8f4c3c31ea1b88b Mon Sep 17 00:00:00 2001 From: shamardy Date: Thu, 20 Apr 2023 02:30:57 +0200 Subject: [PATCH 8/9] remove additional space in SwapMsg, SwapStatus decode error message --- mm2src/mm2_main/src/lp_swap.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm2src/mm2_main/src/lp_swap.rs b/mm2src/mm2_main/src/lp_swap.rs index 6a5d349311..280ed7babc 100644 --- a/mm2src/mm2_main/src/lp_swap.rs +++ b/mm2src/mm2_main/src/lp_swap.rs @@ -254,12 +254,13 @@ pub async fn process_swap_msg(ctx: MmArc, topic: &str, msg: &[u8]) -> P2PRequest }, Err(swap_status_err) => { let error = format!( - "Couldn't deserialize swap msg to either 'SwapMsg': {} or to 'SwapStatus': {}", + "Couldn't deserialize swap msg to either 'SwapMsg': {} or to 'SwapStatus': {}", swap_msg_err, swap_status_err ); MmError::err(P2PRequestError::DecodeError(error)) }, }; + #[cfg(target_arch = "wasm32")] return MmError::err(P2PRequestError::DecodeError(format!( "Couldn't deserialize 'SwapMsg': {}", From 3fbe5791f9b68ff884c6254de03989ec89092fcb Mon Sep 17 00:00:00 2001 From: shamardy Date: Thu, 20 Apr 2023 20:53:31 +0200 Subject: [PATCH 9/9] roll back crate visibility for new_protocol mod --- mm2src/mm2_main/src/lp_ordermatch.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index 4b1a3f52fc..ff55085d61 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -92,8 +92,7 @@ pub use lp_bot::{start_simple_market_maker_bot, stop_simple_market_maker_bot, St #[path = "lp_ordermatch/my_orders_storage.rs"] mod my_orders_storage; -#[path = "lp_ordermatch/new_protocol.rs"] -pub(crate) mod new_protocol; +#[path = "lp_ordermatch/new_protocol.rs"] mod new_protocol; #[path = "lp_ordermatch/order_requests_tracker.rs"] mod order_requests_tracker; #[path = "lp_ordermatch/orderbook_depth.rs"] mod orderbook_depth;