rust-bitcoin-unsafe-fast/bitcoin
Martin Habovstiak e810ecff7c Fix key/script spend detection in `Witness`
The `taproot_control_block` did not properly detect whether it deals
with script spend or key spend. As a result, if key spend with annex was
used it'd return the first element (the signature) as if it was a
control block.

Further, the conditions identifying which kind of spend it was were
repeated multiple times but behaved subtly differently making only
`taproot_control_block` buggy but the other places confusing.

To resolve these issues this change adds a `P2TrSpend` enum that
represents a parsed witness and has a single method doing all the
parsing. The other methods can then be trivially implemented by matching
on that type. This way only one place needs to be verified and the
parsing code is more readable since it uses one big `match` to handle
all possibilities.

The downside of this is a potential perf impact if the parsing code
doesn't get inlined since the common parsing code has to shuffle around
data that the caller is not intersted in. I don't think this will be a
problem but if it will I suppose it will be solvable (e.g. by using
`#[inline(always)]`).

The enum also looks somewhat nice and perhaps downstream consumers could
make use of it. This change does not expose it yet but is written such
that after exposing it the API would be (mostly) idiomatic.

Closes #4097
2025-02-24 18:33:13 +01:00
..
contrib Remove rust-ordered dependency 2025-02-18 13:36:07 +11:00
embedded Move opcodes to primitives 2024-07-09 15:26:33 +10:00
examples Introduce monadic AmountOpResult 2025-02-10 10:06:59 +11:00
src Fix key/script spend detection in `Witness` 2025-02-24 18:33:13 +01:00
tests Use MAX_MONEY in serde regression test 2025-01-24 12:15:13 +11:00
CHANGELOG.md Add unreleased changelog entry 2025-01-25 06:52:26 +11:00
Cargo.toml Remove rust-ordered dependency 2025-02-18 13:36:07 +11:00