2个版本
0.1.1-beta | 2022年7月23日 |
---|---|
0.1.0-beta | 2022年7月23日 |
#2 in #mainline
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