# 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
```