Simple blockchain rpc proxy implementation instead of centralized server
This commit is contained in:
commit
7defc1e814
|
@ -0,0 +1,7 @@
|
|||
.idea/
|
||||
node_modules/
|
||||
.DS_Store
|
||||
**/keys*.store
|
||||
**/signature
|
||||
**/params
|
||||
src/tss/multi-party-ecdsa/
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"name": "bridge",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"dotenv": "8.0.0",
|
||||
"truffle-hdwallet-provider": "1.0.10",
|
||||
"web3": "1.0.0-beta.55"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
RPC_URL=https://sokol.poa.network
|
||||
RPC_URL_DEV=http://127.0.0.1:7545
|
||||
|
||||
PRIVATE_KEY=e49fe947f224ae8e126c41b1be3e52be701509c2366e835ea8c08651f91030e0
|
||||
PRIVATE_KEY_DEV=dc8f77f02a4aba01c3ff0aa22ff13b7c9fd47da936db8d7f0a69abd3198a8c7e
|
||||
|
||||
THRESHOLD=2
|
||||
PARTIES=6
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,24 @@
|
|||
pragma solidity ^0.5.9;
|
||||
|
||||
contract Migrations {
|
||||
address public owner;
|
||||
|
||||
uint public last_completed_migration;
|
||||
|
||||
modifier restricted() {
|
||||
if (msg.sender == owner) _;
|
||||
}
|
||||
|
||||
constructor() public {
|
||||
owner = msg.sender;
|
||||
}
|
||||
|
||||
function setCompleted(uint completed) restricted public {
|
||||
last_completed_migration = completed;
|
||||
}
|
||||
|
||||
function upgrade(address new_address) restricted public {
|
||||
Migrations upgraded = Migrations(new_address);
|
||||
upgraded.setCompleted(last_completed_migration);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
pragma solidity ^0.5.0;
|
||||
|
||||
contract SharedDB {
|
||||
uint32 threshold;
|
||||
uint32 parties;
|
||||
uint32 signupKeygenID;
|
||||
uint32 signupKeygenCurrent;
|
||||
uint32 signupSignID;
|
||||
uint32 signupSignCurrent;
|
||||
mapping(bytes32 => string) public db;
|
||||
|
||||
event SignupKeygen(address indexed from, uint32 uuid, uint32 number);
|
||||
event SignupSign(address indexed from, uint32 uuid, uint32 number);
|
||||
|
||||
constructor(uint32 _threshold, uint32 _parties) public {
|
||||
threshold = _threshold;
|
||||
parties = _parties;
|
||||
signupKeygenID = 1;
|
||||
signupSignID = 0x80000000;
|
||||
}
|
||||
|
||||
function set(bytes32 key, string memory value) public {
|
||||
db[key] = value;
|
||||
}
|
||||
|
||||
function signupKeygen() public {
|
||||
if (signupKeygenCurrent < parties) {
|
||||
signupKeygenCurrent++;
|
||||
}
|
||||
else {
|
||||
signupKeygenID++;
|
||||
signupKeygenCurrent = 1;
|
||||
}
|
||||
emit SignupKeygen(msg.sender, signupKeygenID, signupKeygenCurrent);
|
||||
}
|
||||
|
||||
function signupSign() public {
|
||||
if (signupSignCurrent < threshold + 1) {
|
||||
signupSignCurrent++;
|
||||
}
|
||||
else {
|
||||
signupSignID++;
|
||||
signupSignCurrent = 1;
|
||||
}
|
||||
emit SignupSign(msg.sender, signupSignID, signupSignCurrent);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
const Migrations = artifacts.require('Migrations')
|
||||
|
||||
module.exports = deployer => {
|
||||
deployer.deploy(Migrations)
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
require('dotenv').config()
|
||||
|
||||
const Migrations = artifacts.require('SharedDB')
|
||||
|
||||
const { THRESHOLD, PARTIES } = process.env
|
||||
|
||||
module.exports = deployer => {
|
||||
deployer.deploy(Migrations, THRESHOLD, PARTIES)
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
require('dotenv').config()
|
||||
|
||||
const PrivateKeyProvider = require('truffle-hdwallet-provider')
|
||||
|
||||
const { RPC_URL, PRIVATE_KEY, RPC_URL_DEV, PRIVATE_KEY_DEV } = process.env
|
||||
|
||||
module.exports = {
|
||||
networks: {
|
||||
development: {
|
||||
provider: new PrivateKeyProvider(PRIVATE_KEY_DEV, RPC_URL_DEV),
|
||||
network_id: '33'
|
||||
},
|
||||
staging: {
|
||||
provider: new PrivateKeyProvider(PRIVATE_KEY, RPC_URL),
|
||||
network_id: '77'
|
||||
}
|
||||
},
|
||||
compilers: {
|
||||
solc: {
|
||||
version: '0.5.9',
|
||||
settings: {
|
||||
optimizer: {
|
||||
enabled: true,
|
||||
runs: 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
const Web3 = require('web3')
|
||||
|
||||
const web3 = new Web3('https://sokol.poa.network')
|
||||
|
||||
async function main () {
|
||||
console.log(await web3.eth.getBalance('0x48138BEC745673Fe2CE28C62c9944Ab0Fa56b495'))
|
||||
}
|
||||
|
||||
main()
|
|
@ -0,0 +1,14 @@
|
|||
THRESHOLD=2
|
||||
PARTIES=6
|
||||
|
||||
KEY_FILE=keys.store
|
||||
|
||||
#RPC_URL=https://sokol.poa.network
|
||||
RPC_URL=http://host.docker.internal:7545
|
||||
|
||||
SHARED_DB_ADDRESS=0x213b9cF674ef08E1E30A55f679Dfa55a16494975
|
||||
|
||||
#VALIDATOR_PRIVATE_KEY=d1e7b8ff274e517e1a332f2bc0ac051e30db196ba31c68c2efcd022e8ec358f1
|
||||
VALIDATOR_PRIVATE_KEY=72c16a6812258f999190ccb11ff8bfc1e9f07438c8411f8840dbbe18137785e2
|
||||
|
||||
#SSM_URL=http://127.0.0.1:8001
|
|
@ -0,0 +1,135 @@
|
|||
version: '3.7'
|
||||
services:
|
||||
proxy1:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=e2c1349f1d13f22cd011a9cfef7007388b8df16a6e1f318517cb93dbadcd9c2e
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net1
|
||||
proxy2:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=7562a3ea655c2aad92a819069d334e7cf6edc9d2ae0fcc9a6498bd38842fafd4
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net2
|
||||
proxy3:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=955b1f58a207160459e3be344e8a9cae2c3db47a0cb8275eb771a51da84de244
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net3
|
||||
proxy4:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=a1c08300192fdd27aa92cd836ca98601c35184319c6873b1d1478f21cdb1c867
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net4
|
||||
proxy5:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=3aef900c61246653308ed0770f3bd67a1c21342cf2a7dbf0ee5bcc787b627de0
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net5
|
||||
proxy6:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY=abe7f999209549463e7da719eddd6bb3e00fe77832f5166c1e57d067452954b6
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net6
|
||||
keygen1:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy1:8001'
|
||||
volumes:
|
||||
- './keys1.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net1
|
||||
keygen2:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy2:8001'
|
||||
volumes:
|
||||
- './keys2.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net2
|
||||
keygen3:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy3:8001'
|
||||
volumes:
|
||||
- './keys3.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net3
|
||||
keygen4:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy4:8001'
|
||||
environment:
|
||||
- SKIP_SIGN=true
|
||||
volumes:
|
||||
- './keys4.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net4
|
||||
keygen5:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy5:8001'
|
||||
environment:
|
||||
- SKIP_SIGN=true
|
||||
volumes:
|
||||
- './keys5.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net5
|
||||
keygen6:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy6:8001'
|
||||
environment:
|
||||
- SKIP_SIGN=true
|
||||
volumes:
|
||||
- './keys6.store:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net6
|
||||
networks:
|
||||
keygen-proxy-net1:
|
||||
keygen-proxy-net2:
|
||||
keygen-proxy-net3:
|
||||
keygen-proxy-net4:
|
||||
keygen-proxy-net5:
|
||||
keygen-proxy-net6:
|
|
@ -0,0 +1,24 @@
|
|||
version: '3.7'
|
||||
services:
|
||||
proxy:
|
||||
image: blockchain-proxy
|
||||
build: ./proxy
|
||||
environment:
|
||||
- RPC_URL
|
||||
- SHARED_DB_ADDRESS
|
||||
- VALIDATOR_PRIVATE_KEY
|
||||
volumes:
|
||||
- '../deploy/build/contracts:/proxy/contracts_data'
|
||||
networks:
|
||||
- keygen-proxy-net
|
||||
keygen:
|
||||
image: keygen-client
|
||||
build: ./tss-keygen
|
||||
command: 'http://proxy:8001'
|
||||
volumes:
|
||||
- './${KEY_FILE}:/tss/keys.store'
|
||||
- './params:/tss/params'
|
||||
networks:
|
||||
- keygen-proxy-net
|
||||
networks:
|
||||
keygen-proxy-net:
|
|
@ -0,0 +1,7 @@
|
|||
version: '3.7'
|
||||
services:
|
||||
sign-client:
|
||||
image: sign-client
|
||||
build:
|
||||
context: .
|
||||
dockerfile:
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
set -o allexport
|
||||
source ./.env
|
||||
set +o allexport
|
||||
|
||||
echo Writing params
|
||||
echo \{\"parties\":\""$PARTIES"\",\"threshold\":\""$THRESHOLD"\"\} > ./params
|
||||
|
||||
if [[ -z "$LOCAL" ]]; then
|
||||
echo Building tss source from git
|
||||
docker build -t tss ../tss > /dev/null
|
||||
else
|
||||
echo Building tss local source
|
||||
docker build -t tss -f ../tss/Dockerfile-local ../tss > /dev/null
|
||||
fi
|
||||
|
||||
echo Building tss keygen client
|
||||
docker build -t tss-keygen-client ./tss-keygen > /dev/null
|
||||
|
||||
for (( i = 1 ; i <= $PARTIES ; i++ )) do
|
||||
touch keys"$i".store
|
||||
done
|
||||
|
||||
docker-compose -f ./docker-compose-keygen-all.yml kill $(eval echo proxy{1..${PARTIES}})
|
||||
|
||||
echo Running keygen
|
||||
docker-compose -f ./docker-compose-keygen-all.yml up $@
|
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
set -o allexport
|
||||
source ./.env
|
||||
set +o allexport
|
||||
|
||||
echo Writing params
|
||||
echo \{\"parties\":\""$PARTIES"\",\"threshold\":\""$THRESHOLD"\"\} > ./params
|
||||
|
||||
if [[ -z "$LOCAL" ]]; then
|
||||
echo Building tss source from git
|
||||
docker build -t tss ../tss > /dev/null
|
||||
else
|
||||
echo Building tss local source
|
||||
docker build -t tss -f ../tss/Dockerfile-local ../tss > /dev/null
|
||||
fi
|
||||
|
||||
echo Building tss keygen client
|
||||
docker build -t tss-keygen-client ./tss-keygen > /dev/null
|
||||
|
||||
touch "$KEY_FILE"
|
||||
|
||||
docker-compose -f ./docker-compose-keygen.yml kill proxy
|
||||
|
||||
echo Running keygen
|
||||
docker-compose -f ./docker-compose-keygen.yml up $@
|
|
@ -0,0 +1,11 @@
|
|||
FROM node:10.16.0-alpine
|
||||
|
||||
WORKDIR /proxy
|
||||
|
||||
COPY package.json /proxy/
|
||||
|
||||
RUN npm install
|
||||
|
||||
COPY index.js /proxy/
|
||||
|
||||
ENTRYPOINT ["node", "index.js"]
|
|
@ -0,0 +1,119 @@
|
|||
const express = require('express')
|
||||
const Web3 = require('web3')
|
||||
|
||||
const { RPC_URL, SHARED_DB_ADDRESS, VALIDATOR_PRIVATE_KEY } = process.env
|
||||
const abi = require('./contracts_data/SharedDB.json').abi
|
||||
|
||||
const web3 = new Web3(RPC_URL, null, { transactionConfirmationBlocks: 1 })
|
||||
const contract = new web3.eth.Contract(abi, SHARED_DB_ADDRESS)
|
||||
const validatorAddress = web3.eth.accounts.privateKeyToAccount(`0x${VALIDATOR_PRIVATE_KEY}`).address
|
||||
|
||||
let validatorNonce
|
||||
|
||||
const app = express()
|
||||
app.use(express.json())
|
||||
app.use(express.urlencoded({ extended: true }))
|
||||
|
||||
app.post('/get', get)
|
||||
|
||||
app.post('/set', set)
|
||||
app.post('/signupkeygen', signupKeygen)
|
||||
app.post('/signupsign', signupSign)
|
||||
|
||||
async function main () {
|
||||
validatorNonce = await web3.eth.getTransactionCount(validatorAddress)
|
||||
|
||||
app.listen(8001, () => {
|
||||
console.log('Listening on port 8001')
|
||||
})
|
||||
}
|
||||
|
||||
function Ok (data) {
|
||||
return { Ok: data }
|
||||
}
|
||||
|
||||
function hash (key) {
|
||||
return web3.utils.sha3(JSON.stringify(key))
|
||||
}
|
||||
|
||||
async function get (req, res) {
|
||||
console.log('Get call')
|
||||
while (true) {
|
||||
const result = await contract.methods.db(hash(req.body.key)).call()
|
||||
if (result !== '') {
|
||||
res.send(Ok({ key: req.body.key, value: result }))
|
||||
break
|
||||
}
|
||||
}
|
||||
console.log('Get end')
|
||||
}
|
||||
|
||||
async function set (req, res) {
|
||||
console.log('Set call')
|
||||
const query = contract.methods.set(hash(req.body.key), req.body.value)
|
||||
await sendQuery(query)
|
||||
|
||||
res.send(Ok(null))
|
||||
console.log('Set end')
|
||||
}
|
||||
|
||||
async function signupKeygen (req, res) {
|
||||
console.log('SignupKeygen call')
|
||||
const query = contract.methods.signupKeygen()
|
||||
const receipt = await sendQuery(query)
|
||||
|
||||
while (true) {
|
||||
const events = await contract.getPastEvents('SignupKeygen', {
|
||||
filter: { from: validatorAddress },
|
||||
fromBlock: receipt.blockNumber,
|
||||
toBlock: receipt.blockNumber
|
||||
})
|
||||
const event = events[0]
|
||||
|
||||
if (event) {
|
||||
res.send(Ok({ uuid: event.returnValues.uuid.toString(), number: event.returnValues.number }))
|
||||
break
|
||||
}
|
||||
}
|
||||
console.log('SignupKeygen end')
|
||||
}
|
||||
|
||||
async function signupSign (req, res) {
|
||||
console.log('SignupSign call')
|
||||
const query = contract.methods.signupSign()
|
||||
const receipt = await sendQuery(query)
|
||||
|
||||
while (true) {
|
||||
const events = await contract.getPastEvents('SignupSign', {
|
||||
filter: { from: validatorAddress },
|
||||
fromBlock: receipt.blockNumber,
|
||||
toBlock: receipt.blockNumber
|
||||
})
|
||||
const event = events[0]
|
||||
|
||||
if (event) {
|
||||
res.send(Ok({ uuid: event.returnValues.uuid.toString(), number: event.returnValues.number }))
|
||||
break
|
||||
}
|
||||
}
|
||||
console.log('SignupSign call')
|
||||
}
|
||||
|
||||
async function sendQuery (query) {
|
||||
const encodedABI = query.encodeABI()
|
||||
const tx = {
|
||||
data: encodedABI,
|
||||
from: validatorAddress,
|
||||
to: SHARED_DB_ADDRESS,
|
||||
nonce: validatorNonce++,
|
||||
chainId: 33
|
||||
}
|
||||
tx.gas = await query.estimateGas(tx)
|
||||
const signedTx = await web3.eth.accounts.signTransaction(tx, VALIDATOR_PRIVATE_KEY)
|
||||
|
||||
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction)
|
||||
|
||||
return receipt
|
||||
}
|
||||
|
||||
main()
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"name": "proxy",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"web3": "1.0.0-beta.55",
|
||||
"dotenv": "8.0.0",
|
||||
"express": "4.17.1"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
FROM ubuntu:19.10
|
||||
|
||||
WORKDIR /tss
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y libssl1.1 libssl-dev curl
|
||||
|
||||
COPY params /tss/
|
||||
|
||||
COPY --from=tss /tss/target/release/gg18_sign_client /tss/
|
||||
|
||||
ENTRYPOINT ["./gg18_sign_client"]
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"redis": {
|
||||
"port": 6379,
|
||||
"host": "127.0.0.1",
|
||||
"family": 4,
|
||||
"password": "auth",
|
||||
"db": 0
|
||||
},
|
||||
"eth": {
|
||||
"rpcUrl": "https://sokol.poa.network",
|
||||
"pollingInterval": 5000
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import Redis from 'ioredis'
|
||||
import { redis as redisConfig } from 'config'
|
||||
|
||||
console.log('Connecting to redis')
|
||||
|
||||
const redis = Redis(redisConfig)
|
||||
|
||||
redis.on('connect', () => {
|
||||
console.log('Connected to redis')
|
||||
})
|
||||
|
||||
redis.on('error', () => {
|
||||
console.log('Redis error')
|
||||
})
|
||||
|
||||
export const get = redis.get
|
||||
export const set = redis.set
|
|
@ -0,0 +1,22 @@
|
|||
import Web3 from 'web3'
|
||||
import { eth } from 'config'
|
||||
import {get, set} from 'db'
|
||||
|
||||
const {rpcUrl, pollingInterval} = eth
|
||||
|
||||
const web3 = new Web3(rpcUrl)
|
||||
|
||||
async function main () {
|
||||
const lastProcessedBlock = await get('lastProcessedBlock')
|
||||
|
||||
try {
|
||||
const block = await web3.eth.getBlock(lastProcessedBlock + 1)
|
||||
block.transactions.forEach(transaction => {
|
||||
|
||||
})
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
setInterval(main, pollingInterval)
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
if [[ -z "$SKIP_ENV" ]]; then
|
||||
set -o allexport
|
||||
source ../.env
|
||||
set +o allexport
|
||||
fi
|
||||
|
||||
echo Writing params
|
||||
echo \{\"parties\":\""$PARTIES"\",\"threshold\":\""$THRESHOLD"\"\} > ./params
|
||||
|
||||
if [[ -z "$LOCAL" ]]; then
|
||||
echo Building tss source from git
|
||||
docker build -t tss ../../tss > /dev/null
|
||||
else
|
||||
echo Building tss local source
|
||||
docker build -t tss -f ../../tss/Dockerfile-local ../../tss > /dev/null
|
||||
fi
|
||||
|
||||
echo Building tss sign client
|
||||
docker build -t tss-sign-client . > /dev/null
|
||||
|
||||
touch signature
|
||||
|
||||
echo Signing message using ssm server at "$SSM_URL"
|
||||
docker run --rm -v "$(cd ..; pwd)/$KEY_FILE:/tss/keys.store" -v "$(pwd)/signature:/tss/signature" --network host tss-sign-client "$SSM_URL" keys.store "$1"
|
||||
|
||||
echo Signed message
|
|
@ -0,0 +1,12 @@
|
|||
FROM ubuntu:19.10
|
||||
|
||||
WORKDIR /tss
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y libssl1.1 libssl-dev curl
|
||||
|
||||
COPY keygen-entrypoint.sh /tss/
|
||||
|
||||
COPY --from=tss /tss/target/release/gg18_keygen_client /tss/target/release/gg18_sign_client /tss/
|
||||
|
||||
ENTRYPOINT ["./keygen-entrypoint.sh"]
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "Connecting to $1"
|
||||
|
||||
until curl "$1" > /dev/null 2>&1; do
|
||||
sleep 1;
|
||||
done
|
||||
|
||||
#curl "$1"
|
||||
|
||||
echo "Generating key using server $1"
|
||||
|
||||
./gg18_keygen_client "$1" keys.store
|
||||
|
||||
echo "Generated keys for all parties"
|
||||
|
||||
echo "Signing message"
|
||||
|
||||
if [[ -z "$SKIP_SIGN" ]]; then
|
||||
|
||||
./gg18_sign_client "$1" keys.store some_message
|
||||
|
||||
echo "Signed message"
|
||||
|
||||
fi
|
|
@ -0,0 +1,40 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
set -o allexport
|
||||
source ../.env
|
||||
set +o allexport
|
||||
|
||||
echo Writing params
|
||||
echo \{\"parties\":\""$PARTIES"\",\"threshold\":\""$THRESHOLD"\"\} > ./params
|
||||
|
||||
if [[ -z "$LOCAL" ]]; then
|
||||
echo Building tss source from git
|
||||
docker build -t tss ../../tss > /dev/null
|
||||
else
|
||||
echo Building tss local source
|
||||
docker build -t tss -f ../../tss/Dockerfile-local ../../tss > /dev/null
|
||||
fi
|
||||
|
||||
echo Building tss keygen client
|
||||
docker build -t tss-keygen-client . > /dev/null
|
||||
|
||||
touch ../"$KEY_FILE"
|
||||
|
||||
echo Generating keys using ssm server at "$SSM_URL"
|
||||
docker run --rm -v "$(cd ..; pwd)/$KEY_FILE:/tss/keys.store" --network host tss-keygen-client "$SSM_URL"
|
||||
|
||||
echo ==========================================================
|
||||
|
||||
echo All keys generated, ready to test sign
|
||||
|
||||
if [[ -z "$SKIP_SIGN" ]]; then
|
||||
sleep 3
|
||||
|
||||
SKIP_ENV=true ../tss-client/sign.sh test_message
|
||||
|
||||
echo Signed successful
|
||||
fi
|
|
@ -0,0 +1,4 @@
|
|||
THRESHOLD=1
|
||||
PARTIES=3
|
||||
|
||||
PORT=8001
|
|
@ -0,0 +1,11 @@
|
|||
FROM ubuntu:19.10
|
||||
|
||||
WORKDIR /tss
|
||||
|
||||
COPY Rocket.toml params /tss/
|
||||
|
||||
COPY --from=tss /tss/target/release/sm_manager /tss/
|
||||
|
||||
ENTRYPOINT ["./sm_manager"]
|
||||
|
||||
EXPOSE 8001
|
|
@ -0,0 +1,22 @@
|
|||
[development]
|
||||
address = "127.0.0.1"
|
||||
port = 8001
|
||||
workers = 12
|
||||
keep_alive = 5
|
||||
log = "normal"
|
||||
|
||||
[staging]
|
||||
address = "0.0.0.0"
|
||||
port = 8001
|
||||
workers = 8
|
||||
keep_alive = 5
|
||||
log = "normal"
|
||||
secret_key = "nSLM0D9ip+Gb1DNAOOisC9I+xLYHueO6FhtrNJwCRhE="
|
||||
|
||||
[production]
|
||||
address = "0.0.0.0"
|
||||
port = 8001
|
||||
workers = 1
|
||||
keep_alive = 5
|
||||
log = "critical"
|
||||
secret_key = "VWLeaDIng4S6bpN+Lgey5BbYwAZ3hM1hKzuMCWvEqVo="
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
set -o allexport
|
||||
source ./.env
|
||||
set +o allexport
|
||||
|
||||
echo Starting \{"$THRESHOLD","$PARTIES"\}-threshold ECDSA
|
||||
|
||||
echo Writing params
|
||||
echo \{\"parties\":\""$PARTIES"\",\"threshold\":\""$THRESHOLD"\"\} > ./params
|
||||
|
||||
if [[ -z "$LOCAL" ]]; then
|
||||
echo Building tss source from git
|
||||
docker build -t tss ../tss > /dev/null
|
||||
else
|
||||
echo Building tss local source
|
||||
docker build -t tss -f ../tss/Dockerfile-local ../tss > /dev/null
|
||||
fi
|
||||
|
||||
echo Builing shared state machine
|
||||
docker build -t ssm . > /dev/null
|
||||
|
||||
echo Running shared state machine
|
||||
docker run -d -p "$PORT":8001 --rm ssm > /dev/null
|
||||
|
||||
sleep 1
|
||||
|
||||
echo Server started, listening on port "$PORT"
|
|
@ -0,0 +1,26 @@
|
|||
FROM ubuntu:19.10
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y curl build-essential git openssl pkg-config libssl-dev libgmp3-dev
|
||||
|
||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly -y
|
||||
|
||||
ENV PATH=/root/.cargo/bin:$PATH
|
||||
|
||||
WORKDIR /repo
|
||||
|
||||
RUN git clone https://github.com/KZen-networks/multi-party-ecdsa.git .
|
||||
|
||||
RUN mkdir -p /tss/src && \
|
||||
cp /repo/Cargo.toml /tss/ && \
|
||||
cp /repo/src/lib.rs /tss/src/
|
||||
|
||||
WORKDIR /tss
|
||||
|
||||
RUN cargo build --release || true
|
||||
|
||||
RUN cp -Tr /repo /tss
|
||||
|
||||
RUN cargo build --release
|
||||
|
||||
CMD echo Done
|
|
@ -0,0 +1,21 @@
|
|||
FROM ubuntu:19.10
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y curl build-essential git openssl pkg-config libssl-dev libgmp3-dev
|
||||
|
||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly -y
|
||||
|
||||
ENV PATH=/root/.cargo/bin:$PATH
|
||||
|
||||
WORKDIR /tss
|
||||
|
||||
COPY ./multi-party-ecdsa/Cargo.toml /tss/
|
||||
COPY ./multi-party-ecdsa/src/lib.rs /tss/src/lib.rs
|
||||
|
||||
RUN cargo build --release || true
|
||||
|
||||
COPY ./multi-party-ecdsa /tss/
|
||||
|
||||
RUN cargo build --release
|
||||
|
||||
CMD echo Done
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
TOTAL=100
|
||||
|
||||
for (( i = 0; i <= $TOTAL; i++ )); do
|
||||
|
||||
echo ================================================
|
||||
echo Starting attempt "$i"
|
||||
|
||||
echo Killing all containers
|
||||
docker kill $(docker ps | awk 'NR>1 {print $1}') > /dev/null 2>&1 || true
|
||||
|
||||
echo Starting ssm
|
||||
./src/ssm/start.sh > /dev/null
|
||||
|
||||
echo Start sign client 1
|
||||
KEY_FILE=keys.store ./src/oracle/tss-client/sign.sh some_random_message > client1.log 2>&1 &
|
||||
PROC_1=$!
|
||||
|
||||
sleep 2
|
||||
|
||||
echo Start sign client 2
|
||||
KEY_FILE=keys1.store ./src/oracle/tss-client/sign.sh some_random_message > client2.log 2>&1 &
|
||||
PROC_2=$!
|
||||
|
||||
wait "$PROC_1"
|
||||
echo First client finished with $?
|
||||
wait "$PROC_2"
|
||||
echo Second client finished with $?
|
||||
|
||||
done
|
Loading…
Reference in New Issue