Tornado Cash é uma solução de privacidade Ethereum e ERC20 sem custódia baseada em zkSNARKs. Ele melhora a privacidade das transações ao quebrar o link da cadeia entre o destinatário e os endereços de destino. Utiliza um contrato inteligente que aceita depósitos ETH que podem ser sacados em um endereço diferente. Sempre que o ETH é sacado pelo novo endereço, não há como vincular o saque ao depósito, garantindo total privacidade.
Para fazer um depósito, o usuário gera um segredo e envia seu hash (chamado de compromisso) junto com o valor do depósito para o contrato inteligente Tornado. O contrato aceita o depósito e adiciona o compromisso à sua lista de depósitos.
Posteriormente, o usuário decide fazer um saque. Para fazer isso, o usuário deve fornecer uma prova de que possui o segredo de um compromisso não gasto da lista de depósitos do contrato inteligente. A tecnologia zkSnark permite que isso aconteça sem revelar qual depósito exato corresponde a esse segredo. O contrato inteligente verificará o comprovante e transferirá os fundos depositados para o endereço especificado para retirada. Um observador externo não será capaz de determinar de qual depósito veio esse saque.
Você pode ler mais sobre isso neste artigo do Medium
TornadoCash_whitepaper_v1.4.pdf
Os protocolos, circuitos e contratos inteligentes do Tornado.cash foram auditados por um grupo de especialistas da ABDK Consulting, especializada em conhecimento zero, criptografia e contratos inteligentes.
Durante a auditoria, nenhum problema crítico foi encontrado e todos os problemas pendentes foram corrigidos. Os resultados podem ser encontrados aqui:
A dependência subjacente do circcomlib está sendo auditada e a equipe já publicou a maioria das correções para os problemas encontrados
node v11.15.0
npm install -g npx
Você pode ver um exemplo de uso em cli.js, funciona tanto no console quanto no navegador.
npm install
cp .env.example .env
npm run build
– isso pode levar 10 minutos ou maisnpx ganache-cli
npm run test
- opcionalmente executa testes. Pode falhar na primeira tentativa, basta executá-lo novamente.Use a versão do navegador no Kovan:
vi .env
- adicione sua chave privada Kovan para implantar contratosnpm run migrate
npx http-server
- serve o diretório atual, você pode usar qualquer outro servidor http estáticolocalhost:8080
Use a versão da linha de comando. Funciona para Ganache, Kovan e 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
commit hash para trabalhar com configuração confiável local. Tornado-cli usa 4c0af6a8b65aabea3c09f377f63c44e7a58afa6d
commit com configuração confiável de produção do tornadoCashExemplo:
./cli.js deposit ETH 0.1 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448
Sua nota: tornado-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e 6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 O saldo do Tornado ETH é 8,9 O saldo ETH da conta do remetente é 1004873,470619891361352542 Enviando transação de depósito O saldo do Tornado ETH é 9 O saldo ETH da conta do remetente é 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
Endereço do relé: 0x6A31736e7490AbE5D5676be059DFf064AB4aC754 Obtendo o estado atual do contrato de tornado Gerando prova SNARK Tempo de prova: 9117.051ms Enviando transação de retirada através do relé Transação enviada através do relé. Ver transação no etherscan https://kovan.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b Transação extraída no bloco 17036120 Concluído
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
Observação . Se você quiser reutilizar o mesmo verificador para todas as instâncias, depois de implantar uma das instâncias, você deverá executar apenas a 4ª ou 5ª migração para contratos ETH ou ERC20 respectivamente ( --f 4 --to 4
ou --f 5
).
Resolver
(2) Contract
. Clique em Read Contract
e role para baixo até o método 5. text
.Query
e você obterá o nome DNS. Basta adicionar https://
a ele e usá-lo como relayer url
Agradecimentos especiais a @barryWhiteHat e @kobigurk pelas valiosas contribuições, e @jbaylina pela incrível estrutura 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
Prepare o ambiente de teste:
yarn install
yarn download
cp .env.example .env
npx ganache-cli > /dev/null &
npm run migrate:dev
Execute testes:
yarn test
Cobertura de execução:
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