From: Matt Corallo Date: Sat, 8 Feb 2020 01:05:37 +0000 (-0500) Subject: Impl (de)serialization for bitcoin::Transaction. X-Git-Tag: v0.0.12~119^2~7 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=569f9038bec1f0ba09cfb01c35222a9365ee77d6;p=rust-lightning Impl (de)serialization for bitcoin::Transaction. There is little risk of misusing this as there's not much in the way of other ways you may want to serialize bitcoin::Transaction --- diff --git a/lightning/src/util/ser.rs b/lightning/src/util/ser.rs index 1b98e341..44fdd1c0 100644 --- a/lightning/src/util/ser.rs +++ b/lightning/src/util/ser.rs @@ -11,7 +11,9 @@ use std::cmp; use secp256k1::Signature; use secp256k1::key::{PublicKey, SecretKey}; use bitcoin::blockdata::script::Script; -use bitcoin::blockdata::transaction::OutPoint; +use bitcoin::blockdata::transaction::{OutPoint, Transaction}; +use bitcoin::consensus; +use bitcoin::consensus::Encodable; use bitcoin_hashes::sha256d::Hash as Sha256dHash; use std::marker::Sized; use ln::msgs::DecodeError; @@ -625,6 +627,27 @@ impl Readable for OutPoint { } } +impl Writeable for Transaction { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { + match self.consensus_encode(WriterWriteAdaptor(writer)) { + Ok(_) => Ok(()), + Err(consensus::encode::Error::Io(e)) => Err(e), + Err(_) => panic!("We shouldn't get a consensus::encode::Error unless our Write generated an std::io::Error"), + } + } +} + +impl Readable for Transaction { + fn read(r: &mut R) -> Result { + match consensus::encode::Decodable::consensus_decode(r) { + Ok(t) => Ok(t), + Err(consensus::encode::Error::Io(ref e)) if e.kind() == ::std::io::ErrorKind::UnexpectedEof => Err(DecodeError::ShortRead), + Err(consensus::encode::Error::Io(e)) => Err(DecodeError::Io(e)), + Err(_) => Err(DecodeError::InvalidValue), + } + } +} + impl> Readable for Mutex { fn read(r: &mut R) -> Result { let t: T = Readable::read(r)?;