Skip to content

Instantly share code, notes, and snippets.

@pcaversaccio
Last active June 23, 2026 21:29
Show Gist options
  • Select an option

  • Save pcaversaccio/d6ea7622fea400d7e968b413395db6af to your computer and use it in GitHub Desktop.

Select an option

Save pcaversaccio/d6ea7622fea400d7e968b413395db6af to your computer and use it in GitHub Desktop.
Review Tornado Cash Proposal 66

Review Tornado Cash Proposal 66

Proposal #66: Update the ETH RPC List and ENS - 50 TORN

Expenditure: 50 TORN

Reason: The current default Blockscout RPC is unusable because it enforces a strict JSON-RPC mode.

The feeOracleV4 and feeOracleV5 calls in tornado-oracles do not include the latest block parameters, causing compatibility issues with strictly compatible RPC endpoints.

The most practical and straightforward solution is to update the ETH RPC list to resolve this incompatibility issue.

UI Update Details:

ETH RPCs: pocket, Mevblocker, mevblockerFullprivacy, torndaoRPC, sentioRPC, lavaRPC, blastRPC, xrpc

Goal: Update the IPFS hash of the Tornado Cash Classic UI associated with the ENS domain tornadocash.eth.

UI Codebase: https://codeberg.org/torndao/classic-ui/commits/branch/development

UI Code Commit: https://codeberg.org/torndao/classic-ui/commit/d52c01688f5697e60a1d3c598a4c30989403fb0f

