Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: encode withdrawal id's on-chain in their respective transaction's OP_RETURN #1512

Merged
merged 133 commits into from
Mar 20, 2025

Conversation

cylewitruk
Copy link
Member

@cylewitruk cylewitruk commented Mar 13, 2025

Description

Implements the encoding of withdrawal request ID's in respective transactions' OP_RETURNs while removing the existing deposit count, signer bitmap and merkle tree fields.

Closes: #1478

Changes

  • Bumps the OP_RETURN_VERSION byte from 0 to 1
  • Removes deposit count, signer bitmap and merkle tree fields from the OP_RETURN output
  • Replaces the current merkle tree (and related) code with compressed encoding of explicit withdrawal id's
  • Adds a withdrawal_id() method to the Weighted trait and implements it for WithdrawalRequest, RequestRef and test helpers.
  • Refactored the BestFitPackager a bit:
    • Introduced the PackagerConfig type to hold the constraint configuration
    • Introduced the Bag type to improve separation of concerns and testability
    • Moved bag-specific logic to Bag and implemented smaller, individually-testable functions
  • Adds a bunch of tests around packaging, both for single- and multi-transaction packages
  • Updates tests which needed updating, namely complete_deposit_validation_fee_too_low and multiple tests in the utxo module which otherwise got multiple transactions due to randomized withdrawal ID's and the OP_RETURN size constraints during packaging
  • Added a bunch of documentation

Testing Information

Checklist:

  • I have performed a self-review of my code
  • My changes generate no new warnings
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

@cylewitruk cylewitruk added the sbtc signer binary The sBTC Bootstrap Signer. label Mar 13, 2025
@cylewitruk cylewitruk requested review from matteojug and djordon March 13, 2025 12:41
@cylewitruk cylewitruk self-assigned this Mar 13, 2025
github-merge-queue bot pushed a commit that referenced this pull request Mar 20, 2025
…in OP_RETURN) (#1525)

## Description

Part of: #1478 and supersedes #1486 (due to the size of the changes and
the fact that most comments are now invalidated).

This introduces a new module `idpack` to the `sbtc` crate which contains
an encapsulated integer sequence compression encoding using a
multi-bitmap segmentation algorithm.

Compared to #1486, this PR is substantially slimmed down and drops
support for the eventual handling of multiple encodings within the same
encoding format, i.e. adding or changing the encodings will require a
new implementation.

# Changes

- Removed `EncodingStrategy` trait and moved the full encode/decode
implementations to `encoder.rs` and `decoder.rs` respectively.
- Removed a bunch of other stuff as well.
- The LEB128 implementation is moved to #1523 and this PR targets that.
- The encode-path is now infallible. 
- The packaging path remains fallible:
- The only errors that can be produced (in practice) are due to input
validation.
  - The same applies to size-estimations from `Segmenter`.
- Reason being that these work on slices instead of requiring new allocs
to sortable types (we expect our input to be sorted, anyway - see [this
comment](#1512 (comment))
for more context).
- Added a bunch of tests.
- The `Segments` type now upholds the invariant that its inner segments
must be sequential without overlaps.

## Checklist:

- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules
@cylewitruk cylewitruk requested review from matteojug and djordon March 20, 2025 14:15
@cylewitruk cylewitruk enabled auto-merge March 20, 2025 14:20
djordon
djordon previously approved these changes Mar 20, 2025
Copy link
Contributor

@djordon djordon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good 🚀 🪨

@cylewitruk cylewitruk added this pull request to the merge queue Mar 20, 2025
Merged via the queue into main with commit 5a7f27f Mar 20, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[Feature]: Record withdrawal identifiers on chain
3 participants