use tornado proxy, fix docker

This commit is contained in:
poma 2020-11-04 19:01:51 +03:00
parent 6e9e08fb6b
commit d22837d2bf
No known key found for this signature in database
GPG Key ID: BA20CB01FE165657
7 changed files with 307 additions and 126 deletions

@ -10,4 +10,5 @@ COPY package.json yarn.lock ./
RUN --mount=type=ssh yarn && yarn cache clean --force RUN --mount=type=ssh yarn && yarn cache clean --force
COPY . . COPY . .
EXPOSE 8000
ENTRYPOINT ["yarn"] ENTRYPOINT ["yarn"]

171
abis/tornadoProxyABI.json Normal file

@ -0,0 +1,171 @@
[
{
"inputs": [
{
"internalType": "bytes32",
"name": "_tornadoTrees",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_governance",
"type": "bytes32"
},
{
"internalType": "contract ITornado[]",
"name": "_instances",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "governance",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ITornado",
"name": "",
"type": "address"
}
],
"name": "instances",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "node",
"type": "bytes32"
}
],
"name": "resolve",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tornadoTrees",
"outputs": [
{
"internalType": "contract ITornadoTrees",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ITornado",
"name": "tornado",
"type": "address"
},
{
"internalType": "bytes32",
"name": "commitment",
"type": "bytes32"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ITornado",
"name": "instance",
"type": "address"
},
{
"internalType": "bool",
"name": "update",
"type": "bool"
}
],
"name": "updateInstances",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ITornado",
"name": "tornado",
"type": "address"
},
{
"internalType": "bytes",
"name": "proof",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "root",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "nullifierHash",
"type": "bytes32"
},
{
"internalType": "address payable",
"name": "recipient",
"type": "address"
},
{
"internalType": "address payable",
"name": "relayer",
"type": "address"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "refund",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
]

@ -1,98 +0,0 @@
version: '2'
services:
kovan:
image: tornadocash/relayer
restart: always
command: server
env_file: .env
expose: [8000]
environment:
VIRTUAL_HOST: example.duckdns.org
LETSENCRYPT_HOST: example.duckdns.org
REDIS_URL: redis://redis/0
nginx_proxy_read_timeout: 600
depends_on:
- redis
treeWatcher:
image: tornadocash/relayer
restart: always
command: treeWatcher
env_file: .env
environment:
REDIS_URL: redis://redis/0
priceWatcher:
image: tornadocash/relayer
restart: always
command: priceWatcher
env_file: .env
environment:
REDIS_URL: redis://redis/0
worker1:
image: tornadocash/relayer
restart: always
command: worker
env_file: .env
environment:
REDIS_URL: redis://redis/0
# worker2:
# image: tornadocash/relayer
# restart: always
# command: worker
# env_file: .env
# environment:
# PRIVATE_KEY: qwe
# REDIS_URL: redis://redis/0
redis:
image: redis
restart: always
command: [redis-server, --appendonly, 'yes']
volumes:
- redis:/data
nginx:
image: nginx:alpine
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
volumes:
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs
logging:
driver: none
dockergen:
image: poma/docker-gen
container_name: dockergen
restart: always
command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
volumes_from:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt
restart: always
environment:
NGINX_DOCKER_GEN_CONTAINER: dockergen
volumes_from:
- nginx
- dockergen
volumes:
conf:
vhost:
html:
certs:
redis:

62
docker-compose.test.yml Normal file

@ -0,0 +1,62 @@
version: '2'
# ssh-agent && ssh-add -K ~/.ssh/id_rsa
# DOCKER_BUILDKIT=1 docker build --ssh default -t tornadocash/relayer .
services:
server:
image: tornadocash/relayer
restart: always
command: server
env_file: .env
ports:
- 8000:8000
environment:
REDIS_URL: redis://redis/0
nginx_proxy_read_timeout: 600
depends_on: [ redis ]
treeWatcher:
image: tornadocash/relayer
restart: always
command: treeWatcher
env_file: .env
environment:
REDIS_URL: redis://redis/0
depends_on: [ redis ]
priceWatcher:
image: tornadocash/relayer
restart: always
command: priceWatcher
env_file: .env
environment:
REDIS_URL: redis://redis/0
depends_on: [ redis ]
worker1:
image: tornadocash/relayer
restart: always
command: worker
env_file: .env
environment:
REDIS_URL: redis://redis/0
depends_on: [ redis ]
# worker2:
# image: tornadocash/relayer
# restart: always
# command: worker
# env_file: .env
# environment:
# PRIVATE_KEY: qwe
# REDIS_URL: redis://redis/0
redis:
image: redis
restart: always
command: [redis-server, --appendonly, 'yes']
volumes:
- redis:/data
volumes:
redis:

@ -6,13 +6,12 @@ services:
restart: always restart: always
command: server command: server
env_file: .env env_file: .env
expose: [ 8000 ]
ports: [ 8000 ]
environment: environment:
VIRTUAL_HOST: example.duckdns.org
LETSENCRYPT_HOST: example.duckdns.org
REDIS_URL: redis://redis/0 REDIS_URL: redis://redis/0
nginx_proxy_read_timeout: 600 nginx_proxy_read_timeout: 600
depends_on: depends_on: [ redis ]
- redis
treeWatcher: treeWatcher:
image: tornadocash/relayer image: tornadocash/relayer
@ -21,6 +20,7 @@ services:
env_file: .env env_file: .env
environment: environment:
REDIS_URL: redis://redis/0 REDIS_URL: redis://redis/0
depends_on: [ redis ]
priceWatcher: priceWatcher:
image: tornadocash/relayer image: tornadocash/relayer
@ -29,6 +29,7 @@ services:
env_file: .env env_file: .env
environment: environment:
REDIS_URL: redis://redis/0 REDIS_URL: redis://redis/0
depends_on: [ redis ]
worker1: worker1:
image: tornadocash/relayer image: tornadocash/relayer
@ -37,15 +38,16 @@ services:
env_file: .env env_file: .env
environment: environment:
REDIS_URL: redis://redis/0 REDIS_URL: redis://redis/0
depends_on: [ redis ]
# worker2: # worker2:
# image: tornadocash/relayer # image: tornadocash/relayer
# restart: always # restart: always
# command: worker # command: worker
# env_file: .env # env_file: .env
# environment: # environment:
# PRIVATE_KEY: qwe # PRIVATE_KEY: qwe
# REDIS_URL: redis://redis/0 # REDIS_URL: redis://redis/0
redis: redis:
image: redis image: redis
@ -54,6 +56,44 @@ services:
volumes: volumes:
- redis:/data - redis:/data
volumes: nginx:
redis: image: nginx:alpine
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
volumes:
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs
logging:
driver: none
dockergen:
image: poma/docker-gen
container_name: dockergen
restart: always
command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
volumes_from:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt
restart: always
environment:
NGINX_DOCKER_GEN_CONTAINER: dockergen
volumes_from:
- nginx
- dockergen
volumes:
conf:
vhost:
html:
certs:
redis:

@ -10,6 +10,7 @@ module.exports = {
oracleRpcUrl: process.env.ORACLE_RPC_URL || 'https://mainnet.infura.io/', oracleRpcUrl: process.env.ORACLE_RPC_URL || 'https://mainnet.infura.io/',
oracleAddress: '0xA2b8E7ee7c8a18ea561A5CF7C9C365592026E374', oracleAddress: '0xA2b8E7ee7c8a18ea561A5CF7C9C365592026E374',
minerAddress: '0x3E0a9C6Cf76136862De28ce25a56cDBF38EF9D37', // each network has its own instance minerAddress: '0x3E0a9C6Cf76136862De28ce25a56cDBF38EF9D37', // each network has its own instance
tornadoProxyAddress: '0x98529F6FaE5AdaFfa0AaDA37d9017AF9a4281E13', // each network has its own instance
swapAddress: '0x1E73e0a484a595B692f3d212642AE4B3BF30E7e3', swapAddress: '0x1E73e0a484a595B692f3d212642AE4B3BF30E7e3',
minerMerkleTreeHeight: 20, minerMerkleTreeHeight: 20,
privateKey: process.env.PRIVATE_KEY, privateKey: process.env.PRIVATE_KEY,

@ -6,7 +6,7 @@ const Redis = require('ioredis')
const { GasPriceOracle } = require('gas-price-oracle') const { GasPriceOracle } = require('gas-price-oracle')
const { Utils } = require('tornado-cash-anonymity-mining') const { Utils } = require('tornado-cash-anonymity-mining')
const tornadoABI = require('../abis/tornadoABI.json') const tornadoProxyABI = require('../abis/tornadoProxyABI.json')
const miningABI = require('../abis/mining.abi.json') const miningABI = require('../abis/mining.abi.json')
const swapABI = require('../abis/swap.abi.json') const swapABI = require('../abis/swap.abi.json')
const { queue } = require('./queue') const { queue } = require('./queue')
@ -19,6 +19,7 @@ const {
privateKey, privateKey,
swapAddress, swapAddress,
minerAddress, minerAddress,
tornadoProxyAddress,
gasLimits, gasLimits,
instances, instances,
tornadoServiceFee, tornadoServiceFee,
@ -168,20 +169,23 @@ async function checkMiningFee({ args }) {
} }
function getTxObject({ data }) { function getTxObject({ data }) {
let [ABI, contractAddress, value, args] = if (data.type === jobType.TORNADO_WITHDRAW) {
data.type === jobType.TORNADO_WITHDRAW const contract = new web3.eth.Contract(tornadoProxyABI, tornadoProxyAddress)
? [tornadoABI, data.contract, data.args[5], data.args] const calldata = contract.methods.withdraw(data.contract, data.proof, ...data.args).encodeABI()
: [miningABI, minerAddress, 0, [data.args]]
const method = data.type !== jobType.MINING_REWARD ? 'withdraw' : 'reward'
const contract = new web3.eth.Contract(ABI, contractAddress)
const calldata = contract.methods[method](data.proof, ...args).encodeABI()
return { return {
value, value: data.args[5],
to: contractAddress, to: tornadoProxyAddress,
data: calldata
}
} else {
const contract = new web3.eth.Contract(miningABI, minerAddress)
const method = data.type === jobType.MINING_REWARD ? 'reward' : 'withdraw'
const calldata = contract.methods[method](data.proof, data.args).encodeABI()
return {
to: minerAddress,
data: calldata, data: calldata,
} }
}
} }
async function process(job) { async function process(job) {