Chainhunters
Tornado Cash is een gedecentraliseerde applicatie (dApp) die draait op de Ethereum-blockchain. Het doel van Tornado Cash is simpel maar krachtig: het biedt gebruikers privacy door cryptotransacties moeilijk traceerbaar te maken. Denk aan een blender: als je verschillende ingrediënten in een blender gooit en het mengt, is het onmogelijk om achteraf precies te zeggen welk stukje ingrediënt waar vandaan kwam. Tornado Cash doet hetzelfde, maar dan met cryptotransacties. In deze blog duiken we technisch in de werking van Tornado Cash, bespreken we de juridische situatie rondom de eigenaar en laten we zien waarom de technologie zelf moeilijk te stoppen is, zelfs als de front-end websites offline worden gehaald. Hoe werkt Tornado Cash?
Laten we beginnen met de technische uitleg van hoe Tornado Cash werkt. Stel je voor dat je Ethereum-tokens (ETH) wilt versturen zonder dat iemand kan zien waar ze vandaan komen. Tornado Cash gebruikt een "mixer" die cryptovaluta van meerdere gebruikers samenvoegt. Door het combineren van deze tokens wordt het lastig om de herkomst en bestemming van individuele transacties te achterhalen. De kerntechnologie: Zero-Knowledge Proofs
Tornado Cash maakt gebruik van een cryptografische techniek genaamd Zero-Knowledge Proofs (ZKPs)
. Hiermee kun je bewijzen dat je recht hebt op een bepaalde actie (zoals het opnemen van tokens), zonder je identiteit of andere details te onthullen.
Hieronder een technische uitleg van hoe dit werkt in Tornado Cash:
De bedragen die je kan storten zijn als volgt:
Dit zorgt ervoor dat er dezelfde bedragen worden ingelegd, wat het moeilijk maakt om de eigenaar van een bepaalde storting / opname te achterhalen. Je maakt een storting naar het Tornado Cash smart contract door een specifiek bedrag, zoals 1 ETH, in te leggen. Bij de storting genereert Tornado Cash een willekeurige "note", bestaande uit een geheime sleutel en een publieke hash. De hash wordt opgeslagen in een "Merkle Tree" (een datastructuur die wordt gebruikt om cryptografische gegevens efficiënt te beheren).
function deposit(bytes32 _commitment) public payable { require(msg.value == 1 ether, "Invalid deposit amount"); commitments[_commitment] = true; emit Deposit(_commitment, block.timestamp); }
Om je ETH op te nemen, moet je bewijzen dat je eerder hebt gestort, zonder je identiteit bekend te maken. Dit doe je met een Zero-Knowledge Proof. De proof wordt geverifieerd door het smart contract, dat controleert of de opname legitiem is, zonder dat je hoeft te onthullen wie je bent.
function withdraw(bytes memory _proof, bytes32 _root, address _recipient) public { require(verifier.verifyProof(_proof, _root), "Invalid proof"); payable(_recipient).transfer(1 ether); emit Withdrawal(_recipient, block.timestamp); }
Doordat meerdere mensen tegelijkertijd dezelfde bedragen storten en opnemen, wordt het vrijwel onmogelijk om een directe link te leggen tussen een specifieke storting en opname.
Zoals gezegd kun je Tornado Cash vergelijken met een blender. Stel je voor dat vijf mensen elk een munt in een blender gooien. De blender mengt alles volledig door elkaar, en iedereen kan er later één munt uithalen. Omdat alle munten identiek zijn, weet niemand meer wie welke munt oorspronkelijk had.
De cryptografische "blender" van Tornado Cash maakt gebruik van complexe wiskundige technieken (zoals Merkle Trees en ZKPs) om ervoor te zorgen dat:
Een van de meest intrigerende aspecten van Tornado Cash is dat het decentralisatie in de kern belichaamt. De code van Tornado Cash draait op de blockchain, en de blockchain is ontworpen om onveranderlijk en censuurbestendig te zijn. Zelfs als overheden proberen de front-end websites zoals tornado.cash offline te halen, blijft het smart contract op de Ethereum-blockchain bestaan.
Iedereen met technische kennis kan een nieuwe front-end ontwikkelen die communiceert met hetzelfde contract. Dit maakt het praktisch onmogelijk om Tornado Cash volledig te stoppen.
Een heel hoogover voorbeeld van hoe iemand verbinding maakt met het smart contract via een eenvoudige Python-code:
from web3 import Web3 # Verbind met de Ethereum-blockchain w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID')) # Tornado Cash smart contract adres contract_address = '0x...' # ABI van het smart contract (nodig voor interactie) abi = [ { "constant": False, "inputs": [ {"name": "_proof", "type": "bytes"}, {"name": "_root", "type": "bytes32"}, {"name": "_recipient", "type": "address"} ], "name": "withdraw", "outputs": [], "type": "function" } ] contract = w3.eth.contract(address=contract_address, abi=abi) # Interactie met het contract def withdraw_funds(proof, root, recipient): tx = contract.functions.withdraw(proof, root, recipient).buildTransaction({ 'nonce': w3.eth.getTransactionCount('your_wallet_address'), 'gas': 2000000, 'gasPrice': w3.toWei('50', 'gwei') }) signed_tx = w3.eth.account.signTransaction(tx, private_key='your_private_key') w3.eth.sendRawTransaction(signed_tx.rawTransaction)
Ondanks dat Tornado Cash anonimiteit probeert te garanderen, zijn er manieren om te zien dat een wallet geld heeft ontvangen uit het Tornado Cash smart contract. Dit komt door de openheid van de blockchain: elke transactie die op Ethereum plaatsvindt, is publiekelijk zichtbaar en traceerbaar via blockchain-explorers zoals Etherscan. Dit betekent dat hoewel de afzender anoniem blijft, het ontvangen van fondsen vanuit Tornado Cash nog steeds te zien is.
Transacties zijn openbaar: Alle Ethereum-transacties worden vastgelegd op de blockchain, inclusief de interacties met het Tornado Cash smart contract. Als iemand geld opneemt uit Tornado Cash, wordt dat geregistreerd als een transactie die afkomstig is van het smart contract naar een specifieke wallet.
Smart contract-adres is bekend: Het Tornado Cash smart contract heeft een vast adres op de blockchain. Iedereen kan dit adres opzoeken, evenals de bijbehorende transacties. Wanneer je een wallet analyseert, kun je zien dat de fondsen afkomstig zijn van het Tornado Cash contract.
Voorbeeld van een Tornado Cash smart contract-adres:
Als je op Etherscan een wallet wilt controleren op fondsen afkomstig van Tornado Cash, volg je deze stappen:
Een hoogover voorbeeld van hoe een opname van Tornado Cash eruitziet op Etherscan:
Van: 0x910cbd523d972eb0a6f4cae4618ad62622b39dbf (Tornado Cash smart contract) Naar: 0xABC... (ontvanger) Bedrag: 1 ETH Gas: Betaald door de ontvanger
Dit heeft te maken met de aard van de Ethereum-blockchain:
Openbare blockchain: Ethereum is ontworpen om transparant te zijn. Iedereen kan de volledige geschiedenis van transacties bekijken en analyseren. Dit is een kernprincipe van blockchaintechnologie, maar het beperkt tegelijkertijd absolute anonimiteit.
Transacties zijn traceerbaar naar smart contracts: Hoewel Tornado Cash Zero-Knowledge Proofs gebruikt om de herkomst van het geld te verbergen, is de interactie met het smart contract zelf niet verborgen. Wanneer je geld opneemt, wordt het smart contract gezien als de afzender van de transactie.
Gebrek aan "mixing" in opname: Tornado Cash vermengt alleen de herkomst van de fondsen, maar de opname zelf wordt rechtstreeks uitgevoerd door het smart contract naar een specifieke wallet. Dit betekent dat iedereen kan zien dat een wallet geld van Tornado Cash heeft ontvangen.
Omdat het zichtbaar is dat een wallet geld van Tornado Cash heeft ontvangen, kunnen deze wallets worden gemarkeerd door externe partijen, zoals exchanges of overheden. Dit heeft geleid tot situaties waarin wallets die interactie hadden met Tornado Cash door platforms werden geblokkeerd of extra controle ondergingen.
Hoewel Tornado Cash gebruikers beschermt tegen directe herleidbaarheid van transacties, is het onmogelijk om volledig anoniem te blijven op een openbare blockchain zoals Ethereum. De technologie zorgt ervoor dat de oorsprong van de fondsen niet te achterhalen is, maar iedereen kan nog steeds zien dát fondsen afkomstig zijn van Tornado Cash. Dit benadrukt zowel de kracht als de beperkingen van privacytools op blockchainnetwerken.
In 2024 werd een van de ontwikkelaars van Tornado Cash veroordeeld wegens het faciliteren van witwassen. De Nederlandse rechtbank legde een gevangenisstraf op omdat Tornado Cash werd gebruikt om miljarden dollars aan illegale cryptotransacties te verbergen. Dit roept de vraag op: in hoeverre is een ontwikkelaar verantwoordelijk voor hoe een technologie wordt gebruikt?
De zaak illustreert de complexe juridische en ethische dilemma's rondom privacytools en gedecentraliseerde technologie. Tornado Cash zelf is slechts een stuk code – neutraal en zonder moreel oordeel. Toch is de implementatie ervan een voorbeeld geworden van hoe technologie zowel kan worden gebruikt voor privacy als voor criminele activiteiten.
Link naar de zaak: Ontwikkelaar Tornado Cash veroordeeld