pub timestamp: u32,
/// Channel flags
pub flags: u8,
- /// The number of blocks to subtract from incoming HTLC cltv_expiry values
+ /// The number of blocks such that if:
+ /// `incoming_htlc.cltv_expiry < outgoing_htlc.cltv_expiry + cltv_expiry_delta`
+ /// then we need to fail the HTLC backwards. When forwarding an HTLC, cltv_expiry_delta determines
+ /// the outgoing HTLC's minimum cltv_expiry value -- so, if an incoming HTLC comes in with a
+ /// cltv_expiry of 100000, and the node we're forwarding to has a cltv_expiry_delta value of 10,
+ /// then we'll check that the outgoing HTLC's cltv_expiry value is at least 100010 before
+ /// forwarding. Note that the HTLC sender is the one who originally sets this value when
+ /// constructing the route.
pub cltv_expiry_delta: u16,
/// The minimum HTLC size incoming to sender, in milli-satoshi
pub htlc_minimum_msat: u64,
/// Handle an incoming channel_reestablish message from the given peer.
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
+ /// Handle an incoming channel update from the given peer.
+ fn handle_channel_update(&self, their_node_id: &PublicKey, msg: &ChannelUpdate);
+
// Error:
/// Handle an incoming error message from the given peer.
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);
impl Writeable for UnsignedChannelAnnouncement {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
- w.size_hint(2 + 2*32 + 4*33 + self.features.byte_count() + self.excess_data.len());
+ w.size_hint(2 + 32 + 8 + 4*33 + self.features.byte_count() + self.excess_data.len());
self.features.write(w)?;
self.chain_hash.write(w)?;
self.short_channel_id.write(w)?;
impl_writeable_len_match!(ChannelAnnouncement, {
{ ChannelAnnouncement { contents: UnsignedChannelAnnouncement {ref features, ref excess_data, ..}, .. },
- 2 + 2*32 + 4*33 + features.byte_count() + excess_data.len() + 4*64 }
+ 2 + 32 + 8 + 4*33 + features.byte_count() + excess_data.len() + 4*64 }
}, {
node_signature_1,
node_signature_2,
}
impl_writeable_len_match!(ChannelUpdate, {
- { ChannelUpdate { contents: UnsignedChannelUpdate {ref excess_data, ..}, .. },
- 64 + excess_data.len() + 64 }
+ { ChannelUpdate { contents: UnsignedChannelUpdate {ref excess_data, ref htlc_maximum_msat, ..}, .. },
+ 64 + 64 + excess_data.len() + if let OptionalField::Present(_) = htlc_maximum_msat { 8 } else { 0 } }
}, {
signature,
contents
impl Writeable for UnsignedNodeAnnouncement {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
- w.size_hint(64 + 76 + self.features.byte_count() + self.addresses.len()*38 + self.excess_address_data.len() + self.excess_data.len());
+ w.size_hint(76 + self.features.byte_count() + self.addresses.len()*38 + self.excess_address_data.len() + self.excess_data.len());
self.features.write(w)?;
self.timestamp.write(w)?;
self.node_id.write(w)?;
}
}
-impl_writeable_len_match!(NodeAnnouncement, {
+impl_writeable_len_match!(NodeAnnouncement, <=, {
{ NodeAnnouncement { contents: UnsignedNodeAnnouncement { ref features, ref addresses, ref excess_address_data, ref excess_data, ..}, .. },
64 + 76 + features.byte_count() + addresses.len()*(NetAddress::MAX_LEN as usize + 1) + excess_address_data.len() + excess_data.len() }
}, {
}
}
+impl QueryChannelRange {
+ /**
+ * Calculates the overflow safe ending block height for the query.
+ * Overflow returns `0xffffffff`, otherwise returns `first_blocknum + number_of_blocks`
+ */
+ pub fn end_blocknum(&self) -> u32 {
+ match self.first_blocknum.checked_add(self.number_of_blocks) {
+ Some(block) => block,
+ None => u32::max_value(),
+ }
+ }
+}
+
impl Readable for QueryChannelRange {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let chain_hash: BlockHash = Readable::read(r)?;
assert_eq!(msg.outgoing_cltv_value, 0xffffffff);
}
+ #[test]
+ fn query_channel_range_end_blocknum() {
+ let tests: Vec<(u32, u32, u32)> = vec![
+ (10000, 1500, 11500),
+ (0, 0xffffffff, 0xffffffff),
+ (1, 0xffffffff, 0xffffffff),
+ ];
+
+ for (first_blocknum, number_of_blocks, expected) in tests.into_iter() {
+ let sut = msgs::QueryChannelRange {
+ chain_hash: BlockHash::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f").unwrap(),
+ first_blocknum,
+ number_of_blocks,
+ };
+ assert_eq!(sut.end_blocknum(), expected);
+ }
+ }
+
#[test]
fn encoding_query_channel_range() {
let mut query_channel_range = msgs::QueryChannelRange {