bitcoin/taproot/
mod.rs

1// SPDX-License-Identifier: CC0-1.0
2
3//! Bitcoin Taproot.
4//!
5//! This module provides support for taproot tagged hashes.
6//!
7
8pub mod merkle_branch;
9pub mod serialized_signature;
10
11use core::cmp::Reverse;
12use core::fmt;
13use core::iter::FusedIterator;
14
15use hashes::{sha256t_hash_newtype, Hash, HashEngine};
16use internals::write_err;
17use io::Write;
18use secp256k1::{Scalar, Secp256k1};
19
20use crate::consensus::Encodable;
21use crate::crypto::key::{TapTweak, TweakedPublicKey, UntweakedPublicKey, XOnlyPublicKey};
22use crate::prelude::*;
23use crate::{Script, ScriptBuf};
24
25// Re-export these so downstream only has to use one `taproot` module.
26#[rustfmt::skip]
27#[doc(inline)]
28pub use crate::crypto::taproot::{SigFromSliceError, Signature};
29#[doc(inline)]
30pub use merkle_branch::TaprootMerkleBranch;
31
32// Taproot test vectors from BIP-341 state the hashes without any reversing
33sha256t_hash_newtype! {
34    pub struct TapLeafTag = hash_str("TapLeaf");
35
36    /// Taproot-tagged hash with tag \"TapLeaf\".
37    ///
38    /// This is used for computing tapscript script spend hash.
39    #[hash_newtype(forward)]
40    pub struct TapLeafHash(_);
41
42    pub struct TapBranchTag = hash_str("TapBranch");
43
44    /// Tagged hash used in taproot trees.
45    ///
46    /// See BIP-340 for tagging rules.
47    #[hash_newtype(forward)]
48    pub struct TapNodeHash(_);
49
50    pub struct TapTweakTag = hash_str("TapTweak");
51
52    /// Taproot-tagged hash with tag \"TapTweak\".
53    ///
54    /// This hash type is used while computing the tweaked public key.
55    #[hash_newtype(forward)]
56    pub struct TapTweakHash(_);
57}
58
59impl TapTweakHash {
60    /// Creates a new BIP341 [`TapTweakHash`] from key and tweak. Produces `H_taptweak(P||R)` where
61    /// `P` is the internal key and `R` is the merkle root.
62    pub fn from_key_and_tweak(
63        internal_key: UntweakedPublicKey,
64        merkle_root: Option<TapNodeHash>,
65    ) -> TapTweakHash {
66        let mut eng = TapTweakHash::engine();
67        // always hash the key
68        eng.input(&internal_key.serialize());
69        if let Some(h) = merkle_root {
70            eng.input(h.as_ref());
71        } else {
72            // nothing to hash
73        }
74        TapTweakHash::from_engine(eng)
75    }
76
77    /// Converts a `TapTweakHash` into a `Scalar` ready for use with key tweaking API.
78    pub fn to_scalar(self) -> Scalar {
79        // This is statistically extremely unlikely to panic.
80        Scalar::from_be_bytes(self.to_byte_array()).expect("hash value greater than curve order")
81    }
82}
83
84impl TapLeafHash {
85    /// Computes the leaf hash from components.
86    pub fn from_script(script: &Script, ver: LeafVersion) -> TapLeafHash {
87        let mut eng = TapLeafHash::engine();
88        ver.to_consensus().consensus_encode(&mut eng).expect("engines don't error");
89        script.consensus_encode(&mut eng).expect("engines don't error");
90        TapLeafHash::from_engine(eng)
91    }
92}
93
94impl From<LeafNode> for TapNodeHash {
95    fn from(leaf: LeafNode) -> TapNodeHash { leaf.node_hash() }
96}
97
98impl From<&LeafNode> for TapNodeHash {
99    fn from(leaf: &LeafNode) -> TapNodeHash { leaf.node_hash() }
100}
101
102impl TapNodeHash {
103    /// Computes branch hash given two hashes of the nodes underneath it.
104    pub fn from_node_hashes(a: TapNodeHash, b: TapNodeHash) -> TapNodeHash {
105        Self::combine_node_hashes(a, b).0
106    }
107
108    /// Computes branch hash given two hashes of the nodes underneath it and returns
109    /// whether the left node was the one hashed first.
110    fn combine_node_hashes(a: TapNodeHash, b: TapNodeHash) -> (TapNodeHash, bool) {
111        let mut eng = TapNodeHash::engine();
112        if a < b {
113            eng.input(a.as_ref());
114            eng.input(b.as_ref());
115        } else {
116            eng.input(b.as_ref());
117            eng.input(a.as_ref());
118        };
119        (TapNodeHash::from_engine(eng), a < b)
120    }
121
122    /// Assumes the given 32 byte array as hidden [`TapNodeHash`].
123    ///
124    /// Similar to [`TapLeafHash::from_byte_array`], but explicitly conveys that the
125    /// hash is constructed from a hidden node. This also has better ergonomics
126    /// because it does not require the caller to import the Hash trait.
127    pub fn assume_hidden(hash: [u8; 32]) -> TapNodeHash { TapNodeHash::from_byte_array(hash) }
128
129    /// Computes the [`TapNodeHash`] from a script and a leaf version.
130    pub fn from_script(script: &Script, ver: LeafVersion) -> TapNodeHash {
131        TapNodeHash::from(TapLeafHash::from_script(script, ver))
132    }
133}
134
135impl From<TapLeafHash> for TapNodeHash {
136    fn from(leaf: TapLeafHash) -> TapNodeHash { TapNodeHash::from_byte_array(leaf.to_byte_array()) }
137}
138
139/// Maximum depth of a taproot tree script spend path.
140// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L229
141pub const TAPROOT_CONTROL_MAX_NODE_COUNT: usize = 128;
142/// Size of a taproot control node.
143// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L228
144pub const TAPROOT_CONTROL_NODE_SIZE: usize = 32;
145/// Tapleaf mask for getting the leaf version from first byte of control block.
146// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L225
147pub const TAPROOT_LEAF_MASK: u8 = 0xfe;
148/// Tapscript leaf version.
149// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L226
150pub const TAPROOT_LEAF_TAPSCRIPT: u8 = 0xc0;
151/// Taproot annex prefix.
152pub const TAPROOT_ANNEX_PREFIX: u8 = 0x50;
153/// Tapscript control base size.
154// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L227
155pub const TAPROOT_CONTROL_BASE_SIZE: usize = 33;
156/// Tapscript control max size.
157// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L230
158pub const TAPROOT_CONTROL_MAX_SIZE: usize =
159    TAPROOT_CONTROL_BASE_SIZE + TAPROOT_CONTROL_NODE_SIZE * TAPROOT_CONTROL_MAX_NODE_COUNT;
160
161/// The leaf script with its version.
162#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
163pub struct LeafScript<S> {
164    /// The version of the script.
165    pub version: LeafVersion,
166    /// The script, usually `ScriptBuf` or `&Script`.
167    pub script: S,
168}
169
170// type alias for versioned tap script corresponding Merkle proof
171type ScriptMerkleProofMap = BTreeMap<(ScriptBuf, LeafVersion), BTreeSet<TaprootMerkleBranch>>;
172
173/// Represents taproot spending information.
174///
175/// Taproot output corresponds to a combination of a single public key condition (known as the
176/// internal key), and zero or more general conditions encoded in scripts organized in the form of a
177/// binary tree.
178///
179/// Taproot can be spent by either:
180/// - Spending using the key path i.e., with secret key corresponding to the tweaked `output_key`.
181/// - By satisfying any of the scripts in the script spend path. Each script can be satisfied by
182///   providing a witness stack consisting of the script's inputs, plus the script itself and the
183///   control block.
184///
185/// If one or more of the spending conditions consist of just a single key (after aggregation), the
186/// most likely key should be made the internal key.
187/// See [BIP341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki) for more details on
188/// choosing internal keys for a taproot application.
189///
190/// Note: This library currently does not support
191/// [annex](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-5).
192#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
193pub struct TaprootSpendInfo {
194    /// The BIP341 internal key.
195    internal_key: UntweakedPublicKey,
196    /// The merkle root of the script tree (None if there are no scripts).
197    merkle_root: Option<TapNodeHash>,
198    /// The sign final output pubkey as per BIP 341.
199    output_key_parity: secp256k1::Parity,
200    /// The tweaked output key.
201    output_key: TweakedPublicKey,
202    /// Map from (script, leaf_version) to (sets of) [`TaprootMerkleBranch`]. More than one control
203    /// block for a given script is only possible if it appears in multiple branches of the tree. In
204    /// all cases, keeping one should be enough for spending funds, but we keep all of the paths so
205    /// that a full tree can be constructed again from spending data if required.
206    script_map: ScriptMerkleProofMap,
207}
208
209impl TaprootSpendInfo {
210    /// Creates a new [`TaprootSpendInfo`] from a list of scripts (with default script version) and
211    /// weights of satisfaction for that script.
212    ///
213    /// See [`TaprootBuilder::with_huffman_tree`] for more detailed documentation.
214    pub fn with_huffman_tree<C, I>(
215        secp: &Secp256k1<C>,
216        internal_key: UntweakedPublicKey,
217        script_weights: I,
218    ) -> Result<Self, TaprootBuilderError>
219    where
220        I: IntoIterator<Item = (u32, ScriptBuf)>,
221        C: secp256k1::Verification,
222    {
223        let builder = TaprootBuilder::with_huffman_tree(script_weights)?;
224        Ok(builder.finalize(secp, internal_key).expect("Huffman Tree is always complete"))
225    }
226
227    /// Creates a new key spend with `internal_key` and `merkle_root`. Provide [`None`] for
228    /// the `merkle_root` if there is no script path.
229    ///
230    /// *Note*: As per BIP341
231    ///
232    /// When the merkle root is [`None`], the output key commits to an unspendable script path
233    /// instead of having no script path. This is achieved by computing the output key point as
234    /// `Q = P + int(hashTapTweak(bytes(P)))G`. See also [`TaprootSpendInfo::tap_tweak`].
235    ///
236    /// Refer to BIP 341 footnote ('Why should the output key always have a taproot commitment, even
237    /// if there is no script path?') for more details.
238    pub fn new_key_spend<C: secp256k1::Verification>(
239        secp: &Secp256k1<C>,
240        internal_key: UntweakedPublicKey,
241        merkle_root: Option<TapNodeHash>,
242    ) -> Self {
243        let (output_key, parity) = internal_key.tap_tweak(secp, merkle_root);
244        Self {
245            internal_key,
246            merkle_root,
247            output_key_parity: parity,
248            output_key,
249            script_map: BTreeMap::new(),
250        }
251    }
252
253    /// Returns the `TapTweakHash` for this [`TaprootSpendInfo`] i.e., the tweak using `internal_key`
254    /// and `merkle_root`.
255    pub fn tap_tweak(&self) -> TapTweakHash {
256        TapTweakHash::from_key_and_tweak(self.internal_key, self.merkle_root)
257    }
258
259    /// Returns the internal key for this [`TaprootSpendInfo`].
260    pub fn internal_key(&self) -> UntweakedPublicKey { self.internal_key }
261
262    /// Returns the merkle root for this [`TaprootSpendInfo`].
263    pub fn merkle_root(&self) -> Option<TapNodeHash> { self.merkle_root }
264
265    /// Returns the output key (the key used in script pubkey) for this [`TaprootSpendInfo`].
266    pub fn output_key(&self) -> TweakedPublicKey { self.output_key }
267
268    /// Returns the parity of the output key. See also [`TaprootSpendInfo::output_key`].
269    pub fn output_key_parity(&self) -> secp256k1::Parity { self.output_key_parity }
270
271    /// Returns a reference to the internal script map.
272    pub fn script_map(&self) -> &ScriptMerkleProofMap { &self.script_map }
273
274    /// Computes the [`TaprootSpendInfo`] from `internal_key` and `node`.
275    ///
276    /// This is useful when you want to manually build a taproot tree without using
277    /// [`TaprootBuilder`].
278    pub fn from_node_info<C: secp256k1::Verification>(
279        secp: &Secp256k1<C>,
280        internal_key: UntweakedPublicKey,
281        node: NodeInfo,
282    ) -> TaprootSpendInfo {
283        // Create as if it is a key spend path with the given merkle root
284        let root_hash = Some(node.hash);
285        let mut info = TaprootSpendInfo::new_key_spend(secp, internal_key, root_hash);
286
287        for leaves in node.leaves {
288            match leaves.leaf {
289                TapLeaf::Hidden(_) => {
290                    // We don't store any information about hidden nodes in TaprootSpendInfo.
291                }
292                TapLeaf::Script(script, ver) => {
293                    let key = (script, ver);
294                    let value = leaves.merkle_branch;
295                    match info.script_map.get_mut(&key) {
296                        None => {
297                            let mut set = BTreeSet::new();
298                            set.insert(value);
299                            info.script_map.insert(key, set);
300                        }
301                        Some(set) => {
302                            set.insert(value);
303                        }
304                    }
305                }
306            }
307        }
308        info
309    }
310
311    /// Constructs a [`ControlBlock`] for particular script with the given version.
312    ///
313    /// # Returns
314    ///
315    /// - If there are multiple control blocks possible, returns the shortest one.
316    /// - If the script is not contained in the [`TaprootSpendInfo`], returns `None`.
317    pub fn control_block(&self, script_ver: &(ScriptBuf, LeafVersion)) -> Option<ControlBlock> {
318        let merkle_branch_set = self.script_map.get(script_ver)?;
319        // Choose the smallest one amongst the multiple script maps
320        let smallest = merkle_branch_set
321            .iter()
322            .min_by(|x, y| x.len().cmp(&y.len()))
323            .expect("Invariant: ScriptBuf map key must contain non-empty set value");
324        Some(ControlBlock {
325            internal_key: self.internal_key,
326            output_key_parity: self.output_key_parity,
327            leaf_version: script_ver.1,
328            merkle_branch: smallest.clone(),
329        })
330    }
331}
332
333impl From<TaprootSpendInfo> for TapTweakHash {
334    fn from(spend_info: TaprootSpendInfo) -> TapTweakHash { spend_info.tap_tweak() }
335}
336
337impl From<&TaprootSpendInfo> for TapTweakHash {
338    fn from(spend_info: &TaprootSpendInfo) -> TapTweakHash { spend_info.tap_tweak() }
339}
340
341/// Builder for building taproot iteratively. Users can specify tap leaf or omitted/hidden branches
342/// in a depth-first search (DFS) walk order to construct this tree.
343///
344/// See Wikipedia for more details on [DFS](https://en.wikipedia.org/wiki/Depth-first_search).
345// Similar to Taproot Builder in Bitcoin Core.
346#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
347pub struct TaprootBuilder {
348    // The following doc-comment is from Bitcoin Core, but modified for Rust. It describes the
349    // current state of the builder for a given tree.
350    //
351    // For each level in the tree, one NodeInfo object may be present. Branch at index 0 is
352    // information about the root; further values are for deeper subtrees being explored.
353    //
354    // During the construction of Taptree, for every right branch taken to reach the position we're
355    // currently working on, there will be a `(Some(_))` entry in branch corresponding to the left
356    // branch at that level.
357    //
358    // For example, imagine this tree:     - N0 -
359    //                                    /      \
360    //                                   N1      N2
361    //                                  /  \    /  \
362    //                                 A    B  C   N3
363    //                                            /  \
364    //                                           D    E
365    //
366    // Initially, branch is empty. After processing leaf A, it would become {None, None, A}. When
367    // processing leaf B, an entry at level 2 already exists, and it would thus be combined with it
368    // to produce a level 1 entry, resulting in {None, N1}. Adding C and D takes us to {None, N1, C}
369    // and {None, N1, C, D} respectively. When E is processed, it is combined with D, and then C,
370    // and then N1, to produce the root, resulting in {N0}.
371    //
372    // This structure allows processing with just O(log n) overhead if the leaves are computed on
373    // the fly.
374    //
375    // As an invariant, there can never be None entries at the end. There can also not be more than
376    // 128 entries (as that would mean more than 128 levels in the tree). The depth of newly added
377    // entries will always be at least equal to the current size of branch (otherwise it does not
378    // correspond to a depth-first traversal of a tree). A branch is only empty if no entries have
379    // ever be processed. A branch having length 1 corresponds to being done.
380    branch: Vec<Option<NodeInfo>>,
381}
382
383impl TaprootBuilder {
384    /// Creates a new instance of [`TaprootBuilder`].
385    pub fn new() -> Self { TaprootBuilder { branch: vec![] } }
386
387    /// Creates a new instance of [`TaprootBuilder`] with a capacity hint for `size` elements.
388    ///
389    /// The size here should be maximum depth of the tree.
390    pub fn with_capacity(size: usize) -> Self {
391        TaprootBuilder { branch: Vec::with_capacity(size) }
392    }
393
394    /// Creates a new [`TaprootSpendInfo`] from a list of scripts (with default script version) and
395    /// weights of satisfaction for that script.
396    ///
397    /// The weights represent the probability of each branch being taken. If probabilities/weights
398    /// for each condition are known, constructing the tree as a Huffman Tree is the optimal way to
399    /// minimize average case satisfaction cost. This function takes as input an iterator of
400    /// `tuple(u32, ScriptBuf)` where `u32` represents the satisfaction weights of the branch. For
401    /// example, [(3, S1), (2, S2), (5, S3)] would construct a [`TapTree`] that has optimal
402    /// satisfaction weight when probability for S1 is 30%, S2 is 20% and S3 is 50%.
403    ///
404    /// # Errors:
405    ///
406    /// - When the optimal Huffman Tree has a depth more than 128.
407    /// - If the provided list of script weights is empty.
408    ///
409    /// # Edge Cases:
410    ///
411    /// If the script weight calculations overflow, a sub-optimal tree may be generated. This should
412    /// not happen unless you are dealing with billions of branches with weights close to 2^32.
413    ///
414    /// [`TapTree`]: crate::taproot::TapTree
415    pub fn with_huffman_tree<I>(script_weights: I) -> Result<Self, TaprootBuilderError>
416    where
417        I: IntoIterator<Item = (u32, ScriptBuf)>,
418    {
419        let mut node_weights = BinaryHeap::<(Reverse<u32>, NodeInfo)>::new();
420        for (p, leaf) in script_weights {
421            node_weights
422                .push((Reverse(p), NodeInfo::new_leaf_with_ver(leaf, LeafVersion::TapScript)));
423        }
424        if node_weights.is_empty() {
425            return Err(TaprootBuilderError::EmptyTree);
426        }
427        while node_weights.len() > 1 {
428            // Combine the last two elements and insert a new node
429            let (p1, s1) = node_weights.pop().expect("len must be at least two");
430            let (p2, s2) = node_weights.pop().expect("len must be at least two");
431            // Insert the sum of first two in the tree as a new node
432            // N.B.: p1 + p2 can not practically saturate as you would need to have 2**32 max u32s
433            // from the input to overflow. However, saturating is a reasonable behavior here as
434            // huffman tree construction would treat all such elements as "very likely".
435            let p = Reverse(p1.0.saturating_add(p2.0));
436            node_weights.push((p, NodeInfo::combine(s1, s2)?));
437        }
438        // Every iteration of the loop reduces the node_weights.len() by exactly 1
439        // Therefore, the loop will eventually terminate with exactly 1 element
440        debug_assert_eq!(node_weights.len(), 1);
441        let node = node_weights.pop().expect("huffman tree algorithm is broken").1;
442        Ok(TaprootBuilder { branch: vec![Some(node)] })
443    }
444
445    /// Adds a leaf script at `depth` to the builder with script version `ver`. Errors if the leaves
446    /// are not provided in DFS walk order. The depth of the root node is 0.
447    pub fn add_leaf_with_ver(
448        self,
449        depth: u8,
450        script: ScriptBuf,
451        ver: LeafVersion,
452    ) -> Result<Self, TaprootBuilderError> {
453        let leaf = NodeInfo::new_leaf_with_ver(script, ver);
454        self.insert(leaf, depth)
455    }
456
457    /// Adds a leaf script at `depth` to the builder with default script version. Errors if the
458    /// leaves are not provided in DFS walk order. The depth of the root node is 0.
459    ///
460    /// See [`TaprootBuilder::add_leaf_with_ver`] for adding a leaf with specific version.
461    pub fn add_leaf(self, depth: u8, script: ScriptBuf) -> Result<Self, TaprootBuilderError> {
462        self.add_leaf_with_ver(depth, script, LeafVersion::TapScript)
463    }
464
465    /// Adds a hidden/omitted node at `depth` to the builder. Errors if the leaves are not provided
466    /// in DFS walk order. The depth of the root node is 0.
467    pub fn add_hidden_node(
468        self,
469        depth: u8,
470        hash: TapNodeHash,
471    ) -> Result<Self, TaprootBuilderError> {
472        let node = NodeInfo::new_hidden_node(hash);
473        self.insert(node, depth)
474    }
475
476    /// Checks if the builder has finalized building a tree.
477    pub fn is_finalizable(&self) -> bool { self.branch.len() == 1 && self.branch[0].is_some() }
478
479    /// Converts the builder into a [`NodeInfo`] if the builder is a full tree with possibly
480    /// hidden nodes
481    ///
482    /// # Errors:
483    ///
484    /// [`IncompleteBuilderError::NotFinalized`] if the builder is not finalized. The builder
485    /// can be restored by calling [`IncompleteBuilderError::into_builder`]
486    pub fn try_into_node_info(mut self) -> Result<NodeInfo, IncompleteBuilderError> {
487        if self.branch().len() != 1 {
488            return Err(IncompleteBuilderError::NotFinalized(self));
489        }
490        Ok(self
491            .branch
492            .pop()
493            .expect("length checked above")
494            .expect("invariant guarantees node info exists"))
495    }
496
497    /// Converts the builder into a [`TapTree`] if the builder is a full tree and
498    /// does not contain any hidden nodes
499    pub fn try_into_taptree(self) -> Result<TapTree, IncompleteBuilderError> {
500        let node = self.try_into_node_info()?;
501        if node.has_hidden_nodes {
502            // Reconstruct the builder as it was if it has hidden nodes
503            return Err(IncompleteBuilderError::HiddenParts(TaprootBuilder {
504                branch: vec![Some(node)],
505            }));
506        }
507        Ok(TapTree(node))
508    }
509
510    /// Checks if the builder has hidden nodes.
511    pub fn has_hidden_nodes(&self) -> bool {
512        self.branch.iter().flatten().any(|node| node.has_hidden_nodes)
513    }
514
515    /// Creates a [`TaprootSpendInfo`] with the given internal key.
516    ///
517    /// Returns the unmodified builder as Err if the builder is not finalizable.
518    /// See also [`TaprootBuilder::is_finalizable`]
519    pub fn finalize<C: secp256k1::Verification>(
520        mut self,
521        secp: &Secp256k1<C>,
522        internal_key: UntweakedPublicKey,
523    ) -> Result<TaprootSpendInfo, TaprootBuilder> {
524        match self.branch.len() {
525            0 => Ok(TaprootSpendInfo::new_key_spend(secp, internal_key, None)),
526            1 =>
527                if let Some(Some(node)) = self.branch.pop() {
528                    Ok(TaprootSpendInfo::from_node_info(secp, internal_key, node))
529                } else {
530                    unreachable!("Size checked above. Builder guarantees the last element is Some")
531                },
532            _ => Err(self),
533        }
534    }
535
536    pub(crate) fn branch(&self) -> &[Option<NodeInfo>] { &self.branch }
537
538    /// Inserts a leaf at `depth`.
539    fn insert(mut self, mut node: NodeInfo, mut depth: u8) -> Result<Self, TaprootBuilderError> {
540        // early error on invalid depth. Though this will be checked later
541        // while constructing TaprootMerkelBranch
542        if depth as usize > TAPROOT_CONTROL_MAX_NODE_COUNT {
543            return Err(TaprootBuilderError::InvalidMerkleTreeDepth(depth as usize));
544        }
545        // We cannot insert a leaf at a lower depth while a deeper branch is unfinished. Doing
546        // so would mean the add_leaf/add_hidden invocations do not correspond to a DFS traversal of a
547        // binary tree.
548        if (depth as usize + 1) < self.branch.len() {
549            return Err(TaprootBuilderError::NodeNotInDfsOrder);
550        }
551
552        while self.branch.len() == depth as usize + 1 {
553            let child = match self.branch.pop() {
554                None => unreachable!("Len of branch checked to be >= 1"),
555                Some(Some(child)) => child,
556                // Needs an explicit push to add the None that we just popped.
557                // Cannot use .last() because of borrow checker issues.
558                Some(None) => {
559                    self.branch.push(None);
560                    break;
561                } // Cannot combine further
562            };
563            if depth == 0 {
564                // We are trying to combine two nodes at root level.
565                // Can't propagate further up than the root
566                return Err(TaprootBuilderError::OverCompleteTree);
567            }
568            node = NodeInfo::combine(node, child)?;
569            // Propagate to combine nodes at a lower depth
570            depth -= 1;
571        }
572
573        if self.branch.len() < depth as usize + 1 {
574            // add enough nodes so that we can insert node at depth `depth`
575            let num_extra_nodes = depth as usize + 1 - self.branch.len();
576            self.branch.extend((0..num_extra_nodes).map(|_| None));
577        }
578        // Push the last node to the branch
579        self.branch[depth as usize] = Some(node);
580        Ok(self)
581    }
582}
583
584impl Default for TaprootBuilder {
585    fn default() -> Self { Self::new() }
586}
587
588/// Error happening when [`TapTree`] is constructed from a [`TaprootBuilder`]
589/// having hidden branches or not being finalized.
590#[derive(Debug, Clone, PartialEq, Eq)]
591#[non_exhaustive]
592pub enum IncompleteBuilderError {
593    /// Indicates an attempt to construct a tap tree from a builder containing incomplete branches.
594    NotFinalized(TaprootBuilder),
595    /// Indicates an attempt to construct a tap tree from a builder containing hidden parts.
596    HiddenParts(TaprootBuilder),
597}
598
599internals::impl_from_infallible!(IncompleteBuilderError);
600
601impl IncompleteBuilderError {
602    /// Converts error into the original incomplete [`TaprootBuilder`] instance.
603    pub fn into_builder(self) -> TaprootBuilder {
604        use IncompleteBuilderError::*;
605
606        match self {
607            NotFinalized(builder) | HiddenParts(builder) => builder,
608        }
609    }
610}
611
612impl core::fmt::Display for IncompleteBuilderError {
613    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
614        use IncompleteBuilderError::*;
615
616        f.write_str(match self {
617            NotFinalized(_) =>
618                "an attempt to construct a tap tree from a builder containing incomplete branches.",
619            HiddenParts(_) =>
620                "an attempt to construct a tap tree from a builder containing hidden parts.",
621        })
622    }
623}
624
625#[cfg(feature = "std")]
626impl std::error::Error for IncompleteBuilderError {
627    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
628        use IncompleteBuilderError::*;
629
630        match *self {
631            NotFinalized(_) | HiddenParts(_) => None,
632        }
633    }
634}
635
636/// Error happening when [`TapTree`] is constructed from a [`NodeInfo`]
637/// having hidden branches.
638#[derive(Debug, Clone, PartialEq, Eq)]
639#[non_exhaustive]
640pub enum HiddenNodesError {
641    /// Indicates an attempt to construct a tap tree from a builder containing hidden parts.
642    HiddenParts(NodeInfo),
643}
644
645internals::impl_from_infallible!(HiddenNodesError);
646
647impl HiddenNodesError {
648    /// Converts error into the original incomplete [`NodeInfo`] instance.
649    pub fn into_node_info(self) -> NodeInfo {
650        use HiddenNodesError::*;
651
652        match self {
653            HiddenParts(node_info) => node_info,
654        }
655    }
656}
657
658impl core::fmt::Display for HiddenNodesError {
659    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
660        use HiddenNodesError::*;
661
662        f.write_str(match self {
663            HiddenParts(_) =>
664                "an attempt to construct a tap tree from a node_info containing hidden parts.",
665        })
666    }
667}
668
669#[cfg(feature = "std")]
670impl std::error::Error for HiddenNodesError {
671    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
672        use HiddenNodesError::*;
673
674        match self {
675            HiddenParts(_) => None,
676        }
677    }
678}
679
680/// Taproot Tree representing a complete binary tree without any hidden nodes.
681///
682/// This is in contrast to [`NodeInfo`], which allows hidden nodes.
683/// The implementations for Eq, PartialEq and Hash compare the merkle root of the tree
684//
685// This is a bug in BIP370 that does not specify how to share trees with hidden nodes,
686// for which we need a separate type.
687#[derive(Clone, Debug, Eq, PartialEq, Hash)]
688#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
689#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
690#[cfg_attr(feature = "serde", serde(into = "NodeInfo"))]
691#[cfg_attr(feature = "serde", serde(try_from = "NodeInfo"))]
692pub struct TapTree(NodeInfo);
693
694impl From<TapTree> for NodeInfo {
695    #[inline]
696    fn from(tree: TapTree) -> Self { tree.into_node_info() }
697}
698
699impl TapTree {
700    /// Gets the reference to inner [`NodeInfo`] of this tree root.
701    pub fn node_info(&self) -> &NodeInfo { &self.0 }
702
703    /// Gets the inner [`NodeInfo`] of this tree root.
704    pub fn into_node_info(self) -> NodeInfo { self.0 }
705
706    /// Returns [`ScriptLeaves<'_>`] iterator for a taproot script tree, operating in DFS order over
707    /// tree [`ScriptLeaf`]s.
708    pub fn script_leaves(&self) -> ScriptLeaves<'_> {
709        ScriptLeaves { leaf_iter: self.0.leaf_nodes() }
710    }
711
712    /// Returns the root [`TapNodeHash`] of this tree.
713    pub fn root_hash(&self) -> TapNodeHash { self.0.hash }
714}
715
716impl TryFrom<TaprootBuilder> for TapTree {
717    type Error = IncompleteBuilderError;
718
719    /// Constructs [`TapTree`] from a [`TaprootBuilder`] if it is complete binary tree.
720    ///
721    /// # Returns
722    ///
723    /// A [`TapTree`] iff the `builder` is complete, otherwise return [`IncompleteBuilderError`]
724    /// error with the content of incomplete `builder` instance.
725    fn try_from(builder: TaprootBuilder) -> Result<Self, Self::Error> { builder.try_into_taptree() }
726}
727
728impl TryFrom<NodeInfo> for TapTree {
729    type Error = HiddenNodesError;
730
731    /// Constructs [`TapTree`] from a [`NodeInfo`] if it is complete binary tree.
732    ///
733    /// # Returns
734    ///
735    /// A [`TapTree`] iff the [`NodeInfo`] has no hidden nodes, otherwise return
736    /// [`HiddenNodesError`] error with the content of incomplete [`NodeInfo`] instance.
737    fn try_from(node_info: NodeInfo) -> Result<Self, Self::Error> {
738        if node_info.has_hidden_nodes {
739            Err(HiddenNodesError::HiddenParts(node_info))
740        } else {
741            Ok(TapTree(node_info))
742        }
743    }
744}
745
746/// Iterator for a taproot script tree, operating in DFS order yielding [`ScriptLeaf`].
747///
748/// Returned by [`TapTree::script_leaves`]. [`TapTree`] does not allow hidden nodes,
749/// so this iterator is guaranteed to yield all known leaves.
750pub struct ScriptLeaves<'tree> {
751    leaf_iter: LeafNodes<'tree>,
752}
753
754impl<'tree> Iterator for ScriptLeaves<'tree> {
755    type Item = ScriptLeaf<'tree>;
756
757    #[inline]
758    fn next(&mut self) -> Option<Self::Item> { ScriptLeaf::from_leaf_node(self.leaf_iter.next()?) }
759
760    fn size_hint(&self) -> (usize, Option<usize>) { self.leaf_iter.size_hint() }
761}
762
763impl<'tree> ExactSizeIterator for ScriptLeaves<'tree> {}
764
765impl<'tree> FusedIterator for ScriptLeaves<'tree> {}
766
767impl<'tree> DoubleEndedIterator for ScriptLeaves<'tree> {
768    #[inline]
769    fn next_back(&mut self) -> Option<Self::Item> {
770        ScriptLeaf::from_leaf_node(self.leaf_iter.next_back()?)
771    }
772}
773/// Iterator for a taproot script tree, operating in DFS order yielding [`LeafNode`].
774///
775/// Returned by [`NodeInfo::leaf_nodes`]. This can potentially yield hidden nodes.
776pub struct LeafNodes<'a> {
777    leaf_iter: core::slice::Iter<'a, LeafNode>,
778}
779
780impl<'a> Iterator for LeafNodes<'a> {
781    type Item = &'a LeafNode;
782
783    #[inline]
784    fn next(&mut self) -> Option<Self::Item> { self.leaf_iter.next() }
785
786    fn size_hint(&self) -> (usize, Option<usize>) { self.leaf_iter.size_hint() }
787}
788
789impl<'tree> ExactSizeIterator for LeafNodes<'tree> {}
790
791impl<'tree> FusedIterator for LeafNodes<'tree> {}
792
793impl<'tree> DoubleEndedIterator for LeafNodes<'tree> {
794    #[inline]
795    fn next_back(&mut self) -> Option<Self::Item> { self.leaf_iter.next_back() }
796}
797/// Represents the node information in taproot tree. In contrast to [`TapTree`], this
798/// is allowed to have hidden leaves as children.
799///
800/// Helper type used in merkle tree construction allowing one to build sparse merkle trees. The node
801/// represents part of the tree that has information about all of its descendants.
802/// See how [`TaprootBuilder`] works for more details.
803///
804/// You can use [`TaprootSpendInfo::from_node_info`] to a get a [`TaprootSpendInfo`] from the merkle
805/// root [`NodeInfo`].
806#[derive(Debug, Clone, PartialOrd, Ord)]
807pub struct NodeInfo {
808    /// Merkle hash for this node.
809    pub(crate) hash: TapNodeHash,
810    /// Information about leaves inside this node.
811    pub(crate) leaves: Vec<LeafNode>,
812    /// Tracks information on hidden nodes below this node.
813    pub(crate) has_hidden_nodes: bool,
814}
815
816impl PartialEq for NodeInfo {
817    fn eq(&self, other: &Self) -> bool { self.hash.eq(&other.hash) }
818}
819
820impl core::hash::Hash for NodeInfo {
821    fn hash<H: core::hash::Hasher>(&self, state: &mut H) { self.hash.hash(state) }
822}
823
824impl Eq for NodeInfo {}
825
826impl NodeInfo {
827    /// Creates a new [`NodeInfo`] with omitted/hidden info.
828    pub fn new_hidden_node(hash: TapNodeHash) -> Self {
829        Self { hash, leaves: vec![], has_hidden_nodes: true }
830    }
831
832    /// Creates a new leaf [`NodeInfo`] with given [`ScriptBuf`] and [`LeafVersion`].
833    pub fn new_leaf_with_ver(script: ScriptBuf, ver: LeafVersion) -> Self {
834        Self {
835            hash: TapNodeHash::from_script(&script, ver),
836            leaves: vec![LeafNode::new_script(script, ver)],
837            has_hidden_nodes: false,
838        }
839    }
840
841    /// Combines two [`NodeInfo`] to create a new parent.
842    pub fn combine(a: Self, b: Self) -> Result<Self, TaprootBuilderError> {
843        let mut all_leaves = Vec::with_capacity(a.leaves.len() + b.leaves.len());
844        let (hash, left_first) = TapNodeHash::combine_node_hashes(a.hash, b.hash);
845        let (a, b) = if left_first { (a, b) } else { (b, a) };
846        for mut a_leaf in a.leaves {
847            a_leaf.merkle_branch.push(b.hash)?; // add hashing partner
848            all_leaves.push(a_leaf);
849        }
850        for mut b_leaf in b.leaves {
851            b_leaf.merkle_branch.push(a.hash)?; // add hashing partner
852            all_leaves.push(b_leaf);
853        }
854        Ok(Self {
855            hash,
856            leaves: all_leaves,
857            has_hidden_nodes: a.has_hidden_nodes || b.has_hidden_nodes,
858        })
859    }
860
861    /// Creates an iterator over all leaves (including hidden leaves) in the tree.
862    pub fn leaf_nodes(&self) -> LeafNodes<'_> { LeafNodes { leaf_iter: self.leaves.iter() } }
863
864    /// Returns the root [`TapNodeHash`] of this node info.
865    pub fn node_hash(&self) -> TapNodeHash { self.hash }
866}
867
868impl TryFrom<TaprootBuilder> for NodeInfo {
869    type Error = IncompleteBuilderError;
870
871    fn try_from(builder: TaprootBuilder) -> Result<Self, Self::Error> {
872        builder.try_into_node_info()
873    }
874}
875
876#[cfg(feature = "serde")]
877impl serde::Serialize for NodeInfo {
878    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
879    where
880        S: serde::Serializer,
881    {
882        use serde::ser::SerializeSeq;
883        let mut seq = serializer.serialize_seq(Some(self.leaves.len() * 2))?;
884        for tap_leaf in self.leaves.iter() {
885            seq.serialize_element(&tap_leaf.merkle_branch().len())?;
886            seq.serialize_element(&tap_leaf.leaf)?;
887        }
888        seq.end()
889    }
890}
891
892#[cfg(feature = "serde")]
893impl<'de> serde::Deserialize<'de> for NodeInfo {
894    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
895    where
896        D: serde::Deserializer<'de>,
897    {
898        struct SeqVisitor;
899        impl<'de> serde::de::Visitor<'de> for SeqVisitor {
900            type Value = NodeInfo;
901
902            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
903                formatter.write_str("Taproot tree in DFS walk order")
904            }
905
906            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
907            where
908                A: serde::de::SeqAccess<'de>,
909            {
910                let size = seq
911                    .size_hint()
912                    .map(|x| core::mem::size_of::<usize>() * 8 - x.leading_zeros() as usize)
913                    .map(|x| x / 2) // Each leaf is serialized as two elements.
914                    .unwrap_or(0)
915                    .min(TAPROOT_CONTROL_MAX_NODE_COUNT); // no more than 128 nodes
916                let mut builder = TaprootBuilder::with_capacity(size);
917                while let Some(depth) = seq.next_element()? {
918                    let tap_leaf: TapLeaf = seq
919                        .next_element()?
920                        .ok_or_else(|| serde::de::Error::custom("Missing tap_leaf"))?;
921                    match tap_leaf {
922                        TapLeaf::Script(script, ver) => {
923                            builder =
924                                builder.add_leaf_with_ver(depth, script, ver).map_err(|e| {
925                                    serde::de::Error::custom(format!("Leaf insertion error: {}", e))
926                                })?;
927                        }
928                        TapLeaf::Hidden(h) => {
929                            builder = builder.add_hidden_node(depth, h).map_err(|e| {
930                                serde::de::Error::custom(format!(
931                                    "Hidden node insertion error: {}",
932                                    e
933                                ))
934                            })?;
935                        }
936                    }
937                }
938                NodeInfo::try_from(builder).map_err(|e| {
939                    serde::de::Error::custom(format!("Incomplete taproot tree: {}", e))
940                })
941            }
942        }
943
944        deserializer.deserialize_seq(SeqVisitor)
945    }
946}
947
948/// Leaf node in a taproot tree. Can be either hidden or known.
949#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
950#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
951#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
952pub enum TapLeaf {
953    /// A known script
954    Script(ScriptBuf, LeafVersion),
955    /// Hidden Node with the given leaf hash
956    Hidden(TapNodeHash),
957}
958
959impl TapLeaf {
960    /// Obtains the hidden leaf hash if the leaf is hidden.
961    pub fn as_hidden(&self) -> Option<&TapNodeHash> {
962        if let Self::Hidden(v) = self {
963            Some(v)
964        } else {
965            None
966        }
967    }
968
969    /// Obtains a reference to script and version if the leaf is known.
970    pub fn as_script(&self) -> Option<(&Script, LeafVersion)> {
971        if let Self::Script(script, ver) = self {
972            Some((script, *ver))
973        } else {
974            None
975        }
976    }
977}
978
979/// Store information about taproot leaf node.
980#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
981pub struct LeafNode {
982    /// The [`TapLeaf`]
983    leaf: TapLeaf,
984    /// The merkle proof (hashing partners) to get this node.
985    merkle_branch: TaprootMerkleBranch,
986}
987
988impl LeafNode {
989    /// Creates an new [`ScriptLeaf`] from `script` and `ver` and no merkle branch.
990    pub fn new_script(script: ScriptBuf, ver: LeafVersion) -> Self {
991        Self { leaf: TapLeaf::Script(script, ver), merkle_branch: Default::default() }
992    }
993
994    /// Creates an new [`ScriptLeaf`] from `hash` and no merkle branch.
995    pub fn new_hidden(hash: TapNodeHash) -> Self {
996        Self { leaf: TapLeaf::Hidden(hash), merkle_branch: Default::default() }
997    }
998
999    /// Returns the depth of this script leaf in the tap tree.
1000    #[inline]
1001    pub fn depth(&self) -> u8 {
1002        // Depth is guarded by TAPROOT_CONTROL_MAX_NODE_COUNT.
1003        u8::try_from(self.merkle_branch().len()).expect("depth is guaranteed to fit in a u8")
1004    }
1005
1006    /// Computes a leaf hash for this [`ScriptLeaf`] if the leaf is known.
1007    ///
1008    /// This [`TapLeafHash`] is useful while signing taproot script spends.
1009    ///
1010    /// See [`LeafNode::node_hash`] for computing the [`TapNodeHash`] which returns the hidden node
1011    /// hash if the node is hidden.
1012    #[inline]
1013    pub fn leaf_hash(&self) -> Option<TapLeafHash> {
1014        let (script, ver) = self.leaf.as_script()?;
1015        Some(TapLeafHash::from_script(script, ver))
1016    }
1017
1018    /// Computes the [`TapNodeHash`] for this [`ScriptLeaf`]. This returns the
1019    /// leaf hash if the leaf is known and the hidden node hash if the leaf is
1020    /// hidden.
1021    /// See also, [`LeafNode::leaf_hash`].
1022    #[inline]
1023    pub fn node_hash(&self) -> TapNodeHash {
1024        match self.leaf {
1025            TapLeaf::Script(ref script, ver) => TapLeafHash::from_script(script, ver).into(),
1026            TapLeaf::Hidden(ref hash) => *hash,
1027        }
1028    }
1029
1030    /// Returns reference to the leaf script if the leaf is known.
1031    #[inline]
1032    pub fn script(&self) -> Option<&Script> { self.leaf.as_script().map(|x| x.0) }
1033
1034    /// Returns leaf version of the script if the leaf is known.
1035    #[inline]
1036    pub fn leaf_version(&self) -> Option<LeafVersion> { self.leaf.as_script().map(|x| x.1) }
1037
1038    /// Returns reference to the merkle proof (hashing partners) to get this
1039    /// node in form of [`TaprootMerkleBranch`].
1040    #[inline]
1041    pub fn merkle_branch(&self) -> &TaprootMerkleBranch { &self.merkle_branch }
1042
1043    /// Returns a reference to the leaf of this [`ScriptLeaf`].
1044    #[inline]
1045    pub fn leaf(&self) -> &TapLeaf { &self.leaf }
1046}
1047
1048/// Script leaf node in a taproot tree along with the merkle proof to get this node.
1049/// Returned by [`TapTree::script_leaves`]
1050#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1051pub struct ScriptLeaf<'leaf> {
1052    /// The version of the script leaf.
1053    version: LeafVersion,
1054    /// The script.
1055    script: &'leaf Script,
1056    /// The merkle proof (hashing partners) to get this node.
1057    merkle_branch: &'leaf TaprootMerkleBranch,
1058}
1059
1060impl<'leaf> ScriptLeaf<'leaf> {
1061    /// Obtains the version of the script leaf.
1062    pub fn version(&self) -> LeafVersion { self.version }
1063
1064    /// Obtains a reference to the script inside the leaf.
1065    pub fn script(&self) -> &Script { self.script }
1066
1067    /// Obtains a reference to the merkle proof of the leaf.
1068    pub fn merkle_branch(&self) -> &TaprootMerkleBranch { self.merkle_branch }
1069
1070    /// Obtains a script leaf from the leaf node if the leaf is not hidden.
1071    pub fn from_leaf_node(leaf_node: &'leaf LeafNode) -> Option<Self> {
1072        let (script, ver) = leaf_node.leaf.as_script()?;
1073        Some(Self { version: ver, script, merkle_branch: &leaf_node.merkle_branch })
1074    }
1075}
1076
1077/// Control block data structure used in Tapscript satisfaction.
1078#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1079#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1080#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
1081pub struct ControlBlock {
1082    /// The tapleaf version.
1083    pub leaf_version: LeafVersion,
1084    /// The parity of the output key (NOT THE INTERNAL KEY WHICH IS ALWAYS XONLY).
1085    pub output_key_parity: secp256k1::Parity,
1086    /// The internal key.
1087    pub internal_key: UntweakedPublicKey,
1088    /// The merkle proof of a script associated with this leaf.
1089    pub merkle_branch: TaprootMerkleBranch,
1090}
1091
1092impl ControlBlock {
1093    /// Decodes bytes representing a `ControlBlock`.
1094    ///
1095    /// This is an extra witness element that provides the proof that taproot script pubkey is
1096    /// correctly computed with some specified leaf hash. This is the last element in taproot
1097    /// witness when spending a output via script path.
1098    ///
1099    /// # Errors
1100    ///
1101    /// - [`TaprootError::InvalidControlBlockSize`] if `sl` is not of size 1 + 32 + 32N for any N >= 0.
1102    /// - [`TaprootError::InvalidTaprootLeafVersion`] if first byte of `sl` is not a valid leaf version.
1103    /// - [`TaprootError::InvalidInternalKey`] if internal key is invalid (first 32 bytes after the parity byte).
1104    /// - [`TaprootError::InvalidMerkleTreeDepth`] if merkle tree is too deep (more than 128 levels).
1105    pub fn decode(sl: &[u8]) -> Result<ControlBlock, TaprootError> {
1106        if sl.len() < TAPROOT_CONTROL_BASE_SIZE
1107            || (sl.len() - TAPROOT_CONTROL_BASE_SIZE) % TAPROOT_CONTROL_NODE_SIZE != 0
1108        {
1109            return Err(TaprootError::InvalidControlBlockSize(sl.len()));
1110        }
1111        let output_key_parity = match sl[0] & 1 {
1112            0 => secp256k1::Parity::Even,
1113            _ => secp256k1::Parity::Odd,
1114        };
1115
1116        let leaf_version = LeafVersion::from_consensus(sl[0] & TAPROOT_LEAF_MASK)?;
1117        let internal_key = UntweakedPublicKey::from_slice(&sl[1..TAPROOT_CONTROL_BASE_SIZE])
1118            .map_err(TaprootError::InvalidInternalKey)?;
1119        let merkle_branch = TaprootMerkleBranch::decode(&sl[TAPROOT_CONTROL_BASE_SIZE..])?;
1120        Ok(ControlBlock { leaf_version, output_key_parity, internal_key, merkle_branch })
1121    }
1122
1123    /// Returns the size of control block. Faster and more efficient than calling
1124    /// `Self::serialize().len()`. Can be handy for fee estimation.
1125    pub fn size(&self) -> usize {
1126        TAPROOT_CONTROL_BASE_SIZE + TAPROOT_CONTROL_NODE_SIZE * self.merkle_branch.len()
1127    }
1128
1129    /// Serializes to a writer.
1130    ///
1131    /// # Returns
1132    ///
1133    /// The number of bytes written to the writer.
1134    pub fn encode<W: Write + ?Sized>(&self, writer: &mut W) -> io::Result<usize> {
1135        let first_byte: u8 =
1136            i32::from(self.output_key_parity) as u8 | self.leaf_version.to_consensus();
1137        writer.write_all(&[first_byte])?;
1138        writer.write_all(&self.internal_key.serialize())?;
1139        self.merkle_branch.encode(writer)?;
1140        Ok(self.size())
1141    }
1142
1143    /// Serializes the control block.
1144    ///
1145    /// This would be required when using [`ControlBlock`] as a witness element while spending an
1146    /// output via script path. This serialization does not include the [`crate::VarInt`] prefix that would
1147    /// be applied when encoding this element as a witness.
1148    pub fn serialize(&self) -> Vec<u8> {
1149        let mut buf = Vec::with_capacity(self.size());
1150        self.encode(&mut buf).expect("writers don't error");
1151        buf
1152    }
1153
1154    /// Verifies that a control block is correct proof for a given output key and script.
1155    ///
1156    /// Only checks that script is contained inside the taptree described by output key. Full
1157    /// verification must also execute the script with witness data.
1158    pub fn verify_taproot_commitment<C: secp256k1::Verification>(
1159        &self,
1160        secp: &Secp256k1<C>,
1161        output_key: XOnlyPublicKey,
1162        script: &Script,
1163    ) -> bool {
1164        // compute the script hash
1165        // Initially the curr_hash is the leaf hash
1166        let mut curr_hash = TapNodeHash::from_script(script, self.leaf_version);
1167        // Verify the proof
1168        for elem in &self.merkle_branch {
1169            // Recalculate the curr hash as parent hash
1170            curr_hash = TapNodeHash::from_node_hashes(curr_hash, *elem);
1171        }
1172        // compute the taptweak
1173        let tweak =
1174            TapTweakHash::from_key_and_tweak(self.internal_key, Some(curr_hash)).to_scalar();
1175        self.internal_key.tweak_add_check(secp, &output_key, self.output_key_parity, tweak)
1176    }
1177}
1178
1179/// Inner type representing future (non-tapscript) leaf versions. See [`LeafVersion::Future`].
1180///
1181/// NB: NO PUBLIC CONSTRUCTOR!
1182/// The only way to construct this is by converting `u8` to [`LeafVersion`] and then extracting it.
1183#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]
1184pub struct FutureLeafVersion(u8);
1185
1186impl FutureLeafVersion {
1187    pub(self) fn from_consensus(version: u8) -> Result<FutureLeafVersion, TaprootError> {
1188        match version {
1189            TAPROOT_LEAF_TAPSCRIPT => unreachable!(
1190                "FutureLeafVersion::from_consensus should be never called for 0xC0 value"
1191            ),
1192            TAPROOT_ANNEX_PREFIX =>
1193                Err(TaprootError::InvalidTaprootLeafVersion(TAPROOT_ANNEX_PREFIX)),
1194            odd if odd & 0xFE != odd => Err(TaprootError::InvalidTaprootLeafVersion(odd)),
1195            even => Ok(FutureLeafVersion(even)),
1196        }
1197    }
1198
1199    /// Returns the consensus representation of this [`FutureLeafVersion`].
1200    #[inline]
1201    pub fn to_consensus(self) -> u8 { self.0 }
1202}
1203
1204impl fmt::Display for FutureLeafVersion {
1205    #[inline]
1206    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) }
1207}
1208
1209impl fmt::LowerHex for FutureLeafVersion {
1210    #[inline]
1211    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::LowerHex::fmt(&self.0, f) }
1212}
1213
1214impl fmt::UpperHex for FutureLeafVersion {
1215    #[inline]
1216    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) }
1217}
1218
1219/// The leaf version for tapleafs.
1220#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
1221pub enum LeafVersion {
1222    /// BIP-342 tapscript.
1223    TapScript,
1224
1225    /// Future leaf version.
1226    Future(FutureLeafVersion),
1227}
1228
1229impl LeafVersion {
1230    /// Creates a [`LeafVersion`] from consensus byte representation.
1231    ///
1232    /// # Errors
1233    ///
1234    /// - If the last bit of the `version` is odd.
1235    /// - If the `version` is 0x50 ([`TAPROOT_ANNEX_PREFIX`]).
1236    pub fn from_consensus(version: u8) -> Result<Self, TaprootError> {
1237        match version {
1238            TAPROOT_LEAF_TAPSCRIPT => Ok(LeafVersion::TapScript),
1239            TAPROOT_ANNEX_PREFIX =>
1240                Err(TaprootError::InvalidTaprootLeafVersion(TAPROOT_ANNEX_PREFIX)),
1241            future => FutureLeafVersion::from_consensus(future).map(LeafVersion::Future),
1242        }
1243    }
1244
1245    /// Returns the consensus representation of this [`LeafVersion`].
1246    pub fn to_consensus(self) -> u8 {
1247        match self {
1248            LeafVersion::TapScript => TAPROOT_LEAF_TAPSCRIPT,
1249            LeafVersion::Future(version) => version.to_consensus(),
1250        }
1251    }
1252}
1253
1254impl fmt::Display for LeafVersion {
1255    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1256        match (self, f.alternate()) {
1257            (LeafVersion::TapScript, true) => f.write_str("tapscript"),
1258            (LeafVersion::TapScript, false) => fmt::Display::fmt(&TAPROOT_LEAF_TAPSCRIPT, f),
1259            (LeafVersion::Future(version), true) => write!(f, "future_script_{:#02x}", version.0),
1260            (LeafVersion::Future(version), false) => fmt::Display::fmt(version, f),
1261        }
1262    }
1263}
1264
1265impl fmt::LowerHex for LeafVersion {
1266    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1267        fmt::LowerHex::fmt(&self.to_consensus(), f)
1268    }
1269}
1270
1271impl fmt::UpperHex for LeafVersion {
1272    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1273        fmt::UpperHex::fmt(&self.to_consensus(), f)
1274    }
1275}
1276
1277/// Serializes [`LeafVersion`] as a `u8` using consensus encoding.
1278#[cfg(feature = "serde")]
1279impl serde::Serialize for LeafVersion {
1280    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1281    where
1282        S: serde::Serializer,
1283    {
1284        serializer.serialize_u8(self.to_consensus())
1285    }
1286}
1287
1288/// Deserializes [`LeafVersion`] as a `u8` using consensus encoding.
1289#[cfg(feature = "serde")]
1290impl<'de> serde::Deserialize<'de> for LeafVersion {
1291    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1292    where
1293        D: serde::Deserializer<'de>,
1294    {
1295        struct U8Visitor;
1296        impl<'de> serde::de::Visitor<'de> for U8Visitor {
1297            type Value = LeafVersion;
1298
1299            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1300                formatter.write_str("a valid consensus-encoded taproot leaf version")
1301            }
1302
1303            fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
1304            where
1305                E: serde::de::Error,
1306            {
1307                let value = u8::try_from(value).map_err(|_| {
1308                    E::invalid_value(
1309                        serde::de::Unexpected::Unsigned(value),
1310                        &"consensus-encoded leaf version as u8",
1311                    )
1312                })?;
1313                LeafVersion::from_consensus(value).map_err(|_| {
1314                    E::invalid_value(
1315                        ::serde::de::Unexpected::Unsigned(value as u64),
1316                        &"consensus-encoded leaf version as u8",
1317                    )
1318                })
1319            }
1320        }
1321
1322        deserializer.deserialize_u8(U8Visitor)
1323    }
1324}
1325
1326/// Detailed error type for taproot builder.
1327#[derive(Debug, Clone, PartialEq, Eq)]
1328#[non_exhaustive]
1329pub enum TaprootBuilderError {
1330    /// Merkle tree depth must not be more than 128.
1331    InvalidMerkleTreeDepth(usize),
1332    /// Nodes must be added specified in DFS walk order.
1333    NodeNotInDfsOrder,
1334    /// Two nodes at depth 0 are not allowed.
1335    OverCompleteTree,
1336    /// Invalid taproot internal key.
1337    InvalidInternalKey(secp256k1::Error),
1338    /// Called finalize on a empty tree.
1339    EmptyTree,
1340}
1341
1342internals::impl_from_infallible!(TaprootBuilderError);
1343
1344impl fmt::Display for TaprootBuilderError {
1345    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1346        use TaprootBuilderError::*;
1347
1348        match *self {
1349            InvalidMerkleTreeDepth(d) => {
1350                write!(
1351                    f,
1352                    "Merkle Tree depth({}) must be less than {}",
1353                    d, TAPROOT_CONTROL_MAX_NODE_COUNT
1354                )
1355            }
1356            NodeNotInDfsOrder => {
1357                write!(f, "add_leaf/add_hidden must be called in DFS walk order",)
1358            }
1359            OverCompleteTree => write!(
1360                f,
1361                "Attempted to create a tree with two nodes at depth 0. There must\
1362                only be a exactly one node at depth 0",
1363            ),
1364            InvalidInternalKey(ref e) => {
1365                write_err!(f, "invalid internal x-only key"; e)
1366            }
1367            EmptyTree => {
1368                write!(f, "Called finalize on an empty tree")
1369            }
1370        }
1371    }
1372}
1373
1374#[cfg(feature = "std")]
1375impl std::error::Error for TaprootBuilderError {
1376    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1377        use TaprootBuilderError::*;
1378
1379        match self {
1380            InvalidInternalKey(e) => Some(e),
1381            InvalidMerkleTreeDepth(_) | NodeNotInDfsOrder | OverCompleteTree | EmptyTree => None,
1382        }
1383    }
1384}
1385
1386/// Detailed error type for taproot utilities.
1387#[derive(Debug, Clone, PartialEq, Eq)]
1388#[non_exhaustive]
1389pub enum TaprootError {
1390    /// Proof size must be a multiple of 32.
1391    InvalidMerkleBranchSize(usize),
1392    /// Merkle tree depth must not be more than 128.
1393    InvalidMerkleTreeDepth(usize),
1394    /// The last bit of tapleaf version must be zero.
1395    InvalidTaprootLeafVersion(u8),
1396    /// Invalid control block size.
1397    InvalidControlBlockSize(usize),
1398    /// Invalid taproot internal key.
1399    InvalidInternalKey(secp256k1::Error),
1400    /// Empty tap tree.
1401    EmptyTree,
1402}
1403
1404internals::impl_from_infallible!(TaprootError);
1405
1406impl fmt::Display for TaprootError {
1407    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1408        use TaprootError::*;
1409
1410        match *self {
1411            InvalidMerkleBranchSize(sz) => write!(
1412                f,
1413                "Merkle branch size({}) must be a multiple of {}",
1414                sz, TAPROOT_CONTROL_NODE_SIZE
1415            ),
1416            InvalidMerkleTreeDepth(d) => write!(
1417                f,
1418                "Merkle Tree depth({}) must be less than {}",
1419                d, TAPROOT_CONTROL_MAX_NODE_COUNT
1420            ),
1421            InvalidTaprootLeafVersion(v) => {
1422                write!(f, "Leaf version({}) must have the least significant bit 0", v)
1423            }
1424            InvalidControlBlockSize(sz) => write!(
1425                f,
1426                "Control Block size({}) must be of the form 33 + 32*m where  0 <= m <= {} ",
1427                sz, TAPROOT_CONTROL_MAX_NODE_COUNT
1428            ),
1429            InvalidInternalKey(ref e) => {
1430                write_err!(f, "invalid internal x-only key"; e)
1431            }
1432            EmptyTree => write!(f, "Taproot Tree must contain at least one script"),
1433        }
1434    }
1435}
1436
1437#[cfg(feature = "std")]
1438impl std::error::Error for TaprootError {
1439    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
1440        use TaprootError::*;
1441
1442        match self {
1443            InvalidInternalKey(e) => Some(e),
1444            InvalidMerkleBranchSize(_)
1445            | InvalidMerkleTreeDepth(_)
1446            | InvalidTaprootLeafVersion(_)
1447            | InvalidControlBlockSize(_)
1448            | EmptyTree => None,
1449        }
1450    }
1451}
1452
1453#[cfg(test)]
1454mod test {
1455    use core::str::FromStr;
1456
1457    use hashes::sha256;
1458    use hashes::sha256t::Tag;
1459    use hex::FromHex;
1460    use secp256k1::VerifyOnly;
1461
1462    use super::*;
1463    use crate::sighash::{TapSighash, TapSighashTag};
1464    use crate::{Address, KnownHrp};
1465    extern crate serde_json;
1466
1467    #[cfg(feature = "serde")]
1468    use {
1469        hex::test_hex_unwrap as hex,
1470        serde_test::Configure,
1471        serde_test::{assert_tokens, Token},
1472    };
1473
1474    fn tag_engine(tag_name: &str) -> sha256::HashEngine {
1475        let mut engine = sha256::Hash::engine();
1476        let tag_hash = sha256::Hash::hash(tag_name.as_bytes());
1477        engine.input(tag_hash.as_ref());
1478        engine.input(tag_hash.as_ref());
1479        engine
1480    }
1481
1482    #[test]
1483    fn test_midstates() {
1484        // test that engine creation roundtrips
1485        assert_eq!(tag_engine("TapLeaf").midstate(), TapLeafTag::engine().midstate());
1486        assert_eq!(tag_engine("TapBranch").midstate(), TapBranchTag::engine().midstate());
1487        assert_eq!(tag_engine("TapTweak").midstate(), TapTweakTag::engine().midstate());
1488        assert_eq!(tag_engine("TapSighash").midstate(), TapSighashTag::engine().midstate());
1489
1490        // check that hash creation is the same as building into the same engine
1491        fn empty_hash(tag_name: &str) -> [u8; 32] {
1492            let mut e = tag_engine(tag_name);
1493            e.input(&[]);
1494            TapNodeHash::from_engine(e).to_byte_array()
1495        }
1496        assert_eq!(empty_hash("TapLeaf"), TapLeafHash::hash(&[]).to_byte_array());
1497        assert_eq!(empty_hash("TapBranch"), TapNodeHash::hash(&[]).to_byte_array());
1498        assert_eq!(empty_hash("TapTweak"), TapTweakHash::hash(&[]).to_byte_array());
1499        assert_eq!(empty_hash("TapSighash"), TapSighash::hash(&[]).to_byte_array());
1500    }
1501
1502    #[test]
1503    fn test_vectors_core() {
1504        //! Test vectors taken from Core
1505
1506        // uninitialized writers
1507        //   CHashWriter writer = HasherTapLeaf;
1508        //   writer.GetSHA256().GetHex()
1509        assert_eq!(
1510            TapLeafHash::from_engine(TapLeafTag::engine()).to_string(),
1511            "5212c288a377d1f8164962a5a13429f9ba6a7b84e59776a52c6637df2106facb"
1512        );
1513        assert_eq!(
1514            TapNodeHash::from_engine(TapBranchTag::engine()).to_string(),
1515            "53c373ec4d6f3c53c1f5fb2ff506dcefe1a0ed74874f93fa93c8214cbe9ffddf"
1516        );
1517        assert_eq!(
1518            TapTweakHash::from_engine(TapTweakTag::engine()).to_string(),
1519            "8aa4229474ab0100b2d6f0687f031d1fc9d8eef92a042ad97d279bff456b15e4"
1520        );
1521        assert_eq!(
1522            TapSighash::from_engine(TapSighashTag::engine()).to_string(),
1523            "dabc11914abcd8072900042a2681e52f8dba99ce82e224f97b5fdb7cd4b9c803"
1524        );
1525
1526        // 0-byte
1527        //   CHashWriter writer = HasherTapLeaf;
1528        //   writer << std::vector<unsigned char>{};
1529        //   writer.GetSHA256().GetHex()
1530        // Note that Core writes the 0 length prefix when an empty vector is written.
1531        assert_eq!(
1532            TapLeafHash::hash(&[0]).to_string(),
1533            "ed1382037800c9dd938dd8854f1a8863bcdeb6705069b4b56a66ec22519d5829"
1534        );
1535        assert_eq!(
1536            TapNodeHash::hash(&[0]).to_string(),
1537            "92534b1960c7e6245af7d5fda2588db04aa6d646abc2b588dab2b69e5645eb1d"
1538        );
1539        assert_eq!(
1540            TapTweakHash::hash(&[0]).to_string(),
1541            "cd8737b5e6047fc3f16f03e8b9959e3440e1bdf6dd02f7bb899c352ad490ea1e"
1542        );
1543        assert_eq!(
1544            TapSighash::hash(&[0]).to_string(),
1545            "c2fd0de003889a09c4afcf676656a0d8a1fb706313ff7d509afb00c323c010cd"
1546        );
1547    }
1548
1549    fn _verify_tap_commitments(
1550        secp: &Secp256k1<VerifyOnly>,
1551        out_spk_hex: &str,
1552        script_hex: &str,
1553        control_block_hex: &str,
1554    ) {
1555        let out_pk = XOnlyPublicKey::from_str(&out_spk_hex[4..]).unwrap();
1556        let out_pk = TweakedPublicKey::dangerous_assume_tweaked(out_pk);
1557        let script = ScriptBuf::from_hex(script_hex).unwrap();
1558        let control_block =
1559            ControlBlock::decode(&Vec::<u8>::from_hex(control_block_hex).unwrap()).unwrap();
1560        assert_eq!(control_block_hex, control_block.serialize().to_lower_hex_string());
1561        assert!(control_block.verify_taproot_commitment(
1562            secp,
1563            out_pk.to_x_only_public_key(),
1564            &script
1565        ));
1566    }
1567
1568    #[test]
1569    fn control_block_verify() {
1570        let secp = Secp256k1::verification_only();
1571        // test vectors obtained from printing values in feature_taproot.py from Bitcoin Core
1572        _verify_tap_commitments(&secp, "51205dc8e62b15e0ebdf44751676be35ba32eed2e84608b290d4061bbff136cd7ba9", "6a", "c1a9d6f66cd4b25004f526bfa873e56942f98e8e492bd79ed6532b966104817c2bda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e0641e660d1e5392fb79d64838c2b84faf04b7f5f283c9d8bf83e39e177b64372a0cd22eeab7e093873e851e247714eff762d8a30be699ba4456cfe6491b282e193a071350ae099005a5950d74f73ba13077a57bc478007fb0e4d1099ce9cf3d4");
1573        _verify_tap_commitments(&secp, "5120e208c869c40d8827101c5ad3238018de0f3f5183d77a0c53d18ac28ddcbcd8ad", "f4", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f40090ab1f4890d51115998242ebce636efb9ede1b516d9eb8952dc1068e0335306199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4da14e029b1e154a85bfd9139e7aa2720b6070a4ceba8264ca61d5d3ac27aceb9ef4b54cd43c2d1fd5e11b5c2e93cf29b91ea3dc5b832201f02f7473a28c63246");
1574        _verify_tap_commitments(
1575            &secp,
1576            "5120567666e7df90e0450bb608e17c01ed3fbcfa5355a5f8273e34e583bfaa70ce09",
1577            "203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ac",
1578            "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400",
1579        );
1580        _verify_tap_commitments(&secp, "5120580a19e47269414a55eb86d5d0c6c9b371455d9fd2154412a57dec840df99fe1", "6a", "bca0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f40042ba1bd1c63c03ccff60d4c4d53a653f87909eb3358e7fa45c9d805231fb08c933e1f4e0f9d17f591df1419df7d5b7eb5f744f404c5ef9ecdb1b89b18cafa3a816d8b5dba3205f9a9c05f866d91f40d2793a7586d502cb42f46c7a11f66ad4aa");
1581        _verify_tap_commitments(&secp, "5120228b94a4806254a38d6efa8a134c28ebc89546209559dfe40b2b0493bafacc5b", "6a50", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4009c9aed3dfd11ab0e78bf87ef3bf296269dc4b0f7712140386d6980992bab4b45");
1582        _verify_tap_commitments(
1583            &secp,
1584            "5120567666e7df90e0450bb608e17c01ed3fbcfa5355a5f8273e34e583bfaa70ce09",
1585            "203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ac",
1586            "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400",
1587        );
1588        _verify_tap_commitments(
1589            &secp,
1590            "5120b0a79103c31fe51eea61d2873bad8a25a310da319d7e7a85f825fa7a00ea3f85",
1591            "203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ad51",
1592            "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400",
1593        );
1594        _verify_tap_commitments(&secp, "5120f2f62e854a0012aeba78cd4ba4a0832447a5262d4c6eb4f1c95c7914b536fc6c", "6a86", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4009ad3d30479f0689dbdf59a6b840d60ad485b2effbed1825a75ce19a44e460e09056f60ea686d79cfa4fb79f197b2e905ac857a983be4a5a41a4873e865aa950780c0237de279dc063e67deec46ef8e1bc351bf12c4d67a6d568001faf097e797e6ee620f53cfe0f8acaddf2063c39c3577853bb46d61ffcba5a024c3e1216837");
1595        _verify_tap_commitments(&secp, "51202a4772070b49bae68b44315032cdbf9c40c7c2f896781b32b931b73dbfb26d7e", "6af8", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4006f183944a14618fc7fe9ceade0f58e43a19d3c3b179ea6c43c29616413b6971c99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4c3462adec78cd04f3cc156bdadec50def99feae0dc6a23664e8a2b0d42d6ca9eb968dfdf46c23af642b2688351904e0a0630e71ffac5bcaba33b9b2c8a7495ec");
1596        _verify_tap_commitments(&secp, "5120a32b0b8cfafe0f0f8d5870030ba4d19a8725ad345cb3c8420f86ac4e0dff6207", "4c", "e8a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400615da7ac8d078e5fc7f4690fc2127ba40f0f97cc070ade5b3a7919783d91ef3f13734aab908ae998e57848a01268fe8217d70bc3ee8ea8ceae158ae964a4b5f3af20b50d7019bf47fde210eee5c52f1cfe71cfca78f2d3e7c1fd828c80351525");
1597        _verify_tap_commitments(
1598            &secp,
1599            "5120b0a79103c31fe51eea61d2873bad8a25a310da319d7e7a85f825fa7a00ea3f85",
1600            "203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ad51",
1601            "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400",
1602        );
1603        _verify_tap_commitments(&secp, "51208678459f1fa0f80e9b89b8ffdcaf46a022bdf60aa45f1fed9a96145edf4ec400", "6a50", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4001eff29e1a89e650076b8d3c56302881d09c9df215774ed99993aaed14acd6615");
1604        _verify_tap_commitments(&secp, "5120017316303aed02bcdec424c851c9eacbe192b013139bd9634c4e19b3475b06e1", "61", "02a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f40050462265ca552b23cbb4fe021b474313c8cb87d4a18b3f7bdbeb2b418279ba31fc6509d829cd42336f563363cb3538d78758e0876c71e13012eb2b656eb0edb051a2420a840d5c8c6c762abc7410af2c311f606b20ca2ace56a8139f84b1379a");
1605        _verify_tap_commitments(&secp, "5120896d4d5d2236e86c6e9320e86d1a7822e652907cbd508360e8c71aefc127c77d", "61", "14a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4001ab0e9d9a4858a0e69605fe9c5a42d739fbe26fa79650e7074f462b02645f7ea1c91802b298cd91e6b5af57c6a013d93397cd2ecbd5569382cc27becf44ff4fff8960b20f846160c159c58350f6b6072cf1b3daa5185b7a42524fb72cbc252576ae46732b8e31ac24bfa7d72f4c3713e8696f99d8ac6c07e4c820a03f249f144");
1606        _verify_tap_commitments(&secp, "512093c7378d96518a75448821c4f7c8f4bae7ce60f804d03d1f0628dd5dd0f5de51", "04ffffffff203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ba04feffffff87ab", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400c9a5cd1f6c8a81f5648e39f9810591df1c9a8f1fe97c92e03ecd7c0c016c951983e05473c6e8238cb4c780ea2ce62552b2a3eee068ceffc00517cd7b97e10dad");
1607        _verify_tap_commitments(&secp, "5120b28d75a7179de6feb66b8bb0bfa2b2c739d1a41cf7366a1b393804a844db8a28", "61", "c4a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac47039d40fe34d04b4155df7f1be7f2a49253c7e87812ea9e569e683ac27459e652d6503aa32d64734d00adfee8798b2eed28858abf3bd038e8fa58eb7df4a2d9");
1608        _verify_tap_commitments(&secp, "512043e4aa733fc6f43c78a31c2b3c192623acf5cc8c01199ebcc4de88067baca83e", "bd4c", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4003f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b8b41ebea96ffd937715d9faeaa6895e6ef3b22919c554b75df12b3371d328023e443d1df50634ecc1cd169803a1e546f0d44304d8fc5056c408e597fed469b8437d6660eaad3cf72e35ba6e5ff7ddd5e293c1e7e813c871df4f46508e9946ec");
1609        _verify_tap_commitments(&secp, "5120ee9aecb28f5f35ce1f8b5ec80275ac0f81bca4a21b29b4632fb4bcbef8823e6a", "2021a5981b13be29c9d4ea179ea44a8b773ea8c02d68f6f6eefd98de20d4bd055fac", "c13359c284c196b6e80f0cf1d93b6a397cf7ee722f0427b705bd954b88ada8838bd2622fd0e104fc50aa763b43c6a792d7d117029983abd687223b4344a9402c618bba7f5fc3fa8a57491f6842acde88c1e675ca35caea3b1a69ee2c2d9b10f615");
1610        _verify_tap_commitments(&secp, "5120885274df2252b44764dcef53c21f21154e8488b7e79fafbc96b9ebb22ad0200d", "6a50", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4000793597254158918e3369507f2d6fdbef17d18b1028bbb0719450ded0f42c58f");
1611        _verify_tap_commitments(&secp, "512066f6f6f91d47674d198a28388e1eb05ec24e6ddbba10f16396b1a80c08675121", "6a50", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400fe92aff70a2e8e2a4f34a913b99612468a41e0f8ecaff9a729a173d11013c27e");
1612        _verify_tap_commitments(&secp, "5120868ed9307bd4637491ff03e3aa2c216a08fe213cac8b6cedbb9ab31dbfa6512c", "61", "a2a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa759d4ef857ec8e0bb42d6d31609d3c7e77de3bfa28c38f93393a6ddbabe819ec560ed4f061fbe742a5fd2a648d5209469420434c8753da3fa7067cc2bb4c172a");
1613        _verify_tap_commitments(&secp, "5120c1a00a9baa82888fd7d30291135a7eaa9e9966a5f16db2b10460572f8b108d8d", "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5ba0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4007960d7b37dd1361aee34510e77acb4d27ddca17648a17e28475032538c1eb500f5a747f2c0893f79fe153ae918ac3d696de9322aa679aae62051ff5ed83aa502b338bd907346abd4cd9cf06117cb35d55a5a8dd950843522f8de7b5c7fba1804c38b0778d3d76b383f6db6fdf9d6e770da8fffbfa5152c0b8b38129885bcdee6");
1614        _verify_tap_commitments(&secp, "5120bb9abeff7286b76dfc61800c548fe2621ff47506e47201a85c543b4a9a96fead", "75203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf47342796ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4003eb5cdc419e0a6a800f34583ce750f387be34879c26f4230991bd61da743ad9d34d288e79397b709ac22ad8cc57645d593af3e15b97a876362117177ab2519c000000000000000000000000000000000000000000000000000000000000000007160c3a48c8b17bc3aeaf01db9e0a96ac47a5a9fa329e046856e7765e89c8a93ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07feb9aa7cd72c78e66a85414cd19289f8b0ab1415013dc2a007666aa9248ec1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fccc8bea662a9442a94f7ba0643c1d7ee7cc689f3b3506b7c8c99fd3f3b3d7772972dcdf2550cf95b65098aea67f72fef10abdcf1cef9815af8f4c4644b060e0000000000000000000000000000000000000000000000000000000000000000");
1615        _verify_tap_commitments(&secp, "5120afddc189ea51094b4cbf463806792e9c8b35dfdc5e01228c78376380d0046b00", "4d09024747703eb9f759ce5ecd839109fecc40974ab16f5173ea390daaa5a78f7abe898165c90990062af998c5dc7989818393158a2c62b7ece727e7f5400d2efd33db8732599f6d1dce6b5b68d2d47317f2de6c9df118f61227f98453225036618aaf058140f2415d134fa69ba041c724ad81387f8c568d12ddc49eb32a71532096181b3f85fd465b8e9a176bb19f45c070baad47a2cc4505414b88c31cb5b0a192b2d2d56c404a37070b04d42c875c4ac351224f5b254f9ad0b820f43cad292d6565f796bf083173e14723f1e543c85a61689ddd5cb6666b240c15c38ce3320bf0c3be9e0322e5ef72366c294d3a2d7e8b8e7db875e7ae814537554f10b91c72b8b413e026bd5d5e917de4b54fa8f43f38771a7f242aa32dcb7ca1b0588dbf54af7ab9455047fbb894cdfdd242166db784276430eb47d4df092a6b8cb160eb982fe7d14a44283bdb4a9861ca65c06fd8b2546cfbfe38bc77f527de1b9bfd2c95a3e283b7b1d1d2b2fa291256a90a7003aefcef47ceabf113865a494af43e96a38b0b00919855eb7722ea2363e0ddfc9c51c08631d01e2a2d56e786b4ff6f1e5d415facc9c2619c285d9ad43001878294157cb025f639fb954271fd1d6173f6bc16535672f6abdd72b0284b4ff3eaf5b7247719d7c39365622610efae6562bef6e08a0b370fba75bb04dbdb90a482d8417e057f8bd021ea6ac32d0d48b08be9f77833b11e5e739960c9837d7583", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400ff698adfda0327f188e2ee35f7aecc0f90c9138a350d450648d968c2b5dd7ef94ddd3ec418dc0d03ee4956feb708d838ed2b20e5a193465a6a1467fd3054e1ea141ea4c4c503a6271e19a090e2a69a24282e3be04c4f98720f7a0eb274d9693d13a8e3c139aa625fa2aefd09854570527f9ac545bda1b689719f5cb715612c07");
1616        _verify_tap_commitments(&secp, "5120afddc189ea51094b4cbf463806792e9c8b35dfdc5e01228c78376380d0046b00", "83", "c0a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f4007388cda01113397d4cd00bcfbd08fd68c3cfe3a42cbfe3a7651c1d5e6dacf1ad99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4b59764bec92507e4a4c3f01a06f05980163ca10f1c549bfe01f85fa4f109a1295e607f5ed9f1008048474de336f11f67a1fbf2012f58944dede0ab19a3ca81f5");
1617        _verify_tap_commitments(&secp, "512093c7378d96518a75448821c4f7c8f4bae7ce60f804d03d1f0628dd5dd0f5de51", "04ffffffff203455139bf238a3067bd72ed77e0ab8db590330f55ed58dba7366b53bf4734279ba04feffffff87ab", "c1a0eb12e60a52614986c623cbb6621dcdba3a47e3be6b37e032b7a11c7b98f400c9a5cd1f6c8a81f5648e39f9810591df1c9a8f1fe97c92e03ecd7c0c016c951983e05473c6e8238cb4c780ea2ce62552b2a3eee068ceffc00517cd7b97e10dad");
1618    }
1619
1620    #[test]
1621    fn build_huffman_tree() {
1622        let secp = Secp256k1::verification_only();
1623        let internal_key = UntweakedPublicKey::from_str(
1624            "93c7378d96518a75448821c4f7c8f4bae7ce60f804d03d1f0628dd5dd0f5de51",
1625        )
1626        .unwrap();
1627
1628        let script_weights = vec![
1629            (10, ScriptBuf::from_hex("51").unwrap()), // semantics of script don't matter for this test
1630            (20, ScriptBuf::from_hex("52").unwrap()),
1631            (20, ScriptBuf::from_hex("53").unwrap()),
1632            (30, ScriptBuf::from_hex("54").unwrap()),
1633            (19, ScriptBuf::from_hex("55").unwrap()),
1634        ];
1635        let tree_info =
1636            TaprootSpendInfo::with_huffman_tree(&secp, internal_key, script_weights.clone())
1637                .unwrap();
1638
1639        /* The resulting tree should put the scripts into a tree similar
1640         * to the following:
1641         *
1642         *   1      __/\__
1643         *         /      \
1644         *        /\     / \
1645         *   2   54 52  53 /\
1646         *   3            55 51
1647         */
1648
1649        for (script, length) in [("51", 3), ("52", 2), ("53", 2), ("54", 2), ("55", 3)].iter() {
1650            assert_eq!(
1651                *length,
1652                tree_info
1653                    .script_map
1654                    .get(&(ScriptBuf::from_hex(script).unwrap(), LeafVersion::TapScript))
1655                    .expect("Present Key")
1656                    .iter()
1657                    .next()
1658                    .expect("Present Path")
1659                    .len()
1660            );
1661        }
1662
1663        // Obtain the output key
1664        let output_key = tree_info.output_key();
1665
1666        // Try to create and verify a control block from each path
1667        for (_weights, script) in script_weights {
1668            let ver_script = (script, LeafVersion::TapScript);
1669            let ctrl_block = tree_info.control_block(&ver_script).unwrap();
1670            assert!(ctrl_block.verify_taproot_commitment(
1671                &secp,
1672                output_key.to_x_only_public_key(),
1673                &ver_script.0
1674            ))
1675        }
1676    }
1677
1678    #[test]
1679    fn taptree_builder() {
1680        let secp = Secp256k1::verification_only();
1681        let internal_key = UntweakedPublicKey::from_str(
1682            "93c7378d96518a75448821c4f7c8f4bae7ce60f804d03d1f0628dd5dd0f5de51",
1683        )
1684        .unwrap();
1685
1686        let builder = TaprootBuilder::new();
1687        // Create a tree as shown below
1688        // For example, imagine this tree:
1689        // A, B , C are at depth 2 and D,E are at 3
1690        //                                       ....
1691        //                                     /      \
1692        //                                    /\      /\
1693        //                                   /  \    /  \
1694        //                                  A    B  C  / \
1695        //                                            D   E
1696        let a = ScriptBuf::from_hex("51").unwrap();
1697        let b = ScriptBuf::from_hex("52").unwrap();
1698        let c = ScriptBuf::from_hex("53").unwrap();
1699        let d = ScriptBuf::from_hex("54").unwrap();
1700        let e = ScriptBuf::from_hex("55").unwrap();
1701        let builder = builder.add_leaf(2, a.clone()).unwrap();
1702        let builder = builder.add_leaf(2, b.clone()).unwrap();
1703        let builder = builder.add_leaf(2, c.clone()).unwrap();
1704        let builder = builder.add_leaf(3, d.clone()).unwrap();
1705
1706        // Trying to finalize an incomplete tree returns the Err(builder)
1707        let builder = builder.finalize(&secp, internal_key).unwrap_err();
1708        let builder = builder.add_leaf(3, e.clone()).unwrap();
1709
1710        #[cfg(feature = "serde")]
1711        {
1712            let tree = TapTree::try_from(builder.clone()).unwrap();
1713            // test roundtrip serialization with serde_test
1714            #[rustfmt::skip]
1715            assert_tokens(&tree.readable(), &[
1716                Token::Seq { len: Some(10) },
1717                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("51"), Token::U8(192), Token::TupleVariantEnd,
1718                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("52"), Token::U8(192), Token::TupleVariantEnd,
1719                Token::U64(3), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("55"), Token::U8(192), Token::TupleVariantEnd,
1720                Token::U64(3), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("54"), Token::U8(192), Token::TupleVariantEnd,
1721                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("53"), Token::U8(192), Token::TupleVariantEnd,
1722                Token::SeqEnd,
1723            ],);
1724
1725            let node_info = TapTree::try_from(builder.clone()).unwrap().into_node_info();
1726            // test roundtrip serialization with serde_test
1727            #[rustfmt::skip]
1728            assert_tokens(&node_info.readable(), &[
1729                Token::Seq { len: Some(10) },
1730                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("51"), Token::U8(192), Token::TupleVariantEnd,
1731                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("52"), Token::U8(192), Token::TupleVariantEnd,
1732                Token::U64(3), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("55"), Token::U8(192), Token::TupleVariantEnd,
1733                Token::U64(3), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("54"), Token::U8(192), Token::TupleVariantEnd,
1734                Token::U64(2), Token::TupleVariant { name: "TapLeaf", variant: "Script", len: 2}, Token::Str("53"), Token::U8(192), Token::TupleVariantEnd,
1735                Token::SeqEnd,
1736            ],);
1737        }
1738
1739        let tree_info = builder.finalize(&secp, internal_key).unwrap();
1740        let output_key = tree_info.output_key();
1741
1742        for script in [a, b, c, d, e] {
1743            let ver_script = (script, LeafVersion::TapScript);
1744            let ctrl_block = tree_info.control_block(&ver_script).unwrap();
1745            assert!(ctrl_block.verify_taproot_commitment(
1746                &secp,
1747                output_key.to_x_only_public_key(),
1748                &ver_script.0
1749            ))
1750        }
1751    }
1752
1753    #[test]
1754    #[cfg(feature = "serde")]
1755    fn test_leaf_version_serde() {
1756        let leaf_version = LeafVersion::TapScript;
1757        // use serde_test to test serialization and deserialization
1758        assert_tokens(&leaf_version, &[Token::U8(192)]);
1759
1760        let json = serde_json::to_string(&leaf_version).unwrap();
1761        let leaf_version2 = serde_json::from_str(&json).unwrap();
1762        assert_eq!(leaf_version, leaf_version2);
1763    }
1764
1765    #[test]
1766    #[cfg(feature = "serde")]
1767    fn test_merkle_branch_serde() {
1768        let dummy_hash = hex!("03ba2a4dcd914fed29a1c630c7e811271b081a0e2f2f52cf1c197583dfd46c1b");
1769        let hash1 = TapNodeHash::from_slice(&dummy_hash).unwrap();
1770        let dummy_hash = hex!("8d79dedc2fa0b55167b5d28c61dbad9ce1191a433f3a1a6c8ee291631b2c94c9");
1771        let hash2 = TapNodeHash::from_slice(&dummy_hash).unwrap();
1772        let merkle_branch = TaprootMerkleBranch::from([hash1, hash2]);
1773        // use serde_test to test serialization and deserialization
1774        serde_test::assert_tokens(
1775            &merkle_branch.readable(),
1776            &[
1777                Token::Seq { len: Some(2) },
1778                Token::Str("03ba2a4dcd914fed29a1c630c7e811271b081a0e2f2f52cf1c197583dfd46c1b"),
1779                Token::Str("8d79dedc2fa0b55167b5d28c61dbad9ce1191a433f3a1a6c8ee291631b2c94c9"),
1780                Token::SeqEnd,
1781            ],
1782        );
1783    }
1784
1785    #[test]
1786    fn bip_341_tests() {
1787        fn process_script_trees(
1788            v: &serde_json::Value,
1789            mut builder: TaprootBuilder,
1790            leaves: &mut Vec<(ScriptBuf, LeafVersion)>,
1791            depth: u8,
1792        ) -> TaprootBuilder {
1793            if v.is_null() {
1794                // nothing to push
1795            } else if v.is_array() {
1796                for leaf in v.as_array().unwrap() {
1797                    builder = process_script_trees(leaf, builder, leaves, depth + 1);
1798                }
1799            } else {
1800                let script = ScriptBuf::from_hex(v["script"].as_str().unwrap()).unwrap();
1801                let ver =
1802                    LeafVersion::from_consensus(v["leafVersion"].as_u64().unwrap() as u8).unwrap();
1803                leaves.push((script.clone(), ver));
1804                builder = builder.add_leaf_with_ver(depth, script, ver).unwrap();
1805            }
1806            builder
1807        }
1808
1809        let data = bip_341_read_json();
1810        // Check the version of data
1811        assert!(data["version"] == 1);
1812        let secp = &secp256k1::Secp256k1::verification_only();
1813
1814        for arr in data["scriptPubKey"].as_array().unwrap() {
1815            let internal_key =
1816                XOnlyPublicKey::from_str(arr["given"]["internalPubkey"].as_str().unwrap()).unwrap();
1817            // process the tree
1818            let script_tree = &arr["given"]["scriptTree"];
1819            let mut merkle_root = None;
1820            if script_tree.is_null() {
1821                assert!(arr["intermediary"]["merkleRoot"].is_null());
1822            } else {
1823                merkle_root = Some(
1824                    TapNodeHash::from_str(arr["intermediary"]["merkleRoot"].as_str().unwrap())
1825                        .unwrap(),
1826                );
1827                let leaf_hashes = arr["intermediary"]["leafHashes"].as_array().unwrap();
1828                let ctrl_blks = arr["expected"]["scriptPathControlBlocks"].as_array().unwrap();
1829                let mut builder = TaprootBuilder::new();
1830                let mut leaves = vec![];
1831                builder = process_script_trees(script_tree, builder, &mut leaves, 0);
1832                let spend_info = builder.finalize(secp, internal_key).unwrap();
1833                for (i, script_ver) in leaves.iter().enumerate() {
1834                    let expected_leaf_hash = leaf_hashes[i].as_str().unwrap();
1835                    let expected_ctrl_blk = ControlBlock::decode(
1836                        &Vec::<u8>::from_hex(ctrl_blks[i].as_str().unwrap()).unwrap(),
1837                    )
1838                    .unwrap();
1839
1840                    let leaf_hash = TapLeafHash::from_script(&script_ver.0, script_ver.1);
1841                    let ctrl_blk = spend_info.control_block(script_ver).unwrap();
1842                    assert_eq!(leaf_hash.to_string(), expected_leaf_hash);
1843                    assert_eq!(ctrl_blk, expected_ctrl_blk);
1844                }
1845            }
1846            let expected_output_key =
1847                XOnlyPublicKey::from_str(arr["intermediary"]["tweakedPubkey"].as_str().unwrap())
1848                    .unwrap();
1849            let expected_tweak =
1850                TapTweakHash::from_str(arr["intermediary"]["tweak"].as_str().unwrap()).unwrap();
1851            let expected_spk =
1852                ScriptBuf::from_hex(arr["expected"]["scriptPubKey"].as_str().unwrap()).unwrap();
1853            let expected_addr =
1854                Address::from_str(arr["expected"]["bip350Address"].as_str().unwrap())
1855                    .unwrap()
1856                    .assume_checked();
1857
1858            let tweak = TapTweakHash::from_key_and_tweak(internal_key, merkle_root);
1859            let (output_key, _parity) = internal_key.tap_tweak(secp, merkle_root);
1860            let addr = Address::p2tr(secp, internal_key, merkle_root, KnownHrp::Mainnet);
1861            let spk = addr.script_pubkey();
1862
1863            assert_eq!(expected_output_key, output_key.to_x_only_public_key());
1864            assert_eq!(expected_tweak, tweak);
1865            assert_eq!(expected_addr, addr);
1866            assert_eq!(expected_spk, spk);
1867        }
1868    }
1869
1870    fn bip_341_read_json() -> serde_json::Value {
1871        let json_str = include_str!("../../tests/data/bip341_tests.json");
1872        serde_json::from_str(json_str).expect("JSON was not well-formatted")
1873    }
1874}