1use 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#[cfg(feature = "alloc")]
31const MAX_VECTOR_ALLOCATE: usize = 1_000_000;
32
33#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
44pub struct Witness {
45 content: Vec<u8>,
56
57 witness_elements: usize,
62
63 indices_start: usize,
68}
69
70impl Witness {
71 #[inline]
73 pub const fn new() -> Self {
74 Self { content: Vec::new(), witness_elements: 0, indices_start: 0 }
75 }
76
77 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 #[inline]
103 pub fn to_vec(&self) -> Vec<Vec<u8>> { self.iter().map(<[u8]>::to_vec).collect() }
104
105 #[inline]
107 pub fn is_empty(&self) -> bool { self.witness_elements == 0 }
108
109 #[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 #[inline]
118 pub const fn len(&self) -> usize { self.witness_elements }
119
120 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 #[inline]
142 pub fn clear(&mut self) {
143 self.content.clear();
144 self.witness_elements = 0;
145 self.indices_start = 0;
146 }
147
148 #[inline]
150 pub fn push<T: AsRef<[u8]>>(&mut self, new_element: T) {
151 self.push_slice(new_element.as_ref());
152 }
153
154 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 #[inline]
181 pub fn last(&self) -> Option<&[u8]> { self.get_back(0) }
182
183 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 #[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..]; let element_len = decode_unchecked(&mut slice);
220 let end = cast_to_usize_if_valid(element_len)?;
221 Some(&slice[..end])
222 }
223
224 #[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#[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
261pub 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#[cfg(feature = "alloc")]
289pub struct WitnessDecoder {
290 content: Vec<u8>,
293 cursor: usize,
295 witness_count_decoder: CompactSizeDecoder,
297 witness_elements: Option<usize>,
299 element_idx: usize,
301 element_length_decoder: CompactSizeDecoder,
303 element_bytes_remaining: Option<usize>,
307}
308
309impl WitnessDecoder {
310 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 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 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 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 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 if witness_elements == 0 {
373 return Ok(false);
374 }
375
376 let witness_index_space = witness_elements * 4;
382 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 loop {
394 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 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 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 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 let position_after_rotation = self.cursor - witness_index_space;
440 encode_cursor(&mut self.content, 0, self.element_idx, position_after_rotation);
441
442 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 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 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 self.content.truncate(self.cursor);
477
478 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 self.witness_count_decoder.read_limit()
496 } else {
497 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
511impl<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#[allow(clippy::missing_fields_in_debug)] impl 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#[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..]; 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#[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 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; 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#[derive(Debug, Clone, PartialEq, Eq)]
818pub struct WitnessDecoderError(WitnessDecoderErrorInner);
819
820#[derive(Debug, Clone, PartialEq, Eq)]
821enum WitnessDecoderErrorInner {
822 LengthPrefixDecode(CompactSizeDecoderError),
824 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#[derive(Debug, Clone, PartialEq, Eq)]
857pub struct UnexpectedEofError {
858 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
879fn cast_to_usize_if_valid(n: u64) -> Option<usize> {
890 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
900fn 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 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 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 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 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 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; 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 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 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; assert_eq!(witness.size(), want);
1122
1123 witness.push([1, 2, 3]);
1124 let want = 5; assert_eq!(witness.size(), want);
1126
1127 witness.push([4, 5]);
1128 let want = 8; 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 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 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 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 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 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 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 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 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 let witness1 = Witness::from_iter(data);
1268
1269 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 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 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 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 let witness = Witness::from_iter(data);
1328
1329 let mut encoder = witness.encoder();
1331
1332 assert_eq!(encoder.current_chunk(), &[2u8][..]);
1333 assert!(encoder.advance());
1334
1335 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]; let mut b = &encoded.as_slice()[1..2]; let mut c = &encoded.as_slice()[2..5]; let mut d = &encoded.as_slice()[5..6]; let mut e = &encoded.as_slice()[6..7]; let mut f = &encoded.as_slice()[7..9]; let mut g = &encoded.as_slice()[9..]; 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 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 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 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 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 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 let encoded = vec![0x01, 0xFD, 0x05]; 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 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 assert_eq!(decoder.read_limit(), 1);
1558
1559 let mut bytes = [0x01u8].as_slice();
1561 decoder.push_bytes(&mut bytes).unwrap();
1562 assert_eq!(decoder.read_limit(), 1);
1564
1565 let mut bytes = [0xFDu8].as_slice();
1567 decoder.push_bytes(&mut bytes).unwrap();
1568 assert_eq!(decoder.read_limit(), 2);
1569
1570 let mut bytes = [0xF4u8, 0x01].as_slice();
1572 decoder.push_bytes(&mut bytes).unwrap();
1573 assert_eq!(decoder.read_limit(), 500);
1575
1576 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(); 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 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 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 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 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 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 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 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 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]); encoded.extend_from_slice(&[0xFE, 0x00, 0x09, 0x3D, 0x00]); 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}