Trust Me, I’m Reliable: Railgun Broadcasters and the Self-Scored Scoreboard
Railgun promises private transfers on public chains (Currently Ethereum, Arbitrum, BSC, and Polygon) using Zero-Knowledge proofs—neat math, fewer prying eyes. In this post I zoom in on a smaller but telling piece of the stack: public broadcasters. They relay your encrypted TX so your public 0x address doesn’t dox you. That’s the idea. The funny part? Their ““reliability”” score is self-reported. Yes, the scoreboard lets players keep their own score. Below I show how that works in code and why a broadcaster can crown itself king with a one-line change.
Before starting, it’s important to understand the protocol’s basic architecture and the broadcaster component.
When someone uses the Railgun protocol, they create a 0zk address, which is later used to privately send assets between 0zk addresses or to transfer assets from a 0zk (private) address to a 0x (public) address. For any of these operations, a user can either self-broadcast the transaction using their public 0x address or let a broadcaster submit the transaction on their behalf (a “Public Broadcaster”), at the cost of a small fee paid to the broadcaster:

Broadcasters are the recommended move—especially for 0zk → 0x exits—because they add a privacy buffer between your wallet and the chain. Pick Public Broadcaster and the wallet shows a lineup ordered by fee ratio; if two tie on fees, the tiebreaker is their Reliability score:

Reliability ranges from 0 to 1 . It starts at 0 and ticks up with each successfully submitted TX; errors knock it down. To ground it, here’s the current broadcaster flow at a glance:

High level. Your wallet (Railway or Terminal) runs the Railgun SDK, which talks to core.rootedinprivacy.com—a gateway into the Waku pub/sub network. Through that pipe, the wallet fetches the list of public broadcasters along with each one’s fee ratio and “reliability” score.
When you transfer or withdraw assets using a broadcaster, the wallet signs the TX, encrypts it to the chosen broadcaster’s public key, and publishes it on Waku. The broadcaster picks it up and submits it on-chain.
The wobbly part. Where does “reliability” come from? From the broadcaster itself. In /src/server/waku-broadcaster/waku-broadcaster.ts, the broadcastFeesForChain() function grabs the reliability via getReliabilityRatio(chain), which is persisted in the operator’s local DB. Self-scored reputation—what could possibly go wrong?
async broadcastFeesForChain(chain: BroadcasterChain): Promise<void> {
// Map from tokenAddress to BigNumber hex string
const { fees, feeCacheID } = getAllUnitTokenFeesForChain(chain);
const reliability = await getReliabilityRatio(chain);
const feeBroadcastData = await promiseTimeout(
this.createFeeBroadcastData(fees, feeCacheID, chain, reliability),
3 * 1000,
)
...omitted for brevity...
}Swap the line that calls the getReliabilityRatio(chain) function for a constant, and you’ve crowned yourself. For example—hardcode 99:
async broadcastFeesForChain(chain: BroadcasterChain): Promise<void> {
// Map from tokenAddress to BigNumber hex string
const { fees, feeCacheID } = getAllUnitTokenFeesForChain(chain);
const reliability = 99; // Modified reliability
const feeBroadcastData = await promiseTimeout(
this.createFeeBroadcastData(fees, feeCacheID, chain, reliability),
3 * 1000,
)
...omitted for brevity...
}
Then I spun up my broadcaster. Railway wallet happily displayed Reliability: 99 (even outside the intended 0-1 range) because the reputation source is the broadcaster itself.

That’s the bug in a byte. A reputation system that trusts the subject of the reputation. Practically, it means a broadcaster can float to the top of the fee list without earning it. A healthier design would derive reliability from observer data instead.
This one is low impact, but it’s a canary: never outsource trust to the party being judged. I’ve got a couple of sharper issues coming next—same tone. Stay tuned.
Manuel
Links of interest:
- Railgun protocol - https://www.railgun.org/
- Broadcasters codebase - https://github.com/Railgun-Community/ppoi-safe-broadcaster-example/
- Railway - https://github.com/Railway-Wallet/Railway-Wallet/
- Terminal - https://github.com/Terminal-Wallet/terminal-wallet-cli/