Bitmessage/PyBitmessage 协议规范深度解析
Bitmessage 是一个去中心化的加密通信协议,它采用P2P网络架构实现用户间的安全消息传递。本文将从技术角度深入解析Bitmessage的核心协议规范,帮助开发者理解其底层工作原理。
协议基础规范
哈希算法使用
Bitmessage主要采用两种哈希算法:
- SHA-512:作为主要的哈希算法,广泛用于各种场景
- RIPEMD-160:专门用于地址生成
特别值得注意的是,工作量证明(PoW)采用了双重SHA-512哈希机制。例如字符串"hello"的双重哈希过程如下:
第一轮SHA-512: 9b71d224...bcdec043
第二轮SHA-512: 0592a105...e2b200
而地址生成则采用SHA-512+RIPEMD-160的组合:
SHA-512结果: 9b71d224...bcdec043
RIPEMD-160结果: 79a324fa...2487e
消息基本结构
所有网络消息都遵循以下标准格式:
| 字段大小 | 字段名 | 数据类型 | 说明 |
|---|---|---|---|
| 4字节 | magic | uint32 | 网络标识魔数 |
| 12字节 | command | char[12] | ASCII命令字符串 |
| 4字节 | length | uint32 | 负载数据长度 |
| 4字节 | checksum | uint32 | 负载数据的SHA-512前4字节 |
| 变长 | payload | uchar[] | 实际负载数据 |
当前已知的魔数值为0xE9BEB4D9(网络字节序为E9 BE B4 D9)。
核心数据结构
变长整数编码(VarInt)
Bitmessage采用智能的变长整数编码方案以节省空间:
| 值范围 | 存储长度 | 编码格式 |
|---|---|---|
| < 0xfd | 1字节 | 直接存储 |
| ≤ 0xffff | 3字节 | 0xfd前缀+2字节值 |
| ≤ 0xffffffff | 5字节 | 0xfe前缀+4字节值 |
| 更大值 | 9字节 | 0xff前缀+8字节值 |
网络地址结构
网络地址采用以下格式:
| 字段大小 | 字段名 | 数据类型 | 说明 |
|---|---|---|---|
| 8字节 | time | uint64 | 时间戳 |
| 4字节 | stream | uint32 | 流编号 |
| 8字节 | services | uint64 | 服务标志位 |
| 16字节 | IPv6/4 | char[16] | IP地址(IPv4映射为IPv6格式) |
| 2字节 | port | uint16 | 端口号 |
加密与消息结构
加密方案
Bitmessage采用ECIES(集成加密方案)进行消息加密,这是一种结合了非对称加密和对称加密的混合加密方案。
未加密消息结构
未加密消息包含以下关键字段:
- 地址版本号
- 流编号
- 行为位域(32位标志)
- 签名公钥(64字节)
- 加密公钥(64字节)
- 工作量证明参数(nonce_iterations_per_byte和extra_bytes)
- 接收方RIPE哈希(20字节)
- 消息编码类型
- 实际消息内容
- 确认数据
- ECDSA签名
消息编码类型
Bitmessage支持多种消息编码格式:
| 值 | 名称 | 描述 |
|---|---|---|
| 0 | IGNORE | 可忽略的数据 |
| 1 | TRIVIAL | 简单UTF-8编码 |
| 2 | SIMPLE | 带主题和正文的UTF-8格式 |
| 3 | EXTENDED | 扩展编码格式 |
网络消息类型
version消息
建立连接时首先交换version消息,包含:
- 协议版本(当前为3)
- 服务标志位
- 时间戳
- 收发双方网络地址
- 随机nonce值
- 用户代理字符串
- 感兴趣的流编号列表
服务标志位定义:
| 值 | 名称 | 描述 |
|---|---|---|
| 1 | NODE_NETWORK | 普通网络节点 |
| 2 | NODE_SSL | 支持SSL/TLS |
| 3 | NODE_POW | 支持工作量证明代理 |
| 4 | NODE_DANDELION | 支持蒲公英路由协议 |
verack消息
version消息的确认响应,仅包含消息头。交换verack后,TCP超时从20秒延长至10分钟。
addr消息
用于广播已知节点信息,包含:
- 节点数量(varint)
- 节点地址列表(每个38字节)
inv消息
用于广告已知对象,包含:
- 对象数量(varint)
- 对象哈希列表(每个32字节)
getdata消息
用于请求特定对象内容,格式与inv类似但用于请求而非广告。
高级特性
行为位域
pubkey消息中的32位行为标志位包含多项高级功能:
| 位 | 名称 | 描述 |
|---|---|---|
| 27 | onion_router | 支持洋葱路由 |
| 28 | forward_secrecy | 支持前向保密 |
| 29 | chat | 聊天专用地址 |
| 30 | include_destination | 要求包含目标RIPE哈希 |
| 31 | does_ack | 发送确认消息 |
Bitmessage协议设计体现了对安全性和隐私性的高度重视,其独特的加密方案和网络架构为去中心化通信提供了可靠基础。理解这些协议细节对于开发兼容客户端或进行协议扩展至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