IPFS Hash: bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by (Accessible via https://ipfs.io/ipfs/bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by)

IPFS Hash Verification Tool: https://codeberg.org/torndao/tornado-ipfs-ui

Content Hash: e3010170122031fdc81d48dea2004a10fd5c6deac9ce7ab1347bf603118431eee9ab17d01d0e (Calculated using tools at https://codeberg.org/torndao/tornado-ipfs-ui/src/branch/main/ContentHash.html)

Affected Domains: The updated IPFS hash will affect the following domains:

tornadocash.eth.limo

tornadocash.eth.link

ipfs.io/ipns/tornadocash.eth

tornadocash-eth.ipns.dweb.link

Please note that the referenced commit "UI Code Commit: d52c01688f5697e60a1d3c598a4c30989403fb0f" is incorrect, as it corresponds to the previous Proposal #65 commit hash. The correct UI commit is e312df5a4f6caaa7e93f1b5960c603d8dd7ec67a. This discrepancy in the proposal text does not impact the final IPFS hash calculation.

This proposal passed with 122.13k TORN (100%) voting For. The required quorum of 100k TORN was met, and the proposal was successfully executed here (May-02-2026 11:36:23 AM UTC).

Analysis

Relevant Links

There are two new commits compared to the last version (https://tornadocash.eth.limo/governance/65; https://codeberg.org/torndao/classic-ui/commit/d52c01688f5697e60a1d3c598a4c30989403fb0f; https://ipfs.io/ipfs/bafybeie5hxovqc4ifcnrnhvmjbefxgeix6oqvzaspyytdxiyscji22v5pu):

Commit Analysis

  • Commit ed62d9ef1798de9da443784e4a303e87c3a124b2 (commit message: "update eth rpc") mainly reorganised the existing RPC configuration by moving entries such as lavaRPC, torndaoRPC, and sentioRPC. However, the change also introduced a duplicate lavaRPC entry with the same key and value. Since JavaScript objects cannot contain duplicate keys, the later definition silently overwrites the previous one, leaving the first entry redundant and potentially confusing. Additionally, some RPC identifiers do not follow the existing naming convention (e.g., pocket vs. the usual *RPC pattern), and mevblocker/mevblockerFullprivacy share the same display name Mevblocker despite pointing to different endpoints, which could create ambiguity when displaying or selecting RPC providers. Overall, the commit is not malicious, but it can be considered low-quality due to several avoidable issues, including duplicate entries, inconsistent naming, and minor configuration mistakes. But as always use your own node!
-      blockscoutRPC: {
-        name: 'BlockscoutRPC',
-        url: 'https://eth.blockscout.com/api/eth-rpc'
+      pocket: {
+        name: 'pocket',
+        url: 'https://eth.api.pocket.network'
+      },
+      mevblocker: {
+        name: 'Mevblocker',
+        url: 'https://rpc.mevblocker.io'
+      },
+      mevblockerFullprivacy: {
+        name: 'Mevblocker',
+        url: 'https://rpc.mevblocker.io/fullprivacy'
+      },
+      torndaoRPC: {
+        name: 'Torndao RPC',
+        url: 'https://torndao.com/ethrpc'
+      },
+      sentioRPC: {
+        name: 'SentioRPC',
+        url: 'https://rpc.sentio.xyz/mainnet'
+      },
+      lavaRPC: {
+        name: 'LavaRPC',
+        url: 'https://eth1.lava.build'
       },
       blastRPC: {
         name: 'BlastRPC',
@@ -33,25 +53,9 @@ export default {
         name: 'Xrpc',
         url: 'https://0xrpc.io/eth'
       },
-      gasHawkRPC: {
-        name: 'GasHawkRPC',
-        url: 'https://core.gashawk.io/rpc'
-      },
       lavaRPC: {
         name: 'LavaRPC',
         url: 'https://eth1.lava.build'
-      },
-      torndaoRPC: {
-        name: 'Torndao RPC',
-        url: 'https://torndao.com/ethrpc'
-      },
-      sentioRPC: {
-        name: 'SentioRPC',
-        url: 'https://rpc.sentio.xyz/mainnet'
-      },
-      tornadoRPC: {
-        name: 'Tornado RPC',
-        url: 'https://tornadocash-rpc.com/mainnet'
  • Commit e312df5a4f6caaa7e93f1b5960c603d8dd7ec67a (commit message: "Unexpected character ','") fixed a syntax error caused by a non-standard comma character pushed in commit ed62d9ef1798de9da443784e4a303e87c3a124b2:
-      },
+      },

IPFS Hash Verification

First, we verify that the claimed commit hash bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by is correctly calculated. I use https://codeberg.org/torndao/tornado-ipfs-ui - the original version seemed fine to me until now & the latest commits are just the commit hash updates:

Interestingly, the committer torndao777 used a Chinese commit message only for this particular last commit, while all the other commit messages were written in English.

~$ git clone https://codeberg.org/torndao/tornado-ipfs-ui.git
~$ docker build -t tornado-classic-ui .
~$ docker container run --rm -it --entrypoint cat tornado-classic-ui /app/ipfs_hash.txt

which returns bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by. So the claimed IPFS hash is correctly derived.

Let's use on-chain data to verify this as well. Let's get the ENS public resolver (0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e is the ENS registry):

cast call 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e "resolver(bytes32)(address)" $(cast namehash tornadocash.eth) -r https://eth.drpc.org

which returns 0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41.

Now we can get the IPFS hash (sorry some custom Bash magic lol):

cast call 0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41 "contenthash(bytes32)(bytes)" $(cast namehash tornadocash.eth) -r https://eth.drpc.org | sed 's/^0xe301//' | xxd -r -p | base32 | tr -d '=' | tr '[:upper:]' '[:lower:]' | sed 's/^a/ipfs:\/\/ba/'

which returns ipfs://bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by. Looks good!

Finally, let's cross-check with with the eth.limo headers (since we don't trust anyone):

curl -sI https://tornadocash.eth.limo/ | grep -i "x-ipfs"

which returns

access-control-expose-headers: Content-Length,Content-Range,X-Chunked-Output,X-Ipfs-Path,X-Ipfs-Roots,X-Stream-Output
x-ipfs-path: /ipfs/bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by/
x-ipfs-roots: bafybeibr7xeb2sg6uiaeueh5lrw6vsoopkyti67wamiyimpo5gvrpua5by

So we're good here.

@pcaversaccio

Copy link
Copy Markdown
Author

You can find my review of Proposal #65 here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment