X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fevents.rs;h=df2532e4c4a755cfa4218b297b000aa47ef69fb9;hb=46b68c517dba57bde545ea8e56b47fe3af768579;hp=37c64364b1817bf89e4477ce650a70f52ba0b938;hpb=d66574803e08c65db0e5cec66a3ac7ba5a68bf4f;p=rust-lightning diff --git a/lightning/src/util/events.rs b/lightning/src/util/events.rs index 37c64364..df2532e4 100644 --- a/lightning/src/util/events.rs +++ b/lightning/src/util/events.rs @@ -20,7 +20,7 @@ use ln::msgs::DecodeError; use ln::{PaymentPreimage, PaymentHash, PaymentSecret}; use routing::network_graph::NetworkUpdate; use util::ser::{BigSize, FixedLengthReader, Writeable, Writer, MaybeReadable, Readable, VecReadWrapper, VecWriteWrapper}; -use routing::router::RouteHop; +use routing::router::{PaymentPathRetry, RouteHop}; use bitcoin::blockdata::script::Script; use bitcoin::hashes::Hash; @@ -146,7 +146,10 @@ pub enum Event { channel_value_satoshis: u64, /// The script which should be used in the transaction output. output_script: Script, - /// The value passed in to ChannelManager::create_channel + /// The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for + /// an inbound channel. + /// + /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel user_channel_id: u64, }, /// Indicates we've received money! Just gotta dig out that payment preimage and feed it to @@ -208,6 +211,18 @@ pub enum Event { all_paths_failed: bool, /// The payment path that failed. path: Vec, + /// The channel responsible for the failed payment path. + /// + /// If this is `Some`, then the corresponding channel should be avoided when the payment is + /// retried. May be `None` for older [`Event`] serializations. + short_channel_id: Option, + /// Parameters needed to re-compute a [`Route`] for retrying the failed path. + /// + /// See [`get_retry_route`] for details. + /// + /// [`Route`]: crate::routing::router::Route + /// [`get_retry_route`]: crate::routing::router::get_retry_route + retry: Option, #[cfg(test)] error_code: Option, #[cfg(test)] @@ -257,6 +272,12 @@ pub enum Event { /// The channel_id of the channel which has been closed. Note that on-chain transactions /// resolving the channel are likely still awaiting confirmation. channel_id: [u8; 32], + /// The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for + /// an inbound channel. This will always be zero for objects serialized with LDK versions + /// prior to 0.0.102. + /// + /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel + user_channel_id: u64, /// The reason the channel was closed. reason: ClosureReason }, @@ -308,8 +329,9 @@ impl Writeable for Event { (1, payment_hash, required), }); }, - &Event::PaymentPathFailed { ref payment_hash, ref rejected_by_dest, ref network_update, - ref all_paths_failed, ref path, + &Event::PaymentPathFailed { + ref payment_hash, ref rejected_by_dest, ref network_update, + ref all_paths_failed, ref path, ref short_channel_id, ref retry, #[cfg(test)] ref error_code, #[cfg(test)] @@ -326,6 +348,8 @@ impl Writeable for Event { (2, rejected_by_dest, required), (3, all_paths_failed, required), (5, path, vec_type), + (7, short_channel_id, option), + (9, retry, option), }); }, &Event::PendingHTLCsForwardable { time_forwardable: _ } => { @@ -346,10 +370,11 @@ impl Writeable for Event { (2, claim_from_onchain_tx, required), }); }, - &Event::ChannelClosed { ref channel_id, ref reason } => { + &Event::ChannelClosed { ref channel_id, ref user_channel_id, ref reason } => { 9u8.write(writer)?; write_tlv_fields!(writer, { (0, channel_id, required), + (1, user_channel_id, required), (2, reason, required) }); }, @@ -435,12 +460,16 @@ impl MaybeReadable for Event { let mut network_update = None; let mut all_paths_failed = Some(true); let mut path: Option> = Some(vec![]); + let mut short_channel_id = None; + let mut retry = None; read_tlv_fields!(reader, { (0, payment_hash, required), (1, network_update, ignorable), (2, rejected_by_dest, required), (3, all_paths_failed, option), (5, path, vec_type), + (7, short_channel_id, ignorable), + (9, retry, option), }); Ok(Some(Event::PaymentPathFailed { payment_hash, @@ -448,6 +477,8 @@ impl MaybeReadable for Event { network_update, all_paths_failed: all_paths_failed.unwrap(), path: path.unwrap(), + short_channel_id, + retry, #[cfg(test)] error_code, #[cfg(test)] @@ -480,23 +511,32 @@ impl MaybeReadable for Event { f() }, 9u8 => { - let mut channel_id = [0; 32]; - let mut reason = None; - read_tlv_fields!(reader, { - (0, channel_id, required), - (2, reason, ignorable), - }); - if reason.is_none() { return Ok(None); } - Ok(Some(Event::ChannelClosed { channel_id, reason: reason.unwrap() })) + let f = || { + let mut channel_id = [0; 32]; + let mut reason = None; + let mut user_channel_id_opt = None; + read_tlv_fields!(reader, { + (0, channel_id, required), + (1, user_channel_id_opt, option), + (2, reason, ignorable), + }); + if reason.is_none() { return Ok(None); } + let user_channel_id = if let Some(id) = user_channel_id_opt { id } else { 0 }; + Ok(Some(Event::ChannelClosed { channel_id, user_channel_id, reason: reason.unwrap() })) + }; + f() }, 11u8 => { - let mut channel_id = [0; 32]; - let mut transaction = Transaction{ version: 2, lock_time: 0, input: Vec::new(), output: Vec::new() }; - read_tlv_fields!(reader, { - (0, channel_id, required), - (2, transaction, required), - }); - Ok(Some(Event::DiscardFunding { channel_id, transaction } )) + let f = || { + let mut channel_id = [0; 32]; + let mut transaction = Transaction{ version: 2, lock_time: 0, input: Vec::new(), output: Vec::new() }; + read_tlv_fields!(reader, { + (0, channel_id, required), + (2, transaction, required), + }); + Ok(Some(Event::DiscardFunding { channel_id, transaction } )) + }; + f() }, // Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue. // Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt