]> Untitled Git - bdk/commitdiff
Merge bitcoindevkit/bdk#1917: Canonicalization should handle transactions that spend...
authormerge-script <hello@evanlinjin.me>
Wed, 23 Apr 2025 23:21:21 +0000 (09:21 +1000)
committermerge-script <hello@evanlinjin.me>
Wed, 23 Apr 2025 23:21:21 +0000 (09:21 +1000)
370497c3a9c361e10c8341cbb07210f026cc3e04 fix(chain): Correctly handle txs that double spend themselves (志宇)

Pull request description:

  Fixes #1898

  ### Description

  When we initially created the canonicalization algorithm, we didn't expect callers to insert invalid transactions into the graph. However, user error happens and we should handle it correctly.

  Before this PR, when inserting transactions that double-spend themselves (where two or more different inputs of the transactions conflict), the canonicalization result will have inconsistencies.

  ### Notes to the reviewers

  Logic changes are all contained in `CanonicalIter::mark_canonical`. `mark_canonical` will detect whether the `tx` being passed in double spends itself. If so, we abort and undo all changes made so far.

  There is a slight <2% degradation in performance with this change (except in two cases where there is a performance improvement of ~10%).

  [bench.txt](https://github.com/user-attachments/files/19788730/bench.txt)

  ### Changelog notice

  * Fix canonicalization mess-up when transactions that conflict with itself are inserted.

  ### Checklists

  #### All Submissions:

  * [x] I've signed all my commits
  * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md)
  * [x] I ran `cargo fmt` and `cargo clippy` before committing

  #### Bugfixes:

  ~~* [ ] This pull request breaks the existing API~~
  * [x] I've added tests to reproduce the issue which are now passing
  * [x] I'm linking the issue being fixed by this PR

ACKs for top commit:
  ValuedMammal:
    ACK 370497c3a9c361e10c8341cbb07210f026cc3e04
  LagginTimes:
    ACK 370497c3a9c361e10c8341cbb07210f026cc3e04

Tree-SHA512: 41b08208b3ca7119ff10898c22f91b1fd41bb83876e4ca0655ece13b43db8cf3963a529286282c5fcd0e94d6ae073ffb30b19e91d28d8459957d5592bbacd3c9


Trivial merge