Narrow ChainWatchInterface::install_watch_script
[rust-lightning] / src / ln / msgs.rs
index 42ee9d63e345e85ab3b44060c721fe645b055224..1d0ea1c637235c02774fe3e111238c6a25ed15d4 100644 (file)
@@ -28,6 +28,8 @@ pub trait MsgEncodable {
 pub enum DecodeError {
        /// Unknown realm byte in an OnionHopData packet
        UnknownRealmByte,
+       /// Unknown feature mandating we fail to parse message
+       UnknownRequiredFeature,
        /// Failed to decode a public key (ie it's invalid)
        BadPublicKey,
        /// Failed to decode a signature (ie it's invalid)
@@ -460,11 +462,11 @@ pub trait ChannelMessageHandler : events::EventsProvider + Send + Sync {
 }
 
 pub trait RoutingMessageHandler : Send + Sync {
-       fn handle_node_announcement(&self, msg: &NodeAnnouncement) -> Result<(), HandleError>;
+       fn handle_node_announcement(&self, msg: &NodeAnnouncement) -> Result<bool, HandleError>;
        /// Handle a channel_announcement message, returning true if it should be forwarded on, false
        /// or returning an Err otherwise.
        fn handle_channel_announcement(&self, msg: &ChannelAnnouncement) -> Result<bool, HandleError>;
-       fn handle_channel_update(&self, msg: &ChannelUpdate) -> Result<(), HandleError>;
+       fn handle_channel_update(&self, msg: &ChannelUpdate) -> Result<bool, HandleError>;
        fn handle_htlc_fail_channel_update(&self, update: &HTLCFailChannelUpdate);
 }
 
@@ -510,6 +512,7 @@ impl Error for DecodeError {
        fn description(&self) -> &str {
                match *self {
                        DecodeError::UnknownRealmByte => "Unknown realm byte in Onion packet",
+                       DecodeError::UnknownRequiredFeature => "Unknown required feature preventing decode",
                        DecodeError::BadPublicKey => "Invalid public key in packet",
                        DecodeError::BadSignature => "Invalid signature in packet",
                        DecodeError::BadText => "Invalid text in packet",
@@ -678,10 +681,11 @@ impl MsgDecodable for OpenChannel {
                        }
                        shutdown_scriptpubkey = Some(Script::from(v[321..321+len].to_vec()));
                }
-
+               let mut temp_channel_id = [0; 32];
+               temp_channel_id[..].copy_from_slice(&v[32..64]);
                Ok(OpenChannel {
                        chain_hash: deserialize(&v[0..32]).unwrap(),
-                       temporary_channel_id: deserialize(&v[32..64]).unwrap(),
+                       temporary_channel_id: temp_channel_id,
                        funding_satoshis: byte_utils::slice_to_be64(&v[64..72]),
                        push_msat: byte_utils::slice_to_be64(&v[72..80]),
                        dust_limit_satoshis: byte_utils::slice_to_be64(&v[80..88]),
@@ -1197,6 +1201,10 @@ impl MsgEncodable for AnnouncementSignatures {
 impl MsgDecodable for UnsignedNodeAnnouncement {
        fn decode(v: &[u8]) -> Result<Self, DecodeError> {
                let features = GlobalFeatures::decode(&v[..])?;
+               if features.requires_unknown_bits() {
+                       return Err(DecodeError::UnknownRequiredFeature);
+               }
+
                if v.len() < features.encoded_len() + 4 + 33 + 3 + 32 + 2 {
                        return Err(DecodeError::ShortRead);
                }
@@ -1380,6 +1388,9 @@ impl MsgEncodable for NodeAnnouncement {
 impl MsgDecodable for UnsignedChannelAnnouncement {
        fn decode(v: &[u8]) -> Result<Self, DecodeError> {
                let features = GlobalFeatures::decode(&v[..])?;
+               if features.requires_unknown_bits() {
+                       return Err(DecodeError::UnknownRequiredFeature);
+               }
                if v.len() < features.encoded_len() + 32 + 8 + 33*4 {
                        return Err(DecodeError::ShortRead);
                }