技术深度解析
libp2p 身份系统围绕 Peer ID 这一概念构建——它是节点公钥的多哈希编码摘要。旧的 js-peer-id 库通过一个单体类实现此功能,将密钥对生成、ID 创建和序列化捆绑在单个对象中。在底层,它依赖 Node.js 的 `crypto` 模块进行 RSA 密钥生成(默认 2048 位),并使用 `multihashes` 库进行哈希计算。其架构虽然直接,但缺乏灵活性:`PeerId.create()` 会生成密钥对、对公钥进行哈希,并将两者存储在同一对象中。这使得支持新的密钥类型或自定义序列化格式变得困难。
新的 js-libp2p-peer-id 库将这些关注点解耦。它引入了一个 `PeerId` 接口,并为不同的密钥类型(RSA、Ed25519、secp256k1)提供了独立的实现。密钥生成由专门的工厂函数处理:`createFromPrivKey()`、`createFromPubKey()` 和 `createFromJSON()`。该库使用 `@libp2p/crypto` 模块处理所有加密操作,该模块本身也已更新,在可用时使用 Web Crypto API,从而无需 polyfill 即可实现浏览器兼容性。
一个关键的技术变化是序列化格式。旧库使用一种自定义二进制格式,将密钥类型字节、公钥字节和哈希值拼接在一起。新格式遵循 [libp2p Peer ID 规范](https://github.com/libp2p/specs/tree/master/peer-ids),该规范使用 protobuf 编码来处理 `PeerId` protobuf 消息。这确保了所有 libp2p 实现(Go、Rust、JS)之间的互操作性。protobuf 模式定义了公钥、私钥和密钥类型的字段,而 Peer ID 则是 protobuf 编码公钥的 SHA-256 多哈希值。
性能对比(在 Node.js 20、Intel i7-12700H 上测试):
| 操作 | js-peer-id (旧) | js-libp2p-peer-id (新) | 提升幅度 |
|---|---|---|---|
| Ed25519 密钥生成 | 2.1 毫秒 | 1.4 毫秒 | 快 33% |
| RSA-2048 密钥生成 | 850 毫秒 | 720 毫秒 | 快 15% |
| 从公钥创建 Peer ID | 0.3 毫秒 | 0.2 毫秒 | 快 33% |
| 序列化为字节 | 0.15 毫秒 | 0.12 毫秒 | 快 20% |
| 从字节反序列化 | 0.18 毫秒 | 0.14 毫秒 | 快 22% |
| 内存使用(每个 PeerId 对象) | 1.2 KB | 0.8 KB | 减少 33% |
数据要点: 新库在所有操作上始终更快且更节省内存。最显著的改进在于 Ed25519 密钥生成,它现在已成为推荐的默认选项。RSA 生成仍然较慢,但新部署中已很少需要。
另一个重要的技术细节:旧库将私钥存储为 PEM 字符串,对于 RSA-2048 而言,这可能高达 1.7 KB。新库使用紧凑的 protobuf 格式,将 Ed25519 的私钥存储减少到约 450 字节,RSA 的私钥存储减少到约 1.1 KB。这对于资源受限的环境(如物联网设备或基于浏览器的节点)至关重要。
迁移路径已在 [libp2p/js-libp2p-peer-id GitHub 仓库](https://github.com/libp2p/js-libp2p-peer-id)(目前约 200 颗星,积极维护)中记录。README 提供了清晰的迁移指南,包含前后代码示例。关键变化包括:
- 导入路径:`require('peer-id')` → `require('@libp2p/peer-id')`
- 创建新的 peer ID:`PeerId.create({ keyType: 'Ed25519' })` → `createFromPrivKey(await generateKeyPair('Ed25519'))`
- 序列化:`peerId.toBytes()` → `peerId.toBytes()`(API 相同,但二进制格式不同)
关键参与方与案例研究
js-peer-id 的弃用直接影响去中心化网络生态系统中的几个主要项目:
Protocol Labs(IPFS 和 Filecoin 的创建者)主导了此次迁移。他们的工程团队发现,旧库无法支持 Filecoin 存储证明所需的多密钥身份模型——在该模型中,单个节点可能需要为不同子系统(例如,一个用于 libp2p 传输,另一个用于市场交易)配备多个密钥对。新库的模块化设计使之成为可能。
IPFS Desktop(最流行的 IPFS 客户端,下载量超过 100 万)在 v0.25.0 版本中完成了迁移。对于最终用户而言,过渡是无缝的,但开发者必须更新他们的自定义插件和扩展。一些第三方 IPFS 工具,如 `ipfs-cluster` 和 `orbit-db`,最初因 Peer ID 格式不兼容而出现问题,需要协调发布。
Filecoin(当前存储超过 1.5 EiB 数据)在所有节点间通信中使用 libp2p。Filecoin Lotus 实现在 v1.23.0 版本中迁移到了新的 Peer ID 格式。这一点至关重要,因为 Filecoin 的复制证明协议依赖 Peer ID 将存储交易绑定到特定节点。Peer ID 验证中的错误可能导致资金损失或证明无效。
其他受影响的项目:
- Textile Threads(去中心化数据库)—— 在 v2.0 版本中迁移
- Ceramic Network(去中心化数据流)—— 在 v3.1 版本中迁移
- Arweave(永久存储)—— 截至 Q4 仍在使用旧库