Skip to main content

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:

https://foundation.app/@gaelcorboz

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:

https://etherscan.io/address/0x0E5E9eC9DeDfbbD1cf97318a30831b008bd295C1

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 zk.money, which uses zero-knowledge proof cryptography to anonymize your Ethereum. These types of apps achieve privacy by pooling money into a common smart contract. Whenever you use zk.money transfer ETH, the address showing up in the block explorer sending the ETH will be the zk.money smart contract, as opposed to your personal Ethereum address.

It is important to understand that 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.

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.

Warning

This zk.money guide was written using the old version of zk.money. We believe it may work similarly, but we apologize if there are some mistakes. Feel free to update the guide and help maintain this resource.

Step 1: Create a fresh Ethereum account

First you will need to start off by creating a fresh Ethereum address. For clarity, we will call the wallet where your public non-anonymous ETH originates from Wallet1.

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, install Metamask on a browser like Brave or Firefox and use it alongside a VPN. (Tor is not compatible with zk.money)

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 Wallet2.

Step 2: 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.

Pick username

Then click 'Register'. This may take several minutes. Do not close the window until you see the dashboard.

Create account

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.

Deposit ETH

Step 3: 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 SHIELD and CREATE ACCOUNT transactions are settled. Only then is your username successfully registered. This may take a few hours.

Shield ETH

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.

zk Dashboard

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 4: 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.

Send ETH

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.

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).

Disclaimer:

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. 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.