WIP Integrate rendezvous protocol into ASB

- missing: finish re-registration
- pass in external address to connect to (atm uses listening addresses which won't work)
rendezvous-asb-refactor
rishflab 3 years ago committed by Daniel Karzel
parent 8fb20db33e
commit 76c0031253
No known key found for this signature in database
GPG Key ID: 30C3FC2E438ADB6E

193
Cargo.lock generated

@ -119,9 +119,9 @@ version = "0.1.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -261,9 +261,9 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b45570b78250774145859a8f85bfdb6e310663fc82640d7e159a44b1386074a2"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -617,7 +617,7 @@ dependencies = [
"ansi_term 0.11.0",
"atty",
"bitflags",
"strsim",
"strsim 0.8.0",
"textwrap",
"unicode-width",
"vec_map",
@ -844,6 +844,41 @@ dependencies = [
"zeroize",
]
[[package]]
name = "darling"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12"
dependencies = [
"darling_core",
"darling_macro",
]
[[package]]
name = "darling_core"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3"
dependencies = [
"fnv",
"ident_case",
"proc-macro2 1.0.27",
"quote 1.0.9",
"strsim 0.10.0",
"syn 1.0.73",
]
[[package]]
name = "darling_macro"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc"
dependencies = [
"darling_core",
"quote 1.0.9",
"syn 1.0.73",
]
[[package]]
name = "data-encoding"
version = "2.3.2"
@ -856,9 +891,9 @@ version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -1038,9 +1073,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595"
dependencies = [
"heck",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -1181,9 +1216,9 @@ checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121"
dependencies = [
"autocfg 1.0.1",
"proc-macro-hack",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -1531,6 +1566,12 @@ dependencies = [
"webpki",
]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
version = "0.1.5"
@ -1714,7 +1755,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5f3d1e50fefe4252d2e44c805663e73a8c0b2002b73f834ea055c8ed7fc46a8"
dependencies = [
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -1724,7 +1765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97c11e429f0eaa41fe659013680b459d2368d8f0a3e69dccfb7a35800b0dc27b"
dependencies = [
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -1961,7 +2002,7 @@ version = "0.23.0"
source = "git+https://github.com/comit-network/rust-libp2p?branch=rendezvous#c3cd411cedb12eab72ba26b08c43c2467a8fd8e9"
dependencies = [
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -2209,9 +2250,9 @@ version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19ce18b5423c573a13e80cb3046ea0af6379ef725dc3af4886bdb8f4e5093068"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -2370,9 +2411,9 @@ checksum = "85ee3c48cb9d9b275ad967a0e96715badc13c6029adb92f34fa17b9ff28fd81f"
dependencies = [
"proc-macro-crate",
"proc-macro-error",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"synstructure",
]
@ -2653,9 +2694,9 @@ version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -2664,9 +2705,9 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -2767,9 +2808,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"version_check 0.9.3",
]
@ -2779,7 +2820,7 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"version_check 0.9.3",
]
@ -2807,9 +2848,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.24"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038"
dependencies = [
"unicode-xid 0.2.1",
]
@ -2870,9 +2911,9 @@ checksum = "169a15f3008ecb5160cba7d37bcd690a7601b6d30cfb87a117d45e59d52af5d4"
dependencies = [
"anyhow",
"itertools 0.9.0",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -2933,7 +2974,7 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
]
[[package]]
@ -3550,9 +3591,9 @@ version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3578,6 +3619,29 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_with"
version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad9fdbb69badc8916db738c25efd04f0a65297d26c2f8de4b62e57b8c12bc72"
dependencies = [
"rustversion",
"serde",
"serde_with_macros",
]
[[package]]
name = "serde_with_macros"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1569374bd54623ec8bd592cf22ba6e03c0f177ff55fbc8c29a49e296e7adecf"
dependencies = [
"darling",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.73",
]
[[package]]
name = "serial_test"
version = "0.4.0"
@ -3595,9 +3659,9 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d08338d8024b227c62bd68a12c7c9883f5c66780abaef15c550dc56f46ee6515"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3839,11 +3903,11 @@ version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"serde",
"serde_derive",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3853,13 +3917,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
dependencies = [
"base-x",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"serde",
"serde_derive",
"serde_json",
"sha1",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3874,6 +3938,12 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "structopt"
version = "0.3.21"
@ -3893,9 +3963,9 @@ checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3914,9 +3984,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb076d8b589fde927ec90d05920d610554ca3a4d9dddb177481cadd071a19c2e"
dependencies = [
"heck",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -3983,6 +4053,7 @@ dependencies = [
"serde",
"serde_cbor",
"serde_json",
"serde_with",
"sha2 0.9.5",
"sigma_fun",
"sled",
@ -4023,11 +4094,11 @@ dependencies = [
[[package]]
name = "syn"
version = "1.0.64"
version = "1.0.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f"
checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"unicode-xid 0.2.1",
]
@ -4038,9 +4109,9 @@ version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"unicode-xid 0.2.1",
]
@ -4134,9 +4205,9 @@ version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -4190,10 +4261,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa"
dependencies = [
"proc-macro-hack",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"standback",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -4246,9 +4317,9 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -4393,9 +4464,9 @@ version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
]
[[package]]
@ -4778,9 +4849,9 @@ dependencies = [
"bumpalo",
"lazy_static",
"log 0.4.14",
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"wasm-bindgen-shared",
]
@ -4812,9 +4883,9 @@ version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc053ec74d454df287b9374ee8abb36ffd5acb95ba87da3ba5b7d3fe20eb401e"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -5005,9 +5076,9 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16"
dependencies = [
"proc-macro2 1.0.24",
"proc-macro2 1.0.27",
"quote 1.0.9",
"syn 1.0.64",
"syn 1.0.73",
"synstructure",
]

@ -45,6 +45,7 @@ rust_decimal_macros = "1"
serde = { version = "1", features = [ "derive" ] }
serde_cbor = "0.11"
serde_json = "1"
serde_with = { version = "1.9.4", features = [ "macros" ] }
sha2 = "0.9"
sigma_fun = { git = "https://github.com/LLFourn/secp256kfun", default-features = false, features = [ "ed25519", "serde" ] }
sled = "0.34"

@ -6,9 +6,11 @@ use crate::network::swap_setup::alice::WalletSnapshot;
use crate::network::{encrypted_signature, quote, transfer_proof};
use crate::protocol::alice::State3;
use anyhow::{anyhow, Error};
use libp2p::identity::Keypair;
use libp2p::ping::{Ping, PingEvent};
use libp2p::rendezvous::{Event, Namespace, RegisterError};
use libp2p::request_response::{RequestId, ResponseChannel};
use libp2p::{NetworkBehaviour, PeerId};
use libp2p::{rendezvous, NetworkBehaviour, PeerId};
use uuid::Uuid;
#[derive(Debug)]
@ -42,6 +44,12 @@ pub enum OutEvent {
peer: PeerId,
error: Error,
},
Registered {
rendezvous_node: PeerId,
ttl: u64,
namespace: Namespace,
},
RegisterFailed(RegisterError),
/// "Fallback" variant that allows the event mapping code to swallow certain
/// events that we don't want the caller to deal with.
Other,
@ -71,6 +79,7 @@ pub struct Behaviour<LR>
where
LR: LatestRate + Send + 'static,
{
pub rendezvous: rendezvous::Rendezvous,
pub quote: quote::Behaviour,
pub swap_setup: alice::Behaviour<LR>,
pub transfer_proof: transfer_proof::Behaviour,
@ -92,8 +101,10 @@ where
latest_rate: LR,
resume_only: bool,
env_config: env::Config,
keypair: Keypair,
) -> Self {
Self {
rendezvous: rendezvous::Rendezvous::new(keypair, rendezvous::Config::default()),
quote: quote::asb(),
swap_setup: alice::Behaviour::new(
min_buy,
@ -114,3 +125,28 @@ impl From<PingEvent> for OutEvent {
OutEvent::Other
}
}
impl From<rendezvous::Event> for OutEvent {
fn from(event: rendezvous::Event) -> Self {
match event {
Event::Discovered { .. } => unreachable!("The ASB does not discover other nodes"),
Event::DiscoverFailed { .. } => unreachable!("The ASB does not discover other nodes"),
Event::Registered {
rendezvous_node,
ttl,
namespace,
} => OutEvent::Registered {
rendezvous_node,
ttl,
namespace,
},
Event::RegisterFailed(error) => OutEvent::RegisterFailed(error),
Event::DiscoverServed { .. } => unreachable!("ASB does not act as rendezvous node"),
Event::DiscoverNotServed { .. } => unreachable!("ASB does not act as rendezvous node"),
Event::PeerRegistered { .. } => unreachable!("ASB does not act as rendezvous node"),
Event::PeerNotRegistered { .. } => unreachable!("ASB does not act as rendezvous node"),
Event::PeerUnregistered { .. } => unreachable!("ASB does not act as rendezvous node"),
Event::RegistrationExpired(_) => unreachable!("ASB does not act as rendezvous node"),
}
}
}

@ -6,9 +6,11 @@ use config::ConfigError;
use dialoguer::theme::ColorfulTheme;
use dialoguer::Input;
use libp2p::core::Multiaddr;
use libp2p::PeerId;
use rust_decimal::prelude::FromPrimitive;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, DisplayFromStr};
use std::ffi::OsStr;
use std::fs;
use std::path::{Path, PathBuf};
@ -81,6 +83,13 @@ fn default_asb_data_dir() -> Result<PathBuf> {
.context("Could not generate default config file path")
}
// TODO: update this to the actual deployed rendezvous server
// Currently set to Staging ASB on raspi
const DEFAULT_RENDEZVOUS_PEER_ID: &str = "12D3KooWPZ69DRp4wbGB3wJsxxsg1XW1EVZ2evtVwcARCF3a1nrx";
// TODO: update this to the actual deployed rendezvous server
// Port still to be opened once running rendezvous node
const DEFAULT_RENDEZVOUS_ADDR: &str = "/ip4/141.168.172.35/tcp/7654";
const DEFAULT_MIN_BUY_AMOUNT: f64 = 0.002f64;
const DEFAULT_MAX_BUY_AMOUNT: f64 = 0.02f64;
const DEFAULT_SPREAD: f64 = 0.02f64;
@ -93,6 +102,7 @@ pub struct Config {
pub monero: Monero,
pub tor: TorConf,
pub maker: Maker,
pub rendezvous_node: Rendezvous,
}
impl Config {
@ -157,6 +167,14 @@ pub struct Maker {
pub price_ticker_ws_url: Url,
}
#[serde_as]
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Rendezvous {
pub addr: Multiaddr,
#[serde_as(as = "DisplayFromStr")]
pub peer_id: PeerId,
}
impl Default for TorConf {
fn default() -> Self {
Self {
@ -285,6 +303,18 @@ pub fn query_user_for_initial_config(testnet: bool) -> Result<Config> {
}
let ask_spread = Decimal::from_f64(ask_spread).context("Unable to parse spread")?;
let rendezvous_peer_id_str = Input::with_theme(&ColorfulTheme::default())
.with_prompt("Enter the peer id of the rendezvous node you wish to register with")
.default(DEFAULT_RENDEZVOUS_PEER_ID.to_string())
.interact_text()?;
let rendezvous_peer_id = PeerId::from_str(rendezvous_peer_id_str.as_str())?;
let rendezvous_addr_str = Input::with_theme(&ColorfulTheme::default())
.with_prompt("Enter the multiaddress of the rendezvous node you wish to register with")
.default(DEFAULT_RENDEZVOUS_ADDR.to_string())
.interact_text()?;
let rendezvous_addr = Multiaddr::from_str(rendezvous_addr_str.as_str())?;
println!();
Ok(Config {
@ -313,6 +343,10 @@ pub fn query_user_for_initial_config(testnet: bool) -> Result<Config> {
ask_spread,
price_ticker_ws_url: defaults.price_ticker_ws_url,
},
rendezvous_node: Rendezvous {
addr: rendezvous_addr,
peer_id: rendezvous_peer_id,
},
})
}
@ -354,6 +388,10 @@ mod tests {
ask_spread: Decimal::from_f64(DEFAULT_SPREAD).unwrap(),
price_ticker_ws_url: defaults.price_ticker_ws_url,
},
rendezvous_node: Rendezvous {
addr: DEFAULT_RENDEZVOUS_ADDR.parse().unwrap(),
peer_id: PeerId::from_str(DEFAULT_RENDEZVOUS_PEER_ID).unwrap(),
},
};
initial_setup(config_path.clone(), expected.clone()).unwrap();
@ -395,6 +433,10 @@ mod tests {
ask_spread: Decimal::from_f64(DEFAULT_SPREAD).unwrap(),
price_ticker_ws_url: defaults.price_ticker_ws_url,
},
rendezvous_node: Rendezvous {
addr: DEFAULT_RENDEZVOUS_ADDR.parse().unwrap(),
peer_id: PeerId::from_str(DEFAULT_RENDEZVOUS_PEER_ID).unwrap(),
},
};
initial_setup(config_path.clone(), expected.clone()).unwrap();

@ -1,16 +1,17 @@
use crate::asb::behaviour::{Behaviour, OutEvent};
use crate::asb::Rate;
use crate::database::Database;
use crate::env::Config;
use crate::network::quote::BidQuote;
use crate::network::swap_setup::alice::WalletSnapshot;
use crate::network::transfer_proof;
use crate::protocol::alice::{AliceState, State3, Swap};
use crate::{bitcoin, kraken, monero};
use crate::rendezvous::XmrBtcNamespace;
use crate::{bitcoin, env, kraken, monero};
use anyhow::{Context, Result};
use futures::future;
use futures::future::{BoxFuture, FutureExt};
use futures::stream::{FuturesUnordered, StreamExt};
use libp2p::rendezvous::Namespace;
use libp2p::request_response::{RequestId, ResponseChannel};
use libp2p::swarm::SwarmEvent;
use libp2p::{PeerId, Swarm};
@ -19,6 +20,7 @@ use std::collections::HashMap;
use std::convert::Infallible;
use std::fmt::Debug;
use std::sync::Arc;
use std::time::{Duration, Instant};
use tokio::sync::mpsc;
use uuid::Uuid;
@ -38,7 +40,7 @@ where
LR: LatestRate + Send + 'static + Debug + Clone,
{
swarm: libp2p::Swarm<Behaviour<LR>>,
env_config: Config,
env_config: env::Config,
bitcoin_wallet: Arc<bitcoin::Wallet>,
monero_wallet: Arc<monero::Wallet>,
db: Arc<Database>,
@ -61,6 +63,13 @@ where
/// Tracks [`transfer_proof::Request`]s which are currently inflight and
/// awaiting an acknowledgement.
inflight_transfer_proofs: HashMap<RequestId, bmrng::Responder<()>>,
// TODO: Potentially group together, potentially the whole rendezvous handling could go into a
// separate swarm? There is no dependency between swap and registration, so we could just
// build this completely separate.
rendezvous_node_peer_id: PeerId,
rendezvous_namespace: XmrBtcNamespace,
rendezvous_reregister_timestamp: Option<Instant>,
}
impl<LR> EventLoop<LR>
@ -70,13 +79,15 @@ where
#[allow(clippy::too_many_arguments)]
pub fn new(
swarm: Swarm<Behaviour<LR>>,
env_config: Config,
env_config: env::Config,
bitcoin_wallet: Arc<bitcoin::Wallet>,
monero_wallet: Arc<monero::Wallet>,
db: Arc<Database>,
latest_rate: LR,
min_buy: bitcoin::Amount,
max_buy: bitcoin::Amount,
rendezvous_node_peer_id: PeerId,
rendezvous_namespace: XmrBtcNamespace,
) -> Result<(Self, mpsc::Receiver<Swap>)> {
let swap_channel = MpscChannels::default();
@ -95,6 +106,9 @@ where
send_transfer_proof: Default::default(),
buffered_transfer_proofs: Default::default(),
inflight_transfer_proofs: Default::default(),
rendezvous_node_peer_id,
rendezvous_namespace,
rendezvous_reregister_timestamp: None,
};
Ok((event_loop, swap_channel.receiver))
}
@ -246,6 +260,23 @@ where
channel
}.boxed());
}
Some(SwarmEvent::Behaviour(OutEvent::Registered { rendezvous_node, ttl, namespace })) => {
// TODO: this can most likely not happen at all, potentially remove these checks
if rendezvous_node != self.rendezvous_node_peer_id {
tracing::warn!(peer_id=%rendezvous_node, "Ignoring message from unknown rendezvous node");
continue;
}
// TODO: Consider implementing From for Namespace and XmrBtcNamespace
if namespace.to_string() != self.rendezvous_namespace.to_string() {
tracing::warn!(peer_id=%rendezvous_node, %namespace, "Ignoring message from rendezvous node for unknown namespace");
continue;
}
// record re-registration after half the ttl has expired
self.rendezvous_reregister_timestamp = Some(Instant::now() + Duration::from_secs(ttl) / 2);
}
Some(SwarmEvent::Behaviour(OutEvent::Failure {peer, error})) => {
tracing::error!(
%peer,
@ -262,6 +293,19 @@ where
self.inflight_transfer_proofs.insert(id, responder);
}
}
if peer == self.rendezvous_node_peer_id {
match self
.swarm
.behaviour_mut()
.rendezvous
.register(Namespace::new(self.rendezvous_namespace.to_string()).expect("our namespace to be a correct string"), self.rendezvous_node_peer_id, None) {
Ok(()) => {},
Err(err) => {
tracing::error!("Sending registration to rendezvous failed: {:#}", err);
}
}
}
}
Some(SwarmEvent::IncomingConnectionError { send_back_addr: address, error, .. }) => {
tracing::warn!(%address, "Failed to set up connection with peer. Error {:#}", error);

@ -15,6 +15,7 @@
use anyhow::{bail, Context, Result};
use libp2p::core::multiaddr::Protocol;
use libp2p::core::Multiaddr;
use libp2p::swarm::AddressScore;
use libp2p::Swarm;
use prettytable::{row, Table};
use std::env;
@ -31,6 +32,7 @@ use swap::database::Database;
use swap::monero::Amount;
use swap::network::swarm;
use swap::protocol::alice::run;
use swap::rendezvous::XmrBtcNamespace;
use swap::seed::Seed;
use swap::tor::AuthenticatedClient;
use swap::{asb, bitcoin, kraken, monero, tor};
@ -153,13 +155,29 @@ async fn main() -> Result<()> {
env_config,
)?;
for listen in config.network.listen {
for listen in config.network.listen.clone() {
Swarm::listen_on(&mut swarm, listen.clone())
.with_context(|| format!("Failed to listen on network interface {}", listen))?;
Swarm::add_external_address(&mut swarm, listen.clone(), AddressScore::Infinite);
}
tracing::info!(peer_id = %swarm.local_peer_id(), "Network layer initialized");
Swarm::dial_addr(&mut swarm, config.rendezvous_node.addr.clone()).with_context(
|| {
format!(
"Failed to dial rendezvous node addr {}",
config.rendezvous_node.addr
)
},
)?;
let namespace = if testnet {
XmrBtcNamespace::Testnet
} else {
XmrBtcNamespace::Mainnet
};
let (event_loop, mut swap_receiver) = EventLoop::new(
swarm,
env_config,
@ -169,6 +187,8 @@ async fn main() -> Result<()> {
kraken_rate.clone(),
config.maker.min_buy_btc,
config.maker.max_buy_btc,
config.rendezvous_node.peer_id,
namespace,
)
.unwrap();

@ -10,5 +10,5 @@ pub mod transport;
pub use behaviour::{Behaviour, OutEvent};
pub use cancel::cancel;
pub use event_loop::{EventLoop, EventLoopHandle};
pub use list_sellers::{list_sellers, XmrBtcNamespace};
pub use list_sellers::list_sellers;
pub use refund::refund;

@ -1,6 +1,6 @@
use crate::cli::list_sellers::XmrBtcNamespace;
use crate::env::GetConfig;
use crate::fs::system_data_dir;
use crate::rendezvous::XmrBtcNamespace;
use crate::{env, monero};
use anyhow::{Context, Result};
use libp2p::core::Multiaddr;

@ -1,5 +1,6 @@
use crate::network::quote::BidQuote;
use crate::network::{quote, swarm};
use crate::rendezvous::XmrBtcNamespace;
use anyhow::Result;
use futures::StreamExt;
use libp2p::multiaddr::Protocol;
@ -8,7 +9,6 @@ use libp2p::request_response::{RequestResponseEvent, RequestResponseMessage};
use libp2p::swarm::SwarmEvent;
use libp2p::{identity, rendezvous, Multiaddr, PeerId, Swarm};
use std::collections::HashMap;
use std::fmt::{Display, Formatter};
pub async fn list_sellers(
rendezvous_node_peer_id: PeerId,
@ -42,21 +42,6 @@ pub struct Seller {
pub quote: BidQuote,
}
#[derive(Debug, PartialEq)]
pub enum XmrBtcNamespace {
Mainnet,
Testnet,
}
impl Display for XmrBtcNamespace {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
XmrBtcNamespace::Mainnet => write!(f, "xmr-btc-swap-mainnet"),
XmrBtcNamespace::Testnet => write!(f, "xmr-btc-swap-mainnet"),
}
}
}
#[derive(Debug)]
pub enum OutEvent {
Rendezvous(rendezvous::Event),

@ -26,6 +26,7 @@ pub mod kraken;
pub mod monero;
pub mod network;
pub mod protocol;
pub mod rendezvous;
pub mod seed;
pub mod tor;

@ -18,9 +18,17 @@ pub fn asb<LR>(
where
LR: LatestRate + Send + 'static + Debug + Clone,
{
let behaviour = asb::Behaviour::new(min_buy, max_buy, latest_rate, resume_only, env_config);
let identity = seed.derive_libp2p_identity();
let behaviour = asb::Behaviour::new(
min_buy,
max_buy,
latest_rate,
resume_only,
env_config,
identity.clone(),
);
let transport = asb::transport::new(&identity)?;
let peer_id = identity.public().into_peer_id();

@ -0,0 +1,16 @@
use std::fmt::{Display, Formatter};
#[derive(Debug, PartialEq)]
pub enum XmrBtcNamespace {
Mainnet,
Testnet,
}
impl Display for XmrBtcNamespace {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
XmrBtcNamespace::Mainnet => write!(f, "xmr-btc-swap-mainnet"),
XmrBtcNamespace::Testnet => write!(f, "xmr-btc-swap-mainnet"),
}
}
}

@ -22,6 +22,7 @@ use swap::network::swarm;
use swap::protocol::alice::{AliceState, Swap};
use swap::protocol::bob::BobState;
use swap::protocol::{alice, bob};
use swap::rendezvous::XmrBtcNamespace;
use swap::seed::Seed;
use swap::{asb, bitcoin, cli, env, monero};
use tempfile::tempdir;
@ -249,6 +250,8 @@ async fn start_alice(
FixedRate::default(),
min_buy,
max_buy,
PeerId::random(),
XmrBtcNamespace::Testnet,
)
.unwrap();

Loading…
Cancel
Save