Tornado Cash est une solution de confidentialité Ethereum et ERC20 non dépositaire basée sur zkSNARK. Il améliore la confidentialité des transactions en rompant le lien en chaîne entre les adresses du destinataire et de destination. Il utilise un contrat intelligent qui accepte les dépôts ETH pouvant être retirés à une adresse différente. Chaque fois que l'ETH est retiré par la nouvelle adresse, il n'y a aucun moyen de lier le retrait au dépôt, garantissant ainsi une confidentialité totale.
Pour effectuer un dépôt, l'utilisateur génère un secret et envoie son hachage (appelé engagement) ainsi que le montant du dépôt au contrat intelligent Tornado. Le contrat accepte le dépôt et ajoute l'engagement à sa liste de dépôts.
Plus tard, l'utilisateur décide d'effectuer un retrait. Pour ce faire, l'utilisateur doit fournir une preuve qu'il possède le secret d'un engagement non dépensé dans la liste des dépôts du contrat intelligent. La technologie zkSnark permet que cela se produise sans révéler quel dépôt exact correspond à ce secret. Le contrat intelligent vérifiera la preuve et transférera les fonds déposés à l'adresse indiquée pour le retrait. Un observateur extérieur ne sera pas en mesure de déterminer de quel dépôt provient ce retrait.
Vous pouvez en savoir plus à ce sujet dans cet article Medium
TornadoCash_whitepaper_v1.4.pdf
Les protocoles, circuits et contrats intelligents Tornado.cash ont été audités par un groupe d'experts d'ABDK Consulting, spécialisé dans la connaissance zéro, la cryptographie et les contrats intelligents.
Au cours de l'audit, aucun problème critique n'a été détecté et tous les problèmes en suspens ont été résolus. Les résultats peuvent être trouvés ici :
La dépendance sous-jacente à Circomlib est actuellement en cours d'audit et l'équipe a déjà publié la plupart des correctifs pour les problèmes détectés.
node v11.15.0
npm install -g npx
Vous pouvez voir un exemple d'utilisation dans cli.js, cela fonctionne à la fois dans la console et dans le navigateur.
npm install
cp .env.example .env
npm run build
- cela peut prendre 10 minutes ou plusnpx ganache-cli
npm run test
- exécute éventuellement des tests. Il peut échouer du premier coup, il suffit de le réexécuter.Utilisez la version du navigateur sur Kovan :
vi .env
- ajoutez votre clé privée Kovan pour déployer des contratsnpm run migrate
npx http-server
- sert le répertoire actuel, vous pouvez utiliser n'importe quel autre serveur http statiquelocalhost:8080
Utilisez la version en ligne de commande. Fonctionne pour Ganache, Kovan et Mainnet :
cp .env.example .env
npm run download
npm run build:contract
ganache-cli -i 1337
npm run migrate:dev
./cli.js test
./cli.js --help
2041cfa5fa0b71cd5cca9022a4eeea4afe28c9f7
afin de fonctionner avec une configuration locale approuvée. Tornado-cli utilise le commit 4c0af6a8b65aabea3c09f377f63c44e7a58afa6d
avec une configuration de production approuvée de tornadoCashExemple:
./cli.js deposit ETH 0.1 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448
Votre remarque : tornade-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e 6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 Le solde ETH du compte Tornado est de 8,9. Le solde ETH du compte expéditeur est de 1004873.470619891361352542. Soumission d'une transaction de dépôt. Le solde ETH du compte Tornado est de 9. Le solde ETH du compte expéditeur est de 1004873.361652048361352542.
./cli.js withdraw tornado-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 0x8589427373D6D84E98730D7795D8f6f8731FDA16 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448 --relayer https://kovan-frelay.duckdns.org
Adresse du relais : 0x6A31736e7490AbE5D5676be059DFf064AB4aC754 Obtention de l'état actuel du contrat tornade Génération de la preuve SNARK Temps de preuve : 9117,051 ms Envoi de la transaction de retrait via le relais Transaction soumise via le relais. Afficher la transaction sur etherscan https://kovan.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b Transaction extraite dans le bloc 17036120 terminé
cp .env.example .env
npx truffle migrate --network kovan --reset --f 2 --to 4
cp .env.example .env
npx truffle migrate --network kovan --reset --f 2 --to 3
npx truffle migrate --network kovan --reset --f 5
Note . Si vous souhaitez réutiliser le même vérificateur pour toutes les instances, après avoir déployé l'une des instances, vous ne devez exécuter que la 4ème ou la 5ème migration pour les contrats ETH ou ERC20 respectivement ( --f 4 --to 4
ou --f 5
).
Resolver
(2) Contract
. Cliquez sur Read Contract
et faites défiler jusqu'à la méthode 5. text
.Query
et vous obtiendrez le nom DNS. Ajoutez-y simplement https://
et utilisez-le comme relayer url
Un merci spécial à @barryWhiteHat et @kobigurk pour leurs précieuses contributions, et à @jbaylina pour le superbe framework Circom & Websnark
npm i
ganache-cli -d
npm run download
npm run build:contract
cp .env.example .env
npm run migrate:dev
node minimal-demo.js
Préparer l'environnement de test :
yarn install
yarn download
cp .env.example .env
npx ganache-cli > /dev/null &
npm run migrate:dev
Exécutez des tests :
yarn test
Couverture d'exécution :
yarn coverage
cargo install zkutil
npx circom circuits/withdraw.circom -o build/circuits/withdraw.json
zkutil setup -c build/circuits/withdraw.json -p build/circuits/withdraw.params
zkutil export-keys -c build/circuits/withdraw.json -p build/circuits/withdraw.params -r build/circuits/withdraw_proving_key.json -v build/circuits/withdraw_verification_key.json
zkutil generate-verifier -p build/circuits/withdraw.params -v build/circuits/Verifier.sol
sed -i -e ' s/pragma solidity ^0.6.0/pragma solidity 0.5.17/g ' ./build/circuits/Verifier.sol