idea-p2p-pastebin/README.md

62 lines
2.4 KiB
Markdown
Raw Permalink Normal View History

# 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)