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