# Testing electrs ## Install electrs ```shell= sudo apt-get update sudo apt-get install librocksdb-dev wget sudo apt-get install -qqy cargo clang cmake build-essential ``` From electrs git repo being tested: ```shell= ROCKSDB_INCLUDE_DIR=/usr/include ROCKSDB_LIB_DIR=/usr/lib cargo install --locked --path . electrs --version ``` ## Install bitcoind ```shell= BITCOIND_VERSION=22.0 wget -q https://bitcoincore.org/bin/bitcoin-core-$BITCOIND_VERSION/bitcoin-$BITCOIND_VERSION-x86_64-linux-gnu.tar.gz tar xvf bitcoin-$BITCOIND_VERSION-x86_64-linux-gnu.tar.gz mv -v bitcoin-$BITCOIND_VERSION/bin/bitcoind . mv -v bitcoin-$BITCOIND_VERSION/bin/bitcoin-cli . ``` ## Install electrum client ```shell= sudo apt-get install -qqy git libsecp256k1-0 python3-cryptography python3-setuptools python3-pip jq curl git clone --recurse-submodules https://github.com/spesmilo/electrum/ python3 -m pip install -e electrum/ electrum version --offline ``` ## install electrumx server ```shell= git clone https://github.com/spesmilo/electrumx.git cd electrumx pip3 install . ``` ## Remove old data ```shell= rm -rf data/ mkdir -p data/{bitcoin1,bitcoin2,electrum,electrs,electrumx} ``` ## Start bitcoind node 1 and fund wallet ```shell= ./bitcoind -version ./bitcoind -regtest -regtest -txindex=1 -datadir=data/bitcoin1 -printtoconsole=0 -fallbackfee=0.0001 & BITCOIND1_PID=$! ``` ## Start and fund mining bitcoind node 2 and add to node 1 ```shell= ./bitcoind -regtest -txindex=1 -datadir=data/bitcoin2 -port=28444 -rpcport=28443 -printtoconsole=0 -fallbackfee=0.0001 & BITCOIND2_PID=$! ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 createwallet "test" NODE_ADDR=`./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getnewaddress` echo $NODE_ADDR ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 generatetoaddress 101 $NODE_ADDR ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getwalletinfo ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 addnode "127.0.0.1:18444" "add" ./bitcoin-cli -regtest -datadir=data/bitcoin1 getpeerinfo ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getpeerinfo ``` ### Status of bitcoind nodes | node # | tip height | confirmed | mempool | |--------|------------|-----------|-------------| | 1 | 101 | none | none | | 2 | 101 | none | none | ## Start electrs and electrum ```shell= export RUST_LOG=electrs=debug electrs \ --db-dir=data/electrs \ --daemon-dir=data/bitcoin1 \ --network=regtest \ 2> data/electrs/regtest-debug.log & ELECTRS_PID=$! electrum --regtest daemon --server localhost:60401:t -1 -vDEBUG 2> data/electrum/regtest-debug.log & ELECTRUM_PID=$! ``` ### daemons electrum -> electrs -> bitcoind 1 <- bitcoind2 (block creator/invalidator) ## OR start electrumx and electrum ```shell= export COIN=Bitcoin export DB_DIRECTORY=data/electrumx export NET=Regtest export SERVICES=tcp://:60401 export DAEMON_URL=`cat data/bitcoin/regtest/.cookie`@localhost:18443 export PEER_DISCOVERY=off electrumx/electrumx_server 2>> data/electrumx/electrumx.log >> data/electrumx/electrumx.log & ELECTRUMX_PID=$! electrum --regtest daemon --server localhost:60401:t -1 -vDEBUG 2> data/electrum/regtest-debug.log & ELECTRUM_PID=$! ``` ## Fund electrum wallet ```shell= electrum --regtest --wallet=data/electrum/wallet getinfo electrum --regtest --wallet=data/electrum/wallet create --seed_type=segwit electrum --regtest --wallet=data/electrum/wallet load_wallet electrum --regtest --wallet=data/electrum/wallet getbalance WALLET_ADDR1=`electrum --regtest --wallet=data/electrum/wallet getunusedaddress` echo $WALLET_ADDR1 TX1=`./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 sendtoaddress $WALLET_ADDR1 1.11 "test1"` ./bitcoin-cli -regtest -datadir=data/bitcoin1 getrawtransaction $TX1 true electrum --regtest --wallet=data/electrum/wallet getaddresshistory $WALLET_ADDR1 electrum --regtest --wallet=data/electrum/wallet getbalance ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 generatetoaddress 1 $NODE_ADDR ./bitcoin-cli -regtest -datadir=data/bitcoin1 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getrawtransaction $TX1 true electrum --regtest --wallet=data/electrum/wallet getaddresshistory $WALLET_ADDR1 electrum --regtest --wallet=data/electrum/wallet getbalance ``` ### Status of bitcoind nodes | node # | tip height | confirmed | mempool | |--------|------------|-----------|-------------| | 1 | 102 | TX1 | none | | 2 | 102 | TX1 | none | ### Status of electrum wallet confirmed: 1.11 ## Invalidate 1st block on node 2 ```shell= TIP=`./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getbestblockhash` echo $TIP ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 invalidateblock $TIP ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getmempoolinfo ./bitcoin-cli -regtest -datadir=data/bitcoin1 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin1 getmempoolinfo electrum --regtest --wallet=data/electrum/wallet getbalance ``` ### Status of bitcoind nodes | node # | tip height | confirmed | mempool | |--------|------------|-----------|-------------| | 1 | 102 | TX1 | none | | 2 | 101 | none | TX1 | ### Status of electrum wallet confirmed: 1.11 ## Invalidate 2nd block on node 2 ```shell= TIP=`./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getbestblockhash` echo $TIP ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 invalidateblock $TIP ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getblockchaininfo ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getmempoolinfo ./bitcoin-cli -regtest -datadir=data/bitcoin1 getblockchaininfo ./bitcoin-cli -regtest -datadir=data/bitcoin1 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin1 getmempoolinfo electrum --regtest --wallet=data/electrum/wallet getbalance electrum --regtest --wallet=data/electrum/wallet listunspent ``` ### Status of bitcoind nodes | node # | tip height | confirmed | mempool | |--------|------------|-----------|-------------| | 1 | 102 | TX1 | none | | 2 | 100 | none | none | ### Status of electrum wallet confirmed: 1.11 ## Generate 3 new blocks on node 2 ```shell= ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 generatetoaddress 3 $NODE_ADDR ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getblockchaininfo ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin2 -rpcport=28443 getmempoolinfo ./bitcoin-cli -regtest -datadir=data/bitcoin1 getblockchaininfo ./bitcoin-cli -regtest -datadir=data/bitcoin1 getrawtransaction $TX1 true ./bitcoin-cli -regtest -datadir=data/bitcoin1 getmempoolinfo electrum --regtest --wallet=data/electrum/wallet getbalance ``` ### Status of bitcoind nodes | node # | tip height | confirmed | mempool | |--------|------------|-----------|-------------| | 1 | 103 | none | TX1 | | 2 | 103 | none | none | ### Status of electrum wallet confirmed: 0 unconfirmed: 1.11 ## Stop daemons ```shell= electrum --regtest --wallet=data/electrum/wallet stop wait $ELECTRUM_PID kill -INT $ELECTRS_PID wait $ELECTRS_PID ./bitcoin-cli -regtest -datadir=data/bitcoin1 stop wait $BITCOIND1_PID ./bitcoin-cli -regtest -datadir=data/bitcoin2 --rpcport=28443 stop wait $BITCOIND2_PID # IF using electrumx instead of electrs kill $ELECTRUMX_PID wait $ELECTRUMX_PID ```