Skip to main content

bitcoin_primitives/
witness.rs

1// SPDX-License-Identifier: CC0-1.0
2
3//! A witness.
4//!
5//! This module contains the [`Witness`] struct and related methods to operate on it
6
7use core::convert::Infallible;
8use core::fmt;
9use core::ops::Index;
10
11#[cfg(feature = "arbitrary")]
12use arbitrary::{Arbitrary, Unstructured};
13#[cfg(doc)]
14use encoding::Decoder4;
15use encoding::{
16    self, BytesEncoder, CompactSizeDecoder, CompactSizeDecoderError, CompactSizeEncoder, Decoder,
17    Encodable, Encoder, Encoder2,
18};
19#[cfg(feature = "hex")]
20use hex::DecodeVariableLengthBytesError;
21use internals::slice::SliceExt;
22use internals::wrap_debug::WrapDebug;
23use internals::write_err;
24
25use crate::prelude::{Box, Vec};
26#[cfg(doc)]
27use crate::TxIn;
28
29/// Maximum amount of memory (in bytes) to allocate at once when deserializing vectors.
30#[cfg(feature = "alloc")]
31const MAX_VECTOR_ALLOCATE: usize = 1_000_000;
32
33/// The Witness is the data used to unlock bitcoin since the [SegWit upgrade].
34///
35/// Can be logically seen as an array of bytestrings, i.e. `Vec<Vec<u8>>`, and it is serialized on the wire
36/// in that format. You can convert between this type and `Vec<Vec<u8>>` by using [`Witness::from_slice`]
37/// and [`Witness::to_vec`].
38///
39/// For serialization and deserialization performance it is stored internally as a single `Vec`,
40/// saving some allocations.
41///
42/// [SegWit upgrade]: <https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki>
43#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
44pub struct Witness {
45    /// Contains the witness `Vec<Vec<u8>>` serialization.
46    ///
47    /// Does not include the initial length prefix indicating the number of elements. Each element
48    /// however, does include a [`CompactSize`] indicating the element length. The number of
49    /// elements is stored in `witness_elements`.
50    ///
51    /// Concatenated onto the end of `content` is the index area. This is a `4 * witness_elements`
52    /// bytes area which stores the index of the start of each witness item.
53    ///
54    /// [`CompactSize`]: <https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer>
55    content: Vec<u8>,
56
57    /// The number of elements in the witness.
58    ///
59    /// Stored separately (instead of as a compact size encoding in the initial part of content) so
60    /// that methods like [`Witness::push`] don't have to shift the entire array.
61    witness_elements: usize,
62
63    /// This is the valid index pointing to the beginning of the index area.
64    ///
65    /// Said another way, this is the total length of all witness elements serialized (without the
66    /// element count but with their sizes serialized as compact size).
67    indices_start: usize,
68}
69
70impl Witness {
71    /// Constructs a new empty [`Witness`].
72    #[inline]
73    pub const fn new() -> Self {
74        Self { content: Vec::new(), witness_elements: 0, indices_start: 0 }
75    }
76
77    /// Constructs a new [`Witness`] object from a slice of bytes slices where each slice is a witness item.
78    pub fn from_slice<T: AsRef<[u8]>>(slice: &[T]) -> Self {
79        let witness_elements = slice.len();
80        let index_size = witness_elements * 4;
81        let content_size = slice
82            .iter()
83            .map(|elem| elem.as_ref().len() + CompactSizeEncoder::encoded_size(elem.as_ref().len()))
84            .sum();
85
86        let mut content = alloc::vec![0u8; content_size + index_size];
87        let mut cursor = 0usize;
88        for (i, elem) in slice.iter().enumerate() {
89            encode_cursor(&mut content, content_size, i, cursor);
90            let encoded = crate::compact_size_encode(elem.as_ref().len());
91            let encoded_size = encoded.as_slice().len();
92            content[cursor..cursor + encoded_size].copy_from_slice(encoded.as_slice());
93            cursor += encoded_size;
94            content[cursor..cursor + elem.as_ref().len()].copy_from_slice(elem.as_ref());
95            cursor += elem.as_ref().len();
96        }
97
98        Self { witness_elements, content, indices_start: content_size }
99    }
100
101    /// Convenience method to create an array of byte-arrays from this witness.
102    #[inline]
103    pub fn to_vec(&self) -> Vec<Vec<u8>> { self.iter().map(<[u8]>::to_vec).collect() }
104
105    /// Returns `true` if the witness contains no element.
106    #[inline]
107    pub fn is_empty(&self) -> bool { self.witness_elements == 0 }
108
109    /// Returns a struct implementing [`Iterator`].
110    #[must_use = "iterators are lazy and do nothing unless consumed"]
111    #[inline]
112    pub fn iter(&self) -> Iter<'_> {
113        Iter { inner: self.content.as_slice(), indices_start: self.indices_start, current_index: 0 }
114    }
115
116    /// Returns the number of elements this witness holds.
117    #[inline]
118    pub const fn len(&self) -> usize { self.witness_elements }
119
120    /// Returns the number of bytes this witness contributes to a transactions total size.
121    ///
122    /// # Panics
123    ///
124    /// If the size calculation overflows.
125    pub fn size(&self) -> usize {
126        let mut size: usize = 0;
127
128        size += CompactSizeEncoder::encoded_size(self.witness_elements);
129        size += self
130            .iter()
131            .map(|witness_element| {
132                let len = witness_element.len();
133                CompactSizeEncoder::encoded_size(len) + len
134            })
135            .sum::<usize>();
136
137        size
138    }
139
140    /// Clears the witness.
141    #[inline]
142    pub fn clear(&mut self) {
143        self.content.clear();
144        self.witness_elements = 0;
145        self.indices_start = 0;
146    }
147
148    /// Pushes a new element on the witness, requires an allocation.
149    #[inline]
150    pub fn push<T: AsRef<[u8]>>(&mut self, new_element: T) {
151        self.push_slice(new_element.as_ref());
152    }
153
154    /// Pushes a new element slice onto the witness stack.
155    fn push_slice(&mut self, new_element: &[u8]) {
156        self.witness_elements += 1;
157        let previous_content_end = self.indices_start;
158        let encoded = crate::compact_size_encode(new_element.len());
159        let encoded_size = encoded.as_slice().len();
160        let current_content_len = self.content.len();
161        let new_item_total_len = encoded_size + new_element.len();
162        self.content.resize(current_content_len + new_item_total_len + 4, 0);
163
164        self.content[previous_content_end..].rotate_right(new_item_total_len);
165        self.indices_start += new_item_total_len;
166        encode_cursor(
167            &mut self.content,
168            self.indices_start,
169            self.witness_elements - 1,
170            previous_content_end,
171        );
172
173        let end_compact_size = previous_content_end + encoded_size;
174        self.content[previous_content_end..end_compact_size].copy_from_slice(encoded.as_slice());
175        self.content[end_compact_size..end_compact_size + new_element.len()]
176            .copy_from_slice(new_element);
177    }
178
179    /// Returns the last element in the witness, if any.
180    #[inline]
181    pub fn last(&self) -> Option<&[u8]> { self.get_back(0) }
182
183    /// Retrieves an element from the end of the witness by its reverse index.
184    ///
185    /// `index` is 0-based from the end, where 0 is the last element, 1 is the second-to-last, etc.
186    ///
187    /// Returns `None` if the requested index is beyond the witness's elements.
188    ///
189    /// # Examples
190    /// ```
191    /// use bitcoin_primitives::witness::Witness;
192    ///
193    /// let mut witness = Witness::new();
194    /// witness.push(b"A");
195    /// witness.push(b"B");
196    /// witness.push(b"C");
197    /// witness.push(b"D");
198    ///
199    /// assert_eq!(witness.get_back(0), Some(b"D".as_slice()));
200    /// assert_eq!(witness.get_back(1), Some(b"C".as_slice()));
201    /// assert_eq!(witness.get_back(2), Some(b"B".as_slice()));
202    /// assert_eq!(witness.get_back(3), Some(b"A".as_slice()));
203    /// assert_eq!(witness.get_back(4), None);
204    /// ```
205    pub fn get_back(&self, index: usize) -> Option<&[u8]> {
206        if self.witness_elements <= index {
207            None
208        } else {
209            self.get(self.witness_elements - 1 - index)
210        }
211    }
212
213    /// Returns a specific element from the witness by its index, if any.
214    #[inline]
215    pub fn get(&self, index: usize) -> Option<&[u8]> {
216        let pos = decode_cursor(&self.content, self.indices_start, index)?;
217
218        let mut slice = &self.content[pos..]; // Start of element.
219        let element_len = decode_unchecked(&mut slice);
220        let end = cast_to_usize_if_valid(element_len)?;
221        Some(&slice[..end])
222    }
223
224    /// Constructs a new witness from a list of hex strings.
225    ///
226    /// # Errors
227    ///
228    /// This function will return an error if any of the hex strings are invalid.
229    #[cfg(feature = "hex")]
230    pub fn from_hex<I, T>(iter: I) -> Result<Self, DecodeVariableLengthBytesError>
231    where
232        I: IntoIterator<Item = T>,
233        T: AsRef<str>,
234    {
235        let result = iter
236            .into_iter()
237            .map(|hex_str| crate::hex::decode_to_vec(hex_str.as_ref()))
238            .collect::<Result<Vec<_>, _>>()?;
239
240        Ok(Self::from_slice(&result))
241    }
242}
243
244/// Correctness Requirements: value must always fit within u32
245// This is duplicated in `bitcoin::blockdata::witness`, if you change it please do so over there also.
246#[inline]
247fn encode_cursor(bytes: &mut [u8], start_of_indices: usize, index: usize, value: usize) {
248    let start = start_of_indices + index * 4;
249    let end = start + 4;
250    bytes[start..end]
251        .copy_from_slice(&u32::to_ne_bytes(value.try_into().expect("larger than u32")));
252}
253
254#[inline]
255fn decode_cursor(bytes: &[u8], start_of_indices: usize, index: usize) -> Option<usize> {
256    let start = start_of_indices + index * 4;
257    let pos = bytes.get_array::<4>(start).map(|index_bytes| u32::from_ne_bytes(*index_bytes))?;
258    usize::try_from(pos).ok()
259}
260
261/// The encoder for the [`Witness`] type.
262pub struct WitnessEncoder<'e>(Encoder2<CompactSizeEncoder, BytesEncoder<'e>>);
263
264impl Encodable for Witness {
265    type Encoder<'e>
266        = WitnessEncoder<'e>
267    where
268        Self: 'e;
269
270    fn encoder(&self) -> Self::Encoder<'_> {
271        let num_elements = CompactSizeEncoder::new(self.len());
272        let witness_elements =
273            BytesEncoder::without_length_prefix(&self.content[..self.indices_start]);
274
275        WitnessEncoder(Encoder2::new(num_elements, witness_elements))
276    }
277}
278
279impl Encoder for WitnessEncoder<'_> {
280    #[inline]
281    fn current_chunk(&self) -> &[u8] { self.0.current_chunk() }
282
283    #[inline]
284    fn advance(&mut self) -> bool { self.0.advance() }
285}
286
287/// The decoder for the [`Witness`] type.
288#[cfg(feature = "alloc")]
289pub struct WitnessDecoder {
290    /// The single buffer that will become the Witness content.
291    /// The index entries are written at the beginning, then rotated in [`Self::end`].
292    content: Vec<u8>,
293    /// Current write position in the content buffer.
294    cursor: usize,
295    /// Decoder for the initial witness element count.
296    witness_count_decoder: CompactSizeDecoder,
297    /// Total number of witness elements to decode (None until initial count is read).
298    witness_elements: Option<usize>,
299    /// Index of the current element being decoded.
300    element_idx: usize,
301    /// Decoder for the current element's length.
302    element_length_decoder: CompactSizeDecoder,
303    /// Bytes remaining to read for the current element's data.
304    /// - `None` means we're currently reading the length.
305    /// - `Some(n)` means we're reading element data with `n` bytes remaining.
306    element_bytes_remaining: Option<usize>,
307}
308
309impl WitnessDecoder {
310    /// Constructs a new witness decoder.
311    pub const fn new() -> Self {
312        Self {
313            content: Vec::new(),
314            cursor: 0,
315            witness_elements: None,
316            witness_count_decoder: CompactSizeDecoder::new(),
317            element_idx: 0,
318            element_length_decoder: CompactSizeDecoder::new(),
319            element_bytes_remaining: None,
320        }
321    }
322
323    /// Allocates buffer space in ~1MB batches
324    /// Returns buffer length (may be less than `required_len` !!)
325    fn reserve_batch(&mut self, required_len: usize) -> usize {
326        if required_len <= self.content.len() {
327            return self.content.len();
328        }
329
330        let bytes_needed = required_len - self.content.len();
331        let available_capacity = self.content.capacity() - self.content.len();
332
333        if available_capacity == 0 {
334            let batch_size = bytes_needed.min(MAX_VECTOR_ALLOCATE);
335            self.content.reserve_exact(batch_size);
336        }
337
338        // Only extend up to current capacity to limit batch allocation
339        let can_extend = (self.content.capacity() - self.content.len()).min(bytes_needed);
340        let new_len = self.content.len() + can_extend;
341        self.content.resize(new_len, 0);
342        new_len
343    }
344}
345
346impl Default for WitnessDecoder {
347    fn default() -> Self { Self::new() }
348}
349
350impl Decoder for WitnessDecoder {
351    type Output = Witness;
352    type Error = WitnessDecoderError;
353
354    fn push_bytes(&mut self, bytes: &mut &[u8]) -> Result<bool, Self::Error> {
355        use {WitnessDecoderError as E, WitnessDecoderErrorInner as Inner};
356
357        // Read initial witness element count.
358        if self.witness_elements.is_none() {
359            if self
360                .witness_count_decoder
361                .push_bytes(bytes)
362                .map_err(|e| E(Inner::LengthPrefixDecode(e)))?
363            {
364                return Ok(true);
365            }
366            // Take ownership of the decoder in order to consume it.
367            let decoder = core::mem::take(&mut self.witness_count_decoder);
368            let witness_elements = decoder.end().map_err(|e| E(Inner::LengthPrefixDecode(e)))?;
369            self.witness_elements = Some(witness_elements);
370
371            // Short circuit for zero witness elements.
372            if witness_elements == 0 {
373                return Ok(false);
374            }
375
376            // Allocate space for the index and buffer. The buffer
377            // is initialized to 128 bytes which should be large enough
378            // to cover most witnesses, the typical pubkey + signature
379            // and some overhead (e.g. P2WPKH witness is ~100 bytes),
380            // without reallocating.
381            let witness_index_space = witness_elements * 4;
382            // Initially the index space is at the front of the buffer then we rotate left in `end`.
383            self.cursor = witness_index_space;
384            self.content = alloc::vec![0u8; self.cursor + 128];
385        }
386
387        let Some(witness_elements) = self.witness_elements else {
388            unreachable!("witness_elements must be Some after initial read")
389        };
390        let witness_index_space = witness_elements * 4;
391
392        // Read witness elements.
393        loop {
394            // Check if we're done processing all elements.
395            if self.element_idx >= witness_elements {
396                return Ok(false);
397            }
398
399            if bytes.is_empty() {
400                return Ok(true);
401            }
402
403            // If we have some bytes to read, then reading element data.
404            // Else we are reading the element's length.
405            if let Some(bytes_to_read) = self.element_bytes_remaining {
406                let required_len = self.cursor.saturating_add(bytes.len().min(bytes_to_read));
407                let actual_len = self.reserve_batch(required_len);
408
409                let available_space = actual_len.saturating_sub(self.cursor);
410                let can_copy = available_space.min(bytes.len()).min(bytes_to_read);
411
412                self.content[self.cursor..self.cursor + can_copy]
413                    .copy_from_slice(&bytes[..can_copy]);
414                self.cursor += can_copy;
415                *bytes = &bytes[can_copy..];
416                let remaining = bytes_to_read - can_copy;
417
418                if remaining == 0 {
419                    // Element complete, move to next element.
420                    self.element_idx += 1;
421                    self.element_bytes_remaining = None;
422                } else {
423                    self.element_bytes_remaining = Some(remaining);
424                }
425            } else {
426                if self
427                    .element_length_decoder
428                    .push_bytes(bytes)
429                    .map_err(|e| E(Inner::LengthPrefixDecode(e)))?
430                {
431                    return Ok(true);
432                }
433
434                // Take ownership of the decoder so we can consume it.
435                let decoder = core::mem::take(&mut self.element_length_decoder);
436                let element_length = decoder.end().map_err(|e| E(Inner::LengthPrefixDecode(e)))?;
437
438                // Store the element position in the index.
439                let position_after_rotation = self.cursor - witness_index_space;
440                encode_cursor(&mut self.content, 0, self.element_idx, position_after_rotation);
441
442                // Re-encode the length back into the buffer.
443                let encoded_size = CompactSizeEncoder::encoded_size(element_length);
444                let required_len =
445                    self.cursor.saturating_add(encoded_size).saturating_add(element_length);
446                self.reserve_batch(required_len);
447                let encoded_compact_size = crate::compact_size_encode(element_length);
448                self.content[self.cursor..self.cursor + encoded_size]
449                    .copy_from_slice(&encoded_compact_size);
450                self.cursor += encoded_size;
451
452                if element_length == 0 {
453                    // Complete immediately for zero-length element to
454                    // avoid incorrectly signaling "need more data".
455                    self.element_idx += 1;
456                    self.element_bytes_remaining = None;
457                } else {
458                    self.element_bytes_remaining = Some(element_length);
459                }
460            }
461        }
462    }
463
464    fn end(mut self) -> Result<Self::Output, Self::Error> {
465        use {WitnessDecoderError as E, WitnessDecoderErrorInner as Inner};
466
467        let Some(witness_elements) = self.witness_elements else {
468            // Never read the witness element count.
469            return Err(E(Inner::UnexpectedEof(UnexpectedEofError { missing_elements: 0 })));
470        };
471
472        let remaining = witness_elements - self.element_idx;
473
474        if remaining == 0 {
475            // Truncate to actual content length (remove unused allocated space).
476            self.content.truncate(self.cursor);
477
478            // Rotate the index area from beginning to end.
479            let witness_index_space = witness_elements * 4;
480            self.content.rotate_left(witness_index_space);
481
482            Ok(Witness {
483                content: self.content,
484                witness_elements,
485                indices_start: self.cursor - witness_index_space,
486            })
487        } else {
488            Err(E(Inner::UnexpectedEof(UnexpectedEofError { missing_elements: remaining })))
489        }
490    }
491
492    fn read_limit(&self) -> usize {
493        if self.witness_elements.is_none() {
494            // Reading witness count (haven't started processing elements yet).
495            self.witness_count_decoder.read_limit()
496        } else {
497            // Reading an element.
498            match self.element_bytes_remaining {
499                None => self.element_length_decoder.read_limit(),
500                Some(remaining) => remaining,
501            }
502        }
503    }
504}
505
506impl encoding::Decodable for Witness {
507    type Decoder = WitnessDecoder;
508    fn decoder() -> Self::Decoder { WitnessDecoder::default() }
509}
510
511// Note: we use `Borrow` in the following `PartialEq` impls specifically because of its additional
512// constraints on equality semantics.
513impl<T: core::borrow::Borrow<[u8]>> PartialEq<[T]> for Witness {
514    fn eq(&self, rhs: &[T]) -> bool {
515        if self.len() != rhs.len() {
516            return false;
517        }
518        self.iter().zip(rhs).all(|(left, right)| left == right.borrow())
519    }
520}
521
522impl<T: core::borrow::Borrow<[u8]>> PartialEq<&[T]> for Witness {
523    fn eq(&self, rhs: &&[T]) -> bool { *self == **rhs }
524}
525
526impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for [T] {
527    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
528}
529
530impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for &[T] {
531    fn eq(&self, rhs: &Witness) -> bool { *rhs == **self }
532}
533
534impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<[T; N]> for Witness {
535    fn eq(&self, rhs: &[T; N]) -> bool { *self == *rhs.as_slice() }
536}
537
538impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<&[T; N]> for Witness {
539    fn eq(&self, rhs: &&[T; N]) -> bool { *self == *rhs.as_slice() }
540}
541
542impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for [T; N] {
543    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
544}
545
546impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for &[T; N] {
547    fn eq(&self, rhs: &Witness) -> bool { *rhs == **self }
548}
549
550impl<T: core::borrow::Borrow<[u8]>> PartialEq<Vec<T>> for Witness {
551    fn eq(&self, rhs: &Vec<T>) -> bool { *self == **rhs }
552}
553
554impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for Vec<T> {
555    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
556}
557
558impl<T: core::borrow::Borrow<[u8]>> PartialEq<Box<[T]>> for Witness {
559    fn eq(&self, rhs: &Box<[T]>) -> bool { *self == **rhs }
560}
561
562impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for Box<[T]> {
563    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
564}
565
566impl<T: core::borrow::Borrow<[u8]>> PartialEq<alloc::rc::Rc<[T]>> for Witness {
567    fn eq(&self, rhs: &alloc::rc::Rc<[T]>) -> bool { *self == **rhs }
568}
569
570impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for alloc::rc::Rc<[T]> {
571    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
572}
573
574#[cfg(target_has_atomic = "ptr")]
575impl<T: core::borrow::Borrow<[u8]>> PartialEq<alloc::sync::Arc<[T]>> for Witness {
576    fn eq(&self, rhs: &alloc::sync::Arc<[T]>) -> bool { *self == **rhs }
577}
578
579#[cfg(target_has_atomic = "ptr")]
580impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for alloc::sync::Arc<[T]> {
581    fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
582}
583
584/// Debug implementation that displays the witness as a structured output containing:
585/// - Number of witness elements
586/// - Total bytes across all elements
587/// - List of hex-encoded witness elements if `hex` feature is enabled.
588#[allow(clippy::missing_fields_in_debug)] // We don't want to show `indices_start`.
589impl fmt::Debug for Witness {
590    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
591        let total_bytes: usize = self.iter().map(<[u8]>::len).sum();
592
593        f.debug_struct("Witness")
594            .field("num_elements", &self.witness_elements)
595            .field("total_bytes", &total_bytes)
596            .field(
597                "elements",
598                &WrapDebug(|f| {
599                    #[cfg(feature = "hex")]
600                    {
601                        f.debug_list()
602                            .entries(self.iter().map(hex_unstable::DisplayHex::as_hex))
603                            .finish()
604                    }
605                    #[cfg(not(feature = "hex"))]
606                    {
607                        f.debug_list().entries(self.iter()).finish()
608                    }
609                }),
610            )
611            .finish()
612    }
613}
614
615/// An iterator returning individual witness elements.
616#[derive(Clone)]
617pub struct Iter<'a> {
618    inner: &'a [u8],
619    indices_start: usize,
620    current_index: usize,
621}
622
623impl Index<usize> for Witness {
624    type Output = [u8];
625
626    #[track_caller]
627    #[inline]
628    fn index(&self, index: usize) -> &Self::Output { self.get(index).expect("out of bounds") }
629}
630
631impl<'a> Iterator for Iter<'a> {
632    type Item = &'a [u8];
633
634    fn next(&mut self) -> Option<Self::Item> {
635        let index = decode_cursor(self.inner, self.indices_start, self.current_index)?;
636        let mut slice = &self.inner[index..]; // Start of element.
637        let element_len = decode_unchecked(&mut slice);
638        let end = cast_to_usize_if_valid(element_len)?;
639        self.current_index += 1;
640        Some(&slice[..end])
641    }
642
643    #[inline]
644    fn size_hint(&self) -> (usize, Option<usize>) {
645        let total_count = (self.inner.len() - self.indices_start) / 4;
646        let remaining = total_count - self.current_index;
647        (remaining, Some(remaining))
648    }
649}
650
651impl ExactSizeIterator for Iter<'_> {}
652
653impl<'a> IntoIterator for &'a Witness {
654    type IntoIter = Iter<'a>;
655    type Item = &'a [u8];
656
657    #[inline]
658    fn into_iter(self) -> Self::IntoIter { self.iter() }
659}
660
661impl<T: AsRef<[u8]>> FromIterator<T> for Witness {
662    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
663        let v: Vec<Vec<u8>> = iter.into_iter().map(|item| Vec::from(item.as_ref())).collect();
664        Self::from(v)
665    }
666}
667
668// Serde keep backward compatibility with old Vec<Vec<u8>> format
669#[cfg(feature = "serde")]
670impl serde::Serialize for Witness {
671    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
672    where
673        S: serde::Serializer,
674    {
675        use serde::ser::SerializeSeq;
676
677        let human_readable = serializer.is_human_readable();
678        let mut seq = serializer.serialize_seq(Some(self.witness_elements))?;
679
680        // Note that the `Iter` strips the varints out when iterating.
681        for elem in self {
682            if human_readable {
683                seq.serialize_element(&internals::serde::SerializeBytesAsHex(elem))?;
684            } else {
685                seq.serialize_element(&elem)?;
686            }
687        }
688        seq.end()
689    }
690}
691
692#[cfg(feature = "serde")]
693impl<'de> serde::Deserialize<'de> for Witness {
694    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
695    where
696        D: serde::Deserializer<'de>,
697    {
698        use crate::prelude::String;
699
700        struct Visitor; // Human-readable visitor.
701        impl<'de> serde::de::Visitor<'de> for Visitor {
702            type Value = Witness;
703
704            fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
705                write!(f, "a sequence of hex arrays")
706            }
707
708            fn visit_seq<A: serde::de::SeqAccess<'de>>(
709                self,
710                mut a: A,
711            ) -> Result<Self::Value, A::Error> {
712                use hex_unstable::{FromHex, HexToBytesError as E};
713                use serde::de::{self, Unexpected};
714
715                let mut ret = match a.size_hint() {
716                    Some(len) => Vec::with_capacity(len),
717                    None => Vec::new(),
718                };
719
720                while let Some(elem) = a.next_element::<String>()? {
721                    let vec = Vec::<u8>::from_hex(&elem).map_err(|e| match e {
722                        E::InvalidChar(ref e) =>
723                            match core::char::from_u32(e.invalid_char().into()) {
724                                Some(c) => de::Error::invalid_value(
725                                    Unexpected::Char(c),
726                                    &"a valid hex character",
727                                ),
728                                None => de::Error::invalid_value(
729                                    Unexpected::Unsigned(e.invalid_char().into()),
730                                    &"a valid hex character",
731                                ),
732                            },
733                        E::OddLengthString(ref e) =>
734                            de::Error::invalid_length(e.length(), &"an even length string"),
735                    })?;
736                    ret.push(vec);
737                }
738                Ok(Witness::from_slice(&ret))
739            }
740        }
741
742        if deserializer.is_human_readable() {
743            deserializer.deserialize_seq(Visitor)
744        } else {
745            let vec: Vec<Vec<u8>> = serde::Deserialize::deserialize(deserializer)?;
746            Ok(Self::from_slice(&vec))
747        }
748    }
749}
750
751impl From<Vec<Vec<u8>>> for Witness {
752    #[inline]
753    fn from(vec: Vec<Vec<u8>>) -> Self { Self::from_slice(&vec) }
754}
755
756impl From<&[&[u8]]> for Witness {
757    #[inline]
758    fn from(slice: &[&[u8]]) -> Self { Self::from_slice(slice) }
759}
760
761impl From<&[Vec<u8>]> for Witness {
762    #[inline]
763    fn from(slice: &[Vec<u8>]) -> Self { Self::from_slice(slice) }
764}
765
766impl From<Vec<&[u8]>> for Witness {
767    #[inline]
768    fn from(vec: Vec<&[u8]>) -> Self { Self::from_slice(&vec) }
769}
770
771impl<const N: usize> From<[&[u8]; N]> for Witness {
772    #[inline]
773    fn from(arr: [&[u8]; N]) -> Self { Self::from_slice(&arr) }
774}
775
776impl<const N: usize> From<&[&[u8]; N]> for Witness {
777    #[inline]
778    fn from(arr: &[&[u8]; N]) -> Self { Self::from_slice(arr) }
779}
780
781impl<const N: usize> From<&[[u8; N]]> for Witness {
782    #[inline]
783    fn from(slice: &[[u8; N]]) -> Self { Self::from_slice(slice) }
784}
785
786impl<const N: usize> From<&[&[u8; N]]> for Witness {
787    #[inline]
788    fn from(slice: &[&[u8; N]]) -> Self { Self::from_slice(slice) }
789}
790
791impl<const N: usize, const M: usize> From<[[u8; M]; N]> for Witness {
792    #[inline]
793    fn from(slice: [[u8; M]; N]) -> Self { Self::from_slice(&slice) }
794}
795
796impl<const N: usize, const M: usize> From<&[[u8; M]; N]> for Witness {
797    #[inline]
798    fn from(slice: &[[u8; M]; N]) -> Self { Self::from_slice(slice) }
799}
800
801impl<const N: usize, const M: usize> From<[&[u8; M]; N]> for Witness {
802    #[inline]
803    fn from(slice: [&[u8; M]; N]) -> Self { Self::from_slice(&slice) }
804}
805
806impl<const N: usize, const M: usize> From<&[&[u8; M]; N]> for Witness {
807    #[inline]
808    fn from(slice: &[&[u8; M]; N]) -> Self { Self::from_slice(slice) }
809}
810
811impl Default for Witness {
812    #[inline]
813    fn default() -> Self { Self::new() }
814}
815
816/// An error when consensus decoding a [`Witness`].
817#[derive(Debug, Clone, PartialEq, Eq)]
818pub struct WitnessDecoderError(WitnessDecoderErrorInner);
819
820#[derive(Debug, Clone, PartialEq, Eq)]
821enum WitnessDecoderErrorInner {
822    /// Error decoding the vector length prefix.
823    LengthPrefixDecode(CompactSizeDecoderError),
824    /// Not enough bytes given to decoder.
825    UnexpectedEof(UnexpectedEofError),
826}
827
828impl From<Infallible> for WitnessDecoderError {
829    fn from(never: Infallible) -> Self { match never {} }
830}
831
832impl fmt::Display for WitnessDecoderError {
833    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
834        use WitnessDecoderErrorInner as E;
835
836        match self.0 {
837            E::LengthPrefixDecode(ref e) => write_err!(f, "vec decoder error"; e),
838            E::UnexpectedEof(ref e) => write_err!(f, "decoder error"; e),
839        }
840    }
841}
842
843#[cfg(feature = "std")]
844impl std::error::Error for WitnessDecoderError {
845    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
846        use WitnessDecoderErrorInner as E;
847
848        match self.0 {
849            E::LengthPrefixDecode(ref e) => Some(e),
850            E::UnexpectedEof(ref e) => Some(e),
851        }
852    }
853}
854
855/// Not enough witness elements (bytes) given to decoder.
856#[derive(Debug, Clone, PartialEq, Eq)]
857pub struct UnexpectedEofError {
858    /// Number of elements missing to complete decoder.
859    missing_elements: usize,
860}
861
862impl core::fmt::Display for UnexpectedEofError {
863    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
864        write!(f, "not enough witness elements for decoder, missing {}", self.missing_elements)
865    }
866}
867
868#[cfg(feature = "std")]
869impl std::error::Error for UnexpectedEofError {}
870
871#[cfg(feature = "arbitrary")]
872impl<'a> Arbitrary<'a> for Witness {
873    fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
874        let arbitrary_bytes = Vec::<Vec<u8>>::arbitrary(u)?;
875        Ok(Self::from_slice(&arbitrary_bytes))
876    }
877}
878
879/// Cast a decoded length prefix to a `usize`.
880///
881/// This function is basically just defensive. For all sane use cases the length prefix should be
882/// less than `MAX_VEC_SIZE` (on a 32-bit machine). If the value is bigger that `u16::MAX` and we
883/// are on a 16-bit machine you'll likely hit an error later anyway, better to just check it now.
884///
885/// # 16-bits
886///
887/// The compact size may be bigger than what can be represented in a `usize` on a 16-bit machine but
888/// this shouldn't happen if we created the witness because one would get an OOM error before that.
889fn cast_to_usize_if_valid(n: u64) -> Option<usize> {
890    /// Maximum size, in bytes, of a vector we are allowed to decode.
891    const MAX_VEC_SIZE: u64 = 4_000_000;
892
893    if n > MAX_VEC_SIZE {
894        return None;
895    }
896
897    usize::try_from(n).ok()
898}
899
900/// Gets the compact size encoded value from `slice` and moves slice past the encoding.
901///
902/// Caller to guarantee that the encoding is well formed. Well formed is defined as:
903///
904/// * Being at least long enough.
905/// * Containing a minimal encoding.
906///
907/// # Panics
908///
909/// * Panics in release mode if the `slice` does not contain a valid minimal compact size encoding.
910/// * Panics in debug mode if the encoding is not minimal (referred to as "non-canonical" in Core).
911fn decode_unchecked(slice: &mut &[u8]) -> u64 {
912    assert!(!slice.is_empty(), "tried to decode an empty slice");
913
914    match slice[0] {
915        0xFF => {
916            const SIZE: usize = 9;
917            assert!(slice.len() >= SIZE, "slice too short, expected at least 9 bytes");
918
919            let mut bytes = [0_u8; SIZE - 1];
920            bytes.copy_from_slice(&slice[1..SIZE]);
921
922            let v = u64::from_le_bytes(bytes);
923            debug_assert!(v > u32::MAX.into(), "non-minimal encoding of a u64");
924            *slice = &slice[SIZE..];
925            v
926        }
927        0xFE => {
928            const SIZE: usize = 5;
929            assert!(slice.len() >= SIZE, "slice too short, expected at least 5 bytes");
930
931            let mut bytes = [0_u8; SIZE - 1];
932            bytes.copy_from_slice(&slice[1..SIZE]);
933
934            let v = u32::from_le_bytes(bytes);
935            debug_assert!(v > u16::MAX.into(), "non-minimal encoding of a u32");
936            *slice = &slice[SIZE..];
937            u64::from(v)
938        }
939        0xFD => {
940            const SIZE: usize = 3;
941            assert!(slice.len() >= SIZE, "slice too short, expected at least 3 bytes");
942
943            let mut bytes = [0_u8; SIZE - 1];
944            bytes.copy_from_slice(&slice[1..SIZE]);
945
946            let v = u16::from_le_bytes(bytes);
947            debug_assert!(v >= 0xFD, "non-minimal encoding of a u16");
948            *slice = &slice[SIZE..];
949            u64::from(v)
950        }
951        n => {
952            *slice = &slice[1..];
953            u64::from(n)
954        }
955    }
956}
957
958#[cfg(test)]
959mod test {
960    #[cfg(feature = "alloc")]
961    use alloc::string::ToString;
962    #[cfg(feature = "alloc")]
963    use alloc::{format, vec};
964    #[cfg(feature = "std")]
965    use std::error::Error as _;
966
967    #[cfg(feature = "alloc")]
968    use encoding::Decodable as _;
969
970    use super::*;
971
972    // A witness with a single element that is empty (zero length).
973    fn single_empty_element() -> Witness { Witness::from([[0u8; 0]]) }
974
975    #[test]
976    fn witness_single_empty_element() {
977        let mut got = Witness::new();
978        got.push([]);
979        let want = single_empty_element();
980        assert_eq!(got, want);
981    }
982
983    #[test]
984    fn push() {
985        // Sanity check default.
986        let mut witness = Witness::default();
987        assert!(witness.is_empty());
988        assert_eq!(witness.last(), None);
989        assert_eq!(witness.get_back(1), None);
990
991        assert_eq!(witness.get(0), None);
992        assert_eq!(witness.get(1), None);
993        assert_eq!(witness.get(2), None);
994        assert_eq!(witness.get(3), None);
995
996        // Push a single byte element onto the witness stack.
997        let push = [11_u8];
998        witness.push(push);
999        assert!(!witness.is_empty());
1000
1001        assert_eq!(witness, [[11_u8]]);
1002
1003        let element_0 = push.as_slice();
1004        assert_eq!(element_0, &witness[0]);
1005
1006        assert_eq!(witness.get_back(1), None);
1007        assert_eq!(witness.last(), Some(element_0));
1008
1009        assert_eq!(witness.get(0), Some(element_0));
1010        assert_eq!(witness.get(1), None);
1011        assert_eq!(witness.get(2), None);
1012        assert_eq!(witness.get(3), None);
1013
1014        // Now push 2 byte element onto the witness stack.
1015        let push = [21u8, 22u8];
1016        witness.push(push);
1017
1018        assert_eq!(witness, [&[11_u8] as &[_], &[21, 22]]);
1019
1020        let element_1 = push.as_slice();
1021        assert_eq!(element_1, &witness[1]);
1022
1023        assert_eq!(witness.get(0), Some(element_0));
1024        assert_eq!(witness.get(1), Some(element_1));
1025        assert_eq!(witness.get(2), None);
1026        assert_eq!(witness.get(3), None);
1027
1028        assert_eq!(witness.get_back(1), Some(element_0));
1029        assert_eq!(witness.last(), Some(element_1));
1030
1031        // Now push another 2 byte element onto the witness stack.
1032        let push = [31u8, 32u8];
1033        witness.push(push);
1034
1035        assert_eq!(witness, [&[11_u8] as &[_], &[21, 22], &[31, 32]]);
1036
1037        let element_2 = push.as_slice();
1038        assert_eq!(element_2, &witness[2]);
1039
1040        assert_eq!(witness.get(0), Some(element_0));
1041        assert_eq!(witness.get(1), Some(element_1));
1042        assert_eq!(witness.get(2), Some(element_2));
1043        assert_eq!(witness.get(3), None);
1044
1045        assert_eq!(witness.get_back(2), Some(element_0));
1046        assert_eq!(witness.get_back(1), Some(element_1));
1047        assert_eq!(witness.last(), Some(element_2));
1048    }
1049
1050    #[test]
1051    fn exact_sized_iterator() {
1052        let arbitrary_element = [1_u8, 2, 3];
1053        let num_pushes = 5; // Somewhat arbitrary.
1054
1055        let mut witness = Witness::default();
1056
1057        for i in 0..num_pushes {
1058            assert_eq!(witness.iter().len(), i);
1059            witness.push(arbitrary_element);
1060        }
1061
1062        let mut iter = witness.iter();
1063        for i in (0..=num_pushes).rev() {
1064            assert_eq!(iter.len(), i);
1065            iter.next();
1066        }
1067    }
1068
1069    #[test]
1070    fn witness_from_impl() {
1071        // Test From implementations with the same 2 elements
1072        let vec = vec![vec![11], vec![21, 22]];
1073        let slice_vec: &[Vec<u8>] = &vec;
1074        let slice_slice: &[&[u8]] = &[&[11u8], &[21, 22]];
1075        let vec_slice: Vec<&[u8]> = vec![&[11u8], &[21, 22]];
1076
1077        let witness_vec_vec = Witness::from(vec.clone());
1078        let witness_slice_vec = Witness::from(slice_vec);
1079        let witness_slice_slice = Witness::from(slice_slice);
1080        let witness_vec_slice = Witness::from(vec_slice);
1081
1082        let mut expected = Witness::from_slice(&vec);
1083        assert_eq!(expected.len(), 2);
1084        assert_eq!(expected.to_vec(), vec);
1085
1086        assert_eq!(witness_vec_vec, expected);
1087        assert_eq!(witness_slice_vec, expected);
1088        assert_eq!(witness_slice_slice, expected);
1089        assert_eq!(witness_vec_slice, expected);
1090
1091        // Test clear method
1092        expected.clear();
1093        assert!(expected.is_empty());
1094    }
1095
1096    #[test]
1097    fn witness_from_array_impl() {
1098        const DATA_1: [u8; 3] = [1, 2, 3];
1099        const DATA_2: [u8; 3] = [4, 5, 6];
1100        let witness = Witness::from_slice(&[DATA_1, DATA_2]);
1101
1102        let witness_from_array_ref = Witness::from(&[DATA_1, DATA_2]);
1103        let witness_from_array_of_refs = Witness::from([&DATA_1, &DATA_2]);
1104        let witness_from_ref_to_array_of_refs = Witness::from(&[&DATA_1, &DATA_2]);
1105        let witness_from_fixed_array = Witness::from([DATA_1, DATA_2]);
1106        let witness_from_slice_of_refs = Witness::from(&[&DATA_1, &DATA_2][..]);
1107        let witness_from_nested_array = Witness::from(&[DATA_1, DATA_2][..]);
1108
1109        assert_eq!(witness_from_array_ref, witness);
1110        assert_eq!(witness_from_array_of_refs, witness);
1111        assert_eq!(witness_from_ref_to_array_of_refs, witness);
1112        assert_eq!(witness_from_fixed_array, witness);
1113        assert_eq!(witness_from_slice_of_refs, witness);
1114        assert_eq!(witness_from_nested_array, witness);
1115    }
1116
1117    #[test]
1118    fn witness_size() {
1119        let mut witness = Witness::new();
1120        let want = 1; // Number of elements compact size encoded.
1121        assert_eq!(witness.size(), want);
1122
1123        witness.push([1, 2, 3]);
1124        let want = 5; // 1 + 1 + 3
1125        assert_eq!(witness.size(), want);
1126
1127        witness.push([4, 5]);
1128        let want = 8; // 5 + 1 + 2
1129        assert_eq!(witness.size(), want);
1130    }
1131
1132    #[test]
1133    fn partial_eq() {
1134        const EMPTY_BYTES: &[u8] = &[];
1135        const DATA_1: &[u8] = &[42];
1136        const DATA_2: &[u8] = &[42, 21];
1137
1138        macro_rules! ck {
1139            ($witness:expr, $container:expr, $different:expr) => {{
1140                let witness = $witness;
1141                let container = $container;
1142                let different = $different;
1143
1144                assert_eq!(witness, container, stringify!($container));
1145                assert_eq!(container, witness, stringify!($container));
1146
1147                assert_ne!(witness, different, stringify!($container));
1148                assert_ne!(different, witness, stringify!($container));
1149            }};
1150        }
1151
1152        // &[T]
1153        let container: &[&[u8]] = &[EMPTY_BYTES];
1154        let different: &[&[u8]] = &[DATA_1];
1155        ck!(Witness::from(container), container, different);
1156
1157        let container: &[&[u8]] = &[DATA_1];
1158        let different: &[&[u8]] = &[DATA_2];
1159        ck!(Witness::from(container), container, different);
1160
1161        // &[T; N]
1162        let container: &[&[u8]; 2] = &[DATA_1, DATA_2];
1163        let different: &[&[u8]; 2] = &[DATA_2, DATA_1];
1164        ck!(Witness::from(container), container, different);
1165
1166        // [&[T]; N]
1167        let container: [&[u8]; 2] = [DATA_1, DATA_2];
1168        let different: [&[u8]; 2] = [DATA_2, DATA_1];
1169        ck!(Witness::from(container), container, different);
1170
1171        // Vec<T>
1172        let container: Vec<&[u8]> = vec![DATA_1, DATA_2];
1173        let different: Vec<&[u8]> = vec![DATA_2, DATA_1];
1174        ck!(Witness::from(container.as_slice()), container, different);
1175
1176        // Box<[T]>
1177        let container: Box<[&[u8]]> = vec![DATA_1, DATA_2].into_boxed_slice();
1178        let different: Box<[&[u8]]> = vec![DATA_2, DATA_1].into_boxed_slice();
1179        ck!(Witness::from(&*container), container, different);
1180
1181        // Rc<[T]>
1182        let container: alloc::rc::Rc<[&[u8]]> = vec![DATA_1, DATA_2].into();
1183        let different: alloc::rc::Rc<[&[u8]]> = vec![DATA_2, DATA_1].into();
1184        ck!(Witness::from(&*container), container, different);
1185
1186        // Arc<[T]>
1187        let container: alloc::sync::Arc<[&[u8]]> = vec![DATA_1, DATA_2].into();
1188        let different: alloc::sync::Arc<[&[u8]]> = vec![DATA_2, DATA_1].into();
1189        ck!(Witness::from(&*container), container, different);
1190    }
1191
1192    #[test]
1193    fn partial_eq_for_slice() {
1194        let witness = Witness::from_slice(&[vec![1, 2, 3], vec![4, 5, 6]]);
1195        let container: &[Vec<u8>] = &[vec![1, 2, 3], vec![4, 5, 6]];
1196        let different: &[Vec<u8>] = &[vec![1, 2], vec![4, 5]];
1197
1198        // Explicitly dereference the slice to invoke the `[T]` implementation.
1199        assert_eq!(*container, witness);
1200        assert_ne!(*different, witness);
1201    }
1202
1203    #[test]
1204    fn partial_eq_len_mismatch() {
1205        let witness = Witness::from_slice(&[&[1u8][..]]);
1206        let rhs = vec![vec![1u8], vec![2u8]];
1207        assert_ne!(witness, rhs.as_slice());
1208    }
1209
1210    #[test]
1211    #[cfg(feature = "serde")]
1212    fn serde_bincode_backward_compatibility() {
1213        let old_witness_format = vec![vec![0u8], vec![2]];
1214        let new_witness_format = Witness::from_slice(&old_witness_format);
1215
1216        let old = bincode::serialize(&old_witness_format).unwrap();
1217        let new = bincode::serialize(&new_witness_format).unwrap();
1218
1219        assert_eq!(old, new);
1220    }
1221
1222    #[cfg(feature = "serde")]
1223    fn arbitrary_witness() -> Witness {
1224        let mut witness = Witness::default();
1225
1226        witness.push([0_u8]);
1227        witness.push([1_u8; 32]);
1228        witness.push([2_u8; 72]);
1229
1230        witness
1231    }
1232
1233    #[test]
1234    #[cfg(feature = "serde")]
1235    fn serde_bincode_roundtrips() {
1236        let original = arbitrary_witness();
1237        let ser = bincode::serialize(&original).unwrap();
1238        let roundtrip: Witness = bincode::deserialize(&ser).unwrap();
1239        assert_eq!(roundtrip, original);
1240    }
1241
1242    #[test]
1243    #[cfg(feature = "serde")]
1244    fn serde_human_roundtrips() {
1245        let original = arbitrary_witness();
1246        let ser = serde_json::to_string(&original).unwrap();
1247        let roundtrip: Witness = serde_json::from_str(&ser).unwrap();
1248        assert_eq!(roundtrip, original);
1249    }
1250
1251    #[test]
1252    #[cfg(feature = "serde")]
1253    fn serde_human() {
1254        let witness = Witness::from_slice(&[vec![0u8, 123, 75], vec![2u8, 6, 3, 7, 8]]);
1255        let json = serde_json::to_string(&witness).unwrap();
1256        assert_eq!(json, r#"["007b4b","0206030708"]"#);
1257    }
1258
1259    #[test]
1260    fn test_witness_from_iterator() {
1261        let bytes1 = [1u8, 2, 3];
1262        let bytes2 = [4u8, 5];
1263        let bytes3 = [6u8, 7, 8, 9];
1264        let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1265
1266        // Use FromIterator directly
1267        let witness1 = Witness::from_iter(data);
1268
1269        // Create a witness manually for comparison
1270        let mut witness2 = Witness::new();
1271        for item in &data {
1272            witness2.push(item);
1273        }
1274        assert_eq!(witness1, witness2);
1275        assert_eq!(witness1.len(), witness2.len());
1276        assert_eq!(witness1.to_vec(), witness2.to_vec());
1277
1278        // Test with collect
1279        let bytes4 = [0u8, 123, 75];
1280        let bytes5 = [2u8, 6, 3, 7, 8];
1281        let data = [bytes4.to_vec(), bytes5.to_vec()];
1282        let witness3: Witness = data.iter().collect();
1283        assert_eq!(witness3.len(), 2);
1284        assert_eq!(witness3.to_vec(), data);
1285
1286        // Test with empty iterator
1287        let empty_data: Vec<Vec<u8>> = vec![];
1288        let witness4: Witness = empty_data.iter().collect();
1289        assert!(witness4.is_empty());
1290    }
1291
1292    #[test]
1293    #[cfg(feature = "hex")]
1294    fn test_from_hex() {
1295        let hex_strings = [
1296            "30440220703350f1c8be5b41b4cb03b3b680c4f3337f987514a6b08e16d5d9f81e9b5f72022018fb269ba5b82864c0e1edeaf788829eb332fe34a859cc1f99c4a02edfb5d0df01",
1297            "0208689fe2cca52d8726cefaf274de8fa61d5faa5e1058ad35b49fb194c035f9a4",
1298        ];
1299
1300        let witness = Witness::from_hex(hex_strings).unwrap();
1301        assert_eq!(witness.len(), 2);
1302    }
1303
1304    #[test]
1305    fn encode() {
1306        let bytes1 = [1u8, 2, 3];
1307        let bytes2 = [4u8, 5];
1308        let bytes3 = [6u8, 7, 8, 9];
1309        let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1310
1311        // Use FromIterator directly
1312        let witness = Witness::from_iter(data);
1313
1314        let want = [0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x06, 0x07, 0x08, 0x09];
1315        let got = encoding::encode_to_vec(&witness);
1316
1317        assert_eq!(&got, &want);
1318    }
1319
1320    #[test]
1321    fn encodes_using_correct_chunks() {
1322        let bytes1 = [1u8, 2, 3];
1323        let bytes2 = [4u8, 5];
1324        let data = [&bytes1[..], &bytes2[..]];
1325
1326        // Use FromIterator directly
1327        let witness = Witness::from_iter(data);
1328
1329        // Should have length prefix chunk, then the content slice, then exhausted.
1330        let mut encoder = witness.encoder();
1331
1332        assert_eq!(encoder.current_chunk(), &[2u8][..]);
1333        assert!(encoder.advance());
1334
1335        // We don't encode one element at a time, rather we encode the whole content slice at once.
1336        assert_eq!(encoder.current_chunk(), &[3u8, 1, 2, 3, 2, 4, 5][..]);
1337        assert!(!encoder.advance());
1338        assert!(encoder.current_chunk().is_empty());
1339    }
1340
1341    #[test]
1342    fn encode_empty() {
1343        let witness = Witness::default();
1344
1345        let want = [0x00];
1346        let got = encoding::encode_to_vec(&witness);
1347
1348        assert_eq!(&got, &want);
1349    }
1350
1351    #[cfg(feature = "alloc")]
1352    fn witness_test_case() -> (Witness, Vec<u8>) {
1353        let bytes1 = [1u8];
1354        let bytes2 = [2u8, 3];
1355        let bytes3 = [4u8, 5, 6];
1356        let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1357
1358        let witness = Witness::from_iter(data);
1359
1360        #[rustfmt::skip]
1361        let encoded = vec![
1362            0x03_u8,
1363            0x01, 0x01,
1364            0x02, 0x02, 0x03,
1365            0x03, 0x04, 0x05, 0x06
1366        ];
1367
1368        (witness, encoded)
1369    }
1370
1371    #[test]
1372    #[cfg(feature = "alloc")]
1373    fn decode_witness_one_single_call() {
1374        let (want, encoded) = witness_test_case();
1375
1376        let mut slice = encoded.as_slice();
1377        let mut decoder = WitnessDecoder::new();
1378        decoder.push_bytes(&mut slice).unwrap();
1379
1380        let got = decoder.end().unwrap();
1381
1382        assert_eq!(got, want);
1383    }
1384
1385    #[test]
1386    #[cfg(feature = "alloc")]
1387    #[allow(clippy::many_single_char_names)]
1388    fn decode_witness_many_calls() {
1389        let (want, encoded) = witness_test_case();
1390
1391        let mut decoder = WitnessDecoder::new();
1392
1393        let mut a = &encoded.as_slice()[0..1]; // [3]
1394        let mut b = &encoded.as_slice()[1..2]; // [1]
1395        let mut c = &encoded.as_slice()[2..5]; // [1, 2, 2]
1396        let mut d = &encoded.as_slice()[5..6]; // [3]
1397        let mut e = &encoded.as_slice()[6..7]; // [3]
1398        let mut f = &encoded.as_slice()[7..9]; // [4, 5]
1399        let mut g = &encoded.as_slice()[9..]; // [6]
1400
1401        decoder.push_bytes(&mut a).unwrap();
1402        decoder.push_bytes(&mut b).unwrap();
1403        decoder.push_bytes(&mut c).unwrap();
1404        decoder.push_bytes(&mut d).unwrap();
1405        decoder.push_bytes(&mut e).unwrap();
1406        decoder.push_bytes(&mut f).unwrap();
1407        decoder.push_bytes(&mut g).unwrap();
1408
1409        let got = decoder.end().unwrap();
1410
1411        assert_eq!(got, want);
1412    }
1413
1414    #[test]
1415    #[cfg(feature = "alloc")]
1416    fn decode_max_length() {
1417        let mut encoded = Vec::new();
1418        encoded.extend_from_slice(crate::compact_size_encode(1usize).as_slice());
1419        encoded.extend_from_slice(crate::compact_size_encode(4_000_000usize).as_slice());
1420        encoded.resize(encoded.len() + 4_000_000, 0u8);
1421
1422        let mut slice = encoded.as_slice();
1423        let mut decoder = WitnessDecoder::new();
1424        decoder.push_bytes(&mut slice).unwrap();
1425        let witness = decoder.end().unwrap();
1426        assert_eq!(witness[0].len(), 4_000_000);
1427    }
1428
1429    #[test]
1430    #[cfg(feature = "alloc")]
1431    fn decode_length_prefix_error() {
1432        let mut encoded = Vec::new();
1433        encoded.extend_from_slice(crate::compact_size_encode(1usize).as_slice());
1434        encoded.extend_from_slice(crate::compact_size_encode(4_000_001usize).as_slice());
1435
1436        let mut slice = encoded.as_slice();
1437        let mut decoder = WitnessDecoder::new();
1438        let err = decoder.push_bytes(&mut slice).unwrap_err();
1439        assert!(matches!(
1440            err,
1441            WitnessDecoderError(WitnessDecoderErrorInner::LengthPrefixDecode(_))
1442        ));
1443        assert!(!err.to_string().is_empty());
1444        #[cfg(feature = "std")]
1445        assert!(err.source().is_some());
1446    }
1447
1448    #[test]
1449    #[cfg(feature = "alloc")]
1450    fn decode_empty_witness() {
1451        // Witness with 0 elements.
1452        let encoded = vec![0x00];
1453        let mut slice = encoded.as_slice();
1454        let mut decoder = WitnessDecoder::new();
1455
1456        assert!(!decoder.push_bytes(&mut slice).unwrap());
1457        let witness = decoder.end().unwrap();
1458
1459        assert_eq!(witness.len(), 0);
1460        assert!(witness.is_empty());
1461    }
1462
1463    #[test]
1464    #[cfg(feature = "alloc")]
1465    fn decode_single_element() {
1466        // Witness with 1 element containing [0xAB, 0xCD].
1467        let encoded = vec![0x01, 0x02, 0xAB, 0xCD];
1468        let mut slice = encoded.as_slice();
1469        let mut decoder = WitnessDecoder::new();
1470
1471        assert!(!decoder.push_bytes(&mut slice).unwrap());
1472        let witness = decoder.end().unwrap();
1473
1474        assert_eq!(witness.len(), 1);
1475        assert_eq!(&witness[0], &[0xABu8, 0xCD][..]);
1476    }
1477
1478    #[test]
1479    #[cfg(feature = "alloc")]
1480    fn decode_empty_element() {
1481        // Witness with 1 element that is empty (0 bytes).
1482        let encoded = vec![0x01, 0x00];
1483        let mut slice = encoded.as_slice();
1484        let mut decoder = WitnessDecoder::new();
1485
1486        assert!(!decoder.push_bytes(&mut slice).unwrap());
1487        let witness = decoder.end().unwrap();
1488
1489        assert_eq!(witness.len(), 1);
1490        assert_eq!(&witness[0], &[] as &[u8]);
1491    }
1492
1493    #[test]
1494    #[cfg(feature = "alloc")]
1495    fn decode_multiple_empty_elements() {
1496        // Witness with 3 empty elements.
1497        let encoded = vec![0x03, 0x00, 0x00, 0x00];
1498        let mut slice = encoded.as_slice();
1499        let mut decoder = WitnessDecoder::new();
1500
1501        assert!(!decoder.push_bytes(&mut slice).unwrap());
1502        let witness = decoder.end().unwrap();
1503
1504        assert_eq!(witness.len(), 3);
1505        assert_eq!(&witness[0], &[] as &[u8]);
1506        assert_eq!(&witness[1], &[] as &[u8]);
1507        assert_eq!(&witness[2], &[] as &[u8]);
1508    }
1509
1510    #[test]
1511    #[cfg(feature = "alloc")]
1512    fn decode_incomplete_witness_count() {
1513        // 3-byte compact size but only provide 2 bytes.
1514        let encoded = vec![0xFD, 0x03];
1515        let mut slice = encoded.as_slice();
1516        let mut decoder = WitnessDecoder::new();
1517
1518        assert!(decoder.push_bytes(&mut slice).unwrap());
1519
1520        let err = decoder.end().unwrap_err();
1521        assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1522    }
1523
1524    #[test]
1525    #[cfg(feature = "alloc")]
1526    fn decode_incomplete_element_length() {
1527        // Witness count = 1, but element length is incomplete.
1528        let encoded = vec![0x01, 0xFD, 0x05]; // Element length should be 3 bytes.
1529        let mut slice = encoded.as_slice();
1530        let mut decoder = WitnessDecoder::new();
1531
1532        assert!(decoder.push_bytes(&mut slice).unwrap());
1533
1534        let err = decoder.end().unwrap_err();
1535        assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1536    }
1537
1538    #[test]
1539    #[cfg(feature = "alloc")]
1540    fn decode_incomplete_element_data() {
1541        // Witness count = 1, element length = 5, but only 3 bytes of data provided.
1542        let encoded = vec![0x01, 0x05, 0xAA, 0xBB, 0xCC];
1543        let mut slice = encoded.as_slice();
1544        let mut decoder = WitnessDecoder::new();
1545
1546        assert!(decoder.push_bytes(&mut slice).unwrap());
1547
1548        let err = decoder.end().unwrap_err();
1549        assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1550    }
1551
1552    #[test]
1553    #[cfg(feature = "alloc")]
1554    fn decoder_read_limit() {
1555        let mut decoder = Witness::decoder();
1556        // witness_count_decoder is CompactSize: needs 1 byte.
1557        assert_eq!(decoder.read_limit(), 1);
1558
1559        // Set witness count = 1.
1560        let mut bytes = [0x01u8].as_slice();
1561        decoder.push_bytes(&mut bytes).unwrap();
1562        // element_length_decoder is CompactSize: needs 1 byte..
1563        assert_eq!(decoder.read_limit(), 1);
1564
1565        // Provide only first byte of a 3 byte CompactSize.
1566        let mut bytes = [0xFDu8].as_slice();
1567        decoder.push_bytes(&mut bytes).unwrap();
1568        assert_eq!(decoder.read_limit(), 2);
1569
1570        // Set element length to 500 (0x01F4 little-endian).
1571        let mut bytes = [0xF4u8, 0x01].as_slice();
1572        decoder.push_bytes(&mut bytes).unwrap();
1573        // Decoder now reads element data and the limit becomes the element length.
1574        assert_eq!(decoder.read_limit(), 500);
1575
1576        // Provide 1 byte of element data decreasing the read limit by 1.
1577        let mut bytes = [0xAAu8].as_slice();
1578        decoder.push_bytes(&mut bytes).unwrap();
1579        assert_eq!(decoder.read_limit(), 499);
1580    }
1581
1582    #[test]
1583    #[cfg(feature = "alloc")]
1584    fn decoder_end_without_witness_count_errors() {
1585        let err = WitnessDecoder::new().end().unwrap_err();
1586        assert!(matches!(
1587            err,
1588            WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(UnexpectedEofError {
1589                missing_elements: 0
1590            }))
1591        ));
1592        assert!(!err.to_string().is_empty());
1593        #[cfg(feature = "std")]
1594        assert!(err.source().is_some());
1595    }
1596
1597    #[test]
1598    #[cfg(feature = "alloc")]
1599    fn decoder_unexpected_eof_error() {
1600        let mut decoder = WitnessDecoder::new();
1601        let mut slice = [0x01].as_slice(); // witness element count = 1.
1602        assert!(decoder.push_bytes(&mut slice).unwrap());
1603
1604        let inner = match decoder.end().unwrap_err() {
1605            WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(inner)) => inner,
1606            err => panic!("unexpected error: {err}"),
1607        };
1608        assert!(!inner.to_string().is_empty());
1609    }
1610
1611    #[test]
1612    #[cfg(feature = "alloc")]
1613    fn reserve_batch_returns_existing_len() {
1614        let mut decoder = WitnessDecoder::new();
1615        decoder.content = vec![0u8; 4];
1616        assert_eq!(decoder.reserve_batch(4), 4);
1617    }
1618
1619    #[test]
1620    #[cfg(feature = "alloc")]
1621    fn reserve_batch_reserves_when_full() {
1622        let mut decoder = WitnessDecoder::new();
1623        let content = vec![0; 1];
1624        decoder.content = content;
1625        assert_eq!(decoder.content.capacity(), decoder.content.len());
1626
1627        let new_len = decoder.reserve_batch(2);
1628        assert_eq!(decoder.content.len(), new_len);
1629        assert!(decoder.content.len() >= 2);
1630    }
1631
1632    #[test]
1633    #[cfg(feature = "alloc")]
1634    fn decode_buffer_resizing() {
1635        // Create a witness with elements larger than initial 128-byte allocation.
1636        let large_element = vec![0xFF; 500];
1637        let mut encoded = vec![0x02];
1638        encoded.extend_from_slice(&[0xFD, 0xF4, 0x01]);
1639        encoded.extend_from_slice(&large_element);
1640        encoded.extend_from_slice(&[0xFD, 0xF4, 0x01]);
1641        encoded.extend_from_slice(&large_element);
1642
1643        let mut slice = encoded.as_slice();
1644        let mut decoder = WitnessDecoder::new();
1645        assert!(!decoder.push_bytes(&mut slice).unwrap());
1646
1647        let witness = decoder.end().unwrap();
1648        assert_eq!(witness.len(), 2);
1649        assert_eq!(&witness[0], large_element.as_slice());
1650        assert_eq!(&witness[1], large_element.as_slice());
1651    }
1652
1653    #[test]
1654    #[cfg(feature = "alloc")]
1655    fn iter_next_none_if_cursor_decode_fails() {
1656        let witness = Witness { content: vec![], witness_elements: 1, indices_start: 0 };
1657        assert!(witness.iter().next().is_none());
1658    }
1659
1660    #[test]
1661    #[cfg(feature = "alloc")]
1662    fn iter_next_none_if_element_len_too_big() {
1663        // Element length = 4_000_001 which is larger than MAX_VEC_SIZE (4_000_000).
1664        let mut content = vec![0xFE];
1665        content.extend_from_slice(&4_000_001u32.to_le_bytes());
1666        let indices_start = content.len();
1667        content.extend_from_slice(&u32::to_ne_bytes(0));
1668
1669        let witness = Witness { content, witness_elements: 1, indices_start };
1670        assert!(witness.iter().next().is_none());
1671    }
1672
1673    #[test]
1674    #[cfg(feature = "alloc")]
1675    fn witness_debug() {
1676        let witness = Witness::from_slice(&[&[0xAAu8][..]]);
1677        let s = format!("{:?}", witness);
1678        assert!(!s.is_empty());
1679    }
1680
1681    #[test]
1682    fn size_matches_encoding_length() {
1683        let empty = Witness::new();
1684        assert_eq!(empty.size(), encoding::encode_to_vec(&empty).len());
1685
1686        let mut witness = Witness::new();
1687        witness.push([0u8; 0]);
1688        assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1689        witness.push([0u8; 252]);
1690        assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1691        witness.push([0u8; 253]);
1692        assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1693    }
1694
1695    #[test]
1696    fn decode_value_1_byte() {
1697        // Check lower bound, upper bound.
1698        for v in [0x00, 0x01, 0x02, 0xFA, 0xFB, 0xFC] {
1699            let raw = [v];
1700            let mut slice = raw.as_slice();
1701            let got = decode_unchecked(&mut slice);
1702            assert_eq!(got, u64::from(v));
1703            assert!(slice.is_empty());
1704        }
1705    }
1706
1707    macro_rules! check_decode {
1708        ($($test_name:ident, $size:expr, $want:expr, $encoded:expr);* $(;)?) => {
1709            $(
1710                #[test]
1711                fn $test_name() {
1712                    let mut slice = $encoded.as_slice();
1713                    let got = decode_unchecked(&mut slice);
1714                    assert_eq!(got, $want);
1715                    assert_eq!(slice.len(), $encoded.len() - $size);
1716                }
1717            )*
1718        }
1719    }
1720
1721    check_decode! {
1722        // 3 byte encoding.
1723        decode_from_3_byte_slice_lower_bound, 3, 0xFD, [0xFD, 0xFD, 0x00];
1724        decode_from_3_byte_slice_three_over_lower_bound, 3, 0x0100, [0xFD, 0x00, 0x01];
1725        decode_from_3_byte_slice_endianness, 3, 0xABCD, [0xFD, 0xCD, 0xAB];
1726        decode_from_3_byte_slice_upper_bound, 3, 0xFFFF, [0xFD, 0xFF, 0xFF];
1727
1728        // 5 byte encoding.
1729        decode_from_5_byte_slice_lower_bound, 5, 0x0001_0000, [0xFE, 0x00, 0x00, 0x01, 0x00];
1730        decode_from_5_byte_slice_endianness, 5, 0x0123_4567, [0xFE, 0x67, 0x45, 0x23, 0x01];
1731        decode_from_5_byte_slice_upper_bound, 5, 0xFFFF_FFFF, [0xFE, 0xFF, 0xFF, 0xFF, 0xFF];
1732        // 9 byte encoding.
1733        decode_from_9_byte_slice_lower_bound, 9, 0x0000_0001_0000_0000, [0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00];
1734        decode_from_9_byte_slice_endianness, 9, 0x0123_4567_89AB_CDEF, [0xFF, 0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01];
1735        decode_from_9_byte_slice_upper_bound, 9, u64::MAX, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
1736
1737        // Check slices that are bigger than the actual encoding.
1738        decode_1_byte_from_bigger_slice, 1, 32, [0x20, 0xAB, 0xBC];
1739        decode_3_byte_from_bigger_slice, 3, 0xFFFF, [0xFD, 0xFF, 0xFF, 0xAB, 0xBC];
1740        decode_5_byte_from_bigger_slice, 5, 0xFFFF_FFFF, [0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBC];
1741        decode_9_byte_from_bigger_slice, 9, u64::MAX, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBC];
1742    }
1743
1744    #[test]
1745    #[should_panic(expected = "tried to decode an empty slice")]
1746    fn decode_from_empty_slice_panics() {
1747        let mut slice = [].as_slice();
1748        let _ = decode_unchecked(&mut slice);
1749    }
1750
1751    #[test]
1752    #[should_panic(expected = "slice too short, expected at least 5 bytes")]
1753    // Non-minimal is referred to as non-canonical in Core (`bitcoin/src/serialize.h`).
1754    fn decode_non_minimal_panics() {
1755        let mut slice = [0xFE, 0xCD, 0xAB].as_slice();
1756        let _ = decode_unchecked(&mut slice);
1757    }
1758
1759    #[cfg(feature = "alloc")]
1760    #[test]
1761    fn test_dos_protection() {
1762        let mut encoded = Vec::new();
1763        encoded.extend_from_slice(&[0xFE, 0x00, 0x09, 0x3D, 0x00]); // 4_000_000 (witness count)
1764        encoded.extend_from_slice(&[0xFE, 0x00, 0x09, 0x3D, 0x00]); // 4_000_000 (1st element length)
1765
1766        let mut slice = encoded.as_slice();
1767        let mut dec = WitnessDecoder::new();
1768
1769        assert!(dec.push_bytes(&mut slice).unwrap());
1770
1771        let allocated = dec.content.len();
1772
1773        assert!(allocated >= 16_000_000 && allocated < 17_500_000);
1774    }
1775}