From d2324ad097053eadab4db7337f1065144db5589d Mon Sep 17 00:00:00 2001 From: tecnovert Date: Sat, 18 Jun 2022 19:28:40 +0200 Subject: [PATCH] preparescript: Fix missing btc wallet with --addcoin=bitcoin and --usebtcfastsync doc: Fetch latest xmr chain height --- basicswap/rpc.py | 7 +- bin/basicswap_prepare.py | 36 ++++++-- doc/install.md | 99 +++++++++++++--------- docker/production/bitcoin/Dockerfile | 2 +- docker/production/litecoin/Dockerfile | 2 +- docker/production/monero_daemon/Dockerfile | 2 +- docker/production/particl/Dockerfile | 2 +- 7 files changed, 94 insertions(+), 56 deletions(-) diff --git a/basicswap/rpc.py b/basicswap/rpc.py index f860a62..77e2f63 100644 --- a/basicswap/rpc.py +++ b/basicswap/rpc.py @@ -20,10 +20,13 @@ from xmlrpc.client import ( from .util import jsonDecimal -def waitForRPC(rpc_func, wallet=None, max_tries=7): +def waitForRPC(rpc_func, expect_wallet=True, max_tries=7): for i in range(max_tries + 1): try: - rpc_func('getwalletinfo') + if expect_wallet: + rpc_func('getwalletinfo') + else: + rpc_func('getblockchaininfo') return except Exception as ex: if i < max_tries: diff --git a/bin/basicswap_prepare.py b/bin/basicswap_prepare.py index b0f6523..6d07ed8 100755 --- a/bin/basicswap_prepare.py +++ b/bin/basicswap_prepare.py @@ -702,7 +702,7 @@ def modify_tor_config(settings, coin, tor_control_password=None, enable=False): writeTorSettings(fp, coin, coin_settings, tor_control_password) -def make_rpc_func(bin_dir, data_dir, chain): +def make_rpc_func(bin_dir, data_dir, chain, cli_binary=cfg.PARTICL_CLI): bin_dir = bin_dir data_dir = data_dir chain = chain @@ -712,7 +712,7 @@ def make_rpc_func(bin_dir, data_dir, chain): nonlocal data_dir nonlocal chain - return callrpc_cli(bin_dir, data_dir, chain, cmd, cfg.PARTICL_CLI) + return callrpc_cli(bin_dir, data_dir, chain, cmd, cli_binary) return rpc_func @@ -761,6 +761,15 @@ def printHelp(): logger.info('\n' + 'Known coins: %s', ', '.join(known_coins.keys())) +def finalise_daemon(d): + logging.info('Interrupting {}'.format(d.pid)) + d.send_signal(signal.SIGINT) + d.wait(timeout=120) + for fp in (d.stdout, d.stderr, d.stdin): + if fp: + fp.close() + + def main(): global use_tor_proxy data_dir = None @@ -1086,6 +1095,22 @@ def main(): if not prepare_bin_only: prepareDataDir(add_coin, settings, chain, particl_wallet_mnemonic, extra_opts) + + if use_btc_fastsync and add_coin == 'bitcoin': + # Need to create wallet file through daemon + logger.info('Creating wallet.dat for {}.'.format(add_coin.capitalize())) + bitcoin_settings = settings['chainclients']['bitcoin'] + try: + btcRpc = make_rpc_func(bitcoin_settings['bindir'], bitcoin_settings['datadir'], chain, cli_binary=cfg.BITCOIN_CLI) + filename = 'bitcoind' + ('.exe' if os.name == 'nt' else '') + daemon_args = ['-noconnect', '-nodnsseed', '-nolisten'] + btcd = startDaemon(bitcoin_settings['datadir'], bitcoin_settings['bindir'], filename, daemon_args) + waitForRPC(btcRpc, expect_wallet=False, max_tries=12) + btcRpc('createwallet wallet.dat') + logger.info('createwallet succeeded.') + finally: + finalise_daemon(btcd) + with open(config_path, 'w') as fp: json.dump(settings, fp, indent=4) @@ -1202,12 +1227,7 @@ def main(): del swap_client finally: for d in daemons: - logging.info('Interrupting {}'.format(d.pid)) - d.send_signal(signal.SIGINT) - d.wait(timeout=120) - for fp in (d.stdout, d.stderr, d.stdin): - if fp: - fp.close() + finalise_daemon(d) logger.info('IMPORTANT - Save your particl wallet recovery phrase:\n{}\n'.format(particl_wallet_mnemonic)) logger.info('Done.') diff --git a/doc/install.md b/doc/install.md index 9029c61..97b6df5 100644 --- a/doc/install.md +++ b/doc/install.md @@ -1,14 +1,14 @@ ## Source code - $ git clone https://github.com/tecnovert/basicswap.git + git clone https://github.com/tecnovert/basicswap.git ## Run Using Docker Docker must be installed and started: - $ docker -v + docker -v Should return a line containing `Docker version`... @@ -20,19 +20,23 @@ It's recommended to setup docker to work without sudo: #### Create the images: - $ cd basicswap/docker - $ docker-compose build + cd basicswap/docker + docker-compose build #### Prepare the datadir: Set XMR_RPC_HOST and BASE_XMR_RPC_PORT to a public XMR node or exclude to run a local node. + Set xmrrestoreheight to the current xmr chain height. + + CURRENT_XMR_HEIGHT=$(curl https://localmonero.co/blocks/api/get_stats | jq .height) + Adjust `--withcoins` and `--withoutcoins` as desired, eg: `--withcoins=monero,bitcoin`. By default only Particl is loaded. - $ export COINDATA_PATH=/var/data/coinswaps - $ docker run --rm -e XMR_RPC_HOST="node.xmr.to" -e BASE_XMR_RPC_PORT=18081 -t --name swap_prepare -v $COINDATA_PATH:/coindata i_swapclient \ - basicswap-prepare --datadir=/coindata --withcoins=monero --htmlhost="0.0.0.0" --xmrrestoreheight=2485205 + export COINDATA_PATH=/var/data/coinswaps + docker run --rm -e XMR_RPC_HOST="node.xmr.to" -e BASE_XMR_RPC_PORT=18081 -t --name swap_prepare -v $COINDATA_PATH:/coindata i_swapclient \ + basicswap-prepare --datadir=/coindata --withcoins=monero --htmlhost="0.0.0.0" --xmrrestoreheight=$CURRENT_XMR_HEIGHT **Record the mnemonic from the output of the above command.** @@ -51,8 +55,8 @@ Valid options can be listed with: `timedatectl list-timezones` #### Start the container: - $ export COINDATA_PATH=/var/data/coinswaps - $ docker-compose up + export COINDATA_PATH=/var/data/coinswaps + docker-compose up Open in browser: `http://localhost:12700` @@ -60,9 +64,9 @@ Open in browser: `http://localhost:12700` ### Add a coin - $ docker-compose stop - $ export COINDATA_PATH=/var/data/coinswaps - $ docker run --rm -t --name swap_prepare -v $COINDATA_PATH:/coindata i_swapclient basicswap-prepare --datadir=/coindata --addcoin=bitcoin + docker-compose stop + export COINDATA_PATH=/var/data/coinswaps + docker run --rm -t --name swap_prepare -v $COINDATA_PATH:/coindata i_swapclient basicswap-prepare --datadir=/coindata --addcoin=bitcoin You can copy an existing pruned datadir (excluding bitcoin.conf and any wallets) over to `$COINDATA_PATH/bitcoin` Remove any existing wallets after copying over a pruned chain or the Bitcoin daemon won't start. @@ -81,14 +85,14 @@ Windows key + R -> "wsl" -> Enter Install Git: - $ sudo apt update - $ sudo apt install git + sudo apt update + sudo apt install git Download the BasicSwap code: - $ git clone https://github.com/tecnovert/basicswap.git - $ cd basicswap/docker/ + git clone https://github.com/tecnovert/basicswap.git + cd basicswap/docker/ It's significantly faster to set COINDATA_PATH in the linux filesystem. @@ -102,61 +106,72 @@ Continue from the [Run Using Docker](#run-using-docker) section. ### Ubuntu Setup: - $ apt-get install -y wget python3-pip gnupg unzip protobuf-compiler automake libtool pkg-config + apt-get install -y wget python3-pip gnupg unzip protobuf-compiler automake libtool pkg-config curl jq ### OSX Setup: -Install Homebrew: +Install Homebrew (See https://brew.sh/): - https://brew.sh/ + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Command Line Tools: - $ xcode-select --install + xcode-select --install Dependencies: - $ brew install wget unzip python git protobuf gnupg automake libtool pkg-config + brew install wget unzip python3 git protobuf gnupg automake libtool pkg-config curl jq + +Install python SSL Certificates: + + sudo "/Applications/Python 3.9/Install Certificates.command" ### Basicswap: - $ export SWAP_DATADIR=/Users/$USER/coinswaps - $ mkdir -p "$SWAP_DATADIR/venv" - $ python3 -m venv "$SWAP_DATADIR/venv" - $ . $SWAP_DATADIR/venv/bin/activate && python -V - $ cd $SWAP_DATADIR - $ wget -O coincurve-anonswap.zip https://github.com/tecnovert/coincurve/archive/anonswap.zip - $ unzip coincurve-anonswap.zip - $ cd $SWAP_DATADIR/coincurve-anonswap - $ pip3 install . + export SWAP_DATADIR=/Users/$USER/coinswaps + mkdir -p "$SWAP_DATADIR/venv" + python3 -m venv "$SWAP_DATADIR/venv" + . $SWAP_DATADIR/venv/bin/activate && python -V + cd $SWAP_DATADIR + wget -O coincurve-anonswap.zip https://github.com/tecnovert/coincurve/archive/anonswap.zip + unzip coincurve-anonswap.zip + cd $SWAP_DATADIR/coincurve-anonswap + pip3 install . - $ cd $SWAP_DATADIR - $ git clone https://github.com/tecnovert/basicswap.git - $ cd $SWAP_DATADIR/basicswap - $ protoc -I=basicswap --python_out=basicswap basicswap/messages.proto - $ pip3 install . + cd $SWAP_DATADIR + git clone https://github.com/tecnovert/basicswap.git + cd $SWAP_DATADIR/basicswap + protoc -I=basicswap --python_out=basicswap basicswap/messages.proto + pip3 install . Prepare the datadir: - XMR_RPC_HOST="node.xmr.to" BASE_XMR_RPC_PORT=18081 basicswap-prepare --datadir=$SWAP_DATADIR --withcoins=monero --xmrrestoreheight=2245107 + CURRENT_XMR_HEIGHT=$(curl https://localmonero.co/blocks/api/get_stats | jq .height) + + XMR_RPC_HOST="node.xmr.to" BASE_XMR_RPC_PORT=18081 basicswap-prepare --datadir=$SWAP_DATADIR --withcoins=monero --xmrrestoreheight=$CURRENT_XMR_HEIGHT OR using a local XMR daemon: - basicswap-prepare --datadir=$SWAP_DATADIR --withcoins=monero --xmrrestoreheight=2245107 + basicswap-prepare --datadir=$SWAP_DATADIR --withcoins=monero --xmrrestoreheight=$CURRENT_XMR_HEIGHT Record the mnemonic from the output of the above command. -Start the app +Start Basicswap: - $ basicswap-run --datadir=$SWAP_DATADIR + basicswap-run --datadir=$SWAP_DATADIR Open in browser: `http://localhost:12700` It may take a few minutes to start as the coin daemons are started before the http interface. +Add a coin: + export SWAP_DATADIR=/Users/$USER/coinswaps + basicswap-prepare --usebtcfastsync --datadir=/$SWAP_DATADIR --addcoin=bitcoin + + Start after installed: - $ export SWAP_DATADIR=/Users/$USER/coinswaps - $ . $SWAP_DATADIR/venv/bin/activate && python -V - $ basicswap-run --datadir=$SWAP_DATADIR + export SWAP_DATADIR=/Users/$USER/coinswaps + . $SWAP_DATADIR/venv/bin/activate && python -V + basicswap-run --datadir=$SWAP_DATADIR diff --git a/docker/production/bitcoin/Dockerfile b/docker/production/bitcoin/Dockerfile index 5b8b313..52b02f7 100644 --- a/docker/production/bitcoin/Dockerfile +++ b/docker/production/bitcoin/Dockerfile @@ -5,7 +5,7 @@ FROM i_swapclient as install_stage RUN basicswap-prepare --preparebinonly --bindir=/coin_bin --withcoin=bitcoin --withoutcoins=particl && \ find /coin_bin -name *.tar.gz -delete -FROM debian:buster-slim +FROM debian:bullseye-slim COPY --from=install_stage /coin_bin . ENV BITCOIN_DATA /data diff --git a/docker/production/litecoin/Dockerfile b/docker/production/litecoin/Dockerfile index ca0dbf7..fc0cba2 100644 --- a/docker/production/litecoin/Dockerfile +++ b/docker/production/litecoin/Dockerfile @@ -3,7 +3,7 @@ FROM i_swapclient as install_stage RUN basicswap-prepare --preparebinonly --bindir=/coin_bin --withcoin=litecoin --withoutcoin=particl && \ find /coin_bin -name *.tar.gz -delete -FROM debian:buster-slim +FROM debian:bullseye-slim COPY --from=install_stage /coin_bin . ENV LITECOIN_DATA /data diff --git a/docker/production/monero_daemon/Dockerfile b/docker/production/monero_daemon/Dockerfile index f6847fa..7bfda4f 100644 --- a/docker/production/monero_daemon/Dockerfile +++ b/docker/production/monero_daemon/Dockerfile @@ -2,7 +2,7 @@ FROM i_swapclient as install_stage RUN basicswap-prepare --preparebinonly --bindir=/coin_bin --withcoin=monero --withoutcoins=particl -FROM debian:buster-slim +FROM debian:bullseye-slim COPY --from=install_stage /coin_bin . diff --git a/docker/production/particl/Dockerfile b/docker/production/particl/Dockerfile index 0cf2585..63441f8 100644 --- a/docker/production/particl/Dockerfile +++ b/docker/production/particl/Dockerfile @@ -3,7 +3,7 @@ FROM i_swapclient as install_stage RUN basicswap-prepare --preparebinonly --bindir=/coin_bin --withcoin=particl && \ find /coin_bin -name *.tar.gz -delete -FROM debian:buster-slim +FROM debian:bullseye-slim COPY --from=install_stage /coin_bin . ENV PARTICL_DATA /data