bip-0360: added python reference example; test vector fixes#2202
bip-0360: added python reference example; test vector fixes#2202notmike-5 wants to merge 16 commits into
Conversation
…d to match tree structure of test vectors (bitcoin#45)
…ng construction of P2MR output (bitcoin#46)
This commit adds a python reference example for construction of BIP-360 outputs and control blocks. This commit also updates the test vectors.
murchandamus
left a comment
There was a problem hiding this comment.
Looks reasonable at first glance.
cc: @cryptoquick, @EthanHeilman, @Isabelfoxenduke for owner review/sign-off.
This refactors `compute_control_block` to improve performance, and make the function simpler to read (to me at least). The previous version walked the entire script tree searching for the first matching instance of the leaf node. The new version expects the caller to pass in an explicit `path` parameter, which tells us exactly where the leaf node lives, with left/right steps encoded as bits in an integer. We walk down the tree straight to that leaf node, and build the control block as we go. This might not be the best DX for a real-world API or library, but this is just reference code, so we can accept poor usage ergonomics if it makes the code clearer and more explicit.
| # Bech32 encoding code is taken from sipa (BIP-0350), and has been tested against the test vectors therein: | ||
| # https://github.com/sipa/bech32/blob/master/ref/python/tests.py |
There was a problem hiding this comment.
Most of this code already exists in the BIPs repository, under the reference code of BIP352 (silent payments).
https://github.com/bitcoin/bips/blob/master/bip-0352/bech32m.py
@murchandamus What are your thoughts on the bech32m code duplication here? is it better to duplicate for the sake of compartmentalization, or should we update the existing code and reference it here?
bip360: simplify computing control blocks using explicit traversal paths
Implements @conduitions improvement on tapbranch_hash() Co-authored-by: conduition <conduition@proton.me>
| test_vectors | ||
| }); | ||
|
|
||
| static P2TR_USING_V2_WITNESS_VERSION_ERROR: &str = "p2tr_using_v2_witness_version_error"; |
There was a problem hiding this comment.
I think this should be renamed to "p2tr_using_v2_witness_version_error" to follow the test vector renaming.
Currently cargo test fails with:
called `Option::unwrap()` on a `None` value
After renaming it passed.
There was a problem hiding this comment.
The test is checking p2mr misuse and specifically presence of an internal pubkey. That said, I don't have strong feelings one way or the other. We might need to update this file to also reflect the new test vector @jbride.
Standardizes all P2MR-specific functions to use bytes uniformly for input/output. Hex conversions are now confined to two boundaries: reading `script` field out of ScriptTree input, and comparing against hex-encoded test vector data in `run_single_test`. bech32 functions and s2w are left unchanged.
This PR adds a python reference example for construction of BIP-360 outputs and control blocks.
It updates the test vectors to remove "internalPubkey" key from vectors 7 and 8, and adds a new test for duplicate script leaves.
This PR also brings in fixes to #2102 and #2103 from @jbride