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解析器实现

Download history 8/week @ 2024-04-21 2/week @ 2024-04-28 2/week @ 2024-05-12 30/week @ 2024-05-19 40/week @ 2024-05-26 40/week @ 2024-06-02 24/week @ 2024-06-09 45/week @ 2024-06-16 33/week @ 2024-06-23 15/week @ 2024-06-30 26/week @ 2024-07-07 55/week @ 2024-07-14 27/week @ 2024-07-21 27/week @ 2024-07-28 142/week @ 2024-08-04

每月 257 次下载
10 个 crate 中使用 (通过 binary_sv2)

MIT 许可证

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