Self-Broadcasting Setup for ZKX Wallet Users
It is provided for general educational and informational purposes only and does not constitute legal, financial, or compliance advice.
What is Self-Broadcasting?
When you shield, unshield, or send privately with a Railgun-powered wallet like ZKX Wallet, the resulting transaction has to be submitted on-chain by someone. Normally, that job can be handed to a Broadcaster (Railgun's relayer network) β see Railgun Private Sends: Privacy and Fee Structure for how relayer premiums factor into private-send fees.
Self-broadcasting means you skip the Broadcaster and submit the transaction yourself, using gas from your own wallet. This removes your dependence on a third party to get the transaction included, and β when paired with the correct wallet setup below β reduces the metadata trail that could otherwise link your shielding activity back to a single identity.
Self-broadcasting only removes your reliance on a Broadcaster. It does not, by itself, separate your public and private identities β that depends entirely on which wallets you use to fund, shield, and receive. That's what the setup below is for.
Why You Need Two Separate Wallets
If the same 0x address funds a shield and later receives the unshielded funds, an observer only has to watch that one address to connect both ends β the privacy Railgun provides in between is undermined by the addresses on either side.
Rule: the wallet that funds the shield β the wallet that receives the funds later.
Splitting these roles across two independent 0x/0zk pairs, each capable of paying its own gas, is the baseline setup for self-broadcasting with ZKX Wallet.
The Setup
Wallet 1 β Shielding Wallet (0x1 + 0zk1)
Keep enough native gas token on
0x1to self-broadcast the shield transaction.Keep the funds you intend to shield (for example, on PulseChain) on
0x1.Shield those funds from
0x1β0zk1.
Wallet 2 β Receiving Wallet (0x2 + 0zk2)
Keep enough native gas token on
0x2to self-broadcast.Use
0x2as the separate, clean public wallet you receive your funds into later β not an address that has ever been linked to0x1or posted publicly.
Privacy Flow
The full flow moves funds through three hops, only the first and last of which touch the public chain:
0x1 β 0zk1
Shield
Public transaction, self-broadcast using 0x1's own gas
0zk1 β 0zk2
Private transfer
Fully shielded β no public transaction, no network gas required for the transfer itself
0zk2 β 0x2
Unshield
Public transaction, self-broadcast using 0x2's own gas
The important part is separating the two wallet pairs. Don't reuse 0x1 when unshielding if your goal is to avoid creating an obvious public link back to the original wallet.
Privacy here isn't just about which addresses you use β it depends on how you use the whole system. Self-broadcasting each public hop, keeping the middle hop fully private, and never letting 0x1 and 0x2 cross paths are all part of the same setup, not separate options.
Step-by-Step in ZKX Wallet
Create two independent accounts. In ZKX Wallet, go to Settings β Accounts β Add an account and create Wallet 1 and Wallet 2 using separate recovery phrases β not two sub-accounts under the same seed. If both wallets are derived from one recovery phrase, compromising that single phrase exposes both, defeating the separation this setup is meant to provide.
Fund both public addresses with gas. Send enough native gas token (for example, PLS on PulseChain) to
0x1and0x2so each can independently cover a self-broadcast transaction. See Optional: Funding Wallet 2 Through Tornado Cash below for a way to fund0x2without linking it back to0x1.Load the funds to shield onto
0x1. Keep them there rather than moving them through0x2first.Shield from
0x1to0zk1. Switch to Wallet 1, open Shield, and follow the flow described in Shielding Tokens. The recipient defaults to your own private address (0zk1) β confirm this on the One last check screen before submitting.Send privately from
0zk1to0zk2. This is a shielded-to-shielded transfer β no public transaction is created and no network gas is required for the transfer itself, so this step doesn't depend on either wallet's gas balance.Unshield from
0zk2to0x2. Switch to Wallet 2, open Unshield, and follow the flow described in Unshielding Tokens, self-broadcasting with0x2's own gas.0x2β never0x1β is the address that should end up holding the funds publicly again.
Optional: Funding Wallet 2 Through Tornado Cash
0x2 still needs to be funded with native gas token before it can self-broadcast the final unshield (step 2 above). If that funding comes from an exchange or address that's linked to your real identity or to 0x1, it can reintroduce the exact correlation this setup is designed to avoid.
For extra separation, fund 0x2's gas through Tornado Cash instead of sending it directly from a known source.
Important Notes
Fund
0x1and0x2from sources and at times that aren't obviously linked to each other β funding both from the same exchange withdrawal seconds apart re-creates the correlation this setup is meant to avoid. See Use Privacy Protocols Like Railgun for the broader timing and amount-variance principles this setup builds on.Don't reuse
0x1or0zk1for anything once they've touched the shield in this flow β treat them as tainted going forward, per the "funding wallet β fee payer β receiver" rule linked above.Don't post either address, or a screenshot of the transaction, on social media β see point 6 in Use Privacy Protocols Like Railgun.
Last updated