X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fser.rs;h=fd0e9f7a383b2bb9e0530e183e5ee9203218e065;hb=eff8af21103e43f763cb10ae6a75c1543a2d4068;hp=38133d59670dd5c717a3d1dc850fe3296fc316c6;hpb=32ca8ec13e0928cbb4f7067a3fb6d41f39691d1c;p=rust-lightning diff --git a/lightning/src/util/ser.rs b/lightning/src/util/ser.rs index 38133d59..fd0e9f7a 100644 --- a/lightning/src/util/ser.rs +++ b/lightning/src/util/ser.rs @@ -8,16 +8,16 @@ use std::hash::Hash; use std::sync::Mutex; use std::cmp; -use secp256k1::Signature; -use secp256k1::key::{PublicKey, SecretKey}; +use bitcoin::secp256k1::Signature; +use bitcoin::secp256k1::key::{PublicKey, SecretKey}; use bitcoin::blockdata::script::Script; use bitcoin::blockdata::transaction::{OutPoint, Transaction, TxOut}; use bitcoin::consensus; use bitcoin::consensus::Encodable; -use bitcoin_hashes::sha256d::Hash as Sha256dHash; +use bitcoin::hashes::sha256d::Hash as Sha256dHash; use std::marker::Sized; use ln::msgs::DecodeError; -use ln::channelmanager::{PaymentPreimage, PaymentHash}; +use ln::channelmanager::{PaymentPreimage, PaymentHash, PaymentSecret}; use util::byte_utils; use util::byte_utils::{be64_to_array, be48_to_array, be32_to_array, be16_to_array, slice_to_be16, slice_to_be32, slice_to_be48, slice_to_be64}; @@ -172,6 +172,10 @@ pub trait Writeable { } } +impl<'a, T: Writeable> Writeable for &'a T { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { (*self).write(writer) } +} + /// A trait that various rust-lightning types implement allowing them to be read in from a Read pub trait Readable where Self: Sized @@ -538,7 +542,7 @@ impl Writeable for Sha256dHash { impl Readable for Sha256dHash { fn read(r: &mut R) -> Result { - use bitcoin_hashes::Hash; + use bitcoin::hashes::Hash; let buf: [u8; 32] = Readable::read(r)?; Ok(Sha256dHash::from_slice(&buf[..]).unwrap()) @@ -587,12 +591,27 @@ impl Readable for PaymentHash { } } +impl Writeable for PaymentSecret { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { + self.0.write(w) + } +} + +impl Readable for PaymentSecret { + fn read(r: &mut R) -> Result { + let buf: [u8; 32] = Readable::read(r)?; + Ok(PaymentSecret(buf)) + } +} + impl Writeable for Option { fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { match *self { None => 0u8.write(w)?, Some(ref data) => { - 1u8.write(w)?; + let mut len_calc = LengthCalculatingWriter(0); + data.write(&mut len_calc).expect("No in-memory data may fail to serialize"); + BigSize(len_calc.0 as u64 + 1).write(w)?; data.write(w)?; } } @@ -603,10 +622,12 @@ impl Writeable for Option { impl Readable for Option { fn read(r: &mut R) -> Result { - match ::read(r)? { + match BigSize::read(r)?.0 { 0 => Ok(None), - 1 => Ok(Some(Readable::read(r)?)), - _ => return Err(DecodeError::InvalidValue), + len => { + let mut reader = FixedLengthReader::new(r, len - 1); + Ok(Some(Readable::read(&mut reader)?)) + } } } }