概述
本提案旨在为 I2P 的 BEP9 实现增加完整的信息恢复功能。
动机
BEP9 不发送整个种子文件,因此丢失了一些重要的字典项目,并改变了种子文件的总 SHA1。这对 maggot 链接不利,因为重要信息丢失了。跟踪器列表、评论以及任何附加数据都会消失。因此,找到一种恢复这些信息的方法非常重要,并且需要尽可能少地添加到种子文件中。此外,它也不能有循环依赖。恢复信息不应以任何方式影响当前客户端。无跟踪器的种子文件(跟踪器 URL 实际上是 ’trackerless’)不包含额外字段,因为它们特定于使用 maggot 协议进行发现和下载,在这种情况下信息不会丢失。
解决方案
所需做的只是压缩将要丢失的信息,并将其存储在 info 字典中。
实施
- 生成正常的 info 字典。
- 生成主字典,并排除 info 项。
- 使用 gzip 对主字典进行 bencode 和压缩。
- 将压缩的主字典添加到 info 字典中。
- 将 info 添加到主字典中。
- 写入种子文件。
恢复
- 解压 info 字典中的恢复项。
- 对恢复项进行 bencode 解码。
- 将 info 添加到恢复的字典中。
- 对于支持 maggot 的客户端,现在可以验证 SHA1 是否正确。
- 写出恢复的种子文件。
讨论
使用上述方法,种子文件大小的增加非常小,通常为 200 到 500 字节。Robert 将支持新的 info 字典项的创建,并且这个功能不能被关闭。结构如下:
主字典 {
跟踪器字符串、评论等……
info : {
经过 gzip 压缩的主 bencode 字典,不包含 info 字典和所有其他常规信息
}
}