5 个版本 (2 个稳定版)
新 1.0.1 | 2024 年 8 月 9 日 |
---|---|
1.0.0 | 2024 年 3 月 21 日 |
0.1.3 | 2024 年 2 月 15 日 |
0.1.1 | 2023 年 3 月 1 日 |
0.1.0 | 2021 年 6 月 14 日 |
#781 在 解析器实现
每月 257 次下载
在 10 个 crate 中使用 (通过 binary_sv2)
195KB
5.5K SLoC
根据 serde 教程 实现 stratum v2 的 Serde 序列化器/反序列化器
SERDE <-> Sv2
bool <-> BOOL
u8 <-> U8
u16 <-> U16
U24 <-> U24
u32 <-> u32
f32 <-> f32 // not in the spec but used
u64 <-> u64 // not in the spec but used
U256 <-> U256
String <-> STRO_255
Signature<-> SIGNATURE
B032 <-> B0_32 // not in the spec but used
B032 <-> STR0_32 // not in the spec but used
B0255 <-> B0_255
B064K <-> B0_64K
B016M <-> B0_16M
[u8] <-> BYTES
Pubkey <-> PUBKEY
Seq0255 <-> SEQ0_255[T]
Seq064K <-> SEQ0_64K[T]
序列化和反序列化器使用切片实现,以减少复制
固定长度原语
当反序列化每个固定长度 Sv2 原语类型时,包含输入缓冲区的视图,因此不需要复制原始字节。
非固定长度原语
非固定长度原语可以分为字符串、字节序列和通用序列。
字符串
字符串由 Serde 自动处理
泛型序列
非字节序列 SEQ0_255[T]
和 SEQ0_64K[T]
实现为一个包含两个可选字段的 struct
- 一个可选的输入缓冲区视图
- 一个可选的 T 切片
当序列从序列化消息构建时,我们只需得到输入缓冲区的视图,无需复制数据。
当序列从 [T] 构建时,序列可以安全地指向它们,无需 transmute。
字节序列
字节序列可以是有限长序列或无限长序列,后者由 Serde 自动处理。有限长字节序列不是作为特定的新泛型序列类型实现的。
- 对于 Rust 类型系统,序列化的字节数组和反序列化的字节数组是同一件事,但这对泛型序列不成立。
- 为了不复制数据,泛型序列需要实现为包含两个字段的结构,一个字节数组切片和一个 T 的切片。
- 这种二分法对于字节序列是不必要的,因此它们被实现为特定的较小结构。
为什么不使用 rkyv?
rkyv 是一个针对 Rust 的零复制反序列化框架。我不了解 rkyv,但似乎可以通过使用 rykv 而不是 serder,以更少的努力和更好的性能来实现这个库的目标。
顺便说一句,Serde 是 Rust 代码的标准,非常安全和稳定。反序列化和序列化部分将包含在需要添加到比特币核心的代码中,因此必须使用最安全和最稳定的选项。这并不排除可以使用 rykv 实现序列化和反序列化后端,然后通过条件编译标志由子协议 crate 使用!
依赖项
~1.2–1.9MB
~39K SLoC