Use hashbrown replacements for std equivalents
[rust-lightning] / lightning / src / chain / keysinterface.rs
index 249a2f524604b4a64b28d2753abc78e79b369417..c5ad6f28b263d85dd8559c0df82b5e6e9e91f1e7 100644 (file)
@@ -37,8 +37,8 @@ use ln::chan_utils;
 use ln::chan_utils::{HTLCOutputInCommitment, make_funding_redeemscript, ChannelPublicKeys, HolderCommitmentTransaction, ChannelTransactionParameters, CommitmentTransaction};
 use ln::msgs::UnsignedChannelAnnouncement;
 
-use std::collections::HashSet;
-use std::sync::atomic::{AtomicUsize, Ordering};
+use prelude::*;
+use core::sync::atomic::{AtomicUsize, Ordering};
 use std::io::Error;
 use ln::msgs::{DecodeError, MAX_VALUE_MSAT};
 
@@ -72,6 +72,16 @@ impl DelayedPaymentOutputDescriptor {
        pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 1 + chan_utils::REVOKEABLE_REDEEMSCRIPT_MAX_LENGTH + 1;
 }
 
+impl_writeable_tlv_based!(DelayedPaymentOutputDescriptor, {
+       (0, outpoint),
+       (2, per_commitment_point),
+       (4, to_self_delay),
+       (6, output),
+       (8, revocation_pubkey),
+       (10, channel_keys_id),
+       (12, channel_value_satoshis),
+}, {}, {});
+
 /// Information about a spendable output to our "payment key". See
 /// SpendableOutputDescriptor::StaticPaymentOutput for more details on how to spend this.
 #[derive(Clone, Debug, PartialEq)]
@@ -93,6 +103,12 @@ impl StaticPaymentOutputDescriptor {
        // redeemscript push length.
        pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 34;
 }
+impl_writeable_tlv_based!(StaticPaymentOutputDescriptor, {
+       (0, outpoint),
+       (2, output),
+       (4, channel_keys_id),
+       (6, channel_value_satoshis),
+}, {}, {});
 
 /// When on-chain outputs are created by rust-lightning (which our counterparty is not able to
 /// claim at any point in the future) an event is generated which you must track and be able to
@@ -151,62 +167,15 @@ pub enum SpendableOutputDescriptor {
        StaticPaymentOutput(StaticPaymentOutputDescriptor),
 }
 
-impl Writeable for SpendableOutputDescriptor {
-       fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
-               match self {
-                       &SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output } => {
-                               0u8.write(writer)?;
-                               outpoint.write(writer)?;
-                               output.write(writer)?;
-                       },
-                       &SpendableOutputDescriptor::DelayedPaymentOutput(ref descriptor) => {
-                               1u8.write(writer)?;
-                               descriptor.outpoint.write(writer)?;
-                               descriptor.per_commitment_point.write(writer)?;
-                               descriptor.to_self_delay.write(writer)?;
-                               descriptor.output.write(writer)?;
-                               descriptor.revocation_pubkey.write(writer)?;
-                               descriptor.channel_keys_id.write(writer)?;
-                               descriptor.channel_value_satoshis.write(writer)?;
-                       },
-                       &SpendableOutputDescriptor::StaticPaymentOutput(ref descriptor) => {
-                               2u8.write(writer)?;
-                               descriptor.outpoint.write(writer)?;
-                               descriptor.output.write(writer)?;
-                               descriptor.channel_keys_id.write(writer)?;
-                               descriptor.channel_value_satoshis.write(writer)?;
-                       },
-               }
-               Ok(())
-       }
-}
-
-impl Readable for SpendableOutputDescriptor {
-       fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
-               match Readable::read(reader)? {
-                       0u8 => Ok(SpendableOutputDescriptor::StaticOutput {
-                               outpoint: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                       }),
-                       1u8 => Ok(SpendableOutputDescriptor::DelayedPaymentOutput(DelayedPaymentOutputDescriptor {
-                               outpoint: Readable::read(reader)?,
-                               per_commitment_point: Readable::read(reader)?,
-                               to_self_delay: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                               revocation_pubkey: Readable::read(reader)?,
-                               channel_keys_id: Readable::read(reader)?,
-                               channel_value_satoshis: Readable::read(reader)?,
-                       })),
-                       2u8 => Ok(SpendableOutputDescriptor::StaticPaymentOutput(StaticPaymentOutputDescriptor {
-                               outpoint: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                               channel_keys_id: Readable::read(reader)?,
-                               channel_value_satoshis: Readable::read(reader)?,
-                       })),
-                       _ => Err(DecodeError::InvalidValue),
-               }
-       }
-}
+impl_writeable_tlv_based_enum!(SpendableOutputDescriptor,
+       (0, StaticOutput) => {
+               (0, outpoint),
+               (2, output),
+       }, {}, {},
+;
+       (1, DelayedPaymentOutput),
+       (2, StaticPaymentOutput),
+);
 
 /// A trait to sign lightning channel transactions as described in BOLT 3.
 ///
