Network-level Privacy
for Ethereum RPC Traffic

Anonymized routing for wallets, frontends, dApps, and light-clients with one-line integration — no extension, user configuration, or system installations.

Ali Atiia
Private Reads
Ethereum Foundation
Stateless Summit · EthCC 2026
QR: privreads.ethereum.foundation
privreads.ethereum.foundation

Linkable Onchain ↔ Offchain

We assume users' regular traffic is unprotected vis-à-vis ISPs+. We want to break the link between on-chain and web2 identity.

Wallet / dApp IP: 203.0.113.42 eth_getBalance eth_call IP exposed Infrastructure RPC Provider Block Explorer Indexer Node-as-a-Service They know: Your IP address Your query patterns What you hold What you're planning

Even with shielded transactions, simply reading state reveals who you are and what you care about.

Solution: Tor in the Browser

Make anonymized routing available to The Edge: [browser] wallets, frontends, dApps, light clients — with minimal integration effort, no system installations or configurations.

Wallet / dApp calls tor.fetch() IP hidden G M E Tor Network G = Guard · M = Middle · E = Exit RPC Provider sees Tor exit IP only encrypted decrypted

Traffic is encrypted in layers and routed through three relays. No single relay knows both who you are and what you're accessing.

Starting point: Arti

Arti Tor Project's official Rust client Audited · Actively maintained · Embeddable Successor to the C tor client Compile to WebAssembly Inherit all security properties, no separate fork

Adapting Arti for the Browser

Arti assumes a native OS environment. The browser has none of these:

Cross-Cutting Fixes

Browser-Compatible Timers
tor-time
Swaps in performance.now() on WASM, keeps the standard clock on native. One abstraction, two implementations.
~28 crates modified
Single-Thread Compatible
tor-async-compat
A compile-time macro that strips multi-threading requirements on WASM targets, since the browser only has one thread.
51 files across 7+ crates
Memory Optimization
psl → public-suffix
Replaced a dependency that embedded thousands of constants, causing WASM compilation to consume 10 GB+ of memory.
10 GB+ → 2.6 GB

The WASM Runtime

A bridge layer that maps Arti's assumptions to browser APIs

What Arti expects Browser replacement Thread sleep blocks the current thread setTimeout non-blocking browser timer System clock std::time::SystemTime js_sys::Date JavaScript Date.now() Thread spawn launches new OS threads spawn_local() browser event loop SQLite + filesystem persistent local database In-memory + IndexedDB synced to browser storage ring (C/asm) TLS crypto with native code rustls-rustcrypto pure Rust, compiles to WASM

tor-js-gateway

Browsers can't open raw TCP connections to Tor relays. The gateway bridges browser protocols to TCP — restricted to Tor destinations only.

Browser WebSocket or WebRTC Data Channel Gateway Bridges one browser connection to one TCP socket. Tor relay destinations only. Tor Network TCP WebRTC is the long-term default: peer-to-peer, no centralized bridges

Fast Bootstrap

First prototype took ~3 minutes to connect. The bottleneck is Tor's directory protocol — it incrementally fetches from multiple nodes instead of getting a single bundle.

1
Pre-built Archive
Standard Tor bootstraps incrementally from many nodes — slow over the gateway. Instead, fetch a single brotli-compressed bundle over HTTPS. Arti verifies directory signatures internally, so the server can't lie.
2
Brotli Compression
Brotli compression for the bootstrap archive dramatically reduces download size and bootstrap time.
3
UI Thread Yields
Periodic sleep(0) yields during heavy processing so the browser doesn't freeze while crunching thousands of descriptors.
3 min
before
3 sec
after

Developer Experience

import { TorClient } from 'tor-js';

const tor = new TorClient();
await tor.ready();

// That's it. This routes through Tor.
const response = await tor.fetch('https://api.example.com/data');

A familiar fetch()-compatible API. Wallets and dApps swap one line to get Tor routing.

Security Caveats

34-item internal code review completed. External audit planned before production recommendation.

Status & What's Next

Upstream Merge
tor-time and tor-async-compat under review by Tor Project. Main WASM integration follows.
Security Audit
External audit of WASM-specific integration layers is planned.
WebRTC Default
Replace WebSocket with peer-to-peer WebRTC to remove centralized bridge dependency.
Integrations Everywhere
Bake it into wallet SDKs, light clients, dApps, frontends, ..
Thanks

Learn More