4个版本
0.2.1 | 2019年9月6日 |
---|---|
0.1.2 | 2019年8月22日 |
0.1.1 | 2019年8月22日 |
0.1.0 | 2019年8月22日 |
#116 in #lightning
34KB
971 行
闪电网络消息
一个库,用于将闪电网络消息序列化和反序列化到Rust结构体中。
使用方法
此库定义了以下特性
WireItem
- 为所有线类型实现。
- 为
WireItemWriter
和WireItemReader
提供便利配对
WireItemWriter
- 需要
encode
。 - 允许将项写入线。
WireItemReader
- 需要
decode
- 允许从线中读取项。
TLVWireItem
- 为
TLVWireItemWriter
和TLVWireItemReader
提供便利配对 - 为WireItem提供泛型实现
TLVWireItemWriter
- 需要
encode
。 - 提供
encode_tlv
。
TLVWireItemReader
- 需要
decode
。 - 提供
decode_tlv
。
WireMessage
- 为任何闪电网络消息类型的结构体实现。
- 为
WireMessageWriter
和WireMessageReader
提供便利配对。 - 具有序列化和反序列化方法。
- 如果
decode
中的check_type
为false,则它期望不带前两个字节的消息类型指示的消息。 - 如果它是真的,它将读取前两个字节并验证它是否与消息类型匹配,否则它将返回
std::io::ErrorKind::InvalidData
。
WireMessageWriter
- 需要
encode
。
WireMessageReader
- 需要
decode
。
AnyWireMessage
- 可以为实现
WireMessage
的所有类型的任意子集的枚举推导。 - 它将使用消息的前两个字节来确定要反序列化的变体。
AnyWireMessageWriter
- 可以为实现
WireMessageWriter
的所有类型的任意子集的枚举推导。
AnyWireMessageReader
- 可以为实现
WireMessageReader
的所有类型的任意子集的枚举推导。
贡献
大多数闪电消息可以通过以下推导宏轻松实现
WireMessage
- 可选地,可以仅推导
WireMessageWriter
或WireMessageReader
。
需求
- 需要属性:
#[msg_type = 123]
,它定义了一个用于唯一标识消息类型的2字节数字。 - 每个非TLV字段的类型必须实现
WireItemWriter + WireItemReader
。- 对于
WireMessageWriter
,只需要WireItemWriter
。 - 对于
WireMessageReader
,只需要WireItemReader
。
- 对于
- 字段可以标记为
#[tlv_type = 123]
属性。 - TLV字段编号必须单调递增。
- TLV字段必须位于非TLV字段之后。
- TLV字段必须是
Option<T> where T: TLVWireItemWriter + TLVWireItemReader
。- 对于
WireMessageWriter
,只需要TLVWireItemWriter
。 - 对于
WireMessageReader
,只需要TLVWireItemReader
。
- 对于
AnyWireMessage
- 可选地可以只继承
AnyWireMessageWriter
或AnyWireMessageReader
需求
- 必须是枚举。
- 每个变体必须包含一个单字段未命名字段,该字段实现
WireMessageWriter + WireMessageReader
。- 对于
AnyWireMessageWriter
,只需要WireMessageWriter
。 - 对于
AnyWireMessageReader
,只需要WireMessageReader
。
- 对于
基准测试
对watchtower::Init
消息进行了1,000,000次序列化和反序列化测试,结果如下:
- lightning-wire-msgs:
387.640625ms
- lnd:
1.349666231s
lnd基准测试的代码可以在bench/bench.go
找到。
crate基准测试的代码可以在src/lib.rs
的末尾找到。
我敦促其他人验证这些基准测试,但我对此相当有信心,我的crate将序列化 + 反序列化时间减少了大约70%。
依赖关系
~1.5MB
~35K SLoC