Impl (de)serialization for bitcoin::Transaction.
authorMatt Corallo <git@bluematt.me>
Sat, 8 Feb 2020 01:05:37 +0000 (20:05 -0500)
committerMatt Corallo <git@bluematt.me>
Thu, 27 Feb 2020 00:15:32 +0000 (19:15 -0500)
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

lightning/src/util/ser.rs

index 1b98e341fad6f35e94e555528865ed1cee508b5a..44fdd1c0cf4d3097d27e7abebb83e0a397f0ac86 100644 (file)
@@ -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<R: Read> Readable<R> for OutPoint {
        }
 }
 
+impl Writeable for Transaction {
+       fn write<W: Writer>(&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<R: Read> Readable<R> for Transaction {
+       fn read(r: &mut R) -> Result<Self, DecodeError> {
+               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<R: Read, T: Readable<R>> Readable<R> for Mutex<T> {
        fn read(r: &mut R) -> Result<Self, DecodeError> {
                let t: T = Readable::read(r)?;