4 releases
Uses new Rust 2024
| 0.2.2 | Apr 30, 2025 |
|---|---|
| 0.2.1 | Apr 25, 2025 |
| 0.2.0 | Apr 25, 2025 |
| 0.1.0 | Apr 25, 2025 |
#2 in #calldata
Used in brc20-prog
17KB
478 lines
nada
Compression-focused encoding for zero-heavy Solidity calldata and bytecode.
nada provides an efficient way to encode and decode byte arrays where runs of 0x00 are replaced with a compact marker (0xFF) followed by the length of the run. This is particularly useful for reducing the size of calldata and bytecode in environments like Ethereum.
How it Works
0xFF 0x00is a reserved sequence0xFF 0x01encodes a single0xFF0xFF 0x02encodes a double0xFF0xFF N(3 ≤ N ≤ 255) encodesNzero bytes- All other bytes are passed through unchanged
This encoding helps reduce the size of sequences with a high proportion of zero bytes, which are common in Solidity calldata and bytecode.
Example
| Input | Encoded |
|---|---|
[0x00, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF] |
[0x00, 0x00, 0x02, 0xFF, 0x02, 0xFF, 0x04, 0xFF, 0x01] |
Installation
To add nada to your project, use
> cargo add nada
Usage
Here is a simple example of how to use the encode and decode functions:
let data = vec![0x01, 0x00, 0x00, 0xFF];
let encoded = nada::encode(data);
let decoded = nada::decode(encoded);
assert_eq!(decoded, Ok(data));
decode returns a DecodeError if the input ends unexpectedly, such as when a 0xFF marker is found without a following run length byte, indicating incomplete or malformed encoded data. It also returns an error if the reserved sequence 0xFF00 is encountered.
License
Apache License, Version 2.0