diff --git a/bitcoin/src/blockdata/witness.rs b/bitcoin/src/blockdata/witness.rs index 432079e68..cfcf167cb 100644 --- a/bitcoin/src/blockdata/witness.rs +++ b/bitcoin/src/blockdata/witness.rs @@ -239,8 +239,7 @@ impl Encodable for Witness { let content_with_indices_len = self.content.len(); let indices_size = self.witness_elements * 4; let content_len = content_with_indices_len - indices_size; - w.emit_slice(&self.content[..content_len])?; - Ok(content_len + len.size()) + Ok(w.emit_slice(&self.content[..content_len])? + len.size()) } } diff --git a/bitcoin/src/consensus/encode.rs b/bitcoin/src/consensus/encode.rs index 14c09a2b3..538a02460 100644 --- a/bitcoin/src/consensus/encode.rs +++ b/bitcoin/src/consensus/encode.rs @@ -209,7 +209,7 @@ pub trait WriteExt: Write { fn emit_bool(&mut self, v: bool) -> Result<(), io::Error>; /// Outputs a byte slice. - fn emit_slice(&mut self, v: &[u8]) -> Result<(), io::Error>; + fn emit_slice(&mut self, v: &[u8]) -> Result; } /// Extensions of `Read` to decode data as per Bitcoin consensus. @@ -274,7 +274,10 @@ impl WriteExt for W { #[inline] fn emit_bool(&mut self, v: bool) -> Result<(), io::Error> { self.write_all(&[v as u8]) } #[inline] - fn emit_slice(&mut self, v: &[u8]) -> Result<(), io::Error> { self.write_all(v) } + fn emit_slice(&mut self, v: &[u8]) -> Result { + self.write_all(v)?; + Ok(v.len()) + } } impl ReadExt for R { @@ -546,8 +549,7 @@ impl Encodable for String { fn consensus_encode(&self, w: &mut W) -> Result { let b = self.as_bytes(); let vi_len = VarInt(b.len().to_u64()).consensus_encode(w)?; - w.emit_slice(b)?; - Ok(vi_len + b.len()) + Ok(vi_len + w.emit_slice(b)?) } } @@ -564,8 +566,7 @@ impl Encodable for Cow<'static, str> { fn consensus_encode(&self, w: &mut W) -> Result { let b = self.as_bytes(); let vi_len = VarInt(b.len().to_u64()).consensus_encode(w)?; - w.emit_slice(b)?; - Ok(vi_len + b.len()) + Ok(vi_len + w.emit_slice(b)?) } } @@ -586,8 +587,7 @@ macro_rules! impl_array { &self, w: &mut W, ) -> core::result::Result { - w.emit_slice(&self[..])?; - Ok(self.len()) + Ok(w.emit_slice(&self[..])?) } } @@ -701,8 +701,7 @@ pub(crate) fn consensus_encode_with_size( w: &mut W, ) -> Result { let vi_len = VarInt(data.len().to_u64()).consensus_encode(w)?; - w.emit_slice(data)?; - Ok(vi_len + data.len()) + Ok(vi_len + w.emit_slice(data)?) } struct ReadBytesFromFiniteReaderOpts { @@ -779,8 +778,7 @@ impl Encodable for CheckedData { .expect("network message use u32 as length") .consensus_encode(w)?; self.checksum().consensus_encode(w)?; - w.emit_slice(&self.data)?; - Ok(8 + self.data.len()) + Ok(8 + w.emit_slice(&self.data)?) } } diff --git a/bitcoin/src/p2p/address.rs b/bitcoin/src/p2p/address.rs index abf3ccfaf..8bcee95fc 100644 --- a/bitcoin/src/p2p/address.rs +++ b/bitcoin/src/p2p/address.rs @@ -148,8 +148,7 @@ impl Encodable for AddrV2 { ) -> Result { let len = network.consensus_encode(w)? + VarInt::from(bytes.len()).consensus_encode(w)? - + bytes.len(); - w.emit_slice(bytes)?; + + w.emit_slice(bytes)?; Ok(len) } Ok(match *self {