Skip to content

Commit 8c0f168

Browse files
committed
Merge rust-bitcoin/rust-bitcoin#927: Trivial improvements for TapTree type
4cdff06 Add convenience method TapTree:to_builder (Dr Maxim Orlovsky) a12e7c7 Implement From<TapTree> for TaprootBuilder (Dr Maxim Orlovsky) 410412f Rename TapTree::from_builder (Dr Maxim Orlovsky) 2192737 Rename TapTree::into_builder (Dr Maxim Orlovsky) f9d8d0d Make TapTree::node_info public (Dr Maxim Orlovsky) Pull request description: These are trivial fixes from extracted from now closed #922 ACKs for top commit: Kixunil: ACK 4cdff06 sanket1729: ACK 4cdff06 apoelstra: ACK 4cdff06 Tree-SHA512: 6132e8c214edc6f199a5550309daf4ed5035f24f545c793d6396c393bd2f55940dc418af62aed9aff25c0c90b74ee384ace986f7201db4018c6fd52710006126
2 parents a2138aa + dd990f7 commit 8c0f168

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

src/util/psbt/map/output.rs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,36 +125,49 @@ impl PartialEq for TapTree {
125125

126126
impl Eq for TapTree {}
127127

128+
impl From<TapTree> for TaprootBuilder {
129+
#[inline]
130+
fn from(tree: TapTree) -> Self {
131+
tree.into_builder()
132+
}
133+
}
134+
128135
impl TapTree {
129136
/// Gets the inner node info as the builder is finalized.
130-
fn node_info(&self) -> &NodeInfo {
137+
pub fn node_info(&self) -> &NodeInfo {
131138
// The builder algorithm invariant guarantees that is_complete builder
132139
// have only 1 element in branch and that is not None.
133140
// We make sure that we only allow is_complete builders via the from_inner
134141
// constructor
135142
self.0.branch()[0].as_ref().expect("from_inner only parses is_complete builders")
136143
}
137144

138-
/// Converts a [`TaprootBuilder`] into a tree if it is complete binary tree.
145+
/// Constructs [`TapTree`] from a [`TaprootBuilder`] if it is complete binary tree.
139146
///
140147
/// # Returns
141-
/// A [`TapTree`] iff the `inner` builder is complete, otherwise return [`IncompleteTapTree`]
142-
/// error with the content of incomplete builder `inner` instance.
143-
pub fn from_inner(inner: TaprootBuilder) -> Result<Self, IncompleteTapTree> {
144-
if !inner.is_finalized() {
145-
Err(IncompleteTapTree::NotFinalized(inner))
146-
} else if inner.has_hidden_nodes() {
147-
Err(IncompleteTapTree::HiddenParts(inner))
148+
/// A [`TapTree`] iff the `builder` is complete, otherwise return [`IncompleteTapTree`]
149+
/// error with the content of incomplete `builder` instance.
150+
pub fn from_builder(builder: TaprootBuilder) -> Result<Self, IncompleteTapTree> {
151+
if !builder.is_finalized() {
152+
Err(IncompleteTapTree::NotFinalized(builder))
153+
} else if builder.has_hidden_nodes() {
154+
Err(IncompleteTapTree::HiddenParts(builder))
148155
} else {
149-
Ok(TapTree(inner))
156+
Ok(TapTree(builder))
150157
}
151158
}
152159

153160
/// Converts self into builder [`TaprootBuilder`]. The builder is guaranteed to be finalized.
154-
pub fn into_inner(self) -> TaprootBuilder {
161+
pub fn into_builder(self) -> TaprootBuilder {
155162
self.0
156163
}
157164

165+
/// Constructs [`TaprootBuilder`] by internally cloning the `self`. The builder is guaranteed
166+
/// to be finalized.
167+
pub fn to_builder(&self) -> TaprootBuilder {
168+
self.0.clone()
169+
}
170+
158171
/// Returns [`TapTreeIter`] iterator for a taproot script tree, operating in DFS order over
159172
/// tree [`ScriptLeaf`]s.
160173
pub fn script_leaves(&self) -> TapTreeIter {

src/util/psbt/serialize.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,14 +393,14 @@ mod tests {
393393
let mut builder = compose_taproot_builder(0x51, &[2, 2, 2]);
394394
builder = builder.add_leaf_with_ver(3, Script::from_hex("b9").unwrap(), LeafVersion::from_consensus(0xC2).unwrap()).unwrap();
395395
builder = builder.add_hidden_node(3, sha256::Hash::default()).unwrap();
396-
assert!(TapTree::from_inner(builder.clone()).is_err());
396+
assert!(TapTree::from_builder(builder.clone()).is_err());
397397
}
398398

399399
#[test]
400400
fn taptree_roundtrip() {
401401
let mut builder = compose_taproot_builder(0x51, &[2, 2, 2, 3]);
402402
builder = builder.add_leaf_with_ver(3, Script::from_hex("b9").unwrap(), LeafVersion::from_consensus(0xC2).unwrap()).unwrap();
403-
let tree = TapTree::from_inner(builder).unwrap();
403+
let tree = TapTree::from_builder(builder).unwrap();
404404
let tree_prime = TapTree::deserialize(&tree.serialize()).unwrap();
405405
assert_eq!(tree, tree_prime);
406406
}

0 commit comments

Comments
 (0)