<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HkpFJavi-x.svg" alt="logo-small-light">
</div>
# Introducing Nullmask: First Virtual Private EVM Network
> **TL;DR:** Nullmask is a virtual EVM network that installs into any existing multichain wallet as a custom RPC. It translates standard EIP-1559 transactions into shielded actions using zk-proofs — no new wallet, no new addresses, full compliance and hardware wallets support.
In this post, we introduce a novel approach to on-chain privacy optimized for speeding up web3 privacy adoption. The current ZKP-based web3 privacy solutions can be categorized as follows:
1. dApps (0xbow, zkBob, Privacy Cash)
2. private wallets (Railgun, Hinkal)
3. privacy SDKs (Kohaku, Bermuda)
4. privacy-focused L2s (Aztec Network, Ztarknet)
Despite all these existing options, privacy-preserving transactions in Web3 have stalled. Every existing solution adds too much friction — new wallets, new seed phrases, special addresses, workflows. As of March 2026, none of the major wallets offer a native privacy option. Privacy SDKs are in early development and there is no established horizon for their adoption.
On the other hand, NullMask allows users to send shielded transfers directly from any existing multichain wallet now — no new app, no new address, no new workflows. How is this possible?
## How does Nullmask work?
We build on existing infrastructure for multichain support. Nullmask installs into a wallet as a new network with a custom RPC server. Importantly, this network is not a real network with custom consensus, validators, and nodes. It is a **virtual network** — a mechanism that enables us to inject a custom middleware between the wallet and the blockchain. This middleware translates outgoing EIP-1559 transactions into shielded actions and decrypts incoming transactions.

Nullmask RPC middleware communicates with the wallet via standard methods like `eth_getBalance` and `eth_sendTransaction`. It manages user's shielded balances, scans for new on-chain incoming encrypted notes, and computes zk-proofs to authorize outgoing shielded actions. Nullmask RPC can run either remotely or locally as a mobile app or browser extension.
## Nullmask Cryptography
Our security objective is that Nullmask RPC is completely untrusted. It has access to all private data, but it cannot manipulate users' funds in any malicious way. Every shielded action must be authorized by an EIP-1559 signed transaction. Building on the standard primitives for privacy-preserving protocols like Merkle tree proofs and UTXO nullifiers, this threat model forced us to invent several new logic components.
### EIP-1559 Transaction zk-Verification
Nullmask action circuit verifies the validity of the EIP-1559 transaction: RLP encoding, keccak hashing, and ECDSA signature verification. All this takes ~87k constraints for a shielded transfer and ~112k constraints for a shielded swap. Thanks to the highly optimized Barretenberg UltraHonk, computing the zk-proof for a Nullmask transaction takes only 2–3 seconds.
### Transaction Nullifiers
Nullmask RPC translates the account model into the UTXO model. In order to prevent a malicious proxy from replaying a transaction, we introduce _transaction nullifiers_ alongside the notes nullifiers. It is basically an `(address, chainId, nonce)` triple masked by a nullifying key.
```
txNullifer := Poseidon2(nullifying_key, (chainId << 32) + nonce, address)
```
The contract stores all transaction nullifiers and rejects shielded actions with already used transaction nullifiers.
### zk-verifiable Encryption
A malicious Nullmask RPC could incorrectly encrypt outgoing notes, resulting in unspendable notes and lost funds. We prevent this by verifying the encryption inside the circuit. The encryption public key is a Grumpkin curve point, which enables us to use native BN254 arithmetic to verify Diffie–Hellman key exchange.
Additionally, we use a custom symmetric encryption scheme to minimize the constraint count. We tweak the derived DH shared secret via Poseidon2 to get an encryption mask which we simply add to the plaintext data. Message authentication is guaranteed by the zk-proof itself.
### Key Registry
Nullmask uses standard 0x EVM addresses, mapped to corresponding nullifying key hashes and public encryption keys via an on-chain key registry.
1. The user generates their additional keys and writes them to the key registry.
2. The contract manages a Merkle tree over all the key registry records.
3. The shielded action circuit verifies this mapping via a Merkle inclusion proof.
## Hardware Wallets Support
As a byproduct of the Nullmask design, we get full compatibility with all hardware wallets for free.
Most privacy protocols struggle with HWW integration. Computation of the zk-proof that authorizes a shielded transaction is too heavy for the constrained environment of a HWW. Some projects tried to patch this by requiring an extra zk-verifiable signature, but made impractical choices of the related hashing function (more in our previous [post](https://hackmd.io/@krnak/Sy5zROAFWx)).
On the other hand, Nullmask does not rely on any special type of signature or hashing function: the ECDSA signature of the EIP-1559 transaction is what authorizes a shielded transaction. Any HWW wallet can sign an EIP-1559 transaction. As a result, Nullmask users can manage their Nullmask shielded funds from any HWW today.
## Compliance
We employ two compliance layers to keep the pool clean of funds originating from illicit activity.
First, all protocol deposits are scanned for association with publicly blacklisted addresses before they get merged into the pool.
Second, every transfer includes a list of shielded deposit indices that funded it. In case a deposit gets reported after approval, we publish a revocation key that enables pool users to retroactively disassociate from the tainted funds.
## Current status of the project
- Nullmask is live at several major EVM networks
- Nullmask works well with MetaMask. We are working on tuning it for other wallets.
- Nullmask _Virtual Private EVM Network_ is currently not whitelisted and therefore installs as a custom network with some limitations (missing exchange rates, some warnings)
- We are in the first seed round of fund raising
- Code will be open sourced soon
- Code has passed internal audits and external audits are being negotiated
- Stay tuned at https://x.com/NullMaskio
### Supported Networks
| Network | Link |
|---------|------|
| Ethereum | [app.nullmask.io](https://app.nullmask.io) |
| Sepolia | [sepolia.nullmask.io](https://sepolia.nullmask.io) |
| MegaETH | [mega.nullmask.io](https://mega.nullmask.io) |
| BSC | [bsc.nullmask.io](https://bsc.nullmask.io) |
| Base | [base.nullmask.io](https://base.nullmask.io) |