@@ -704,10 +673,15 @@ impl BaseSign for InMemorySigner {
        }
 }
 
+const SERIALIZATION_VERSION: u8 = 1;
+const MIN_SERIALIZATION_VERSION: u8 = 1;
+
 impl Sign for InMemorySigner {}
 
 impl Writeable for InMemorySigner {
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
+               write_ver_prefix!(writer, SERIALIZATION_VERSION, MIN_SERIALIZATION_VERSION);
+
                self.funding_key.write(writer)?;
                self.revocation_base_key.write(writer)?;
                self.payment_key.write(writer)?;
@@ -718,12 +692,16 @@ impl Writeable for InMemorySigner {
                self.channel_value_satoshis.write(writer)?;
                self.channel_keys_id.write(writer)?;
 
+               write_tlv_fields!(writer, {}, {});
+
                Ok(())
        }
 }
 
 impl Readable for InMemorySigner {
        fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
+               let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
+
                let funding_key = Readable::read(reader)?;
                let revocation_base_key = Readable::read(reader)?;
                let payment_key = Readable::read(reader)?;
@@ -739,6 +717,8 @@ impl Readable for InMemorySigner {
                                                             &htlc_base_key);
                let keys_id = Readable::read(reader)?;
 
+               read_tlv_fields!(reader, {}, {});
+
                Ok(InMemorySigner {
                        funding_key,
                        revocation_base_key,
@@ -857,7 +837,7 @@ impl KeysManager {
        /// onchain output detection for which a corresponding delayed_payment_key must be derived.
        pub fn derive_channel_keys(&self, channel_value_satoshis: u64, params: &[u8; 32]) -> InMemorySigner {
                let chan_id = byte_utils::slice_to_be64(&params[0..8]);
-               assert!(chan_id <= std::u32::MAX as u64); // Otherwise the params field wasn't created by us
+               assert!(chan_id <= core::u32::MAX as u64); // Otherwise the params field wasn't created by us
                let mut unique_start = Sha256::engine();
                unique_start.input(params);
                unique_start.input(&self.seed);
@@ -1039,7 +1019,7 @@ impl KeysInterface for KeysManager {
 
        fn get_channel_signer(&self, _inbound: bool, channel_value_satoshis: u64) -> Self::Signer {
                let child_ix = self.channel_child_index.fetch_add(1, Ordering::AcqRel);
-               assert!(child_ix <= std::u32::MAX as usize);
+               assert!(child_ix <= core::u32::MAX as usize);
                let mut id = [0; 32];
                id[0..8].copy_from_slice(&byte_utils::be64_to_array(child_ix as u64));
                id[8..16].copy_from_slice(&byte_utils::be64_to_array(self.starting_time_nanos as u64));