X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fcli.rs;h=bfea9d25072b1ec053c70369aa7eb0c26f6ba867;hb=93d3b7942b2a0a4990e5a93fda262f9edb671364;hp=603e6a9ad117e5ec5218143ec58a4a799f300b67;hpb=fed8e61327521ff288be20787d89665d475e09b8;p=ldk-sample diff --git a/src/cli.rs b/src/cli.rs index 603e6a9..bfea9d2 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -4,6 +4,7 @@ use crate::{ ChannelManager, FilesystemLogger, HTLCStatus, MillisatAmount, PaymentInfo, PaymentInfoStorage, PeerManager, }; +use bitcoin::hashes::Hash; use bitcoin::network::constants::Network; use bitcoin::secp256k1::key::PublicKey; use lightning::chain; @@ -33,14 +34,14 @@ pub(crate) struct LdkUserInfo { pub(crate) bitcoind_rpc_host: String, pub(crate) ldk_storage_dir_path: String, pub(crate) ldk_peer_listening_port: u16, - pub(crate) ldk_announced_listen_addr: Option, + pub(crate) ldk_announced_listen_addr: Vec, pub(crate) ldk_announced_node_name: [u8; 32], pub(crate) network: Network, } pub(crate) fn parse_startup_args() -> Result { if env::args().len() < 3 { - println!("ldk-tutorial-node requires 3 arguments: `cargo run :@: ldk_storage_directory_path [] [bitcoin-network] [announced-listen-addr announced-node-name]`"); + println!("ldk-tutorial-node requires 3 arguments: `cargo run :@: ldk_storage_directory_path [] [bitcoin-network] [announced-node-name announced-listen-addr*]`"); return Err(()); } let bitcoind_rpc_info = env::args().skip(1).next().unwrap(); @@ -76,7 +77,7 @@ pub(crate) fn parse_startup_args() -> Result { } }; - let arg_idx = match ldk_peer_port_set { + let mut arg_idx = match ldk_peer_port_set { true => 4, false => 3, }; @@ -87,24 +88,12 @@ pub(crate) fn parse_startup_args() -> Result { None => Network::Testnet, }; - let ldk_announced_listen_addr = match env::args().skip(arg_idx + 1).next().as_ref() { - Some(s) => match IpAddr::from_str(s) { - Ok(IpAddr::V4(a)) => { - Some(NetAddress::IPv4 { addr: a.octets(), port: ldk_peer_listening_port }) - } - Ok(IpAddr::V6(a)) => { - Some(NetAddress::IPv6 { addr: a.octets(), port: ldk_peer_listening_port }) - } - Err(_) => panic!("Failed to parse announced-listen-addr into an IP address"), - }, - None => None, - }; - - let ldk_announced_node_name = match env::args().skip(arg_idx + 2).next().as_ref() { + let ldk_announced_node_name = match env::args().skip(arg_idx + 1).next().as_ref() { Some(s) => { if s.len() > 32 { panic!("Node Alias can not be longer than 32 bytes"); } + arg_idx += 1; let mut bytes = [0; 32]; bytes[..s.len()].copy_from_slice(s.as_bytes()); bytes @@ -112,6 +101,26 @@ pub(crate) fn parse_startup_args() -> Result { None => [0; 32], }; + let mut ldk_announced_listen_addr = Vec::new(); + loop { + match env::args().skip(arg_idx + 1).next().as_ref() { + Some(s) => match IpAddr::from_str(s) { + Ok(IpAddr::V4(a)) => { + ldk_announced_listen_addr + .push(NetAddress::IPv4 { addr: a.octets(), port: ldk_peer_listening_port }); + arg_idx += 1; + } + Ok(IpAddr::V6(a)) => { + ldk_announced_listen_addr + .push(NetAddress::IPv6 { addr: a.octets(), port: ldk_peer_listening_port }); + arg_idx += 1; + } + Err(_) => panic!("Failed to parse announced-listen-addr into an IP address"), + }, + None => break, + } + } + Ok(LdkUserInfo { bitcoind_rpc_username, bitcoind_rpc_password, @@ -240,23 +249,9 @@ pub(crate) async fn poll_for_user_input( let payee_pubkey = invoice.recover_payee_pub_key(); let final_cltv = invoice.min_final_cltv_expiry() as u32; - - let mut payment_hash = PaymentHash([0; 32]); - payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]); - - let payment_secret = match invoice.payment_secret() { - Some(secret) => { - let mut payment_secret = PaymentSecret([0; 32]); - payment_secret.0.copy_from_slice(&secret.0); - Some(payment_secret) - } - None => None, - }; - - let invoice_features = match invoice.features() { - Some(feat) => Some(feat.clone()), - None => None, - }; + let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner()); + let payment_secret = invoice.payment_secret().cloned(); + let invoice_features = invoice.features().cloned(); send_payment( payee_pubkey, @@ -484,24 +479,21 @@ pub(crate) async fn connect_peer_if_necessary( } match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), pubkey, peer_addr).await { - Some(conn_closed_fut) => { - let mut closed_fut_box = Box::pin(conn_closed_fut); - let mut peer_connected = false; - while !peer_connected { - match futures::poll!(&mut closed_fut_box) { + Some(connection_closed_future) => { + let mut connection_closed_future = Box::pin(connection_closed_future); + loop { + match futures::poll!(&mut connection_closed_future) { std::task::Poll::Ready(_) => { println!("ERROR: Peer disconnected before we finished the handshake"); return Err(()); } std::task::Poll::Pending => {} } - for node_pubkey in peer_manager.get_peer_node_ids() { - if node_pubkey == pubkey { - peer_connected = true; - } - } // Avoid blocking the tokio context by sleeping a bit - tokio::time::sleep(Duration::from_millis(10)).await; + match peer_manager.get_peer_node_ids().iter().find(|id| **id == pubkey) { + Some(_) => break, + None => tokio::time::sleep(Duration::from_millis(10)).await, + } } } None => { @@ -616,16 +608,12 @@ fn get_invoice( } }; - let mut payment_hash = PaymentHash([0; 32]); - payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]); + let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner()); payments.insert( payment_hash, PaymentInfo { preimage: None, - // We can't add payment secrets to invoices until we support features in invoices. - // Otherwise lnd errors with "destination hop doesn't understand payment addresses" - // (for context, lnd calls payment secrets "payment addresses"). - secret: Some(invoice.payment_secret().unwrap().clone()), + secret: invoice.payment_secret().cloned(), status: HTLCStatus::Pending, amt_msat: MillisatAmount(Some(amt_msat)), },