X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Fmsgs.rs;h=61e18648a58878877596649d17b7f52450a90d70;hb=fe25bbb44ea879e6b84e0cd6f62fd53058d77417;hp=c971df906c281fc96fd852c483def81367618ee2;hpb=b156371d45cb3f25131468b82352902a66024933;p=rust-lightning diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index c971df90..61e18648 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -40,7 +40,7 @@ use core::fmt::Debug; use crate::io::{self, Read}; use crate::io_extras::read_to_end; -use crate::util::events::{MessageSendEventsProvider, OnionMessageProvider}; +use crate::events::{MessageSendEventsProvider, OnionMessageProvider}; use crate::util::logger; use crate::util::ser::{LengthReadable, Readable, ReadableArgs, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname}; @@ -51,6 +51,11 @@ use crate::routing::gossip::NodeId; /// 21 million * 10^8 * 1000 pub(crate) const MAX_VALUE_MSAT: u64 = 21_000_000_0000_0000_000; +#[cfg(taproot)] +/// A partial signature that also contains the Musig2 nonce its signer used +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PartialSignatureWithNonce(pub musig2::types::PartialSignature, pub musig2::types::PublicNonce); + /// An error in decoding a message or struct. #[derive(Clone, Debug, PartialEq, Eq)] pub enum DecodeError { @@ -244,6 +249,9 @@ pub struct AcceptChannel { /// our feature bits with our counterparty's feature bits from the [`Init`] message. /// This is required to match the equivalent field in [`OpenChannel::channel_type`]. pub channel_type: Option, + #[cfg(taproot)] + /// Next nonce the channel initiator should use to create a funding output signature against + pub next_local_nonce: Option, } /// A [`funding_created`] message to be sent to or received from a peer. @@ -259,6 +267,12 @@ pub struct FundingCreated { pub funding_output_index: u16, /// The signature of the channel initiator (funder) on the initial commitment transaction pub signature: Signature, + #[cfg(taproot)] + /// The partial signature of the channel initiator (funder) + pub partial_signature_with_nonce: Option, + #[cfg(taproot)] + /// Next nonce the channel acceptor should use to finalize the funding output signature + pub next_local_nonce: Option } /// A [`funding_signed`] message to be sent to or received from a peer. @@ -270,6 +284,9 @@ pub struct FundingSigned { pub channel_id: [u8; 32], /// The signature of the channel acceptor (fundee) on the initial commitment transaction pub signature: Signature, + #[cfg(taproot)] + /// The partial signature of the channel acceptor (fundee) + pub partial_signature_with_nonce: Option, } /// A [`channel_ready`] message to be sent to or received from a peer. @@ -409,6 +426,9 @@ pub struct CommitmentSigned { pub signature: Signature, /// Signatures on the HTLC transactions pub htlc_signatures: Vec, + #[cfg(taproot)] + /// The partial Taproot signature on the commitment transaction + pub partial_signature_with_nonce: Option, } /// A [`revoke_and_ack`] message to be sent to or received from a peer. @@ -939,7 +959,7 @@ pub struct CommitmentUpdate { /// [`OptionalField`] simply gets `Present` if there are enough bytes to read into it), we have a /// separate enum type for them. /// -/// (C-not exported) due to a free generic in `T` +/// This is not exported to bindings users due to a free generic in `T` #[derive(Clone, Debug, PartialEq, Eq)] pub enum OptionalField { /// Optional field is included in message @@ -993,21 +1013,15 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider { fn handle_announcement_signatures(&self, their_node_id: &PublicKey, msg: &AnnouncementSignatures); // Connection loss/reestablish: - /// Indicates a connection to the peer failed/an existing connection was lost. If no connection - /// is believed to be possible in the future (eg they're sending us messages we don't - /// understand or indicate they require unknown feature bits), `no_connection_possible` is set - /// and any outstanding channels should be failed. - /// - /// Note that in some rare cases this may be called without a corresponding - /// [`Self::peer_connected`]. - fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool); + /// Indicates a connection to the peer failed/an existing connection was lost. + fn peer_disconnected(&self, their_node_id: &PublicKey); /// Handle a peer reconnecting, possibly generating `channel_reestablish` message(s). /// /// May return an `Err(())` if the features the peer supports are not sufficient to communicate /// with us. Implementors should be somewhat conservative about doing so, however, as other /// message handlers may still wish to communicate with this peer. - fn peer_connected(&self, their_node_id: &PublicKey, msg: &Init) -> Result<(), ()>; + fn peer_connected(&self, their_node_id: &PublicKey, msg: &Init, inbound: bool) -> Result<(), ()>; /// Handle an incoming `channel_reestablish` message from the given peer. fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish); @@ -1065,7 +1079,7 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider { /// May return an `Err(())` if the features the peer supports are not sufficient to communicate /// with us. Implementors should be somewhat conservative about doing so, however, as other /// message handlers may still wish to communicate with this peer. - fn peer_connected(&self, their_node_id: &PublicKey, init: &Init) -> Result<(), ()>; + fn peer_connected(&self, their_node_id: &PublicKey, init: &Init, inbound: bool) -> Result<(), ()>; /// Handles the reply of a query we initiated to learn about channels /// for a given range of blocks. We can expect to receive one or more /// replies to a single query. @@ -1082,6 +1096,13 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider { /// list of `short_channel_id`s. fn handle_query_short_channel_ids(&self, their_node_id: &PublicKey, msg: QueryShortChannelIds) -> Result<(), LightningError>; + // Handler queueing status: + /// Indicates that there are a large number of [`ChannelAnnouncement`] (or other) messages + /// pending some async action. While there is no guarantee of the rate of future messages, the + /// caller should seek to reduce the rate of new gossip messages handled, especially + /// [`ChannelAnnouncement`]s. + fn processing_queue_high(&self) -> bool; + // Handler information: /// Gets the node feature flags which this handler itself supports. All available handlers are /// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`] @@ -1105,13 +1126,10 @@ pub trait OnionMessageHandler : OnionMessageProvider { /// May return an `Err(())` if the features the peer supports are not sufficient to communicate /// with us. Implementors should be somewhat conservative about doing so, however, as other /// message handlers may still wish to communicate with this peer. - fn peer_connected(&self, their_node_id: &PublicKey, init: &Init) -> Result<(), ()>; + fn peer_connected(&self, their_node_id: &PublicKey, init: &Init, inbound: bool) -> Result<(), ()>; /// Indicates a connection to the peer failed/an existing connection was lost. Allows handlers to /// drop and refuse to forward onion messages to this peer. - /// - /// Note that in some rare cases this may be called without a corresponding - /// [`Self::peer_connected`]. - fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool); + fn peer_disconnected(&self, their_node_id: &PublicKey); // Handler information: /// Gets the node feature flags which this handler itself supports. All available handlers are @@ -1290,7 +1308,28 @@ impl Readable for OptionalField { } } +#[cfg(not(taproot))] +impl_writeable_msg!(AcceptChannel, { + temporary_channel_id, + dust_limit_satoshis, + max_htlc_value_in_flight_msat, + channel_reserve_satoshis, + htlc_minimum_msat, + minimum_depth, + to_self_delay, + max_accepted_htlcs, + funding_pubkey, + revocation_basepoint, + payment_point, + delayed_payment_basepoint, + htlc_basepoint, + first_per_commitment_point, + shutdown_scriptpubkey +}, { + (1, channel_type, option), +}); +#[cfg(taproot)] impl_writeable_msg!(AcceptChannel, { temporary_channel_id, dust_limit_satoshis, @@ -1309,6 +1348,7 @@ impl_writeable_msg!(AcceptChannel, { shutdown_scriptpubkey }, { (1, channel_type, option), + (4, next_local_nonce, option), }); impl_writeable_msg!(AnnouncementSignatures, { @@ -1365,30 +1405,60 @@ impl_writeable!(ClosingSignedFeeRange, { max_fee_satoshis }); +#[cfg(not(taproot))] impl_writeable_msg!(CommitmentSigned, { channel_id, signature, htlc_signatures }, {}); +#[cfg(taproot)] +impl_writeable_msg!(CommitmentSigned, { + channel_id, + signature, + htlc_signatures +}, { + (2, partial_signature_with_nonce, option) +}); + impl_writeable!(DecodedOnionErrorPacket, { hmac, failuremsg, pad }); +#[cfg(not(taproot))] impl_writeable_msg!(FundingCreated, { temporary_channel_id, funding_txid, funding_output_index, signature }, {}); +#[cfg(taproot)] +impl_writeable_msg!(FundingCreated, { + temporary_channel_id, + funding_txid, + funding_output_index, + signature +}, { + (2, partial_signature_with_nonce, option), + (4, next_local_nonce, option) +}); +#[cfg(not(taproot))] impl_writeable_msg!(FundingSigned, { channel_id, signature }, {}); +#[cfg(taproot)] +impl_writeable_msg!(FundingSigned, { + channel_id, + signature +}, { + (2, partial_signature_with_nonce, option) +}); + impl_writeable_msg!(ChannelReady, { channel_id, next_per_commitment_point, @@ -2446,6 +2516,8 @@ mod tests { first_per_commitment_point: pubkey_6, shutdown_scriptpubkey: if shutdown { OptionalField::Present(Address::p2pkh(&::bitcoin::PublicKey{compressed: true, inner: pubkey_1}, Network::Testnet).script_pubkey()) } else { OptionalField::Absent }, channel_type: None, + #[cfg(taproot)] + next_local_nonce: None, }; let encoded_value = accept_channel.encode(); let mut target_value = hex::decode("020202020202020202020202020202020202020202020202020202020202020212345678901234562334032891223698321446687011447600083a840000034d000c89d4c0bcc0bc031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d076602531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe33703462779ad4aad39514614751a71085f2f10e1c7a593e4e030efb5b8721ce55b0b0362c0a046dacce86ddd0343c6d3c7c79c2208ba0d9c9cf24a6d046d21d21f90f703f006a18d5653c4edf5391ff23a61f03ff83d237e880ee61187fa9f379a028e0a").unwrap(); @@ -2471,6 +2543,10 @@ mod tests { funding_txid: Txid::from_hex("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e").unwrap(), funding_output_index: 255, signature: sig_1, + #[cfg(taproot)] + partial_signature_with_nonce: None, + #[cfg(taproot)] + next_local_nonce: None, }; let encoded_value = funding_created.encode(); let target_value = hex::decode("02020202020202020202020202020202020202020202020202020202020202026e96fe9f8b0ddcd729ba03cfafa5a27b050b39d354dd980814268dfa9a44d4c200ffd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap(); @@ -2485,6 +2561,8 @@ mod tests { let funding_signed = msgs::FundingSigned { channel_id: [2; 32], signature: sig_1, + #[cfg(taproot)] + partial_signature_with_nonce: None, }; let encoded_value = funding_signed.encode(); let target_value = hex::decode("0202020202020202020202020202020202020202020202020202020202020202d977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap(); @@ -2648,6 +2726,8 @@ mod tests { channel_id: [2; 32], signature: sig_1, htlc_signatures: if htlcs { vec![sig_2, sig_3, sig_4] } else { Vec::new() }, + #[cfg(taproot)] + partial_signature_with_nonce: None, }; let encoded_value = commitment_signed.encode(); let mut target_value = hex::decode("0202020202020202020202020202020202020202020202020202020202020202d977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap();