2个版本

0.1.1-beta2022年7月23日
0.1.0-beta2022年7月23日

#2 in #mainline

MIT 许可证

110KB
2K SLoC

midwest_mainline

midwest_mainline是一个使用Rust编写的所有异步网络调用BitTorrent分布式哈希表。

为什么叫这个名字?

由于曾经存在其他不支持BT协议的客户端上运行的非标准DHT,BitTorrent DHT有时被称为“主线”DHT。由于将其称为“rust主线”太过无聊,而“rust”一词会让人联想到中西部的州,因此得名“midwest mainline”。

什么是DHT?

DHT存在是为了解决将大型哈希表分散到多台机器并提高冗余性的问题。在BitTorrent的情况下,它用于共享有关特定种子文件的其它 peers 的信息。

DHT的核心思想是,通过使用相同的键空间来标识我们自己和哈希表中的键,我们只将我们附近的元素包含在哈希表中。通过维护一些关于与我们id相近的其他节点的联系,其他节点可以向我们询问我们的邻居,并逐渐找到他们想要的确切键对应的节点。

路线图

  • 路由
  • 引导
  • 查找节点
  • 获取 peers
  • ping
  • 安全扩展 BEP-42
  • 公告
  • 响应ping
  • 响应获取 peers
  • 响应公告
  • 响应查找节点
  • 哈希表过期
  • 路由表ping和修剪
  • 上传到crate.io

开发状态

截至目前,代码库每天都在经历大规模的变化,并且添加了很少的注释。

警告

我在安全方面没有接受过正规培训,任何监听传入流量的东西都应被视为问题,并需要关注。特别是当协议实际上是明文发送时。

不稳定的tokio功能

此库使用不稳定的tokio功能进行跟踪,请参阅tokio的文档了解有关使用不稳定功能的更多信息。

TL;DR

该库仍在测试版,我知道接口相当笨拙

use std::io;
use midwest_mainline::dht_service;
use midwest_mainline::dht_service::DhtV4;
use std::net::SocketAddrV4;
use std::str::FromStr;

#[tokio::main]
async fn main() -> io::Result<()> {
    let external_ip = public_ip::addr_v4().await.unwrap();
    let dht = DhtV4::bootstrap_with_random_id(
                    SocketAddrV4::from_str("0.0.0.0:51413").unwrap(),
                    external_ip,
                    vec![
                    // dht.tansmissionbt.com
                    "87.98.162.88:6881".parse().unwrap(),
                    // router.utorrent.com
                    "67.215.246.10:6881".parse().unwrap(),
                    // router.bittorrent.com, ironically that this almost never responds
                    "82.221.103.244:6881".parse().unwrap(),
                    // dht.aelitis.com
                    "174.129.43.152:6881".parse().unwrap(),
                ],
        ).await?;
    let client = dht.client();

    // make sure this is alive
    tokio::spawn(dht.run());

    // now you can do hackerman things with the client

    Ok(())
}

依赖项

约11-19MB
约237K SLoC