Skip to content

Commit

Permalink
Optimize Witness Serialization
Browse files Browse the repository at this point in the history
We allocated a new vector when serializing a `Witness`. That was
inefficient and unnecessary. Use `serialize_seq` to feed the witness
elements directly into the serializer.

Optimize `Witness` serialization by removing the allocation.
  • Loading branch information
DanGould committed Jun 29, 2022
1 parent b645b6b commit 9bf9591
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions src/blockdata/witness.rs
Expand Up @@ -11,9 +11,6 @@ use crate::prelude::*;
use secp256k1::ecdsa;
use crate::VarInt;

#[cfg(feature = "serde")]
use serde;

/// The Witness is the data used to unlock bitcoins since the [segwit upgrade](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki)
///
/// Can be logically seen as an array of byte-arrays `Vec<Vec<u8>>` and indeed you can convert from
Expand Down Expand Up @@ -282,8 +279,15 @@ impl serde::Serialize for Witness {
where
S: serde::Serializer,
{
let vec: Vec<_> = self.to_vec();
serde::Serialize::serialize(&vec, serializer)
use serde::ser::SerializeSeq;

let mut seq = serializer.serialize_seq(Some(self.witness_elements))?;

for elem in self.iter() {
seq.serialize_element(&elem)?;
}

seq.end()
}
}
#[cfg(feature = "serde")]
Expand Down

0 comments on commit 9bf9591

Please sign in to comment.