1use core::{fmt, str};
15
16use hashes::{hash_newtype, sha256, sha256d, sha256t_hash_newtype, Hash};
17use internals::write_err;
18use io::Write;
19
20use crate::blockdata::witness::Witness;
21use crate::consensus::{encode, Encodable};
22use crate::prelude::*;
23use crate::taproot::{LeafVersion, TapLeafHash, TAPROOT_ANNEX_PREFIX};
24use crate::{transaction, Amount, Script, ScriptBuf, Sequence, Transaction, TxIn, TxOut};
25
26#[rustfmt::skip]
28pub(crate) const UINT256_ONE: [u8; 32] = [
29 1, 0, 0, 0, 0, 0, 0, 0,
30 0, 0, 0, 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 0, 0, 0, 0, 0
33];
34
35macro_rules! impl_message_from_hash {
36 ($ty:ident) => {
37 impl From<$ty> for secp256k1::Message {
38 fn from(hash: $ty) -> secp256k1::Message {
39 secp256k1::Message::from_digest(hash.to_byte_array())
40 }
41 }
42 };
43}
44
45hash_newtype! {
46 #[hash_newtype(forward)]
48 pub struct LegacySighash(sha256d::Hash);
49
50 #[hash_newtype(forward)]
52 pub struct SegwitV0Sighash(sha256d::Hash);
53}
54
55impl_message_from_hash!(LegacySighash);
56impl_message_from_hash!(SegwitV0Sighash);
57
58sha256t_hash_newtype! {
59 pub struct TapSighashTag = hash_str("TapSighash");
60
61 #[hash_newtype(forward)]
65 pub struct TapSighash(_);
66}
67
68impl_message_from_hash!(TapSighash);
69
70#[derive(Debug)]
72pub struct SighashCache<T: Borrow<Transaction>> {
73 tx: T,
77
78 common_cache: Option<CommonCache>,
80
81 segwit_cache: Option<SegwitCache>,
83
84 taproot_cache: Option<TaprootCache>,
86}
87
88#[derive(Debug)]
90struct CommonCache {
91 prevouts: sha256::Hash,
92 sequences: sha256::Hash,
93
94 outputs: sha256::Hash,
97}
98
99#[derive(Debug)]
101struct SegwitCache {
102 prevouts: sha256d::Hash,
103 sequences: sha256d::Hash,
104 outputs: sha256d::Hash,
105}
106
107#[derive(Debug)]
109struct TaprootCache {
110 amounts: sha256::Hash,
111 script_pubkeys: sha256::Hash,
112}
113
114#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
117pub enum Prevouts<'u, T>
118where
119 T: 'u + Borrow<TxOut>,
120{
121 One(usize, T),
125 All(&'u [T]),
128}
129
130const KEY_VERSION_0: u8 = 0u8;
131
132#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
136pub struct ScriptPath<'s> {
137 script: &'s Script,
138 leaf_version: LeafVersion,
139}
140
141#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
144pub enum TapSighashType {
145 Default = 0x00,
147 All = 0x01,
149 None = 0x02,
151 Single = 0x03,
156 AllPlusAnyoneCanPay = 0x81,
158 NonePlusAnyoneCanPay = 0x82,
160 SinglePlusAnyoneCanPay = 0x83,
162}
163#[cfg(feature = "serde")]
164crate::serde_utils::serde_string_impl!(TapSighashType, "a TapSighashType data");
165
166impl fmt::Display for TapSighashType {
167 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
168 use TapSighashType::*;
169
170 let s = match self {
171 Default => "SIGHASH_DEFAULT",
172 All => "SIGHASH_ALL",
173 None => "SIGHASH_NONE",
174 Single => "SIGHASH_SINGLE",
175 AllPlusAnyoneCanPay => "SIGHASH_ALL|SIGHASH_ANYONECANPAY",
176 NonePlusAnyoneCanPay => "SIGHASH_NONE|SIGHASH_ANYONECANPAY",
177 SinglePlusAnyoneCanPay => "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY",
178 };
179 f.write_str(s)
180 }
181}
182
183impl str::FromStr for TapSighashType {
184 type Err = SighashTypeParseError;
185
186 fn from_str(s: &str) -> Result<Self, Self::Err> {
187 use TapSighashType::*;
188
189 match s {
190 "SIGHASH_DEFAULT" => Ok(Default),
191 "SIGHASH_ALL" => Ok(All),
192 "SIGHASH_NONE" => Ok(None),
193 "SIGHASH_SINGLE" => Ok(Single),
194 "SIGHASH_ALL|SIGHASH_ANYONECANPAY" => Ok(AllPlusAnyoneCanPay),
195 "SIGHASH_NONE|SIGHASH_ANYONECANPAY" => Ok(NonePlusAnyoneCanPay),
196 "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY" => Ok(SinglePlusAnyoneCanPay),
197 _ => Err(SighashTypeParseError { unrecognized: s.to_owned() }),
198 }
199 }
200}
201
202impl<'u, T> Prevouts<'u, T>
203where
204 T: Borrow<TxOut>,
205{
206 fn check_all(&self, tx: &Transaction) -> Result<(), PrevoutsSizeError> {
207 if let Prevouts::All(prevouts) = self {
208 if prevouts.len() != tx.input.len() {
209 return Err(PrevoutsSizeError);
210 }
211 }
212 Ok(())
213 }
214
215 fn get_all(&self) -> Result<&[T], PrevoutsKindError> {
216 match self {
217 Prevouts::All(prevouts) => Ok(*prevouts),
218 _ => Err(PrevoutsKindError),
219 }
220 }
221
222 fn get(&self, input_index: usize) -> Result<&TxOut, PrevoutsIndexError> {
223 match self {
224 Prevouts::One(index, prevout) =>
225 if input_index == *index {
226 Ok(prevout.borrow())
227 } else {
228 Err(PrevoutsIndexError::InvalidOneIndex)
229 },
230 Prevouts::All(prevouts) => prevouts
231 .get(input_index)
232 .map(|x| x.borrow())
233 .ok_or(PrevoutsIndexError::InvalidAllIndex),
234 }
235 }
236}
237
238#[derive(Debug, Clone, PartialEq, Eq)]
240#[non_exhaustive]
241pub struct PrevoutsSizeError;
242
243impl fmt::Display for PrevoutsSizeError {
244 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
245 write!(f, "number of supplied prevouts differs from the number of inputs in transaction")
246 }
247}
248
249#[cfg(feature = "std")]
250impl std::error::Error for PrevoutsSizeError {
251 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
252}
253
254#[derive(Debug, Clone, PartialEq, Eq)]
256#[non_exhaustive]
257pub struct PrevoutsKindError;
258
259impl fmt::Display for PrevoutsKindError {
260 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
261 write!(f, "single prevout provided but all prevouts are needed without `ANYONECANPAY`")
262 }
263}
264
265#[cfg(feature = "std")]
266impl std::error::Error for PrevoutsKindError {
267 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
268}
269
270#[derive(Debug, Clone, PartialEq, Eq)]
272#[non_exhaustive]
273pub enum PrevoutsIndexError {
274 InvalidOneIndex,
276 InvalidAllIndex,
278}
279
280internals::impl_from_infallible!(PrevoutsIndexError);
281
282impl fmt::Display for PrevoutsIndexError {
283 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
284 use PrevoutsIndexError::*;
285
286 match *self {
287 InvalidOneIndex => write!(f, "invalid index when accessing a Prevouts::One kind"),
288 InvalidAllIndex => write!(f, "invalid index when accessing a Prevouts::All kind"),
289 }
290 }
291}
292
293#[cfg(feature = "std")]
294impl std::error::Error for PrevoutsIndexError {
295 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
296 use PrevoutsIndexError::*;
297
298 match *self {
299 InvalidOneIndex | InvalidAllIndex => None,
300 }
301 }
302}
303
304impl<'s> ScriptPath<'s> {
305 pub fn new(script: &'s Script, leaf_version: LeafVersion) -> Self {
307 ScriptPath { script, leaf_version }
308 }
309 pub fn with_defaults(script: &'s Script) -> Self { Self::new(script, LeafVersion::TapScript) }
311 pub fn leaf_hash(&self) -> TapLeafHash {
313 let mut enc = TapLeafHash::engine();
314
315 self.leaf_version
316 .to_consensus()
317 .consensus_encode(&mut enc)
318 .expect("writing to hash enging should never fail");
319 self.script.consensus_encode(&mut enc).expect("writing to hash enging should never fail");
320
321 TapLeafHash::from_engine(enc)
322 }
323}
324
325impl<'s> From<ScriptPath<'s>> for TapLeafHash {
326 fn from(script_path: ScriptPath<'s>) -> TapLeafHash { script_path.leaf_hash() }
327}
328
329#[derive(PartialEq, Eq, Debug, Copy, Clone, Hash)]
334pub enum EcdsaSighashType {
335 All = 0x01,
337 None = 0x02,
339 Single = 0x03,
344 AllPlusAnyoneCanPay = 0x81,
346 NonePlusAnyoneCanPay = 0x82,
348 SinglePlusAnyoneCanPay = 0x83,
350}
351#[cfg(feature = "serde")]
352crate::serde_utils::serde_string_impl!(EcdsaSighashType, "a EcdsaSighashType data");
353
354impl fmt::Display for EcdsaSighashType {
355 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
356 use EcdsaSighashType::*;
357
358 let s = match self {
359 All => "SIGHASH_ALL",
360 None => "SIGHASH_NONE",
361 Single => "SIGHASH_SINGLE",
362 AllPlusAnyoneCanPay => "SIGHASH_ALL|SIGHASH_ANYONECANPAY",
363 NonePlusAnyoneCanPay => "SIGHASH_NONE|SIGHASH_ANYONECANPAY",
364 SinglePlusAnyoneCanPay => "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY",
365 };
366 f.write_str(s)
367 }
368}
369
370impl str::FromStr for EcdsaSighashType {
371 type Err = SighashTypeParseError;
372
373 fn from_str(s: &str) -> Result<Self, Self::Err> {
374 use EcdsaSighashType::*;
375
376 match s {
377 "SIGHASH_ALL" => Ok(All),
378 "SIGHASH_NONE" => Ok(None),
379 "SIGHASH_SINGLE" => Ok(Single),
380 "SIGHASH_ALL|SIGHASH_ANYONECANPAY" => Ok(AllPlusAnyoneCanPay),
381 "SIGHASH_NONE|SIGHASH_ANYONECANPAY" => Ok(NonePlusAnyoneCanPay),
382 "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY" => Ok(SinglePlusAnyoneCanPay),
383 _ => Err(SighashTypeParseError { unrecognized: s.to_owned() }),
384 }
385 }
386}
387
388impl EcdsaSighashType {
389 pub(crate) fn split_anyonecanpay_flag(self) -> (EcdsaSighashType, bool) {
391 use EcdsaSighashType::*;
392
393 match self {
394 All => (All, false),
395 None => (None, false),
396 Single => (Single, false),
397 AllPlusAnyoneCanPay => (All, true),
398 NonePlusAnyoneCanPay => (None, true),
399 SinglePlusAnyoneCanPay => (Single, true),
400 }
401 }
402
403 pub fn is_single(&self) -> bool {
410 matches!(self, Self::Single | Self::SinglePlusAnyoneCanPay)
411 }
412
413 pub fn from_consensus(n: u32) -> EcdsaSighashType {
423 use EcdsaSighashType::*;
424
425 let mask = 0x1f | 0x80;
430 match n & mask {
431 0x01 => All,
433 0x02 => None,
434 0x03 => Single,
435 0x81 => AllPlusAnyoneCanPay,
436 0x82 => NonePlusAnyoneCanPay,
437 0x83 => SinglePlusAnyoneCanPay,
438 x if x & 0x80 == 0x80 => AllPlusAnyoneCanPay,
440 _ => All,
441 }
442 }
443
444 pub fn from_standard(n: u32) -> Result<EcdsaSighashType, NonStandardSighashTypeError> {
450 use EcdsaSighashType::*;
451
452 match n {
453 0x01 => Ok(All),
455 0x02 => Ok(None),
456 0x03 => Ok(Single),
457 0x81 => Ok(AllPlusAnyoneCanPay),
458 0x82 => Ok(NonePlusAnyoneCanPay),
459 0x83 => Ok(SinglePlusAnyoneCanPay),
460 non_standard => Err(NonStandardSighashTypeError(non_standard)),
461 }
462 }
463
464 pub fn to_u32(self) -> u32 { self as u32 }
468}
469
470impl From<EcdsaSighashType> for TapSighashType {
471 fn from(s: EcdsaSighashType) -> Self {
472 use TapSighashType::*;
473
474 match s {
475 EcdsaSighashType::All => All,
476 EcdsaSighashType::None => None,
477 EcdsaSighashType::Single => Single,
478 EcdsaSighashType::AllPlusAnyoneCanPay => AllPlusAnyoneCanPay,
479 EcdsaSighashType::NonePlusAnyoneCanPay => NonePlusAnyoneCanPay,
480 EcdsaSighashType::SinglePlusAnyoneCanPay => SinglePlusAnyoneCanPay,
481 }
482 }
483}
484
485impl TapSighashType {
486 pub(crate) fn split_anyonecanpay_flag(self) -> (TapSighashType, bool) {
488 use TapSighashType::*;
489
490 match self {
491 Default => (Default, false),
492 All => (All, false),
493 None => (None, false),
494 Single => (Single, false),
495 AllPlusAnyoneCanPay => (All, true),
496 NonePlusAnyoneCanPay => (None, true),
497 SinglePlusAnyoneCanPay => (Single, true),
498 }
499 }
500
501 pub fn from_consensus_u8(sighash_type: u8) -> Result<Self, InvalidSighashTypeError> {
503 use TapSighashType::*;
504
505 Ok(match sighash_type {
506 0x00 => Default,
507 0x01 => All,
508 0x02 => None,
509 0x03 => Single,
510 0x81 => AllPlusAnyoneCanPay,
511 0x82 => NonePlusAnyoneCanPay,
512 0x83 => SinglePlusAnyoneCanPay,
513 x => return Err(InvalidSighashTypeError(x.into())),
514 })
515 }
516}
517
518#[derive(Debug, Clone, PartialEq, Eq)]
520pub struct InvalidSighashTypeError(pub u32);
521
522impl fmt::Display for InvalidSighashTypeError {
523 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
524 write!(f, "invalid sighash type {}", self.0)
525 }
526}
527
528#[cfg(feature = "std")]
529impl std::error::Error for InvalidSighashTypeError {
530 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
531}
532
533#[derive(Debug, Clone, PartialEq, Eq)]
536pub struct NonStandardSighashTypeError(pub u32);
537
538impl fmt::Display for NonStandardSighashTypeError {
539 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
540 write!(f, "non-standard sighash type {}", self.0)
541 }
542}
543
544#[cfg(feature = "std")]
545impl std::error::Error for NonStandardSighashTypeError {
546 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
547}
548
549#[derive(Debug, Clone, PartialEq, Eq)]
553#[non_exhaustive]
554pub struct SighashTypeParseError {
555 pub unrecognized: String,
557}
558
559impl fmt::Display for SighashTypeParseError {
560 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
561 write!(f, "unrecognized SIGHASH string '{}'", self.unrecognized)
562 }
563}
564
565#[cfg(feature = "std")]
566impl std::error::Error for SighashTypeParseError {
567 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
568}
569
570impl<R: Borrow<Transaction>> SighashCache<R> {
571 pub fn new(tx: R) -> Self {
577 SighashCache { tx, common_cache: None, taproot_cache: None, segwit_cache: None }
578 }
579
580 pub fn transaction(&self) -> &Transaction { self.tx.borrow() }
582
583 pub fn into_transaction(self) -> R { self.tx }
585
586 pub fn taproot_encode_signing_data_to<W: Write + ?Sized, T: Borrow<TxOut>>(
589 &mut self,
590 writer: &mut W,
591 input_index: usize,
592 prevouts: &Prevouts<T>,
593 annex: Option<Annex>,
594 leaf_hash_code_separator: Option<(TapLeafHash, u32)>,
595 sighash_type: TapSighashType,
596 ) -> Result<(), SigningDataError<TaprootError>> {
597 prevouts.check_all(self.tx.borrow()).map_err(SigningDataError::sighash)?;
598
599 let (sighash, anyone_can_pay) = sighash_type.split_anyonecanpay_flag();
600
601 0u8.consensus_encode(writer)?;
603
604 (sighash_type as u8).consensus_encode(writer)?;
607
608 self.tx.borrow().version.consensus_encode(writer)?;
611
612 self.tx.borrow().lock_time.consensus_encode(writer)?;
614
615 if !anyone_can_pay {
621 self.common_cache().prevouts.consensus_encode(writer)?;
622 self.taproot_cache(prevouts.get_all().map_err(SigningDataError::sighash)?)
623 .amounts
624 .consensus_encode(writer)?;
625 self.taproot_cache(prevouts.get_all().map_err(SigningDataError::sighash)?)
626 .script_pubkeys
627 .consensus_encode(writer)?;
628 self.common_cache().sequences.consensus_encode(writer)?;
629 }
630
631 if sighash != TapSighashType::None && sighash != TapSighashType::Single {
634 self.common_cache().outputs.consensus_encode(writer)?;
635 }
636
637 let mut spend_type = 0u8;
641 if annex.is_some() {
642 spend_type |= 1u8;
643 }
644 if leaf_hash_code_separator.is_some() {
645 spend_type |= 2u8;
646 }
647 spend_type.consensus_encode(writer)?;
648
649 if anyone_can_pay {
655 let txin = &self.tx.borrow().tx_in(input_index).map_err(SigningDataError::sighash)?;
656 let previous_output = prevouts.get(input_index).map_err(SigningDataError::sighash)?;
657 txin.previous_output.consensus_encode(writer)?;
658 previous_output.value.consensus_encode(writer)?;
659 previous_output.script_pubkey.consensus_encode(writer)?;
660 txin.sequence.consensus_encode(writer)?;
661 } else {
662 (input_index as u32).consensus_encode(writer)?;
663 }
664
665 if let Some(annex) = annex {
669 let mut enc = sha256::Hash::engine();
670 annex.consensus_encode(&mut enc)?;
671 let hash = sha256::Hash::from_engine(enc);
672 hash.consensus_encode(writer)?;
673 }
674
675 if sighash == TapSighashType::Single {
679 let mut enc = sha256::Hash::engine();
680 self.tx
681 .borrow()
682 .output
683 .get(input_index)
684 .ok_or(TaprootError::SingleMissingOutput(SingleMissingOutputError {
685 input_index,
686 outputs_length: self.tx.borrow().output.len(),
687 }))
688 .map_err(SigningDataError::Sighash)?
689 .consensus_encode(&mut enc)?;
690 let hash = sha256::Hash::from_engine(enc);
691 hash.consensus_encode(writer)?;
692 }
693
694 if let Some((hash, code_separator_pos)) = leaf_hash_code_separator {
699 hash.as_byte_array().consensus_encode(writer)?;
700 KEY_VERSION_0.consensus_encode(writer)?;
701 code_separator_pos.consensus_encode(writer)?;
702 }
703
704 Ok(())
705 }
706
707 pub fn taproot_signature_hash<T: Borrow<TxOut>>(
709 &mut self,
710 input_index: usize,
711 prevouts: &Prevouts<T>,
712 annex: Option<Annex>,
713 leaf_hash_code_separator: Option<(TapLeafHash, u32)>,
714 sighash_type: TapSighashType,
715 ) -> Result<TapSighash, TaprootError> {
716 let mut enc = TapSighash::engine();
717 self.taproot_encode_signing_data_to(
718 &mut enc,
719 input_index,
720 prevouts,
721 annex,
722 leaf_hash_code_separator,
723 sighash_type,
724 )
725 .map_err(SigningDataError::unwrap_sighash)?;
726 Ok(TapSighash::from_engine(enc))
727 }
728
729 pub fn taproot_key_spend_signature_hash<T: Borrow<TxOut>>(
731 &mut self,
732 input_index: usize,
733 prevouts: &Prevouts<T>,
734 sighash_type: TapSighashType,
735 ) -> Result<TapSighash, TaprootError> {
736 let mut enc = TapSighash::engine();
737 self.taproot_encode_signing_data_to(
738 &mut enc,
739 input_index,
740 prevouts,
741 None,
742 None,
743 sighash_type,
744 )
745 .map_err(SigningDataError::unwrap_sighash)?;
746 Ok(TapSighash::from_engine(enc))
747 }
748
749 pub fn taproot_script_spend_signature_hash<S: Into<TapLeafHash>, T: Borrow<TxOut>>(
754 &mut self,
755 input_index: usize,
756 prevouts: &Prevouts<T>,
757 leaf_hash: S,
758 sighash_type: TapSighashType,
759 ) -> Result<TapSighash, TaprootError> {
760 let mut enc = TapSighash::engine();
761 self.taproot_encode_signing_data_to(
762 &mut enc,
763 input_index,
764 prevouts,
765 None,
766 Some((leaf_hash.into(), 0xFFFFFFFF)),
767 sighash_type,
768 )
769 .map_err(SigningDataError::unwrap_sighash)?;
770 Ok(TapSighash::from_engine(enc))
771 }
772
773 pub fn segwit_v0_encode_signing_data_to<W: Write + ?Sized>(
780 &mut self,
781 writer: &mut W,
782 input_index: usize,
783 script_code: &Script,
784 value: Amount,
785 sighash_type: EcdsaSighashType,
786 ) -> Result<(), SigningDataError<transaction::InputsIndexError>> {
787 let zero_hash = sha256d::Hash::all_zeros();
788
789 let (sighash, anyone_can_pay) = sighash_type.split_anyonecanpay_flag();
790
791 self.tx.borrow().version.consensus_encode(writer)?;
792
793 if !anyone_can_pay {
794 self.segwit_cache().prevouts.consensus_encode(writer)?;
795 } else {
796 zero_hash.consensus_encode(writer)?;
797 }
798
799 if !anyone_can_pay
800 && sighash != EcdsaSighashType::Single
801 && sighash != EcdsaSighashType::None
802 {
803 self.segwit_cache().sequences.consensus_encode(writer)?;
804 } else {
805 zero_hash.consensus_encode(writer)?;
806 }
807
808 {
809 let txin = &self.tx.borrow().tx_in(input_index).map_err(SigningDataError::sighash)?;
810 txin.previous_output.consensus_encode(writer)?;
811 script_code.consensus_encode(writer)?;
812 value.consensus_encode(writer)?;
813 txin.sequence.consensus_encode(writer)?;
814 }
815
816 if sighash != EcdsaSighashType::Single && sighash != EcdsaSighashType::None {
817 self.segwit_cache().outputs.consensus_encode(writer)?;
818 } else if sighash == EcdsaSighashType::Single && input_index < self.tx.borrow().output.len()
819 {
820 let mut single_enc = LegacySighash::engine();
821 self.tx.borrow().output[input_index].consensus_encode(&mut single_enc)?;
822 let hash = LegacySighash::from_engine(single_enc);
823 writer.write_all(&hash[..])?;
824 } else {
825 writer.write_all(&zero_hash[..])?;
826 }
827
828 self.tx.borrow().lock_time.consensus_encode(writer)?;
829 sighash_type.to_u32().consensus_encode(writer)?;
830 Ok(())
831 }
832
833 pub fn p2wpkh_signature_hash(
838 &mut self,
839 input_index: usize,
840 script_pubkey: &Script,
841 value: Amount,
842 sighash_type: EcdsaSighashType,
843 ) -> Result<SegwitV0Sighash, P2wpkhError> {
844 let script_code = script_pubkey.p2wpkh_script_code().ok_or(P2wpkhError::NotP2wpkhScript)?;
845
846 let mut enc = SegwitV0Sighash::engine();
847 self.segwit_v0_encode_signing_data_to(
848 &mut enc,
849 input_index,
850 &script_code,
851 value,
852 sighash_type,
853 )
854 .map_err(SigningDataError::unwrap_sighash)?;
855 Ok(SegwitV0Sighash::from_engine(enc))
856 }
857
858 pub fn p2wsh_signature_hash(
860 &mut self,
861 input_index: usize,
862 witness_script: &Script,
863 value: Amount,
864 sighash_type: EcdsaSighashType,
865 ) -> Result<SegwitV0Sighash, transaction::InputsIndexError> {
866 let mut enc = SegwitV0Sighash::engine();
867 self.segwit_v0_encode_signing_data_to(
868 &mut enc,
869 input_index,
870 witness_script,
871 value,
872 sighash_type,
873 )
874 .map_err(SigningDataError::unwrap_sighash)?;
875 Ok(SegwitV0Sighash::from_engine(enc))
876 }
877
878 pub fn legacy_encode_signing_data_to<W: Write + ?Sized, U: Into<u32>>(
901 &self,
902 writer: &mut W,
903 input_index: usize,
904 script_pubkey: &Script,
905 sighash_type: U,
906 ) -> EncodeSigningDataResult<SigningDataError<transaction::InputsIndexError>> {
907 if let Err(e) = self.tx.borrow().tx_in(input_index) {
909 return EncodeSigningDataResult::WriteResult(Err(SigningDataError::Sighash(e)));
910 }
911 let sighash_type: u32 = sighash_type.into();
912
913 if is_invalid_use_of_sighash_single(
914 sighash_type,
915 input_index,
916 self.tx.borrow().output.len(),
917 ) {
918 return EncodeSigningDataResult::SighashSingleBug;
923 }
924
925 fn encode_signing_data_to_inner<W: Write + ?Sized>(
926 self_: &Transaction,
927 writer: &mut W,
928 input_index: usize,
929 script_pubkey: &Script,
930 sighash_type: u32,
931 ) -> Result<(), io::Error> {
932 let (sighash, anyone_can_pay) =
933 EcdsaSighashType::from_consensus(sighash_type).split_anyonecanpay_flag();
934
935 let mut tx = Transaction {
937 version: self_.version,
938 lock_time: self_.lock_time,
939 input: vec![],
940 output: vec![],
941 };
942 if anyone_can_pay {
944 tx.input = vec![TxIn {
945 previous_output: self_.input[input_index].previous_output,
946 script_sig: script_pubkey.to_owned(),
947 sequence: self_.input[input_index].sequence,
948 witness: Witness::default(),
949 }];
950 } else {
951 tx.input = Vec::with_capacity(self_.input.len());
952 for (n, input) in self_.input.iter().enumerate() {
953 tx.input.push(TxIn {
954 previous_output: input.previous_output,
955 script_sig: if n == input_index {
956 script_pubkey.to_owned()
957 } else {
958 ScriptBuf::new()
959 },
960 sequence: if n != input_index
961 && (sighash == EcdsaSighashType::Single
962 || sighash == EcdsaSighashType::None)
963 {
964 Sequence::ZERO
965 } else {
966 input.sequence
967 },
968 witness: Witness::default(),
969 });
970 }
971 }
972 tx.output = match sighash {
974 EcdsaSighashType::All => self_.output.clone(),
975 EcdsaSighashType::Single => {
976 let output_iter = self_
977 .output
978 .iter()
979 .take(input_index + 1) .enumerate() .map(|(n, out)| if n == input_index { out.clone() } else { TxOut::NULL });
982 output_iter.collect()
983 }
984 EcdsaSighashType::None => vec![],
985 _ => unreachable!(),
986 };
987 tx.consensus_encode(writer)?;
989 sighash_type.to_le_bytes().consensus_encode(writer)?;
990 Ok(())
991 }
992
993 EncodeSigningDataResult::WriteResult(
994 encode_signing_data_to_inner(
995 self.tx.borrow(),
996 writer,
997 input_index,
998 script_pubkey,
999 sighash_type,
1000 )
1001 .map_err(Into::into),
1002 )
1003 }
1004
1005 pub fn legacy_signature_hash(
1025 &self,
1026 input_index: usize,
1027 script_pubkey: &Script,
1028 sighash_type: u32,
1029 ) -> Result<LegacySighash, transaction::InputsIndexError> {
1030 let mut engine = LegacySighash::engine();
1031 match self
1032 .legacy_encode_signing_data_to(&mut engine, input_index, script_pubkey, sighash_type)
1033 .is_sighash_single_bug()
1034 {
1035 Ok(true) => Ok(LegacySighash::from_byte_array(UINT256_ONE)),
1036 Ok(false) => Ok(LegacySighash::from_engine(engine)),
1037 Err(e) => Err(e.unwrap_sighash()),
1038 }
1039 }
1040
1041 #[inline]
1042 fn common_cache(&mut self) -> &CommonCache {
1043 Self::common_cache_minimal_borrow(&mut self.common_cache, self.tx.borrow())
1044 }
1045
1046 fn common_cache_minimal_borrow<'a>(
1047 common_cache: &'a mut Option<CommonCache>,
1048 tx: &Transaction,
1049 ) -> &'a CommonCache {
1050 common_cache.get_or_insert_with(|| {
1051 let mut enc_prevouts = sha256::Hash::engine();
1052 let mut enc_sequences = sha256::Hash::engine();
1053 for txin in tx.input.iter() {
1054 txin.previous_output.consensus_encode(&mut enc_prevouts).unwrap();
1055 txin.sequence.consensus_encode(&mut enc_sequences).unwrap();
1056 }
1057 CommonCache {
1058 prevouts: sha256::Hash::from_engine(enc_prevouts),
1059 sequences: sha256::Hash::from_engine(enc_sequences),
1060 outputs: {
1061 let mut enc = sha256::Hash::engine();
1062 for txout in tx.output.iter() {
1063 txout.consensus_encode(&mut enc).unwrap();
1064 }
1065 sha256::Hash::from_engine(enc)
1066 },
1067 }
1068 })
1069 }
1070
1071 fn segwit_cache(&mut self) -> &SegwitCache {
1072 let common_cache = &mut self.common_cache;
1073 let tx = self.tx.borrow();
1074 self.segwit_cache.get_or_insert_with(|| {
1075 let common_cache = Self::common_cache_minimal_borrow(common_cache, tx);
1076 SegwitCache {
1077 prevouts: common_cache.prevouts.hash_again(),
1078 sequences: common_cache.sequences.hash_again(),
1079 outputs: common_cache.outputs.hash_again(),
1080 }
1081 })
1082 }
1083
1084 fn taproot_cache<T: Borrow<TxOut>>(&mut self, prevouts: &[T]) -> &TaprootCache {
1085 self.taproot_cache.get_or_insert_with(|| {
1086 let mut enc_amounts = sha256::Hash::engine();
1087 let mut enc_script_pubkeys = sha256::Hash::engine();
1088 for prevout in prevouts {
1089 prevout.borrow().value.consensus_encode(&mut enc_amounts).unwrap();
1090 prevout.borrow().script_pubkey.consensus_encode(&mut enc_script_pubkeys).unwrap();
1091 }
1092 TaprootCache {
1093 amounts: sha256::Hash::from_engine(enc_amounts),
1094 script_pubkeys: sha256::Hash::from_engine(enc_script_pubkeys),
1095 }
1096 })
1097 }
1098}
1099
1100impl<R: BorrowMut<Transaction>> SighashCache<R> {
1101 pub fn witness_mut(&mut self, input_index: usize) -> Option<&mut Witness> {
1130 self.tx.borrow_mut().input.get_mut(input_index).map(|i| &mut i.witness)
1131 }
1132}
1133
1134#[derive(Clone, PartialEq, Eq, Hash, Debug)]
1136pub struct Annex<'a>(&'a [u8]);
1137
1138impl<'a> Annex<'a> {
1139 pub fn new(annex_bytes: &'a [u8]) -> Result<Self, AnnexError> {
1141 use AnnexError::*;
1142
1143 match annex_bytes.first() {
1144 Some(&TAPROOT_ANNEX_PREFIX) => Ok(Annex(annex_bytes)),
1145 Some(other) => Err(IncorrectPrefix(*other)),
1146 None => Err(Empty),
1147 }
1148 }
1149
1150 pub fn as_bytes(&self) -> &[u8] { self.0 }
1152}
1153
1154impl<'a> Encodable for Annex<'a> {
1155 fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1156 encode::consensus_encode_with_size(self.0, w)
1157 }
1158}
1159
1160#[derive(Debug, Clone, PartialEq, Eq)]
1162#[non_exhaustive]
1163pub enum TaprootError {
1164 InputsIndex(transaction::InputsIndexError),
1166 SingleMissingOutput(SingleMissingOutputError),
1168 PrevoutsSize(PrevoutsSizeError),
1170 PrevoutsIndex(PrevoutsIndexError),
1172 PrevoutsKind(PrevoutsKindError),
1174 InvalidSighashType(u32),
1176}
1177
1178internals::impl_from_infallible!(TaprootError);
1179
1180impl fmt::Display for TaprootError {
1181 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1182 use TaprootError::*;
1183
1184 match *self {
1185 InputsIndex(ref e) => write_err!(f, "inputs index"; e),
1186 SingleMissingOutput(ref e) => write_err!(f, "sighash single"; e),
1187 PrevoutsSize(ref e) => write_err!(f, "prevouts size"; e),
1188 PrevoutsIndex(ref e) => write_err!(f, "prevouts index"; e),
1189 PrevoutsKind(ref e) => write_err!(f, "prevouts kind"; e),
1190 InvalidSighashType(hash_ty) => write!(f, "invalid taproot sighash type : {} ", hash_ty),
1191 }
1192 }
1193}
1194
1195#[cfg(feature = "std")]
1196impl std::error::Error for TaprootError {
1197 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1198 use TaprootError::*;
1199
1200 match *self {
1201 InputsIndex(ref e) => Some(e),
1202 SingleMissingOutput(ref e) => Some(e),
1203 PrevoutsSize(ref e) => Some(e),
1204 PrevoutsIndex(ref e) => Some(e),
1205 PrevoutsKind(ref e) => Some(e),
1206 InvalidSighashType(_) => None,
1207 }
1208 }
1209}
1210
1211impl From<transaction::InputsIndexError> for TaprootError {
1212 fn from(e: transaction::InputsIndexError) -> Self { Self::InputsIndex(e) }
1213}
1214
1215impl From<PrevoutsSizeError> for TaprootError {
1216 fn from(e: PrevoutsSizeError) -> Self { Self::PrevoutsSize(e) }
1217}
1218
1219impl From<PrevoutsKindError> for TaprootError {
1220 fn from(e: PrevoutsKindError) -> Self { Self::PrevoutsKind(e) }
1221}
1222
1223impl From<PrevoutsIndexError> for TaprootError {
1224 fn from(e: PrevoutsIndexError) -> Self { Self::PrevoutsIndex(e) }
1225}
1226
1227#[derive(Debug, Clone, PartialEq, Eq)]
1229#[non_exhaustive]
1230pub enum P2wpkhError {
1231 Sighash(transaction::InputsIndexError),
1233 NotP2wpkhScript,
1235}
1236
1237internals::impl_from_infallible!(P2wpkhError);
1238
1239impl From<transaction::InputsIndexError> for P2wpkhError {
1240 fn from(value: transaction::InputsIndexError) -> Self { P2wpkhError::Sighash(value) }
1241}
1242
1243impl fmt::Display for P2wpkhError {
1244 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1245 use P2wpkhError::*;
1246
1247 match *self {
1248 Sighash(ref e) => write_err!(f, "error encoding segwit v0 signing data"; e),
1249 NotP2wpkhScript => write!(f, "script is not a script pubkey for a p2wpkh output"),
1250 }
1251 }
1252}
1253
1254#[cfg(feature = "std")]
1255impl std::error::Error for P2wpkhError {
1256 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1257 use P2wpkhError::*;
1258
1259 match *self {
1260 Sighash(ref e) => Some(e),
1261 NotP2wpkhScript => None,
1262 }
1263 }
1264}
1265
1266#[derive(Debug, Clone, PartialEq, Eq)]
1268#[non_exhaustive]
1269pub struct SingleMissingOutputError {
1270 pub input_index: usize,
1272 pub outputs_length: usize,
1274}
1275
1276impl fmt::Display for SingleMissingOutputError {
1277 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1278 write!(
1279 f,
1280 "sighash single requires an output at the same index as the input \
1281 (input index: {}, outputs length: {})",
1282 self.input_index, self.outputs_length
1283 )
1284 }
1285}
1286
1287#[cfg(feature = "std")]
1288impl std::error::Error for SingleMissingOutputError {
1289 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
1290}
1291
1292#[derive(Debug, Clone, PartialEq, Eq)]
1294#[non_exhaustive]
1295pub enum AnnexError {
1296 Empty,
1298 IncorrectPrefix(u8),
1300}
1301
1302internals::impl_from_infallible!(AnnexError);
1303
1304impl fmt::Display for AnnexError {
1305 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1306 use AnnexError::*;
1307
1308 match *self {
1309 Empty => write!(f, "the annex is empty"),
1310 IncorrectPrefix(byte) =>
1311 write!(f, "incorrect prefix byte in the annex {:02x}, expecting 0x50", byte),
1312 }
1313 }
1314}
1315
1316#[cfg(feature = "std")]
1317impl std::error::Error for AnnexError {
1318 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1319 use AnnexError::*;
1320
1321 match *self {
1322 Empty | IncorrectPrefix(_) => None,
1323 }
1324 }
1325}
1326
1327fn is_invalid_use_of_sighash_single(sighash: u32, input_index: usize, outputs_len: usize) -> bool {
1328 let ty = EcdsaSighashType::from_consensus(sighash);
1329 ty.is_single() && input_index >= outputs_len
1330}
1331
1332#[must_use]
1340pub enum EncodeSigningDataResult<E> {
1341 SighashSingleBug,
1343 WriteResult(Result<(), E>),
1345}
1346
1347impl<E> EncodeSigningDataResult<E> {
1348 pub fn is_sighash_single_bug(self) -> Result<bool, E> {
1375 match self {
1376 EncodeSigningDataResult::SighashSingleBug => Ok(true),
1377 EncodeSigningDataResult::WriteResult(Ok(())) => Ok(false),
1378 EncodeSigningDataResult::WriteResult(Err(e)) => Err(e),
1379 }
1380 }
1381
1382 pub fn map_err<E2, F>(self, f: F) -> EncodeSigningDataResult<E2>
1387 where
1388 F: FnOnce(E) -> E2,
1389 {
1390 match self {
1391 EncodeSigningDataResult::SighashSingleBug => EncodeSigningDataResult::SighashSingleBug,
1392 EncodeSigningDataResult::WriteResult(Err(e)) =>
1393 EncodeSigningDataResult::WriteResult(Err(f(e))),
1394 EncodeSigningDataResult::WriteResult(Ok(o)) =>
1395 EncodeSigningDataResult::WriteResult(Ok(o)),
1396 }
1397 }
1398}
1399
1400#[derive(Debug)]
1402pub enum SigningDataError<E> {
1403 Io(io::Error),
1406 Sighash(E),
1408}
1409
1410internals::impl_from_infallible!(SigningDataError<E>);
1411
1412impl<E> SigningDataError<E> {
1413 fn unwrap_sighash(self) -> E {
1417 match self {
1418 Self::Sighash(error) => error,
1419 Self::Io(error) => panic!("hash engine error {}", error),
1420 }
1421 }
1422
1423 fn sighash<E2: Into<E>>(error: E2) -> Self { Self::Sighash(error.into()) }
1424}
1425
1426impl<E> From<io::Error> for SigningDataError<E> {
1429 fn from(value: io::Error) -> Self { Self::Io(value) }
1430}
1431
1432impl<E: fmt::Display> fmt::Display for SigningDataError<E> {
1433 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1434 match self {
1435 Self::Io(error) => write_err!(f, "failed to write sighash data"; error),
1436 Self::Sighash(error) => write_err!(f, "failed to compute sighash data"; error),
1437 }
1438 }
1439}
1440
1441#[cfg(feature = "std")]
1442impl<E: std::error::Error + 'static> std::error::Error for SigningDataError<E> {
1443 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1444 match self {
1445 SigningDataError::Io(error) => Some(error),
1446 SigningDataError::Sighash(error) => Some(error),
1447 }
1448 }
1449}
1450
1451#[cfg(test)]
1452mod tests {
1453 use std::str::FromStr;
1454
1455 use hashes::HashEngine;
1456 use hex::{test_hex_unwrap as hex, FromHex};
1457
1458 use super::*;
1459 use crate::blockdata::locktime::absolute;
1460 use crate::consensus::deserialize;
1461
1462 extern crate serde_json;
1463
1464 #[test]
1465 fn sighash_single_bug() {
1466 let tx = Transaction {
1468 version: transaction::Version::ONE,
1469 lock_time: absolute::LockTime::ZERO,
1470 input: vec![TxIn::default(), TxIn::default()],
1471 output: vec![TxOut::NULL],
1472 };
1473 let script = ScriptBuf::new();
1474 let cache = SighashCache::new(&tx);
1475
1476 let sighash_single = 3;
1477 let got = cache.legacy_signature_hash(1, &script, sighash_single).expect("sighash");
1478 let want = LegacySighash::from_byte_array(UINT256_ONE);
1479 assert_eq!(got, want);
1480
1481 let sighash_single = 131;
1483 let got = cache.legacy_signature_hash(1, &script, sighash_single).expect("sighash");
1484 let want = LegacySighash::from_byte_array(UINT256_ONE);
1485 assert_eq!(got, want);
1486 }
1487
1488 #[test]
1489 #[cfg(feature = "serde")]
1490 fn legacy_sighash() {
1491 use serde_json::Value;
1492
1493 use crate::sighash::SighashCache;
1494
1495 fn run_test_sighash(
1496 tx: &str,
1497 script: &str,
1498 input_index: usize,
1499 hash_type: i64,
1500 expected_result: &str,
1501 ) {
1502 let tx: Transaction = deserialize(&Vec::from_hex(tx).unwrap()[..]).unwrap();
1503 let script = ScriptBuf::from(Vec::from_hex(script).unwrap());
1504 let mut raw_expected = Vec::from_hex(expected_result).unwrap();
1505 raw_expected.reverse();
1506 let want = LegacySighash::from_slice(&raw_expected[..]).unwrap();
1507
1508 let cache = SighashCache::new(&tx);
1509 let got = cache.legacy_signature_hash(input_index, &script, hash_type as u32).unwrap();
1510
1511 assert_eq!(got, want);
1512 }
1513
1514 let data = include_str!("../../tests/data/legacy_sighash.json");
1518
1519 let testdata = serde_json::from_str::<Value>(data).unwrap().as_array().unwrap().clone();
1520 for t in testdata.iter().skip(1) {
1521 let tx = t.get(0).unwrap().as_str().unwrap();
1522 let script = t.get(1).unwrap().as_str().unwrap_or("");
1523 let input_index = t.get(2).unwrap().as_u64().unwrap();
1524 let hash_type = t.get(3).unwrap().as_i64().unwrap();
1525 let expected_sighash = t.get(4).unwrap().as_str().unwrap();
1526 run_test_sighash(tx, script, input_index as usize, hash_type, expected_sighash);
1527 }
1528 }
1529
1530 #[test]
1531 fn test_tap_sighash_hash() {
1532 let bytes = hex!("00011b96877db45ffa23b307e9f0ac87b80ef9a80b4c5f0db3fbe734422453e83cc5576f3d542c5d4898fb2b696c15d43332534a7c1d1255fda38993545882df92c3e353ff6d36fbfadc4d168452afd8467f02fe53d71714fcea5dfe2ea759bd00185c4cb02bc76d42620393ca358a1a713f4997f9fc222911890afb3fe56c6a19b202df7bffdcfad08003821294279043746631b00e2dc5e52a111e213bbfe6ef09a19428d418dab0d50000000000");
1533 let expected = hex!("04e808aad07a40b3767a1442fead79af6ef7e7c9316d82dec409bb31e77699b0");
1534 let mut enc = TapSighash::engine();
1535 enc.input(&bytes);
1536 let hash = TapSighash::from_engine(enc);
1537 assert_eq!(expected, hash.to_byte_array());
1538 }
1539
1540 #[test]
1541 fn test_sighashes_keyspending() {
1542 test_taproot_sighash(
1545 "020000000164eb050a5e3da0c2a65e4786f26d753b7bc69691fabccafb11f7acef36641f1846010000003101b2b404392a22000000000017a9147f2bde86fe78bf68a0544a4f290e12f0b7e0a08c87580200000000000017a91425d11723074ecfb96a0a83c3956bfaf362ae0c908758020000000000001600147e20f938993641de67bb0cdd71682aa34c4d29ad5802000000000000160014c64984dc8761acfa99418bd6bedc79b9287d652d72000000",
1546 "01365724000000000023542156b39dab4f8f3508e0432cfb41fab110170acaa2d4c42539cb90a4dc7c093bc500",
1547 0,
1548 "33ca0ebfb4a945eeee9569fc0f5040221275f88690b7f8592ada88ce3bdf6703",
1549 TapSighashType::Default, None, None, None
1550 );
1551
1552 test_taproot_sighash(
1553 "0200000002fff49be59befe7566050737910f6ccdc5e749c7f8860ddc140386463d88c5ad0f3000000002cf68eb4a3d67f9d4c079249f7e4f27b8854815cb1ed13842d4fbf395f9e217fd605ee24090100000065235d9203f458520000000000160014b6d48333bb13b4c644e57c43a9a26df3a44b785e58020000000000001976a914eea9461a9e1e3f765d3af3e726162e0229fe3eb688ac58020000000000001976a9143a8869c9f2b5ea1d4ff3aeeb6a8fb2fffb1ad5fe88ac0ad7125c",
1554 "02591f220000000000225120f25ad35583ea31998d968871d7de1abd2a52f6fe4178b54ea158274806ff4ece48fb310000000000225120f25ad35583ea31998d968871d7de1abd2a52f6fe4178b54ea158274806ff4ece",
1555 1,
1556 "626ab955d58c9a8a600a0c580549d06dc7da4e802eb2a531f62a588e430967a8",
1557 TapSighashType::All, None, None, None
1558 );
1559
1560 test_taproot_sighash(
1561 "0200000001350005f65aa830ced2079df348e2d8c2bdb4f10e2dde6a161d8a07b40d1ad87dae000000001611d0d603d9dc0e000000000017a914459b6d7d6bbb4d8837b4bf7e9a4556f952da2f5c8758020000000000001976a9141dd70e1299ffc2d5b51f6f87de9dfe9398c33cbb88ac58020000000000001976a9141dd70e1299ffc2d5b51f6f87de9dfe9398c33cbb88aca71c1f4f",
1562 "01c4811000000000002251201bf9297d0a2968ae6693aadd0fa514717afefd218087a239afb7418e2d22e65c",
1563 0,
1564 "dfa9437f9c9a1d1f9af271f79f2f5482f287cdb0d2e03fa92c8a9b216cc6061c",
1565 TapSighashType::AllPlusAnyoneCanPay, None, None, None
1566 );
1567
1568 test_taproot_sighash(
1569 "020000000185bed1a6da2bffbd60ec681a1bfb71c5111d6395b99b3f8b2bf90167111bcb18f5010000007c83ace802ded24a00000000001600142c4698f9f7a773866879755aa78c516fb332af8e5802000000000000160014d38639dfbac4259323b98a472405db0c461b31fa61073747",
1570 "0144c84d0000000000225120e3f2107989c88e67296ab2faca930efa2e3a5bd3ff0904835a11c9e807458621",
1571 0,
1572 "3129de36a5d05fff97ffca31eb75fcccbbbc27b3147a7a36a9e4b45d8b625067",
1573 TapSighashType::None, None, None, None
1574 );
1575
1576 test_taproot_sighash(
1577 "eb93dbb901028c8515589dac980b6e7f8e4088b77ed866ca0d6d210a7218b6fd0f6b22dd6d7300000000eb4740a9047efc0e0000000000160014913da2128d8fcf292b3691db0e187414aa1783825802000000000000160014913da2128d8fcf292b3691db0e187414aa178382580200000000000017a9143dd27f01c6f7ef9bb9159937b17f17065ed01a0c875802000000000000160014d7630e19df70ada9905ede1722b800c0005f246641000000",
1578 "013fed110000000000225120eb536ae8c33580290630fc495046e998086a64f8f33b93b07967d9029b265c55",
1579 0,
1580 "2441e8b0e063a2083ee790f14f2045022f07258ddde5ee01de543c9e789d80ae",
1581 TapSighashType::NonePlusAnyoneCanPay, None, None, None
1582 );
1583
1584 test_taproot_sighash(
1585 "02000000017836b409a5fed32211407e44b971591f2032053f14701fb5b3a30c0ff382f2cc9c0100000061ac55f60288fb5600000000001976a9144ea02f6f182b082fb6ce47e36bbde390b6a41b5088ac58020000000000001976a9144ea02f6f182b082fb6ce47e36bbde390b6a41b5088ace4000000",
1586 "01efa558000000000022512007071ea3dc7e331b0687d0193d1e6d6ed10e645ef36f10ef8831d5e522ac9e80",
1587 0,
1588 "30239345177cadd0e3ea413d49803580abb6cb27971b481b7788a78d35117a88",
1589 TapSighashType::Single, None, None, None
1590 );
1591
1592 test_taproot_sighash(
1593 "0100000001aa6deae89d5e0aaca58714fc76ef6f3c8284224888089232d4e663843ed3ab3eae010000008b6657a60450cb4c0000000000160014a3d42b5413ef0c0701c4702f3cd7d4df222c147058020000000000001976a91430b4ed8723a4ee8992aa2c8814cfe5c3ad0ab9d988ac5802000000000000160014365b1166a6ed0a5e8e9dff17a6d00bbb43454bc758020000000000001976a914bc98c51a84fe7fad5dc380eb8b39586eff47241688ac4f313247",
1594 "0107af4e00000000002251202c36d243dfc06cb56a248e62df27ecba7417307511a81ae61aa41c597a929c69",
1595 0,
1596 "bf9c83f26c6dd16449e4921f813f551c4218e86f2ec906ca8611175b41b566df",
1597 TapSighashType::SinglePlusAnyoneCanPay, None, None, None
1598 );
1599 }
1600
1601 #[test]
1602 fn test_sighashes_with_annex() {
1603 test_taproot_sighash(
1604 "0200000001df8123752e8f37d132c4e9f1ff7e4f9b986ade9211267e9ebd5fd22a5e718dec6d01000000ce4023b903cb7b23000000000017a914a18b36ea7a094db2f4940fc09edf154e86de7bd787580200000000000017a914afd0d512a2c5c2b40e25669e9cc460303c325b8b87580200000000000017a914a18b36ea7a094db2f4940fc09edf154e86de7bd787f6020000",
1605 "01ea49260000000000225120ab5e9800806bf18cb246edcf5fe63441208fe955a4b5a35bbff65f5db622a010",
1606 0,
1607 "3b003000add359a364a156e73e02846782a59d0d95ca8c4638aaad99f2ef915c",
1608 TapSighashType::SinglePlusAnyoneCanPay,
1609 Some("507b979802e62d397acb29f56743a791894b99372872fc5af06a4f6e8d242d0615cda53062bb20e6ec79756fe39183f0c128adfe85559a8fa042b042c018aa8010143799e44f0893c40e1e"),
1610 None,
1611 None,
1612 );
1613 }
1614
1615 #[test]
1616 fn test_sighashes_with_script_path() {
1617 test_taproot_sighash(
1618 "020000000189fc651483f9296b906455dd939813bf086b1bbe7c77635e157c8e14ae29062195010000004445b5c7044561320000000000160014331414dbdada7fb578f700f38fb69995fc9b5ab958020000000000001976a914268db0a8104cc6d8afd91233cc8b3d1ace8ac3ef88ac580200000000000017a914ec00dcb368d6a693e11986d265f659d2f59e8be2875802000000000000160014c715799a49a0bae3956df9c17cb4440a673ac0df6f010000",
1619 "011bec34000000000022512028055142ea437db73382e991861446040b61dd2185c4891d7daf6893d79f7182",
1620 0,
1621 "d66de5274a60400c7b08c86ba6b7f198f40660079edf53aca89d2a9501317f2e",
1622 TapSighashType::All,
1623 None,
1624 Some("20cc4e1107aea1d170c5ff5b6817e1303010049724fb3caa7941792ea9d29b3e2bacab"),
1625 None,
1626 );
1627 }
1628
1629 #[test]
1630 fn test_sighashes_with_script_path_raw_hash() {
1631 test_taproot_sighash(
1632 "020000000189fc651483f9296b906455dd939813bf086b1bbe7c77635e157c8e14ae29062195010000004445b5c7044561320000000000160014331414dbdada7fb578f700f38fb69995fc9b5ab958020000000000001976a914268db0a8104cc6d8afd91233cc8b3d1ace8ac3ef88ac580200000000000017a914ec00dcb368d6a693e11986d265f659d2f59e8be2875802000000000000160014c715799a49a0bae3956df9c17cb4440a673ac0df6f010000",
1633 "011bec34000000000022512028055142ea437db73382e991861446040b61dd2185c4891d7daf6893d79f7182",
1634 0,
1635 "d66de5274a60400c7b08c86ba6b7f198f40660079edf53aca89d2a9501317f2e",
1636 TapSighashType::All,
1637 None,
1638 None,
1639 Some("15a2530514e399f8b5cf0b3d3112cf5b289eaa3e308ba2071b58392fdc6da68a"),
1640 );
1641 }
1642
1643 #[test]
1644 fn test_sighashes_with_annex_and_script() {
1645 test_taproot_sighash(
1646 "020000000132fb72cb8fba496755f027a9743e2d698c831fdb8304e4d1a346ac92cbf51acba50100000026bdc7df044aad34000000000017a9144fa2554ed6174586854fa3bc01de58dcf33567d0875802000000000000160014950367e1e62cdf240b35b883fc2f5e39f0eb9ab95802000000000000160014950367e1e62cdf240b35b883fc2f5e39f0eb9ab958020000000000001600141b31217d48ccc8760dcc0710fade5866d628e733a02d5122",
1647 "011458360000000000225120a7baec3fb9f84614e3899fcc010c638f80f13539344120e1f4d8b68a9a011a13",
1648 0,
1649 "a0042aa434f9a75904b64043f2a283f8b4c143c7f4f7f49a6cbe5b9f745f4c15",
1650 TapSighashType::All,
1651 Some("50a6272b470e1460e3332ade7bb14b81671c564fb6245761bd5bd531394b28860e0b3808ab229fb51791fb6ae6fa82d915b2efb8f6df83ae1f5ab3db13e30928875e2a22b749d89358de481f19286cd4caa792ce27f9559082d227a731c5486882cc707f83da361c51b7aadd9a0cf68fe7480c410fa137b454482d9a1ebf0f96d760b4d61426fc109c6e8e99a508372c45caa7b000a41f8251305da3f206c1849985ba03f3d9592832b4053afbd23ab25d0465df0bc25a36c223aacf8e04ec736a418c72dc319e4da3e972e349713ca600965e7c665f2090d5a70e241ac164115a1f5639f28b1773327715ca307ace64a2de7f0e3df70a2ffee3857689f909c0dad46d8a20fa373a4cc6eed6d4c9806bf146f0d76baae1"),
1652 Some("7520ab9160dd8299dc1367659be3e8f66781fe440d52940c7f8d314a89b9f2698d406ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac"),
1653 None,
1654 );
1655 }
1656
1657 #[test]
1658 #[rustfmt::skip] fn test_sighash_errors() {
1660 use crate::transaction::{IndexOutOfBoundsError, InputsIndexError};
1661
1662 let dumb_tx = Transaction {
1663 version: transaction::Version::TWO,
1664 lock_time: absolute::LockTime::ZERO,
1665 input: vec![TxIn::default()],
1666 output: vec![],
1667 };
1668 let mut c = SighashCache::new(&dumb_tx);
1669
1670 let empty_vec = vec![];
1672 let empty_prevouts : Prevouts<TxOut> = Prevouts::All(&empty_vec);
1673 assert_eq!(
1674 c.taproot_signature_hash(0, &empty_prevouts, None, None, TapSighashType::All),
1675 Err(TaprootError::PrevoutsSize(PrevoutsSizeError))
1676 );
1677 let two = vec![TxOut::NULL, TxOut::NULL];
1678 let too_many_prevouts = Prevouts::All(&two);
1679 assert_eq!(
1680 c.taproot_signature_hash(0, &too_many_prevouts, None, None, TapSighashType::All),
1681 Err(TaprootError::PrevoutsSize(PrevoutsSizeError))
1682 );
1683 let tx_out = TxOut::NULL;
1684 let prevout = Prevouts::One(1, &tx_out);
1685 assert_eq!(
1686 c.taproot_signature_hash(0, &prevout, None, None, TapSighashType::All),
1687 Err(TaprootError::PrevoutsKind(PrevoutsKindError))
1688 );
1689 assert_eq!(
1690 c.taproot_signature_hash(0, &prevout, None, None, TapSighashType::AllPlusAnyoneCanPay),
1691 Err(TaprootError::PrevoutsIndex(PrevoutsIndexError::InvalidOneIndex))
1692 );
1693 assert_eq!(
1694 c.taproot_signature_hash(10, &prevout, None, None, TapSighashType::AllPlusAnyoneCanPay),
1695 Err(InputsIndexError(IndexOutOfBoundsError {
1696 index: 10,
1697 length: 1
1698 }).into())
1699 );
1700 let prevout = Prevouts::One(0, &tx_out);
1701 assert_eq!(
1702 c.taproot_signature_hash(0, &prevout, None, None, TapSighashType::SinglePlusAnyoneCanPay),
1703 Err(TaprootError::SingleMissingOutput(SingleMissingOutputError {
1704 input_index: 0,
1705 outputs_length: 0
1706 }))
1707 );
1708 assert_eq!(
1709 c.legacy_signature_hash(10, Script::new(), 0u32),
1710 Err(InputsIndexError(IndexOutOfBoundsError {
1711 index: 10,
1712 length: 1
1713 }))
1714 );
1715 }
1716
1717 #[test]
1718 fn test_annex_errors() {
1719 assert_eq!(Annex::new(&[]), Err(AnnexError::Empty));
1720 assert_eq!(Annex::new(&[0x51]), Err(AnnexError::IncorrectPrefix(0x51)));
1721 assert_eq!(Annex::new(&[0x51, 0x50]), Err(AnnexError::IncorrectPrefix(0x51)));
1722 }
1723
1724 #[allow(clippy::too_many_arguments)]
1725 fn test_taproot_sighash(
1726 tx_hex: &str,
1727 prevout_hex: &str,
1728 input_index: usize,
1729 expected_hash: &str,
1730 sighash_type: TapSighashType,
1731 annex_hex: Option<&str>,
1732 script_hex: Option<&str>,
1733 script_leaf_hash: Option<&str>,
1734 ) {
1735 let tx_bytes = Vec::from_hex(tx_hex).unwrap();
1736 let tx: Transaction = deserialize(&tx_bytes).unwrap();
1737 let prevout_bytes = Vec::from_hex(prevout_hex).unwrap();
1738 let prevouts: Vec<TxOut> = deserialize(&prevout_bytes).unwrap();
1739 let annex_inner;
1740 let annex = match annex_hex {
1741 Some(annex_hex) => {
1742 annex_inner = Vec::from_hex(annex_hex).unwrap();
1743 Some(Annex::new(&annex_inner).unwrap())
1744 }
1745 None => None,
1746 };
1747
1748 let leaf_hash = match (script_hex, script_leaf_hash) {
1749 (Some(script_hex), _) => {
1750 let script_inner = ScriptBuf::from_hex(script_hex).unwrap();
1751 Some(ScriptPath::with_defaults(&script_inner).leaf_hash())
1752 }
1753 (_, Some(script_leaf_hash)) => Some(script_leaf_hash.parse::<TapLeafHash>().unwrap()),
1754 _ => None,
1755 };
1756 let leaf_hash = leaf_hash.map(|lh| (lh, 0xFFFFFFFF));
1758
1759 let prevouts = if sighash_type.split_anyonecanpay_flag().1 && tx_bytes[0] % 2 == 0 {
1760 Prevouts::One(input_index, prevouts[input_index].clone())
1763 } else {
1764 Prevouts::All(&prevouts)
1765 };
1766
1767 let mut sighash_cache = SighashCache::new(&tx);
1768
1769 let hash = sighash_cache
1770 .taproot_signature_hash(input_index, &prevouts, annex, leaf_hash, sighash_type)
1771 .unwrap();
1772 let expected = Vec::from_hex(expected_hash).unwrap();
1773 assert_eq!(expected, hash.to_byte_array());
1774 }
1775
1776 #[cfg(feature = "serde")]
1777 #[test]
1778 fn bip_341_sighash_tests() {
1779 use hex::DisplayHex;
1780
1781 fn sighash_deser_numeric<'de, D>(deserializer: D) -> Result<TapSighashType, D::Error>
1782 where
1783 D: actual_serde::Deserializer<'de>,
1784 {
1785 use actual_serde::de::{Deserialize, Error, Unexpected};
1786
1787 let raw = u8::deserialize(deserializer)?;
1788 TapSighashType::from_consensus_u8(raw).map_err(|_| {
1789 D::Error::invalid_value(
1790 Unexpected::Unsigned(raw.into()),
1791 &"number in range 0-3 or 0x81-0x83",
1792 )
1793 })
1794 }
1795
1796 use secp256k1::{SecretKey, XOnlyPublicKey};
1797
1798 use crate::consensus::serde as con_serde;
1799 use crate::taproot::{TapNodeHash, TapTweakHash};
1800
1801 #[derive(serde::Deserialize)]
1802 #[serde(crate = "actual_serde")]
1803 struct UtxoSpent {
1804 #[serde(rename = "scriptPubKey")]
1805 script_pubkey: ScriptBuf,
1806 #[serde(rename = "amountSats")]
1807 value: Amount,
1808 }
1809
1810 #[derive(serde::Deserialize)]
1811 #[serde(rename_all = "camelCase")]
1812 #[serde(crate = "actual_serde")]
1813 struct KpsGiven {
1814 #[serde(with = "con_serde::With::<con_serde::Hex>")]
1815 raw_unsigned_tx: Transaction,
1816 utxos_spent: Vec<UtxoSpent>,
1817 }
1818
1819 #[derive(serde::Deserialize)]
1820 #[serde(rename_all = "camelCase")]
1821 #[serde(crate = "actual_serde")]
1822 struct KpsIntermediary {
1823 hash_prevouts: sha256::Hash,
1824 hash_outputs: sha256::Hash,
1825 hash_sequences: sha256::Hash,
1826 hash_amounts: sha256::Hash,
1827 hash_script_pubkeys: sha256::Hash,
1828 }
1829
1830 #[derive(serde::Deserialize)]
1831 #[serde(rename_all = "camelCase")]
1832 #[serde(crate = "actual_serde")]
1833 struct KpsInputSpendingGiven {
1834 txin_index: usize,
1835 internal_privkey: SecretKey,
1836 merkle_root: Option<TapNodeHash>,
1837 #[serde(deserialize_with = "sighash_deser_numeric")]
1838 hash_type: TapSighashType,
1839 }
1840
1841 #[derive(serde::Deserialize)]
1842 #[serde(rename_all = "camelCase")]
1843 #[serde(crate = "actual_serde")]
1844 struct KpsInputSpendingIntermediary {
1845 internal_pubkey: XOnlyPublicKey,
1846 tweak: TapTweakHash,
1847 tweaked_privkey: SecretKey,
1848 sig_msg: String,
1849 sig_hash: TapSighash,
1851 }
1852
1853 #[derive(serde::Deserialize)]
1854 #[serde(rename_all = "camelCase")]
1855 #[serde(crate = "actual_serde")]
1856 struct KpsInputSpendingExpected {
1857 witness: Vec<String>,
1858 }
1859
1860 #[derive(serde::Deserialize)]
1861 #[serde(rename_all = "camelCase")]
1862 #[serde(crate = "actual_serde")]
1863 struct KpsInputSpending {
1864 given: KpsInputSpendingGiven,
1865 intermediary: KpsInputSpendingIntermediary,
1866 expected: KpsInputSpendingExpected,
1867 }
1869
1870 #[derive(serde::Deserialize)]
1871 #[serde(rename_all = "camelCase")]
1872 #[serde(crate = "actual_serde")]
1873 struct KeyPathSpending {
1874 given: KpsGiven,
1875 intermediary: KpsIntermediary,
1876 input_spending: Vec<KpsInputSpending>,
1877 }
1878
1879 #[derive(serde::Deserialize)]
1880 #[serde(rename_all = "camelCase")]
1881 #[serde(crate = "actual_serde")]
1882 struct TestData {
1883 version: u64,
1884 key_path_spending: Vec<KeyPathSpending>,
1885 }
1887
1888 let json_str = include_str!("../../tests/data/bip341_tests.json");
1889 let mut data =
1890 serde_json::from_str::<TestData>(json_str).expect("JSON was not well-formatted");
1891
1892 assert_eq!(data.version, 1u64);
1893 let secp = &secp256k1::Secp256k1::new();
1894 let key_path = data.key_path_spending.remove(0);
1895
1896 let raw_unsigned_tx = key_path.given.raw_unsigned_tx;
1897 let utxos = key_path
1898 .given
1899 .utxos_spent
1900 .into_iter()
1901 .map(|txo| TxOut { value: txo.value, script_pubkey: txo.script_pubkey })
1902 .collect::<Vec<_>>();
1903
1904 let mut cache = SighashCache::new(&raw_unsigned_tx);
1906
1907 let expected = key_path.intermediary;
1908 assert_eq!(expected.hash_amounts, cache.taproot_cache(&utxos).amounts);
1910 assert_eq!(expected.hash_outputs, cache.common_cache().outputs);
1911 assert_eq!(expected.hash_prevouts, cache.common_cache().prevouts);
1912 assert_eq!(expected.hash_script_pubkeys, cache.taproot_cache(&utxos).script_pubkeys);
1913 assert_eq!(expected.hash_sequences, cache.common_cache().sequences);
1914
1915 for mut inp in key_path.input_spending {
1916 let tx_ind = inp.given.txin_index;
1917 let internal_priv_key = inp.given.internal_privkey;
1918 let merkle_root = inp.given.merkle_root;
1919 let hash_ty = inp.given.hash_type;
1920
1921 let expected = inp.intermediary;
1922 let sig_str = inp.expected.witness.remove(0);
1923 let (expected_key_spend_sig, expected_hash_ty) = if sig_str.len() == 128 {
1924 (
1925 secp256k1::schnorr::Signature::from_str(&sig_str).unwrap(),
1926 TapSighashType::Default,
1927 )
1928 } else {
1929 let hash_ty = u8::from_str_radix(&sig_str[128..130], 16).unwrap();
1930 let hash_ty = TapSighashType::from_consensus_u8(hash_ty).unwrap();
1931 (secp256k1::schnorr::Signature::from_str(&sig_str[..128]).unwrap(), hash_ty)
1932 };
1933
1934 let keypair = secp256k1::Keypair::from_secret_key(secp, &internal_priv_key);
1936 let (internal_key, _parity) = XOnlyPublicKey::from_keypair(&keypair);
1937 let tweak = TapTweakHash::from_key_and_tweak(internal_key, merkle_root);
1938 let tweaked_keypair = keypair.add_xonly_tweak(secp, &tweak.to_scalar()).unwrap();
1939 let mut sig_msg = Vec::new();
1940 cache
1941 .taproot_encode_signing_data_to(
1942 &mut sig_msg,
1943 tx_ind,
1944 &Prevouts::All(&utxos),
1945 None,
1946 None,
1947 hash_ty,
1948 )
1949 .unwrap();
1950 let sighash = cache
1951 .taproot_signature_hash(tx_ind, &Prevouts::All(&utxos), None, None, hash_ty)
1952 .unwrap();
1953
1954 let msg = secp256k1::Message::from(sighash);
1955 let key_spend_sig = secp.sign_schnorr_with_aux_rand(&msg, &tweaked_keypair, &[0u8; 32]);
1956
1957 assert_eq!(expected.internal_pubkey, internal_key);
1958 assert_eq!(expected.tweak, tweak);
1959 assert_eq!(expected.sig_msg, sig_msg.to_lower_hex_string());
1960 assert_eq!(expected.sig_hash, sighash);
1961 assert_eq!(expected_hash_ty, hash_ty);
1962 assert_eq!(expected_key_spend_sig, key_spend_sig);
1963
1964 let tweaked_priv_key = SecretKey::from_keypair(&tweaked_keypair);
1965 assert_eq!(expected.tweaked_privkey, tweaked_priv_key);
1966 }
1967 }
1968
1969 #[test]
1970 fn sighashtype_fromstr_display() {
1971 let sighashtypes = vec![
1972 ("SIGHASH_DEFAULT", TapSighashType::Default),
1973 ("SIGHASH_ALL", TapSighashType::All),
1974 ("SIGHASH_NONE", TapSighashType::None),
1975 ("SIGHASH_SINGLE", TapSighashType::Single),
1976 ("SIGHASH_ALL|SIGHASH_ANYONECANPAY", TapSighashType::AllPlusAnyoneCanPay),
1977 ("SIGHASH_NONE|SIGHASH_ANYONECANPAY", TapSighashType::NonePlusAnyoneCanPay),
1978 ("SIGHASH_SINGLE|SIGHASH_ANYONECANPAY", TapSighashType::SinglePlusAnyoneCanPay),
1979 ];
1980 for (s, sht) in sighashtypes {
1981 assert_eq!(sht.to_string(), s);
1982 assert_eq!(TapSighashType::from_str(s).unwrap(), sht);
1983 }
1984 let sht_mistakes = vec![
1985 "SIGHASH_ALL | SIGHASH_ANYONECANPAY",
1986 "SIGHASH_NONE |SIGHASH_ANYONECANPAY",
1987 "SIGHASH_SINGLE| SIGHASH_ANYONECANPAY",
1988 "SIGHASH_ALL SIGHASH_ANYONECANPAY",
1989 "SIGHASH_NONE |",
1990 "SIGHASH_SIGNLE",
1991 "DEFAULT",
1992 "ALL",
1993 "sighash_none",
1994 "Sighash_none",
1995 "SigHash_None",
1996 "SigHash_NONE",
1997 ];
1998 for s in sht_mistakes {
1999 assert_eq!(
2000 TapSighashType::from_str(s).unwrap_err().to_string(),
2001 format!("unrecognized SIGHASH string '{}'", s)
2002 );
2003 }
2004 }
2005
2006 #[test]
2007 fn bip143_p2wpkh() {
2008 let tx = deserialize::<Transaction>(
2009 &hex!(
2010 "0100000002fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f000000\
2011 0000eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a01000000\
2012 00ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac9093\
2013 510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac11000000"
2014 ),
2015 ).unwrap();
2016
2017 let spk = ScriptBuf::from_hex("00141d0f172a0ecb48aee1be1f2687d2963ae33f71a1").unwrap();
2018 let value = Amount::from_sat(600_000_000);
2019
2020 let mut cache = SighashCache::new(&tx);
2021 assert_eq!(
2022 cache.p2wpkh_signature_hash(1, &spk, value, EcdsaSighashType::All).unwrap(),
2023 "c37af31116d1b27caf68aae9e3ac82f1477929014d5b917657d0eb49478cb670"
2024 .parse::<SegwitV0Sighash>()
2025 .unwrap(),
2026 );
2027
2028 let cache = cache.segwit_cache();
2029 assert_eq!(
2031 cache.prevouts.as_byte_array(),
2032 &Vec::from_hex("96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37")
2033 .unwrap()[..],
2034 );
2035 assert_eq!(
2036 cache.sequences.as_byte_array(),
2037 &Vec::from_hex("52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b")
2038 .unwrap()[..],
2039 );
2040 assert_eq!(
2041 cache.outputs.as_byte_array(),
2042 &Vec::from_hex("863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5")
2043 .unwrap()[..],
2044 );
2045 }
2046
2047 #[test]
2048 fn bip143_p2wpkh_nested_in_p2sh() {
2049 let tx = deserialize::<Transaction>(
2050 &hex!(
2051 "0100000001db6b1b20aa0fd7b23880be2ecbd4a98130974cf4748fb66092ac4d3ceb1a5477010000\
2052 0000feffffff02b8b4eb0b000000001976a914a457b684d7f0d539a46a45bbc043f35b59d0d96388ac00\
2053 08af2f000000001976a914fd270b1ee6abcaea97fea7ad0402e8bd8ad6d77c88ac92040000"
2054 ),
2055 ).unwrap();
2056
2057 let redeem_script =
2058 ScriptBuf::from_hex("001479091972186c449eb1ded22b78e40d009bdf0089").unwrap();
2059 let value = Amount::from_sat(1_000_000_000);
2060
2061 let mut cache = SighashCache::new(&tx);
2062 assert_eq!(
2063 cache.p2wpkh_signature_hash(0, &redeem_script, value, EcdsaSighashType::All).unwrap(),
2064 "64f3b0f4dd2bb3aa1ce8566d220cc74dda9df97d8490cc81d89d735c92e59fb6"
2065 .parse::<SegwitV0Sighash>()
2066 .unwrap(),
2067 );
2068
2069 let cache = cache.segwit_cache();
2070 assert_eq!(
2072 cache.prevouts.as_byte_array(),
2073 &Vec::from_hex("b0287b4a252ac05af83d2dcef00ba313af78a3e9c329afa216eb3aa2a7b4613a")
2074 .unwrap()[..],
2075 );
2076 assert_eq!(
2077 cache.sequences.as_byte_array(),
2078 &Vec::from_hex("18606b350cd8bf565266bc352f0caddcf01e8fa789dd8a15386327cf8cabe198")
2079 .unwrap()[..],
2080 );
2081 assert_eq!(
2082 cache.outputs.as_byte_array(),
2083 &Vec::from_hex("de984f44532e2173ca0d64314fcefe6d30da6f8cf27bafa706da61df8a226c83")
2084 .unwrap()[..],
2085 );
2086 }
2087
2088 fn bip143_p2wsh_nested_in_p2sh_data() -> (Transaction, ScriptBuf, Amount) {
2092 let tx = deserialize::<Transaction>(&hex!(
2093 "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000\
2094 ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f\
2095 05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000"
2096 ))
2097 .unwrap();
2098
2099 let witness_script = ScriptBuf::from_hex(
2100 "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28\
2101 bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b\
2102 9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58\
2103 c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b1486\
2104 2c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b\
2105 56ae",
2106 )
2107 .unwrap();
2108
2109 let value = Amount::from_sat(987_654_321);
2110 (tx, witness_script, value)
2111 }
2112
2113 #[test]
2114 fn bip143_p2wsh_nested_in_p2sh_sighash_type_all() {
2115 let (tx, witness_script, value) = bip143_p2wsh_nested_in_p2sh_data();
2116 let mut cache = SighashCache::new(&tx);
2117 assert_eq!(
2118 cache.p2wsh_signature_hash(0, &witness_script, value, EcdsaSighashType::All).unwrap(),
2119 "185c0be5263dce5b4bb50a047973c1b6272bfbd0103a89444597dc40b248ee7c"
2120 .parse::<SegwitV0Sighash>()
2121 .unwrap(),
2122 );
2123
2124 let cache = cache.segwit_cache();
2130 assert_eq!(
2132 cache.prevouts.as_byte_array(),
2133 &Vec::from_hex("74afdc312af5183c4198a40ca3c1a275b485496dd3929bca388c4b5e31f7aaa0")
2134 .unwrap()[..],
2135 );
2136 assert_eq!(
2137 cache.sequences.as_byte_array(),
2138 &Vec::from_hex("3bb13029ce7b1f559ef5e747fcac439f1455a2ec7c5f09b72290795e70665044")
2139 .unwrap()[..],
2140 );
2141 assert_eq!(
2142 cache.outputs.as_byte_array(),
2143 &Vec::from_hex("bc4d309071414bed932f98832b27b4d76dad7e6c1346f487a8fdbb8eb90307cc")
2144 .unwrap()[..],
2145 );
2146 }
2147
2148 macro_rules! check_bip143_p2wsh_nested_in_p2sh {
2149 ($($test_name:ident, $sighash_type:ident, $sighash:literal);* $(;)?) => {
2150 $(
2151 #[test]
2152 fn $test_name() {
2153 use EcdsaSighashType::*;
2154
2155 let (tx, witness_script, value) = bip143_p2wsh_nested_in_p2sh_data();
2156 let mut cache = SighashCache::new(&tx);
2157 assert_eq!(
2158 cache
2159 .p2wsh_signature_hash(0, &witness_script, value, $sighash_type)
2160 .unwrap(),
2161 $sighash
2162 .parse::<SegwitV0Sighash>()
2163 .unwrap(),
2164 );
2165 }
2166 )*
2167 }
2168 }
2169 check_bip143_p2wsh_nested_in_p2sh! {
2170 bip143_p2wsh_nested_in_p2sh_sighash_none, None, "e9733bc60ea13c95c6527066bb975a2ff29a925e80aa14c213f686cbae5d2f36";
2172 bip143_p2wsh_nested_in_p2sh_sighash_single, Single, "1e1f1c303dc025bd664acb72e583e933fae4cff9148bf78c157d1e8f78530aea";
2173 bip143_p2wsh_nested_in_p2sh_sighash_all_plus_anyonecanpay, AllPlusAnyoneCanPay, "2a67f03e63a6a422125878b40b82da593be8d4efaafe88ee528af6e5a9955c6e";
2174 bip143_p2wsh_nested_in_p2sh_sighash_none_plus_anyonecanpay, NonePlusAnyoneCanPay, "781ba15f3779d5542ce8ecb5c18716733a5ee42a6f51488ec96154934e2c890a";
2175 bip143_p2wsh_nested_in_p2sh_sighash_single_plus_anyonecanpay, SinglePlusAnyoneCanPay, "511e8e52ed574121fc1b654970395502128263f62662e076dc6baf05c2e6a99b";
2176 }
2177}