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
| Artifact | Best for | Public source |
|---|---|---|
| Normal snapshot | most full nodes, validators before enrollment, lightweight seed boxes | `https://snapshots.roko.network/mainnet/normal/normal-latest.torrent` |
| Archive snapshot | explorers, indexers, analytics operators, high-disk seed boxes | `https://snapshots.roko.network/mainnet/archive-latest.torrent` |
| Node release bundle | users 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
| Area | Recommendation |
|---|---|
| Uptime | Always-on or mostly-on host. A home lab, small VPS, NAS, or spare Linux box is fine. |
| Disk | Enough for the current artifacts you choose plus temporary download space. Keep at least 20% free. |
| Network | Public inbound TCP/51413 and UDP/51413 when possible. Seeding still works behind NAT, but it helps less. |
| Permissions | Run the torrent client as an unprivileged user. Do not run it as root unless your OS package does so through its own service isolation. |
| Secrets | None 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:
| Profile | Behavior |
|---|---|
| `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
| Event | What to do |
|---|---|
| New snapshot published | Add the new `.torrent` or let `roko-seed-refresh` pick it up. Keep the old file only if you have space. |
| New node release published | Add the new release torrent from `downloads.roko.network/releases/current/`. |
| Low disk | Remove 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 pressure | Set an upload cap in your torrent client. A stable capped seeder is more useful than an intermittent overloaded one. |
| Restoring a node | Stop 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.