BitTorrent Seeding

Help distribute verified snapshots and releases with a safe, automated torrent client.

Seed ROKO artifacts with BitTorrent

ROKO publishes node releases and chain snapshots over HTTPS and BitTorrent. Running a seeder helps other operators download large artifacts without putting all traffic on one public server.

Seeding is optional. It does not make your machine a validator, RPC node, bootnode, or time observer. It only means your BitTorrent client keeps verified public files available to other peers.

What to seed

ArtifactBest forPublic source
Normal snapshotmost full nodes, validators before enrollment, lightweight seed boxes`https://snapshots.roko.network/mainnet/normal/normal-latest.torrent`
Archive snapshotexplorers, indexers, analytics operators, high-disk seed boxes`https://snapshots.roko.network/mainnet/archive-latest.torrent`
Node release bundleusers installing native binaries or offline container archives`https://downloads.roko.network/releases/current/`

If you can only seed one thing, seed the normal snapshot. If you have spare disk and bandwidth, add archive snapshots and the current node release bundle.

Host expectations

AreaRecommendation
UptimeAlways-on or mostly-on host. A home lab, small VPS, NAS, or spare Linux box is fine.
DiskEnough for the current artifacts you choose plus temporary download space. Keep at least 20% free.
NetworkPublic inbound TCP/51413 and UDP/51413 when possible. Seeding still works behind NAT, but it helps less.
PermissionsRun the torrent client as an unprivileged user. Do not run it as root unless your OS package does so through its own service isolation.
SecretsNone required. Never place validator keys, wallet seeds, node keys, or live database directories inside a torrent download path.

Install a torrent client

Transmission is simple to automate on Linux:

sudo apt update
sudo apt install transmission-daemon curl coreutils jq python3
sudo systemctl enable --now transmission-daemon

On Fedora, RHEL, Rocky, or AlmaLinux:

sudo dnf install transmission-daemon curl coreutils jq python3
sudo systemctl enable --now transmission-daemon

Create a seed directory that the Transmission daemon can write. On Debian/Ubuntu packages the service user is usually `debian-transmission`; on RHEL-family packages it is commonly `transmission`.

sudo install -d -o debian-transmission -g debian-transmission \
  /srv/roko-seed/snapshots /srv/roko-seed/releases

If your distribution uses a different service user, replace `debian-transmission` with that user.

Desktop users may use qBittorrent, Transmission, Deluge, or another client. Add the `.torrent` files or magnet links from `snapshots.roko.network` and `downloads.roko.network`, choose a stable download folder, and leave the client running.

Seed the current normal snapshot

transmission-remote 127.0.0.1:9091 \
  --add https://snapshots.roko.network/mainnet/normal/normal-latest.torrent \
  --download-dir /srv/roko-seed/snapshots

If your Transmission RPC requires credentials, add `--auth USERNAME:PASSWORD` to the command or configure `TR_AUTH=USERNAME:PASSWORD` in the helper script environment.

Verify completed payloads

BitTorrent verifies pieces during transport. ROKO still expects operators to verify the published checksum before restoring or running an artifact.

For snapshots:

curl --fail --location https://snapshots.roko.network/mainnet/normal/normal-latest.json \
  | jq -r '"\(.archive.sha256)  \(.archive.file)"' \
  > /tmp/roko-normal-latest.sha256

cd /srv/roko-seed/snapshots
sha256sum -c /tmp/roko-normal-latest.sha256

For node releases:

curl --fail --location \
  --output /tmp/roko-release-SHA256SUMS \
  https://downloads.roko.network/releases/current/SHA256SUMS

cd /srv/roko-seed/releases
sha256sum -c /tmp/roko-release-SHA256SUMS

Do not restore a snapshot, execute a binary, or load an offline image until the checksum passes.

Use the helper script

The public tools repository includes `roko-seed-refresh`, which adds current ROKO torrents to Transmission and verifies completed downloads when checksum files are available.

git clone https://github.com/Roko-Network/roko-edge-tools.git
cd roko-edge-tools

ROKO_SEED_PROFILES="normal releases" ./bin/roko-seed-refresh

Profiles:

ProfileBehavior
`normal`Adds the current normal snapshot torrent.
`archive`Adds the current archive snapshot torrent. Use only when you have enough disk.
`releases`Discovers the current node release torrent from `downloads.roko.network` and adds it.

The script is intentionally non-destructive. It does not delete old downloads or remove torrents from your client. Prune manually after a newer artifact is downloaded, verified, and seeding.

Automate refresh with systemd

Install the tools and copy the example units:

sudo git clone https://github.com/Roko-Network/roko-edge-tools.git \
  /opt/roko-edge-tools
sudo install -d -o debian-transmission -g debian-transmission \
  /srv/roko-seed/snapshots /srv/roko-seed/releases

sudo install -m 0644 /opt/roko-edge-tools/examples/roko-seed-refresh.service \
  /etc/systemd/system/roko-seed-refresh.service
sudo install -m 0644 /opt/roko-edge-tools/examples/roko-seed-refresh.timer \
  /etc/systemd/system/roko-seed-refresh.timer

sudo systemctl daemon-reload
sudo systemctl enable --now roko-seed-refresh.timer

By default the timer checks every 30 minutes. That is frequent enough for normal use because ROKO’s publisher promotes snapshot torrent metadata after verified public snapshots appear. Daily seeders can run the script from cron instead.

To include archive snapshots, edit the service environment:

Environment=ROKO_SEED_PROFILES=normal archive releases

Then reload:

sudo systemctl daemon-reload
sudo systemctl restart roko-seed-refresh.timer

When to update

EventWhat to do
New snapshot publishedAdd the new `.torrent` or let `roko-seed-refresh` pick it up. Keep the old file only if you have space.
New node release publishedAdd the new release torrent from `downloads.roko.network/releases/current/`.
Low diskRemove old torrents from the client without deleting live node data. In Transmission use “remove torrent” first, then delete only files inside your seed directory.
Bandwidth pressureSet an upload cap in your torrent client. A stable capped seeder is more useful than an intermittent overloaded one.
Restoring a nodeStop the node, verify the snapshot SHA-256, restore into the chain data path, then restart. Never torrent directly into a live database directory.

Firewall notes

Forward or allow:

TCP/51413
UDP/51413

Only expose the torrent peer port. Do not expose Transmission RPC to the internet. Keep RPC on loopback or a private management network with authentication.

Support checklist

If you ask for help, include:

  • the artifact profile you are seeding: normal, archive, releases;
  • your torrent client and version;
  • whether TCP/51413 and UDP/51413 are reachable;
  • output from `transmission-remote 127.0.0.1:9091 -l`; and
  • checksum verification output.

Remove usernames, private IP details you do not want public, tokens, RPC passwords, wallet material, and node keys before posting logs.