#message #lightning #deserialize #bitcoin #serialization

lightning-wire-msgs

比特币闪电网络消息类型

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

Apache-2.0

34KB
971

闪电网络消息

一个库,用于将闪电网络消息序列化和反序列化到Rust结构体中。

使用方法

此库定义了以下特性

WireItem

  • 为所有线类型实现。
  • WireItemWriterWireItemReader提供便利配对

WireItemWriter

  • 需要encode
  • 允许将项写入线。

WireItemReader

  • 需要decode
  • 允许从线中读取项。

TLVWireItem

  • TLVWireItemWriterTLVWireItemReader提供便利配对
  • 为WireItem提供泛型实现

TLVWireItemWriter

  • 需要encode
  • 提供encode_tlv

TLVWireItemReader

  • 需要decode
  • 提供decode_tlv

WireMessage

  • 为任何闪电网络消息类型的结构体实现。
  • WireMessageWriterWireMessageReader提供便利配对。
  • 具有序列化和反序列化方法。
  • 如果decode中的check_type为false,则它期望不带前两个字节的消息类型指示的消息。
  • 如果它是真的,它将读取前两个字节并验证它是否与消息类型匹配,否则它将返回std::io::ErrorKind::InvalidData

WireMessageWriter

  • 需要encode

WireMessageReader

  • 需要decode

AnyWireMessage

  • 可以为实现WireMessage的所有类型的任意子集的枚举推导。
  • 它将使用消息的前两个字节来确定要反序列化的变体。

AnyWireMessageWriter

  • 可以为实现WireMessageWriter的所有类型的任意子集的枚举推导。

AnyWireMessageReader

  • 可以为实现WireMessageReader的所有类型的任意子集的枚举推导。

贡献

大多数闪电消息可以通过以下推导宏轻松实现

WireMessage

  • 可选地,可以仅推导WireMessageWriterWireMessageReader

需求

  • 需要属性:#[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

  • 可选地可以只继承AnyWireMessageWriterAnyWireMessageReader

需求

  • 必须是枚举。
  • 每个变体必须包含一个单字段未命名字段,该字段实现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