diff --git a/src/block.rs b/src/block.rs index 21cab270..2e2ada8c 100644 --- a/src/block.rs +++ b/src/block.rs @@ -1,5 +1,4 @@ use block_header::BlockHeader; -use compact_integer::CompactInteger; use crypto::dhash256; use hash::H256; use merkle_root::merkle_root; @@ -16,7 +15,6 @@ impl Serializable for Block { fn serialize(&self, stream: &mut Stream) { stream .append(&self.block_header) - .append(&CompactInteger::from(self.transactions.len())) .append_list(&self.transactions); } } @@ -24,8 +22,7 @@ impl Serializable for Block { impl Deserializable for Block { fn deserialize(reader: &mut Reader) -> Result where Self: Sized { let block_header = try!(reader.read()); - let tx_len = try!(reader.read::()); - let transactions = try!(reader.read_list(tx_len.into())); + let transactions = try!(reader.read_list()); let result = Block { block_header: block_header, diff --git a/src/reader.rs b/src/reader.rs index 737d907f..687d6f79 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,5 +1,6 @@ use std::{io, cmp}; use byteorder::{LittleEndian, ReadBytesExt}; +use compact_integer::CompactInteger; pub fn deserialize(buffer: &[u8]) -> Result where T: Deserializable { let mut reader = Reader::new(buffer); @@ -65,7 +66,8 @@ impl<'a> Reader<'a> { Ok(result) } - pub fn read_list(&mut self, len: usize) -> Result, Error> where T: Deserializable { + pub fn read_list(&mut self) -> Result, Error> where T: Deserializable { + let len: usize = try!(self.read::()).into(); let mut result = vec![]; for _ in 0..len { diff --git a/src/stream.rs b/src/stream.rs index 4a5b6b80..83407ba4 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -1,6 +1,7 @@ //! Stream used for serialization. use std::io::{self, Write}; use byteorder::{LittleEndian, WriteBytesExt}; +use compact_integer::CompactInteger; pub fn serialize(t: &Serializable) -> Vec { let mut stream = Stream::default(); @@ -35,6 +36,7 @@ impl Stream { /// Appends a list of serializable structs to the end of the stream. pub fn append_list(&mut self, t: &[T]) -> &mut Self where T: Serializable { + CompactInteger::from(t.len()).serialize(self); for i in t { i.serialize(self); } diff --git a/src/transaction.rs b/src/transaction.rs index 5e5ce50c..60fb25d4 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -8,7 +8,6 @@ use reader::{Deserializable, Reader, Error as ReaderError, deserialize}; use crypto::dhash256; use hash::H256; use stream::{Serializable, Stream, serialize}; -use compact_integer::CompactInteger; // Below flags apply in the context of BIP 68 // If this flag set, CTxIn::nSequence is NOT interpreted as a @@ -172,9 +171,7 @@ impl Serializable for Transaction { fn serialize(&self, stream: &mut Stream) { stream .append(&self.version) - .append(&CompactInteger::from(self.inputs.len())) .append_list(&self.inputs) - .append(&CompactInteger::from(self.outputs.len())) .append_list(&self.outputs) .append(&self.lock_time); } @@ -183,10 +180,8 @@ impl Serializable for Transaction { impl Deserializable for Transaction { fn deserialize(reader: &mut Reader) -> Result where Self: Sized { let version = try!(reader.read()); - let tx_inputs_len= try!(reader.read::()); - let tx_inputs = try!(reader.read_list(tx_inputs_len.into())); - let tx_outputs_len= try!(reader.read::()); - let tx_outputs = try!(reader.read_list(tx_outputs_len.into())); + let tx_inputs = try!(reader.read_list()); + let tx_outputs = try!(reader.read_list()); let lock_time = try!(reader.read()); let result = Transaction {