62 lines
2.4 KiB
Markdown
62 lines
2.4 KiB
Markdown
# p2p-pastebin
|
|
|
|
An idea for easy and instant sharing of files.
|
|
|
|
|
|
## Overview
|
|
|
|
bittorrent is an established protocol and there are public infrastructure
|
|
available that can be leveraged.
|
|
|
|
Even though much of the torrent world tends to be long-living and eventually
|
|
stale content. This idea would be more for one-time, short lived content. The
|
|
`*.torrent` file is never even shared, only the magnet URI.
|
|
|
|
Ideally this could be a native binary to wrap the whole process.
|
|
Until then, most of this workflow should be possible with `transmission-cli` utilities.
|
|
|
|
Like:
|
|
```shell
|
|
# get today's best trackers
|
|
curl https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt
|
|
|
|
# make the *.torrent
|
|
transmission-create -o dir.torrent -c "this is a test for creating magnets" -t "udp://62.138.0.158:6969/announce" -t "udp://185.225.17.100:1337/announce" -t "udp://51.15.4.13:1337/announce" dir/
|
|
|
|
# get the magnet URI to share
|
|
transmission-show -m ./dir.torrent
|
|
|
|
# start seeding the data
|
|
transmission-cli -er -w . ./dir.torrent
|
|
```
|
|
|
|
Then from the other host:
|
|
```shell
|
|
transmission-cli -w . "magnet:?xt=urn:btih:5c2a54edd30dbe87765dcc85a0e5b4f6f2e8780b&dn=dir&tr=udp%3A%2F%2F62.138.0.158%3A6969%2Fannounce&tr=udp%3A%2F%2F185.225.17.100%3A1337%2Fannounce&tr=udp%3A%2F%2F51.15.4.13%3A1337%2Fannounce"
|
|
```
|
|
|
|
## signalling all-done
|
|
|
|
Only particularly tricky aspect is how to signal from all the clients that have
|
|
been shared the magnet, that they are done. Or further, to expire the shared
|
|
data. One of the primitives forced by the bittorrent protocol is that the data
|
|
is effectively permenantly available as long as someone is still sharing it
|
|
(seeding).
|
|
|
|
## libraries
|
|
There are some good client libraries in golang that cover much, but lack the
|
|
building of the torrent and then producing the magnet URI. Like
|
|
[`github.com/anacrolix/torrent`](https://github.com/anacrolix/torrent)
|
|
[[godoc]](https://godoc.org/github.com/anacrolix/torrent) has everything to
|
|
recieve the magnet string and start downloading the shared data.
|
|
|
|
Looking at the ./cmd/... tools provided by this library it looks like it may
|
|
have everything needed to accomplish this workflow I'm imagining (except
|
|
expiration of the content).
|
|
|
|
## Reference
|
|
|
|
* [automated list of trackers](https://github.com/ngosang/trackerslist)
|
|
* [golang torrent tracker implementation](https://github.com/crosbymichael/tracker) that has bencode logic too?
|
|
* [golang client library](https://github.com/anacrolix/torrent)
|