From 7a947ddf7993f56550240bd368c4425195235d41 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Fri, 9 Jul 2021 22:51:33 +0100 Subject: [PATCH] Starting to play with alternative DHT implementations --- Cargo.lock | 199 +++++++++++++++++++++++++++++++++- Cargo.toml | 3 +- crates/bencode/src/lib.rs | 2 + crates/buffers/Cargo.toml | 3 +- crates/dht/Cargo.toml | 12 ++ crates/dht/resources/query.js | 10 ++ crates/dht/src/lib.rs | 11 ++ 7 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 crates/dht/Cargo.toml create mode 100644 crates/dht/resources/query.js create mode 100644 crates/dht/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 8912f13..5ff8380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,12 +11,32 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" +[[package]] +name = "async-trait" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atty" version = "0.2.14" @@ -102,6 +122,7 @@ name = "buffers" version = "0.1.0" dependencies = [ "clone_to_owned", + "hex 0.4.3", "serde", ] @@ -135,6 +156,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + [[package]] name = "clap" version = "3.0.0-beta.2" @@ -147,9 +183,9 @@ dependencies = [ "indexmap", "lazy_static", "os_str_bytes", - "strsim", + "strsim 0.10.0", "termcolor", - "textwrap", + "textwrap 0.12.1", "unicode-width", "vec_map", ] @@ -171,6 +207,15 @@ dependencies = [ name = "clone_to_owned" version = "0.1.0" +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + [[package]] name = "commoncrypto" version = "0.2.0" @@ -226,6 +271,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "dht" +version = "0.1.0" +dependencies = [ + "bencode", + "hex 0.4.3", + "kad", + "tokio", +] + [[package]] name = "digest" version = "0.9.0" @@ -288,12 +343,24 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "funty" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e" +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + [[package]] name = "futures" version = "0.3.15" @@ -367,6 +434,15 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +[[package]] +name = "futures-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5cedfe9b6dc756220782cc1ba5bcb1fa091cdcba155e40d3556159c3db58043" +dependencies = [ + "futures 0.1.31", +] + [[package]] name = "futures-util" version = "0.3.15" @@ -649,6 +725,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kad" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ed647905c649de73b7df476658b34898472f49245de662a0041bbfefc5cdcb" +dependencies = [ + "async-trait", + "futures 0.3.15", + "futures-timer", + "humantime", + "log", + "num", + "rand 0.5.6", + "structopt", + "tracing", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -673,7 +766,7 @@ dependencies = [ "byteorder", "clone_to_owned", "crypto-hash", - "futures", + "futures 0.3.15", "hex 0.4.3", "librqbit_core", "log", @@ -830,6 +923,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ + "num-bigint", "num-complex", "num-integer", "num-iter", @@ -837,6 +931,18 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "rand 0.5.6", +] + [[package]] name = "num-complex" version = "0.2.4" @@ -845,6 +951,7 @@ checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ "autocfg", "num-traits", + "rand 0.5.6", ] [[package]] @@ -875,6 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", + "num-bigint", "num-integer", "num-traits", ] @@ -1115,6 +1223,19 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" +[[package]] +name = "rand" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "winapi", +] + [[package]] name = "rand" version = "0.7.3" @@ -1160,6 +1281,21 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.5.1" @@ -1270,8 +1406,8 @@ name = "rqbit" version = "0.1.0" dependencies = [ "anyhow", - "clap", - "futures", + "clap 3.0.0-beta.2", + "futures 0.3.15", "librqbit", "log", "pretty_env_logger", @@ -1440,12 +1576,42 @@ dependencies = [ "winapi", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "structopt" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b041cdcb67226aca307e6e7be44c8806423d83e018bd662360a93dabce4d71" +dependencies = [ + "clap 2.33.3", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7813934aecf5f51a54775e00068c237de98489463968231a51746bbbc03f9c10" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "syn" version = "1.0.73" @@ -1486,6 +1652,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "textwrap" version = "0.12.1" @@ -1611,9 +1786,21 @@ dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" version = "0.1.18" @@ -1776,7 +1963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" dependencies = [ "bytes", - "futures", + "futures 0.3.15", "headers", "http", "hyper", diff --git a/Cargo.toml b/Cargo.toml index bdba329..09adc48 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,8 @@ members = [ "crates/bencode", "crates/sha1w", "crates/librqbit_core", - "crates/peer_binary_protocol" + "crates/peer_binary_protocol", + "crates/dht" ] [profile.dev] diff --git a/crates/bencode/src/lib.rs b/crates/bencode/src/lib.rs index 431bed5..dc5a7ed 100644 --- a/crates/bencode/src/lib.rs +++ b/crates/bencode/src/lib.rs @@ -5,3 +5,5 @@ mod serde_bencode_ser; pub use bencode_value::*; pub use serde_bencode_de::*; pub use serde_bencode_ser::*; + +pub use buffers::{ByteBuf, ByteString}; diff --git a/crates/buffers/Cargo.toml b/crates/buffers/Cargo.toml index d4f332b..16c4505 100644 --- a/crates/buffers/Cargo.toml +++ b/crates/buffers/Cargo.toml @@ -7,4 +7,5 @@ edition = "2018" [dependencies] serde = {version = "1", features=["derive"]} -clone_to_owned = {path="../clone_to_owned"} \ No newline at end of file +clone_to_owned = {path="../clone_to_owned"} +hex = "0.4" \ No newline at end of file diff --git a/crates/dht/Cargo.toml b/crates/dht/Cargo.toml new file mode 100644 index 0000000..76095e6 --- /dev/null +++ b/crates/dht/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "dht" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +kad = "0.6" +tokio = {version = "1", features = ["macros", "rt"]} +hex = "0.4" +bencode = {path = "../bencode"} \ No newline at end of file diff --git a/crates/dht/resources/query.js b/crates/dht/resources/query.js new file mode 100644 index 0000000..ad966b7 --- /dev/null +++ b/crates/dht/resources/query.js @@ -0,0 +1,10 @@ +const DHT = require('bittorrent-dht') + +let dht = new DHT(); +let infoHash = process.env["INFOHASH"]; + +dht.on('peer', function (peer, infoHash, from) { + console.log(peer.host + ':' + peer.port) +}) + +dht.lookup(infoHash) \ No newline at end of file diff --git a/crates/dht/src/lib.rs b/crates/dht/src/lib.rs new file mode 100644 index 0000000..f0c54f6 --- /dev/null +++ b/crates/dht/src/lib.rs @@ -0,0 +1,11 @@ +#[cfg(test)] +mod tests { + use bencode::ByteBuf; + + #[tokio::test] + async fn it_works() { + let data = b"64313a6164323a696432303abd7b477cfbcd10f30b705da20201e7101d8df155363a74617267657432303abd7b477cfbcd10f30b705da20201e7101d8df15565313a71393a66696e645f6e6f6465313a74323a0005313a79313a7165"; + let data = hex::decode(data).unwrap(); + dbg!(bencode::dyn_from_bytes::(data.as_slice()).unwrap()); + } +}