Skip to main content
The Parallax client has first-class Tor support, modeled closely on Bitcoin Core’s: outbound connections can be routed through a SOCKS5 proxy, the node can host a Tor v3 onion service for inbound connections with no port forwarding, onion addresses are gossiped and stored like any other peer address, and a node can run entirely inside Tor with --onlynet=onion. See Tor Integration for the protocol-level design.

Quick start

Install Tor and enable its control port in /etc/tor/torrc:
restart Tor (sudo systemctl restart tor), add the user running parallaxd to the Tor group (debian-tor on Debian/Ubuntu, tor on Arch — on Arch also add DataDirectoryGroupReadable 1 to torrc, since the auth cookie lives inside /var/lib/tor there), then simply start the node:
No Tor-specific flags are needed for the default experience. On startup the node connects to the control port, creates a v3 onion service pointing at its P2P listener, and — because --onion wasn’t set — asks the Tor daemon for its SOCKS listener and configures it as the onion proxy automatically. Watch for:
From that point the node is reachable at its onion address, advertises it to the network, and can dial other nodes’ onion addresses. The network reachability line logged at startup summarizes what the resolved configuration allows.

Flags

The onion service identity

The service key persists in <datadir>/onion_v3_private_key, so the node keeps the same .onion address across restarts. Treat the file like the node key: back it up to keep the address, protect it because whoever holds it can impersonate the service. Deleting it yields a fresh address on next startup. The onion service always advertises the network default port (32110) regardless of the local --port, so nodes on non-standard ports are not decloaked by their port number.

Verifying

On the console:
admin.peers shows each peer’s transport and logical address. A proxied peer’s remoteAddress is always the SOCKS5 proxy — the socket-level truth — while network.address names the actual target:
An inbound onion peer shows an empty address: it reached us through a Tor rendezvous and is anonymous by design. To test reachability from another machine with Tor, dial the address directly:
setban/listbanned accept onion addresses the same way, and removenode accepts them too — outbound peers are matched by the address they were dialed at, so a peer reached through a proxy is addressed by its real address rather than the proxy’s.

Fully dark: --onlynet=onion

restricts outbound to onion peers. No discv4 UDP socket is opened, NAT traversal and DNS seeding are disabled, and the node bootstraps from the onion addresses in the hardcoded bootnode list, then from gossip. It is legal to start this way before the Tor daemon is up: the node begins with no reachable network and flips onion reachable the moment the control port answers. An onion-only node never reveals its IP address to any peer — the client refuses to advertise an IP over a Tor circuit even when it knows one. A dual-stack node (clearnet listener + onion service) advertises both addresses, which allows observers to link them. Operators who need unlinkability must run onion-only.

Clearnet through Tor: expectations

--proxy=127.0.0.1:9050 routes clearnet connections through Tor exit relays. This works, but most exit policies do not carry non-standard ports, so only a fraction of circuits complete a connection to clearnet peers on 32110 — measured at roughly 1 in 6 on the live network (Bitcoin has the same property on 8333). Onion-to-onion connections use rendezvous circuits, never exits, and connect reliably in seconds. Treat exit-based clearnet dialing as a bootstrap fallback; onion peering is the real transport.

Troubleshooting

  • No torcontrol: lines at all — the control port isn’t answering, or the auth cookie is unreadable. The controller retries with backoff and logs failures only at debug level; run debug.verbosity(4) on the console to see the exact error (connection refused → torrc lacks ControlPort; permission denied → group membership or, on Arch, the missing DataDirectoryGroupReadable 1).
  • Onion dial says no route to network — the node has no onion proxy: no --proxy/--onion, and no control port for the auto-discovery. Onion entries are then neither stored nor dialed.
  • First dial to a fresh onion address fails with onion service descriptor can not be found — the descriptor hasn’t propagated yet; retry after 30-60 seconds.