Clean up channel error handling a ton
[rust-lightning] / src / ln / msgs.rs
index c7310ac9d5d4a2c1e13b368c761ef8ef7204b3af..e85f25ac78a23248690d520a586af5cb1cca9fb5 100644 (file)
@@ -2,7 +2,7 @@ use secp256k1::key::PublicKey;
 use secp256k1::{Secp256k1, Signature};
 use bitcoin::util::uint::Uint256;
 use bitcoin::util::hash::Sha256dHash;
-use bitcoin::network::serialize::deserialize;
+use bitcoin::network::serialize::{deserialize,serialize};
 use bitcoin::blockdata::script::Script;
 
 use std::error::Error;
@@ -342,16 +342,19 @@ pub struct ChannelUpdate {
 }
 
 /// Used to put an error message in a HandleError
-pub enum ErrorMessage {
+pub enum ErrorAction {
+       /// Indicates an inbound HTLC add resulted in a failure, and the UpdateFailHTLC provided in msg
+       /// should be sent back to the sender.
        UpdateFailHTLC {
                msg: UpdateFailHTLC
        },
+       /// The peer took some action which made us think they were useless. Disconnect them.
        DisconnectPeer {},
 }
 
 pub struct HandleError { //TODO: rename me
        pub err: &'static str,
-       pub msg: Option<ErrorMessage>, //TODO: Move into an Action enum and require it!
+       pub msg: Option<ErrorAction>, //TODO: Make this required and rename it
 }
 
 /// A trait to describe an object which can receive channel messages. Messages MAY be called in
@@ -381,6 +384,13 @@ pub trait ChannelMessageHandler : events::EventsProvider {
 
        // Channel-to-announce:
        fn handle_announcement_signatures(&self, their_node_id: &PublicKey, msg: &AnnouncementSignatures) -> Result<(), HandleError>;
+
+       // Informational:
+       /// 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.
+       fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
 }
 
 pub trait RoutingMessageHandler {
@@ -473,7 +483,7 @@ impl MsgDecodable for LocalFeatures {
                let len = byte_utils::slice_to_be16(&v[0..2]) as usize;
                if v.len() < len + 2 { return Err(DecodeError::WrongLength); }
                let mut flags = Vec::with_capacity(len);
-               flags.extend_from_slice(&v[2..]);
+               flags.extend_from_slice(&v[2..2 + len]);
                Ok(Self {
                        flags: flags
                })
@@ -495,7 +505,7 @@ impl MsgDecodable for GlobalFeatures {
                let len = byte_utils::slice_to_be16(&v[0..2]) as usize;
                if v.len() < len + 2 { return Err(DecodeError::WrongLength); }
                let mut flags = Vec::with_capacity(len);
-               flags.extend_from_slice(&v[2..]);
+               flags.extend_from_slice(&v[2..2 + len]);
                Ok(Self {
                        flags: flags
                })
@@ -619,7 +629,29 @@ impl MsgDecodable for AcceptChannel {
 }
 impl MsgEncodable for AcceptChannel {
        fn encode(&self) -> Vec<u8> {
-               unimplemented!();
+               let mut res = match &self.shutdown_scriptpubkey {
+                       &Some(ref script) => Vec::with_capacity(270 + 2 + script.len()),
+                       &None => Vec::with_capacity(270),
+               };
+               res.extend_from_slice(&serialize(&self.temporary_channel_id).unwrap()[..]);
+               res.extend_from_slice(&byte_utils::be64_to_array(self.dust_limit_satoshis));
+               res.extend_from_slice(&byte_utils::be64_to_array(self.max_htlc_value_in_flight_msat));
+               res.extend_from_slice(&byte_utils::be64_to_array(self.channel_reserve_satoshis));
+               res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_minimum_msat));
+               res.extend_from_slice(&byte_utils::be32_to_array(self.minimum_depth));
+               res.extend_from_slice(&byte_utils::be16_to_array(self.to_self_delay));
+               res.extend_from_slice(&byte_utils::be16_to_array(self.max_accepted_htlcs));
+               res.extend_from_slice(&self.funding_pubkey.serialize());
+               res.extend_from_slice(&self.revocation_basepoint.serialize());
+               res.extend_from_slice(&self.payment_basepoint.serialize());
+               res.extend_from_slice(&self.delayed_payment_basepoint.serialize());
+               res.extend_from_slice(&self.htlc_basepoint.serialize());
+               res.extend_from_slice(&self.first_per_commitment_point.serialize());
+               if let &Some(ref script) = &self.shutdown_scriptpubkey {
+                       res.extend_from_slice(&byte_utils::be16_to_array(script.len() as u16));
+                       res.extend_from_slice(&script[..]);
+               }
+               res
        }
 }
 
@@ -639,7 +671,13 @@ impl MsgDecodable for FundingCreated {
 }
 impl MsgEncodable for FundingCreated {
        fn encode(&self) -> Vec<u8> {
-               unimplemented!();
+               let mut res = Vec::with_capacity(32+32+2+64);
+               res.extend_from_slice(&serialize(&self.temporary_channel_id).unwrap()[..]);
+               res.extend_from_slice(&serialize(&self.funding_txid).unwrap()[..]);
+               res.extend_from_slice(&byte_utils::be16_to_array(self.funding_output_index));
+               let secp_ctx = Secp256k1::without_caps();
+               res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx));
+               res
        }
 }
 
@@ -675,7 +713,10 @@ impl MsgDecodable for FundingLocked {
 }
 impl MsgEncodable for FundingLocked {
        fn encode(&self) -> Vec<u8> {
-               unimplemented!();
+               let mut res = Vec::with_capacity(32+33);
+               res.extend_from_slice(&serialize(&self.channel_id).unwrap());
+               res.extend_from_slice(&self.next_per_commitment_point.serialize());
+               res
        }
 }
 
@@ -893,7 +934,13 @@ impl MsgDecodable for AnnouncementSignatures {
 }
 impl MsgEncodable for AnnouncementSignatures {
        fn encode(&self) -> Vec<u8> {
-               unimplemented!();
+               let mut res = Vec::with_capacity(32+8+64*2);
+               res.extend_from_slice(&serialize(&self.channel_id).unwrap());
+               res.extend_from_slice(&byte_utils::be64_to_array(self.short_channel_id));
+               let secp_ctx = Secp256k1::without_caps();
+               res.extend_from_slice(&self.node_signature.serialize_compact(&secp_ctx));
+               res.extend_from_slice(&self.bitcoin_signature.serialize_compact(&secp_ctx));
+               res
        }
 }