多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Moonbit 重实现 Loro 二进制编码:开工前 Context 收集清单的完整落地指南

Moonbit 重实现 Loro 二进制编码:开工前 Context 收集清单的完整落地指南 后端【免费下载链接】loroMake your JSON data collaborative and version-controlled with CRDTs项目地址https://gitcode.com/gh_mirrors/lo/loro点击查看免费下载导读本文围绕moon/specs/01-context-checklist.md展开这是一份用于「用 Moonbit 语言从零实现 Loro 二进制编码格式」项目的开工前 Checklist。它的核心作用是强制开发者在写任何编解码代码之前先把「规格文档、Rust 参考实现、Moonbit 运行时能力、跨语言验收方式」四类 Context 全部收集并记录到moon/SPEC_NOTES.md避免因缺失背景导致反复返工。读完本文你将掌握 Loro 二进制格式的规格来源分布、Rust 真值源码定位方法、Moonbit 运行时能力确认清单以及一套可落地的 e2e 验收框架。本文以 moon/specs/01-context-checklist.md 为骨架并对照仓库中实际存在的规格文档、Rust 源码与 Moon 实现逐项给出可验证的落地指引。一、这份 Checklist 是什么为「Moonbit 重实现」项目开工前兜底在仓库moon/目录下存在一个完整的「用 Moonbit 实现 Loro 二进制编码格式」工程moon/specs/README.md对其目标有索引说明。该项目要复刻docs/encoding.md描述的 Loro 二进制导出/导入格式FastSnapshot 与 FastUpdates从而实现与 Rust 版 Loro 的跨语言互通。正确性的最终定义是Rust 与 Moon 的导出/导入能互相 decode/encode并在 Rust 侧用get_deep_value()验证状态一致。这份01-context-checklist.md正是该工程开工前的第一步它把「实现前必须完成确认的事项」固定为清单并要求把每项结论记录到moon/SPEC_NOTES.md该文件在仓库中已经存在内容与清单一一对应可作为「清单已落地」的直接证据。它不是一个技术实现文档而是一个过程控制文档——但它规定的每一项都指向具体的技术规格、源码文件与验收方法因此具备完整的工程指导价值。清单共分四节下文逐一展开并补充仓库中可验证的实现证据。二、1.1 规格文档先找出「可实现的确定性规则」清单要求阅读并提取「可实现的确定性规则」规格来源分为主规格与补充规格规格文档仓库相对路径覆盖内容docs/encoding.md主规格header / checksum / modeFastSnapshot / FastUpdatesSSTableOpLog KV schemavv/fr/sv/sf change blocksChangeBlock 整体结构postcard 列编码自定义 Value Encodingtag payloadserde_columnar 外层格式与策略BoolRle/Rle/DeltaRle/DeltaOfDeltadocs/encoding-xxhash32.md补充xxHash32 实现与 test vectorsdocs/encoding-lz4.md补充LZ4 Frame及 block 级解码docs/encoding-container-states.md补充Map/List/Text/Tree/MovableList/Counter 的 state snapshotdocs/encoding.md在仓库中是完整的规范性 wire-format 参考共 1200 行明确指出普通快照EncodeMode::FastSnapshot 3、浅快照同样为 mode 3、更新EncodeMode::FastUpdates 4是当前 Loro 写入的三种二进制形态StateOnly与SnapshotAt复用快照格式但不算独立 wire format解码器必须「按字节而非按 API 名称」判断。清单同时要求产出物moon/SPEC_NOTES.md至少包含五类结论。仓库中该文件已经写入了对应内容例如端序规则文档 mode 为 u16 big-endian位于 header bytes[20..22]文档 checksum 为 u32 little-endianbytes[16..20]且覆盖范围是 bytes[20..]包含 mode body不只 bodyChangeBlock key 为 12 字节peer(u64 BE) counter(i32 BE)自定义 ValueEncoding 中 F64 为 big-endian IEEE754I64/DeltaInt 用 SLEB128补码符号扩展不是 zigzagpostcard 则用 unsigned varint zigzag。LEB128 与 postcard varint 的差异-1在 sleb 下编码为7f而在 postcard zigzag 下是01docs/encoding.md第 1 节对此有明确告诫Do not interchangesleband postcard signed integers。ContainerType 两套映射表二进制 ContainerID/ContainerWrapper kind byte 映射为Map0, List1, Text2, Tree3, MovableList4, Counter5而 postcardOptionContainerID仅用于 wrapper.parent使用历史映射Text0, Map1, List2, MovableList3, Tree4, Counter5。Rust 参考见 crates/loro-internal/src/state/container_store/container_wrapper.rs。Richtext 的 Unicode 规则文本位置按 Unicode scalar count不是 UTF-16 code unitMoon 实现用count_utf8_codepoints(...)在字符串长度与线上表示之间转换。宽容解析点自定义 ValueEncoding 对未知 tag 保留为 opaque bytesValue::Future(tag, data)实现 value 层的保守往返而 JsonSchema import 仍会拒绝UnknownOp非 Counter 容器与 root 容器值。三、1.2 Rust 源码「真值」定位每块格式都要有参考实现清单要求为每一块格式找到 Rust 参考实现并记录位置以便对照排查。仓库实际结构验证了这些路径全部存在格式/模块Rust 真值源码仓库相对路径顶层 header/bodycrates/loro-internal/src/encoding.rsFastSnapshot / FastUpdatescrates/loro-internal/src/encoding/fast_snapshot.rsSSTablecrates/kv-store/src/sstable.rs、crates/kv-store/src/block.rsChangeBlockcrates/loro-internal/src/oplog/change_store/block_encode.rs、crates/loro-internal/src/oplog/change_store/block_meta_encode.rs自定义 Valuecrates/loro-internal/src/encoding/value.rsID / ContainerIDcrates/loro-common/src/lib.rsContainerWrappercrates/loro-internal/src/state/container_store/container_wrapper.rs各容器 statemap_state.rs、list_state.rs、richtext_state.rs、tree_state.rs、movable_list_state.rs、counter_state.rs产出物要求在moon/SPEC_NOTES.md里按模块建立「规格段落 ↔ Rust 源码位置」映射索引。仓库中的 moon/SPEC_NOTES.md 尾部确实维护了这样的指针表含crates/loro-internal/src/oplog/change_store/block_encode.rs等作为调试用 truth pointer。值得注意的一点是docs/encoding.md对每个规范性小节都同时链接 writer 与 reader并固定到具体行号与符号名。例如文档 envelope 的 writer 是 encoding.rs::encode_withreader 是 encoding.rs::parse_header_and_bodyFastSnapshot 三段式 body 的 writer 是 fast_snapshot.rs::_encode_snapshot。这种「文档行号 符号名」双重定位方式正是清单「方便对照/排查」的落地方案。四、1.3 Moonbit 语言/运行时能力确认五个关键能力点编码格式实现依赖 Moonbit 的特定运行时能力清单要求开工前确认是否支持或需手写替代整数是否有Int64/UInt64位运算与移位行为逻辑/算术移位、溢出是否截断更大整数serde_columnar 的DeltaRle规范使用 i128 delta至少需精确表示 i128若无 i128是否有 BigInt或可用「有符号 128 位结构体hi/lo」实现字节与切片Bytes/Array[Byte]的拷贝成本与切片语义零拷贝/拷贝如何实现安全 reader越界报错而非 panic浮点能否按字节读写 IEEE754 f64LE/BEUnicode字符串是否支持按 Unicode scalar 遍历如何按 Unicode scalar count 截取子串Richtext span.len 需要该节的产出物要求是moon/specs/02-module-plan.md中 i128 与 Unicode 的实现选型必须基于此处结论。从仓库中moon/loro_codec/的实际实现可以看到这些结论的落地moon/loro_codec/leb128.mbt 实现了 ULEB128(u64) 与 SLEB128(i64)并配套 leb128_test.mbtpostcard_varint.mbt 实现了 postcard 的 unsigned varint zigzag。i128 的选型答案是 BigIntmoon/SPEC_NOTES.md 明确记录「Moon implementation usesBigIntas the internal accumulator for i128-like behavior」对应文件为 moon/loro_codec/serde_columnar_delta_rle.mbt。这正是清单「结论必须落到 02 模块计划」的直接证据。Unicode 的选型答案是count_utf8_codepoints(...)见 moon/SPEC_NOTES.md。安全 reader 方面moon/loro_codec/bytes.mbt 提供带越界检查的字节读写配套 bytes_test.mbt错误类型集中在 errors.mbtDecodeError/ChecksumMismatch/Unsupported/Overflow/InvalidInput 等见 moon/specs/02-module-plan.md 2.1 节。五、1.4 对照数据与验收方式避免「实现了但不知道对不对」清单要求开工前确定三个问题Rust 侧怎么生成测试向量blob 真值 JSON 元信息Moon 侧怎么运行单测与 e2e至少提供 CLI 入口供 Rust harness 调用e2e 的判定方式以 Rustimport()后get_deep_value()的 JSON 对比为准。产出物为moon/specs/03-e2e-test-plan.md详细定义向量格式与 CLI 合约。仓库中该文件不仅存在而且已经超越「计划」进入了落地状态其 3.8 节「当前落地repo 现状」给出了可直接复现的运行方式MOON_BIN~/.moon/bin/moon NODE_BINnode cargo test -p loro --test moon_transcode这条命令的含义是设置 Moonbit 编译器与 Node 的路径后运行 Rust integration test harnesscrates/loro/tests/moon_transcode.rs共 1900 行。harness 在缺 Moon/Node 时会自动跳过见文件开头的bin_available检查逻辑具备环境时会用moon build --target js --release cmd/loro_codec_cli构建 moon/cmd/loro_codec_cli 的 JS 产物再逐个transcode测试向量并由 Rustimport()校验。已落地的测试向量生成器与 CLI 命令包括Rust 生成器crates/loro/examples/moon_golden_gen.rsMoon CLImoon/cmd/loro_codec_cli/main.mbt 提供的命令集合为transcode in.blob out.blobdecode→encodee2e 主入口decode-updates in.blob输出 Change/Op 结构化 JSON调试/对照用export-jsonschema in.blob从二进制 FastUpdates 导出 JsonUpdatesencode-jsonschema in.json out.blob从 JsonSchema JSON 编码为 FastUpdates 二进制export-deep-json snapshot.blob从 FastSnapshot 导出 deep JSON最终状态。终极黄金测试moon_golden_updates_jsonschema_matches_rust与moon_golden_snapshot_deep_json_matches_rust分别要求「二进制 updates → JsonUpdates」与「二进制 snapshot → deep JSON」与 Rust 真值反序列化后完全相等先 parse 再比较而非比字符串。覆盖矩阵03 文档 3.6 节要求至少覆盖header 的 magic/checksum/mode 错误分支SSTable 的多 block、LZ4 压缩 block、LargeValueBlockChangeBlock 的多 peer、dep flags/counters、lamport/timestamps 的 DeltaOfDeltaValue 的所有 tag0..16与 unknown tag0x80的保守重编码容器 state 的 Map/List/Text/Tree/MovableList 全覆盖Text 含 emoji验证 Unicode scalar。六、从 Checklist 到可运行工程仓库给出的闭环证据01-context-checklist.md并不是孤立文档。它在moon/specs/规格族中起着「开工前入口」的作用后续文档形成了完整闭环00-goals-and-acceptance.md目标与验收——Rust→Moon 任意 blob 可 decode、Moon→Rust 产物可 import最终以双向 e2e 验收明确支持 mode 3/4、对 mode 1/2 报错。02-module-plan.md按模块逐步实现计划errors/bytes_reader → leb128/postcard → xxhash32/lz4_frame → sstable → document → id/container_id → serde_columnar → value_custom → change_block → state → CLI每个模块都有目标、依赖、实现要点、测试与退出条件。03-e2e-test-plan.md向量格式规范case.blobcase.json真值 case.meta.json元信息与 CLI 合约。04/05/06/07Change/Op 数据结构IR设计、FastUpdates/ChangeBlock 编码细节、JsonSchema 导出与编码实现。而moon/loro_codec/目录下 60 个 .mbt 文件xxhash32.mbt、lz4_frame.mbt、sstable.mbt、serde_columnar.mbt、value_custom.mbt、change_block.mbt、state_snapshot.mbt 等证明清单所列模块在仓库中均已具备实现雏形与 moon/SPEC_NOTES.md 的结论一一对应。七、给读者的落地建议如果你要基于这份 Checklist 在 Moonbit 侧从零实现或继续完善 Loro 编解码推荐的执行顺序是通读主规格docs/encoding.md同时打开三份补充规格xxhash32 / lz4 / container-states把端序、varint 体系、两套 ContainerType 映射、Unicode 规则先记入moon/SPEC_NOTES.md逐块对照 Rust 真值按第三节的映射表给每个格式模块打上源码指针确认 Moonbit 能力边界Int64/i128/BigInt、字节切片语义、安全 reader、f64 字节序、Unicode scalar 截取并把选型结论写入moon/specs/02-module-plan.md尽早建立跨语言对照用 crates/loro/examples/moon_golden_gen.rs 生成向量用 moon/cmd/loro_codec_cli 的transcode/export-jsonschema/export-deep-json命令参与对照最后以cargo test -p loro --test moon_transcode作为验收入口。这套方法的核心价值在于把「Rust 是真值、Moon 是复刻、e2e 是裁判」的原则在开工前就固定下来避免实现中途因为规格细节尤其是端序与 varint 混用这类易错点反复返工。赞分享后端【免费下载链接】loroMake your JSON data collaborative and version-controlled with CRDTs项目地址https://gitcode.com/gh_mirrors/lo/loro点击查看免费下载相关推荐用 Moonbit 复刻 Loro 二进制编码格式规格、实现计划与 e2e 验收全指南用 Moonbit 复刻 Loro 二进制编码格式规格、实现计划与 e2e 验收全指南 导读 Loro 的导出/导入使用一套二进制编码格式FastSnaps后端Loro JsonSchema 导出指南从 FastUpdates 二进制到可读 JSON 的 MoonBit 实现Loro JsonSchema 导出指南从 FastUpdates 二进制到可读 JSON 的 MoonBit 实现 导读 本文围绕 Loro 仓库中 moo后端用 Moonbit 实现 Loro 二进制编码格式按模块的逐步实现计划与测试退出条件用 Moonbit 实现 Loro 二进制编码格式按模块的逐步实现计划与测试退出条件 本篇技术指南以仓库 moon/specs/02 module plan.后端上一篇ctf-wiki 流量包分析指南CTF Misc 中的 PCAP 取證分析方法論與實戰下一篇wren-core-py 深入指南用 PyO3 打通 WrenAI 的 Rust 语义引擎与 Python 生态创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表