Crates.io | serde_bolt |
lib.rs | serde_bolt |
version | 0.4.1 |
source | src |
created_at | 2021-09-21 14:00:47.510731 |
updated_at | 2024-08-12 11:42:54.050623 |
description | Bitcoin Lightning BOLT-style message serializer / deserializer |
homepage | |
repository | https://gitlab.com/lightning-signer/serde-bolt |
max_upload_size | |
id | 454416 |
size | 49,308 |
An incomplete implementation of the Lightning BOLT message serialization format. Compatible with rust-bitcoin Encodable
and Decodable
traits.
Unlike rust-bitcoin, the default is big-endian encoding and u16/u32 for length fields for the following types:
Option
is implemented as a single byte, with None
as 0x00
and Some
as 0x01
followed by the value.
Domain-specific types are not implemented. You can just use Array<u8>
or [u8; nnn]
or a wrapped version thereof.
Structs and tuples are considered transparent - they are not delimited in the stream.
use hex::{encode, decode};
extern crate alloc;
use serde_bolt::{to_vec, from_vec, bitcoin::consensus::{Encodable, Decodable}, Array};
use bitcoin_consensus_derive::{Encodable, Decodable};
#[derive(Encodable, Decodable, PartialEq, Debug)]
struct Thing([u8; 3]);
#[derive(Encodable, Decodable, Debug)]
struct Test {
x: bool,
a: u32,
b: u8,
c: Option<u16>,
d: Option<u16>,
e: Array<u8>,
/// Sub-structs are transparent
f: Thing
}
#[test]
fn test_simple() {
let test = Test {
x: true,
a: 65538, b:160, c: None, d: Some(3),
e: vec![0x33, 0x44].into(),
f: Thing([0x55, 0x66, 0x77])
};
let result = to_vec(&test).unwrap();
assert_eq!("0100010002a00001000300023344556677", encode(&result));
let decoded: Test = from_vec(&mut result.clone()).unwrap();
assert_eq!(test.a, decoded.a);
assert_eq!(test.f, decoded.f);
}