Tornado Cash es una solución de privacidad sin custodia de Ethereum y ERC20 basada en zkSNARK. Mejora la privacidad de las transacciones al romper el vínculo en cadena entre las direcciones del destinatario y de destino. Utiliza un contrato inteligente que acepta depósitos de ETH que pueden retirarse mediante una dirección diferente. Siempre que se retira ETH a través de la nueva dirección, no hay forma de vincular el retiro al depósito, lo que garantiza total privacidad.
Para realizar un depósito, el usuario genera un secreto y envía su hash (llamado compromiso) junto con el monto del depósito al contrato inteligente Tornado. El contrato acepta el depósito y agrega el compromiso a su lista de depósitos.
Posteriormente, el usuario decide realizar un retiro. Para ello, el usuario debe proporcionar una prueba de que posee un secreto de un compromiso no gastado de la lista de depósitos del contrato inteligente. La tecnología zkSnark permite que eso suceda sin revelar qué depósito exacto corresponde a este secreto. El contrato inteligente verificará la prueba y transferirá los fondos depositados a la dirección especificada para el retiro. Un observador externo no podrá determinar de qué depósito provino este retiro.
Puedes leer más sobre esto en este artículo de Medium.
TornadoCash_whitepaper_v1.4.pdf
Los protocolos, circuitos y contratos inteligentes de Tornado.cash fueron auditados por un grupo de expertos de ABDK Consulting, especializados en conocimiento cero, criptografía y contratos inteligentes.
Durante la auditoría, no se encontraron problemas críticos y se solucionaron todos los problemas pendientes. Los resultados se pueden encontrar aquí:
Actualmente se está auditando la dependencia subyacente de circomlib y el equipo ya publicó la mayoría de las correcciones para los problemas encontrados.
node v11.15.0
npm install -g npx
Puede ver un ejemplo de uso en cli.js, funciona tanto en la consola como en el navegador.
npm install
cp .env.example .env
npm run build
: esto puede tardar 10 minutos o másnpx ganache-cli
npm run test
: opcionalmente ejecuta pruebas. Puede fallar en el primer intento, simplemente ejecútelo nuevamente.Utilice la versión del navegador en Kovan:
vi .env
: agregue su clave privada de Kovan para implementar contratosnpm run migrate
npx http-server
: sirve el directorio actual, puede usar cualquier otro servidor http estáticolocalhost:8080
Utilice la versión de línea de comandos. Funciona para Ganache, Kovan y 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 trabajar con la configuración local confiable. Tornado-cli utiliza el compromiso 4c0af6a8b65aabea3c09f377f63c44e7a58afa6d
con la configuración confiable de producción de tornadoCashEjemplo:
./cli.js deposit ETH 0.1 --rpc https://kovan.infura.io/v3/27a9649f826b4e31a83e07ae09a87448
Tu nota: tornado-eth-0.1-42-0xf73dd6833ccbcc046c44228c8e2aa312bf49e08389dadc7c65e 6a73239867b7ef49c705c4db227e2fadd8489a494b6880bdcb6016047e019d1abec1c7652 El saldo de Tornado ETH es 8.9 El saldo de ETH de la cuenta del remitente es 1004873.470619891361352542 Al enviar la transacción de depósito El saldo de Tornado ETH es 9 El saldo de ETH de la cuenta del remitente es 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
Dirección de retransmisión: 0x6A31736e7490AbE5D5676be059DFf064AB4aC754 Obteniendo el estado actual del contrato de tornado Generando prueba SNARK Tiempo de prueba: 9117.051ms Envío de transacción de retiro a través del retransmisión Transacción enviada a través del retransmisión. Ver transacción en etherscan https://kovan.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b Transacción extraída en el bloque 17036120 Hecho
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
Nota . Si desea reutilizar el mismo verificador para todas las instancias, después de implementar una de las instancias, solo debe ejecutar la cuarta o quinta migración para contratos ETH o ERC20 respectivamente ( --f 4 --to 4
o --f 5
).
Resolver
(2)Contract
. Haga clic en Read Contract
y desplácese hacia abajo hasta el 5. text
.Query
y obtendrá el nombre DNS. Simplemente agregue https://
y utilícelo como relayer url
Un agradecimiento especial a @barryWhiteHat y @kobigurk por sus valiosos aportes, y a @jbaylina por el increíble marco Circom y 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
Preparar el entorno de prueba:
yarn install
yarn download
cp .env.example .env
npx ganache-cli > /dev/null &
npm run migrate:dev
Ejecutar pruebas:
yarn test
Ejecutar cobertura:
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