C

Chainhunters

20 min
Witwassen
tornado-cash
solidity
sancties
witwassen
aml
Tornado Cash Uitgelegd
Tornado Cash is een gedecentraliseerde applicatie op de Ethereum-blockchain die gebruikers privacy biedt door cryptotransacties te mengen met behulp van Zero-Knowledge Proofs, waardoor de anonimiteit van transacties wordt gegarandeerd zonder de identiteit van de betrokken partijen prijs te geven.

Wat is Tornado Cash?

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:

Storten van ETH:

De bedragen die je kan storten zijn als volgt:

  • 0.1 ETH
  • 1 ETH
  • 10 ETH
  • 100 ETH

tornado-cash-storten.png

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);
}

Opnemen van ETH:

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);
}

Anoniemiteit:

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.

Vergelijking met een Blender

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:

  • De storting en opname volledig worden losgekoppeld.
  • Niemand buiten het systeem kan achterhalen wie welke opname heeft gedaan.

blender.png

Waarom blijft Tornado Cash bestaan?

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)

Hoe kun je zien dat iemand geld heeft ontvangen van Tornado Cash op Etherscan?

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.

Hoe werkt dit?

  • 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:

    Tornado Cash 10 ETH contract

balance.png

  • Geen metadata in de transactie: Hoewel de opname geen metadata bevat die de oorspronkelijke afzender identificeert (dankzij Zero-Knowledge Proofs), is het ontvangen bedrag en het smart contract waar het vandaan komt zichtbaar. Dit betekent dat je kunt zien dát de wallet geld heeft ontvangen van Tornado Cash, maar niet wie de oorspronkelijke storting heeft gedaan.

Zoekproces op Etherscan

Als je op Etherscan een wallet wilt controleren op fondsen afkomstig van Tornado Cash, volg je deze stappen:

  • Zoek de wallet op via het zoekveld van Etherscan.
  • Bekijk de "Transaction History".
  • Zoek naar internal transactions waarbij de afzender het Tornado Cash smart contract is.

etherscan.png

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

Waarom kun je dit zien?

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.

Implicaties

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.

Vervolging van Tornado Cash-eigenaar

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