How to Anonymize Ethereum
By Rachel-Rose O'Leary, Stellar Magnet
Ethereum is the most popular blockchain with smart contract functionality and has attracted a lot of users new to cryptocurrency due to the rise in popularity of NFTs. One thing new users might not understand is that Ethereum doesn't provide privacy features up front and that transacting on Web3, if you aren’t using privacy add-ons or specialized blockchains, is actually much less private than one is accustomed to when transacting on Web2, wherein only your bank and service providers know details of your financial transactions.
This guide exists to educate people on the transparency of Ethereum and to provide instructions on tools that can be used to achieve better anonymity on Ethereum.
Primer on Ethereum's Transparency
If you decide to mint an NFT and someone subsequently puchases the NFT from you, it's possible for anyone to now observe what you do with the ETH (or ERC-20 token) that you receive. For example, if you navigate to a profile on Foundation such as:
You can copy the Ethereum address,
0x0E5E9eC9DeDfbbD1cf97318a30831b008bd295C1 and then navigate to Ethereum's most popular block explorer, Etherscan, and paste in the address in the search bar. This will return this URL:
Now we are able to see how Gael Corboz has been spending cryptocurrency associated with their Foundation address. This behavior isn't limited to only Foundation, it's possible to determine the Ethereum address of anyone selling NFTs on OpenSea, Zora, Rarible, etc.
Being anonymous on Ethereum
In this guide, you can learn how to anonymize Ethereum using two different possible apps: zk.money and Tornado Cash. Both of these apps use zero-knowledge proof cryptography to anonymize your Ethereum. These types of apps are called mixers because they achieve privacy by pooling money into a common smart contract. Whenever you use one of these protocols to transfer ETH, the address showing up in the block explorer sending the ETH will be the zk.money or Tornado Cash smart contract, as opposed to your personal Ethereum address.
In the case of zk.money, wherein the app allows you to transact in variable amounts of ETH, how much money you are depositing into the pool, and how much you then withdraw from it, can potentially de-anonymize you.
For example, if you decide to deposit 12.454 ETH into zk.money and then you withdraw exactly that same amount of shielded ETH to another address, it is easy to de-anonymize yourself and have the transactions linked (if someone is looking closely at the smart contract, they can link the addresses together by matching the ETH deposit and withdrawal amounts as it may be very unlikely that another person besides you has transacted in that same amount of ETH).
To bypass this potential breach in privacy when you are sending ETH on zk.money, the app will provide an estimated size of the anonymity set for the transaction amount you'd like to send. You can play around with the number until you see something you're comfortable with.
Tornado Cash controls this more at the app level, only allowing specific denominations of ETH to be sent (0.1 ETH, 1 ETH, 10 ETH).
Whether you decide to use zk.money or Tornado Cash, you will need to start off by creating a fresh Ethereum address.
Step 0: Create a fresh Ethereum account
For clarity, we will call the wallet where your public non-anonymous ETH originates from
To anonymize ETH, you must create a second fresh Ethereum account that is tied to a new seed. One way to do this, is to simply download Metamask on a different browser and create a brand new seed. It is important to use an entirely different seed to
Wallet1 to minimize the risk of linking the accounts.
If you want to be highly secure, download Metamask on Tor Browser (do not use a VPN when you are interacting with Tor as it will reduce your overall anonymity). If you don't use Tor, use a browser like Brave or Firefox alongside a VPN.
Once you have downloaded Metamask on this new browser, create an account and backup your seed. Copy and paste your account's public key onto a text file. We'll use this later on. We will now refer to this account as
Anonymizing ETH using zk.money
This zk.money guide was written using the old version of zk.money. We are still waiting for the new version to go to live. The old version of zk.money no longer supports new account generations and functionality will be deprecated in 6 months.
The steps in this guide will take a few minutes to complete, but it will take about 6 hours until you can transact with your private, "shielded" ETH. If you would like a faster, but more expensive alternative, check out the Tornado Cash guide.
Once you have created your fresh Ethereum wallet
Wallet2 described in Step 0, you can proceed with the rest of this guide.
Note: Tor is not compatible with zk.money, so it's recommended to use a VPN instead.
Step 1: Connect to zk.money and pick username
On the browser associated with
Wallet1, navigate to the zk.money website. Connect
Wallet1 to zk.money. Pick a username to set as your alias.
Then click 'Register'. This may take several minutes. Do not close the window until you see the dashboard.
Deposit at least 0.01 ETH for the username registration to be complete. You'll be able to withdraw your ETH later or include them in a payment.
Step 2: Shield your Ethereum
Now convert your ETH to zkETH by shielding your coins. Shield your preferred asset by clicking the “Shield” button on your dashboard. You can reduce the time the shielding will take by paying a higher transaction fee here.
Keep waiting until the
CREATE ACCOUNT transactions are settled. Only then is your username successfully registered. This may take a few hours.
You’ll be able to follow your transaction status in the dashboard. Please note that while your account balance may show zkETH available, you won’t be able to send any funds until your new sendable balance is settled.
Once you have a sendable balance of zkETH you will be in privacy mode. The entire process may take several hours, so don’t stress if the balance does not show up immediately.
Step 3: Send anonymized ETH to fresh wallet
Now that the ETH has been anonymized, send it to
Wallet2. Simply paste the
Wallet2 address into the Recipient section.
The coins received by
Wallet2 will be normal ETH (as opposed to zkETH). However, the transaction history will have been anonymized. Etherscan will show the funds were sent from the Aztec contract to
Wallet2 is now an anonymous account you can use that isn't tied to any of your past Ethereum transaction history (remember to use it in combination with Tor or a VPN for increased anonymity).
Anonymizing ETH using Tornado Cash
Now we will walk through the process of anonymizing ETH through Tornado Cash. This guide does not deal with Tornado Cash Nova - the new experimental version of Tornado Cash. Make sure your are on the right version of the app.
Depending on the ETH gas price, an average Tornado Cash deposit costs around 0.05 ETH (plus a similar amount for withdrawal). If you'd like a cheaper alternative, check out the process for zk.money.
Once you have created
Wallet2, you can proceed with the rest of this guide.
Step 1: Deposit to Tornado Cash
On the browser associated with
Wallet1, navigate to Tornado Cash. Click 'Launch App' in the top right hand side. Now follow the steps to deposit ETH.
Select ETH from the token list and enter your required amount. Now connect your wallet. Click on
Connect and choose Metamask.
Save your note. Click on
Deposit and store your note on a secure place before clicking on
I backed up the note.
You can also save encrypted notes on-chain by setting up a Note Account, by clicking on
Settings (top-right corner).
Your ETH is now being anonymized. Leave it here for as long as you can. The longer you wait, the greater your anonymity set will be.
Step 2: Send anonymized ETH to fresh wallet
Now we are going to redeem anonymous ETH on
Wallet2. First navigate to
Wallet2. If you are running it on Tor, switch off your VPN. Otherwise, close your current browser and turn your VPN on.
Wallet2, use your deposit note by clicking
Deposit and pasting it in the corresponding box. Click on
Withdraw and wait for the zk-SNARK proof to be generated.
Finally, confirm the withdrawal.
Wallet2 is now an account you can use, loaded with ETH, that isn't tied to any of your past Ethereum transaction history.
This tutorial is for informative purposes only. We make no representation as to the tutorial's accuracy, usefulness, or completeness. As a consequence, the above tutorial is offered to you without any warranties. We are not liable for any claims, losses, damages, judgments, fines, litigation costs, and/or legal fees arising out of or in connection with your use of the information provided or any other action or transaction related thereto.
This tutorial is not presented as, nor should it be construed as, an endorsement of zk.money or Tornado Cash. In addition, this tutorial is not presented as, nor should it be construed as, a recommendation to engage in any transaction or taken as the basis for making decisions. By viewing the above tutorial, you acknowledge and agree that you are solely responsible for your own transactions and decisions (“Your Actions”), and that we are not responsible for Your Actions or the consequences thereof.