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