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: add leb128 variable length integer implementation to sbtc crate #1523

Merged
merged 16 commits into from
Mar 20, 2025

Conversation

cylewitruk
Copy link
Member

Description

Break-out from withdrawal id encoding. LEB128 encoding is used to efficiently encode integer values.

Changes

  • Adds a new type Leb128 and related tests to the sbtc crate which can be used to encode/decode and calculate the size of LEB-128 encoded values.

Testing Information

  • Adds a bunch of new tests testing the encoding logic.
  • Introduces the proptest crate for ensuring maximum coverage.

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 transaction library Common library for handling transaction manipulation. label Mar 18, 2025
@cylewitruk cylewitruk self-assigned this Mar 18, 2025
matteojug
matteojug previously approved these changes Mar 19, 2025
@MCJOHN974
Copy link
Contributor

FYI, I benchmarked your impl against https://crates.io/crates/leb128 and your impl is ~6% faster in release mode, nice!

@cylewitruk
Copy link
Member Author

FYI, I benchmarked your impl against https://crates.io/crates/leb128 and your impl is ~6% faster in release mode, nice!

Well that's cool, and here I was mostly going for safety and not performance 😅

@cylewitruk cylewitruk added this pull request to the merge queue Mar 20, 2025
Merged via the queue into main with commit b6c69d0 Mar 20, 2025
8 checks passed
@cylewitruk cylewitruk deleted the feat/leb128 branch March 20, 2025 12:53
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
needed-for-withdrawals-v1 transaction library Common library for handling transaction manipulation.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants