mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2025-05-17 22:20:32 -04:00
Listen on tcp and websocket transports
- Listen on both tcp and websockets as default - Listening addresses in config as array - Configure fallback transport using `or_transport` - if listening on a given address fails on WS, we fall back to TCP.
This commit is contained in:
parent
2e3f052417
commit
f70e2aa8d6
6 changed files with 108 additions and 12 deletions
|
@ -27,7 +27,7 @@ directories-next = "2"
|
|||
ecdsa_fun = { git = "https://github.com/LLFourn/secp256kfun", features = ["libsecp_compat", "serde"] }
|
||||
futures = { version = "0.3", default-features = false }
|
||||
itertools = "0.10"
|
||||
libp2p = { version = "0.36", default-features = false, features = ["tcp-tokio", "yamux", "mplex", "dns-tokio", "noise", "request-response"] }
|
||||
libp2p = { version = "0.36", default-features = false, features = ["tcp-tokio", "yamux", "mplex", "dns-tokio", "noise", "request-response", "websocket"] }
|
||||
libp2p-async-await = { git = "https://github.com/comit-network/rust-libp2p-async-await" }
|
||||
miniscript = { version = "5", features = ["serde"] }
|
||||
monero = { version = "0.11", features = ["serde_support"] }
|
||||
|
|
|
@ -11,7 +11,8 @@ use std::path::{Path, PathBuf};
|
|||
use tracing::info;
|
||||
use url::Url;
|
||||
|
||||
const DEFAULT_LISTEN_ADDRESS: &str = "/ip4/0.0.0.0/tcp/9939";
|
||||
const DEFAULT_LISTEN_ADDRESS_TCP: &str = "/ip4/0.0.0.0/tcp/9939";
|
||||
const DEFAULT_LISTEN_ADDRESS_WS: &str = "/ip4/0.0.0.0/tcp/9940/ws";
|
||||
const DEFAULT_ELECTRUM_RPC_URL: &str = "ssl://electrum.blockstream.info:60002";
|
||||
const DEFAULT_MONERO_WALLET_RPC_TESTNET_URL: &str = "http://127.0.0.1:38083/json_rpc";
|
||||
|
||||
|
@ -45,7 +46,7 @@ pub struct Data {
|
|||
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct Network {
|
||||
pub listen: Multiaddr,
|
||||
pub listen: Vec<Multiaddr>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
||||
|
@ -112,11 +113,14 @@ pub fn query_user_for_initial_testnet_config() -> Result<Config> {
|
|||
.interact_text()?;
|
||||
let data_dir = data_dir.as_str().parse()?;
|
||||
|
||||
let listen_address = Input::with_theme(&ColorfulTheme::default())
|
||||
.with_prompt("Enter multiaddress on which asb should list for peer-to-peer communications or hit return to use default")
|
||||
.default(DEFAULT_LISTEN_ADDRESS.to_owned())
|
||||
let listen_addresses = Input::with_theme(&ColorfulTheme::default())
|
||||
.with_prompt("Enter multiaddresses (comma separated) on which asb should list for peer-to-peer communications or hit return to use default")
|
||||
.default( format!("{},{}", DEFAULT_LISTEN_ADDRESS_TCP, DEFAULT_LISTEN_ADDRESS_WS))
|
||||
.interact_text()?;
|
||||
let listen_address = listen_address.as_str().parse()?;
|
||||
let listen_addresses = listen_addresses
|
||||
.split(',')
|
||||
.map(|str| str.parse())
|
||||
.collect::<Result<Vec<Multiaddr>, _>>()?;
|
||||
|
||||
let electrum_rpc_url: String = Input::with_theme(&ColorfulTheme::default())
|
||||
.with_prompt("Enter Electrum RPC URL or hit return to use default")
|
||||
|
@ -134,7 +138,7 @@ pub fn query_user_for_initial_testnet_config() -> Result<Config> {
|
|||
Ok(Config {
|
||||
data: Data { dir: data_dir },
|
||||
network: Network {
|
||||
listen: listen_address,
|
||||
listen: listen_addresses,
|
||||
},
|
||||
bitcoin: Bitcoin { electrum_rpc_url },
|
||||
monero: Monero {
|
||||
|
@ -162,7 +166,10 @@ mod tests {
|
|||
electrum_rpc_url: Url::from_str(DEFAULT_ELECTRUM_RPC_URL).unwrap(),
|
||||
},
|
||||
network: Network {
|
||||
listen: DEFAULT_LISTEN_ADDRESS.parse().unwrap(),
|
||||
listen: vec![
|
||||
DEFAULT_LISTEN_ADDRESS_TCP.parse().unwrap(),
|
||||
DEFAULT_LISTEN_ADDRESS_WS.parse().unwrap(),
|
||||
],
|
||||
},
|
||||
|
||||
monero: Monero {
|
||||
|
|
|
@ -98,8 +98,11 @@ async fn main() -> Result<()> {
|
|||
let kraken_price_updates = kraken::connect()?;
|
||||
|
||||
let mut swarm = swarm::alice(&seed)?;
|
||||
Swarm::listen_on(&mut swarm, config.network.listen)
|
||||
.context("Failed to listen network interface")?;
|
||||
|
||||
for listen in config.network.listen {
|
||||
Swarm::listen_on(&mut swarm, listen.clone())
|
||||
.with_context(|| format!("Failed to listen on network interface {}", listen))?;
|
||||
}
|
||||
|
||||
let (event_loop, mut swap_receiver) = EventLoop::new(
|
||||
swarm,
|
||||
|
|
|
@ -6,11 +6,13 @@ use libp2p::core::{identity, Transport};
|
|||
use libp2p::dns::TokioDnsConfig;
|
||||
use libp2p::mplex::MplexConfig;
|
||||
use libp2p::noise::{self, NoiseConfig, X25519Spec};
|
||||
use libp2p::websocket::WsConfig;
|
||||
use libp2p::{yamux, PeerId};
|
||||
use std::time::Duration;
|
||||
|
||||
/// Builds a libp2p transport with the following features:
|
||||
/// - TcpConnection
|
||||
/// - WebSocketConnection
|
||||
/// - DNS name resolution
|
||||
/// - authentication via noise
|
||||
/// - multiplexing via yamux or mplex
|
||||
|
@ -22,8 +24,10 @@ pub fn build(id_keys: &identity::Keypair) -> Result<SwapTransport> {
|
|||
|
||||
let tcp = TokioTcpConfig::new().nodelay(true);
|
||||
let dns = TokioDnsConfig::system(tcp)?;
|
||||
let websocket = WsConfig::new(dns.clone());
|
||||
|
||||
let transport = dns
|
||||
let transport = websocket
|
||||
.or_transport(dns)
|
||||
.upgrade(Version::V1)
|
||||
.authenticate(noise)
|
||||
.multiplex(SelectUpgrade::new(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue