#blockchain #memory #embedded-devices #memory-management #resources #allocation #standard

no-std foundation-ur

Implementation of Blockchain Common's Uniform Resources (UR) standard, with static memory allocation for embedded devices while also allowing to use dynamic memory allocation for platforms with more resources

4 releases (breaking)

new 0.4.0 Nov 20, 2024
0.3.0 Jul 15, 2024
0.2.0 May 15, 2024
0.1.0 Feb 16, 2024

#454 in Magic Beans

Download history 104/week @ 2024-08-04 210/week @ 2024-08-11 309/week @ 2024-08-18 215/week @ 2024-08-25 71/week @ 2024-09-01 133/week @ 2024-09-08 203/week @ 2024-09-15 90/week @ 2024-09-22 129/week @ 2024-09-29 176/week @ 2024-10-06 266/week @ 2024-10-13 92/week @ 2024-10-20 388/week @ 2024-10-27 498/week @ 2024-11-03 281/week @ 2024-11-10 228/week @ 2024-11-17

1,395 downloads per month

MIT license

155KB
3.5K SLoC

ur is a crate to interact with "Uniform Resources (UR)" encodings of binary data.

The encoding scheme is optimized for transport in URIs and QR codes.

The encoder allows a byte payload to be transmitted in multiple stages, respecting maximum size requirements. Under the hood, a fountain encoder is used to create an unbounded stream of URIs, subsets of which can be recombined at the receiving side into the payload.

For example:

const MAX_FRAGMENT_LENGTH: usize = 5;

let data = "Ten chars!".repeat(10);

encoder.start("bytes", data.as_bytes(), MAX_FRAGMENT_LENGTH);
assert_eq!(
    encoder.next_part().to_string(),
    "ur:bytes/1-20/lpadbbcsiecyvdidatkpfeghihjtcxiabdfevlms"
);

while !decoder.is_complete() {
    let sequence = encoder.current_sequence();
    let part = encoder.next_part();
    // Simulate some communication loss
    if sequence & 1 > 0 {
        decoder.receive(part).unwrap();
    }
}
assert_eq!(decoder.message().unwrap().as_deref(), Some(data.as_bytes()));

The following useful building blocks are also part of the public API:

  • The bytewords module contains functionality to encode byte payloads into a suitable alphabet, achieving hexadecimal byte-per-character efficiency.

  • The fountain module provides an implementation of a fountain encoder, which splits up a byte payload into multiple segments and emits an unbounded stream of parts which can be recombined at the receiving decoder side.

Dependencies

~2.5MB
~56K SLoC