decred.org/dcrdex@v1.0.5/dex/testing/dcr/harness.sh (about)

     1  #!/usr/bin/env bash
     2  # Tmux script that sets up a simnet harness.
     3  set -ex
     4  SESSION="dcr-harness"
     5  export RPC_USER="user"
     6  export RPC_PASS="pass"
     7  export WALLET_PASS=abc
     8  
     9  # --listen and --rpclisten ports for alpha and beta nodes.
    10  # The ports are exported for use by create-wallet.sh.
    11  export ALPHA_NODE_PORT="19560"
    12  export ALPHA_NODE_RPC_PORT="19561"
    13  export BETA_NODE_PORT="19570"
    14  export BETA_NODE_RPC_PORT="19571"
    15  
    16  ALPHA_WALLET_SEED="b280922d2cffda44648346412c5ec97f429938105003730414f10b01e1402eac"
    17  ALPHA_MINING_ADDR="SsXciQNTo3HuV5tX3yy4hXndRWgLMRVC7Ah"
    18  export ALPHA_WALLET_RPC_PORT="19562"
    19  ALPHA_WALLET_HTTPPROF_PORT="19563"
    20  
    21  # The alpha wallet clone uses the same seed as the alpha wallet.
    22  ALPHA_WALLET_CLONE_RPC_PORT="19564"
    23  
    24  BETA_WALLET_SEED="3285a47d6a59f9c548b2a72c2c34a2de97967bede3844090102bbba76707fe9d"
    25  BETA_MINING_ADDR="Ssge52jCzbixgFC736RSTrwAnvH3a4hcPRX"
    26  BETA_WALLET_RPC_PORT="19572"
    27  BETA_WALLET_HTTPPROF_PORT="19573"
    28  
    29  TRADING_WALLET1_SEED="31cc0eeb220aa5b1f1ab3b6c47529d737976af1a556b156a665408f1711c962f"
    30  TRADING_WALLET1_ADDRESS="SsjTp2QaT8qkPGWKKSeFi4DtaZsgkoPbgXt"
    31  TRADING_WALLET1_PORT="19581"
    32  
    33  TRADING_WALLET2_SEED="3db72efa55b9e6cce9c27dde9bea848c6199004f9b1ae2add3b04389495edb9c"
    34  TRADING_WALLET2_ADDRESS="SsYW5LPmGCvvHuWok8U9FQu1kotv8LpvoEt"
    35  TRADING_WALLET2_PORT="19582"
    36  
    37  VSPD_WALLET_SEED="2db72efa55b9e6cce9c27dde9bea848c6199004f9b1ae2add3b04389495edb9c"
    38  export VSPD_WALLET_RPC_PORT="19590"
    39  
    40  # Address for testing with an internal wallet in client/assets/dcr
    41  VSP_HARNESS_TEST_ADDR="SsXsicdfL1jB2Rzu2UA7P2B9gnpqA9YGypw"
    42  
    43  VSPD_PORT="19591"
    44  
    45  # WAIT can be used in a send-keys call along with a `wait-for donedcr` command to
    46  # wait for process termination.
    47  WAIT="; tmux wait-for -S donedcr"
    48  
    49  NODES_ROOT=~/dextest/dcr
    50  export NODES_ROOT
    51  
    52  export SHELL=$(which bash)
    53  
    54  if [ -d "${NODES_ROOT}" ]; then
    55    rm -fR "${NODES_ROOT}"
    56  fi
    57  mkdir -p "${NODES_ROOT}/alpha"
    58  mkdir -p "${NODES_ROOT}/beta"
    59  mkdir -p "${NODES_ROOT}/harness-ctl"
    60  
    61  MINE=1
    62  # Bump sleep up to 3 if we have to mine a lot of blocks, because dcrwallet
    63  # doesn't always keep up.
    64  MINE_SLEEP=3
    65  if [ -f ./harnesschain.tar.gz ]; then
    66    echo "Seeding blockchain from compressed file"
    67    MINE=0
    68    MINE_SLEEP=0.5
    69    mkdir -p "${NODES_ROOT}/alpha/data"
    70    mkdir -p "${NODES_ROOT}/beta/data"
    71    tar -xzf ./harnesschain.tar.gz -C ${NODES_ROOT}/alpha/data
    72    cp -r ${NODES_ROOT}/alpha/data/simnet ${NODES_ROOT}/beta/data/simnet
    73  fi
    74  
    75  # Background watch mining in window 8 by default:  
    76  # 'export NOMINER="1"' or uncomment this line to disable
    77  #NOMINER="1"
    78  
    79  echo "Writing ctl scripts"
    80  ################################################################################
    81  # Control Scripts
    82  ################################################################################
    83  
    84  # Add wallet script
    85  HARNESS_DIR=$(dirname $0)
    86  export HARNESS_DIR
    87  cp "${HARNESS_DIR}/create-wallet.sh" "${NODES_ROOT}/harness-ctl/create-wallet"
    88  
    89  # Script to send funds from alpha to address
    90  cat > "${NODES_ROOT}/harness-ctl/fund" <<EOF
    91  #!/usr/bin/env bash
    92  ./alpha sendtoaddress \$@
    93  sleep 0.5
    94  ./mine-alpha 1
    95  EOF
    96  chmod +x "${NODES_ROOT}/harness-ctl/fund"
    97  
    98  # Alpha mine script
    99  cat > "${NODES_ROOT}/harness-ctl/mine-alpha" <<EOF
   100  #!/usr/bin/env bash
   101  NUM=1
   102    case \$1 in
   103        ''|*[!0-9]*)  ;;
   104        *) NUM=\$1 ;;
   105    esac
   106    for i in \$(seq \$NUM) ; do
   107      dcrctl -C ${NODES_ROOT}/alpha/alpha-ctl.conf regentemplate
   108      sleep 0.05
   109      dcrctl -C ${NODES_ROOT}/alpha/alpha-ctl.conf generate 1
   110      if [ $i != $NUM ]; then
   111        sleep ${MINE_SLEEP}
   112      fi
   113    done
   114  EOF
   115  chmod +x "${NODES_ROOT}/harness-ctl/mine-alpha"
   116  
   117  # A node ctl config only exists for beta because some node functions are not
   118  # accessible through the beta spv wallet.
   119  cat > "${NODES_ROOT}/beta/beta_node-ctl.conf" <<EOF
   120  rpcuser=${RPC_USER}
   121  rpcpass=${RPC_PASS}
   122  rpccert="${NODES_ROOT}/beta/rpc.cert"
   123  rpcserver=127.0.0.1:${BETA_NODE_RPC_PORT}
   124  EOF
   125  
   126  # node ctl script
   127  cat > "${NODES_ROOT}/harness-ctl/beta_node" <<EOF
   128  #!/usr/bin/env bash
   129  dcrctl -C "${NODES_ROOT}/beta/beta_node-ctl.conf" \$*
   130  EOF
   131  chmod +x "${NODES_ROOT}/harness-ctl/beta_node"
   132  
   133  # Beta mine script
   134  cat > "${NODES_ROOT}/harness-ctl/mine-beta" <<EOF
   135  #!/usr/bin/env bash
   136  NUM=1
   137    case \$1 in
   138        ''|*[!0-9]*)  ;;
   139        *) NUM=\$1 ;;
   140    esac
   141    for i in \$(seq \$NUM) ; do
   142      dcrctl -C ${NODES_ROOT}/beta/beta_node-ctl.conf regentemplate
   143      sleep 0.05
   144      dcrctl -C ${NODES_ROOT}/beta/beta_node-ctl.conf generate 1
   145      if [ $i != $NUM ]; then
   146        sleep ${MINE_SLEEP}
   147      fi
   148    done
   149  EOF
   150  chmod +x "${NODES_ROOT}/harness-ctl/mine-beta"
   151  
   152  # Alpha wallet clone script.
   153  # The alpha wallet clone connects to the beta node so it can vote on tickets
   154  # purchased with the alpha wallet after the alpha node is disconnected. This
   155  # alpha wallet clone does not need to purchase tickets or do anything else
   156  # really other than just voting on tickets purchased with the alpha wallet.
   157  cat > "${NODES_ROOT}/harness-ctl/clone-w-alpha" <<EOF
   158  "${HARNESS_DIR}/create-wallet" "$SESSION:9" "alpha-clone" ${ALPHA_WALLET_SEED} \
   159  ${ALPHA_WALLET_CLONE_RPC_PORT} 0 1 # ENABLE_VOTING=1 enables voting but not ticket buyer
   160  tmux select-window -t $SESSION:0 # return to the ctl window
   161  EOF
   162  chmod +x "${NODES_ROOT}/harness-ctl/clone-w-alpha"
   163  
   164  # Reorg script
   165  cat > "${NODES_ROOT}/harness-ctl/reorg" <<EOF
   166  #!/usr/bin/env bash
   167  REORG_NODE="alpha"
   168  VALID_NODE="beta"
   169  REORG_DEPTH=2
   170  
   171  if [ "\$1" = "beta" ]; then
   172    REORG_NODE="beta"
   173    VALID_NODE="alpha"
   174  fi
   175  
   176  if [ "\$2" != "" ]; then
   177    REORG_DEPTH=\$2
   178  fi
   179  
   180  echo "Current alpha, beta best blocks"
   181  ./alpha getbestblock && ./beta_node getbestblock
   182  
   183  echo "Disconnecting beta from alpha"
   184  ./beta_node addnode 127.0.0.1:${ALPHA_NODE_PORT} remove
   185  sleep 1
   186  
   187  # Start the alpha wallet clone to enable the beta node receive
   188  # votes while disconnected from the alpha node.
   189  "${NODES_ROOT}/harness-ctl/clone-w-alpha"
   190  
   191  # Mine REORG_DEPTH blocks on REORG_NODE and REORG_DEPTH+1 blocks
   192  # on VALID_NODE while disconnected.
   193  echo "Mining \${REORG_DEPTH} blocks on \${REORG_NODE}"
   194  ./mine-\${REORG_NODE} \${REORG_DEPTH}
   195  sleep 1
   196  echo "Mining \$((REORG_DEPTH+1)) blocks on \${VALID_NODE}"
   197  ./mine-\${VALID_NODE} \$((REORG_DEPTH+1))
   198  sleep 1
   199  
   200  echo "Diverged alpha, beta best blocks" && ./alpha getbestblock && ./beta_node getbestblock
   201  
   202  # Stop alpha wallet clone, no longer needed.
   203  echo "Stopping alpha-clone wallet"
   204  tmux send-keys -t $SESSION:9 C-c
   205  tmux send-keys -t $SESSION:9 exit C-m
   206  
   207  echo "Reconnecting beta to alpha"
   208  ./beta_node addnode 127.0.0.1:${ALPHA_NODE_PORT} add
   209  sleep 1
   210  
   211  echo "Reconnected alpha, beta best blocks" && ./alpha getbestblock && ./beta_node getbestblock
   212  
   213  echo "${NODES_ROOT}/\${REORG_NODE}/logs/simnet/dcrd.log:"
   214  grep REORG ${NODES_ROOT}/\${REORG_NODE}/logs/simnet/dcrd.log | tail -4
   215  EOF
   216  chmod +x "${NODES_ROOT}/harness-ctl/reorg"
   217  
   218  # Shutdown script
   219  cat > "${NODES_ROOT}/harness-ctl/quit" <<EOF
   220  #!/usr/bin/env bash
   221  tmux send-keys -t $SESSION:3 C-c
   222  tmux send-keys -t $SESSION:4 C-c
   223  tmux send-keys -t $SESSION:5 C-c
   224  tmux send-keys -t $SESSION:6 C-c
   225  tmux send-keys -t $SESSION:7 C-c
   226  tmux send-keys -t $SESSION:8 C-c
   227  tmux send-keys -t $SESSION:9 C-c
   228  tmux send-keys -t $SESSION:10 C-c
   229  sleep 0.2
   230  tmux send-keys -t $SESSION:1 C-c
   231  tmux send-keys -t $SESSION:2 C-c
   232  tmux wait-for alphadcr
   233  tmux wait-for betadcr
   234  tmux kill-session
   235  EOF
   236  chmod +x "${NODES_ROOT}/harness-ctl/quit"
   237  
   238  echo "Writing node config files"
   239  ################################################################################
   240  # Configuration Files
   241  ################################################################################
   242  
   243  # Alpha node config. Not used here, but added for use in dcrdex's markets.json
   244  cat > "${NODES_ROOT}/alpha/dcrd.conf" <<EOF
   245  rpcuser=${RPC_USER}
   246  rpcpass=${RPC_PASS}
   247  rpccert="${NODES_ROOT}/alpha/rpc.cert"
   248  rpclisten=127.0.0.1:${ALPHA_NODE_RPC_PORT}
   249  EOF
   250  
   251  
   252  ################################################################################
   253  # Start harness
   254  ################################################################################
   255  
   256  echo "Starting harness"
   257  tmux new-session -d -s $SESSION $SHELL
   258  tmux rename-window -t $SESSION:0 'harness-ctl'
   259  tmux send-keys -t $SESSION:0 "set +o history" C-m
   260  tmux send-keys -t $SESSION:0 "cd ${NODES_ROOT}/harness-ctl" C-m
   261  
   262  ################################################################################
   263  # dcrd Nodes
   264  ################################################################################
   265  
   266  tmux new-window -t $SESSION:1 -n 'alpha' $SHELL
   267  tmux send-keys -t $SESSION:1 "set +o history" C-m
   268  tmux send-keys -t $SESSION:1 "cd ${NODES_ROOT}/alpha" C-m
   269  
   270  echo "Starting simnet alpha node (txindex for server)"
   271  tmux send-keys -t $SESSION:1 "dcrd --appdata=${NODES_ROOT}/alpha \
   272  --rpcuser=${RPC_USER} --rpcpass=${RPC_PASS} \
   273  --miningaddr=${ALPHA_MINING_ADDR} --rpclisten=:${ALPHA_NODE_RPC_PORT} \
   274  --txindex --listen=:${ALPHA_NODE_PORT} \
   275  --debuglevel=debug \
   276  --whitelist=127.0.0.0/8 --whitelist=::1 \
   277  --simnet; tmux wait-for -S alphadcr" C-m
   278  
   279  tmux new-window -t $SESSION:2 -n 'beta' $SHELL
   280  tmux send-keys -t $SESSION:2 "set +o history" C-m
   281  tmux send-keys -t $SESSION:2 "cd ${NODES_ROOT}/beta" C-m
   282  
   283  echo "Starting simnet beta node (no txindex for a typical client)"
   284  tmux send-keys -t $SESSION:2 "dcrd --appdata=${NODES_ROOT}/beta \
   285  --rpcuser=${RPC_USER} --rpcpass=${RPC_PASS} \
   286  --listen=:${BETA_NODE_PORT} --rpclisten=:${BETA_NODE_RPC_PORT} \
   287  --miningaddr=${BETA_MINING_ADDR} \
   288  --connect=127.0.0.1:${ALPHA_NODE_PORT} \
   289  --debuglevel=debug \
   290  --whitelist=127.0.0.0/8 --whitelist=::1 \
   291  --simnet; tmux wait-for -S betadcr" C-m
   292  
   293  sleep 3
   294  
   295  ################################################################################
   296  # dcrwallets
   297  ################################################################################
   298  
   299  echo "Creating simnet alpha wallet"
   300  USE_SPV="0"
   301  ENABLE_VOTING="2" # 2 = enable voting and ticket buyer
   302  MANUAL_TICKETS="0"
   303  "${HARNESS_DIR}/create-wallet.sh" "$SESSION:3" "alpha" ${ALPHA_WALLET_SEED} \
   304  ${ALPHA_WALLET_RPC_PORT} ${USE_SPV} ${ENABLE_VOTING} ${ALPHA_WALLET_HTTPPROF_PORT} \
   305  ${MANUAL_TICKETS} "_"
   306  # alpha uses walletpassphrase/walletlock.
   307  
   308  # SPV wallets will declare peers stalled and disconnect with only ancient blocks
   309  # from the archive, so we must mine a couple blocks first, but only now after the
   310  # voting wallet (alpha) is running.
   311  tmux send-keys -t $SESSION:0 "./mine-alpha 2${WAIT}" C-m\; wait-for donedcr
   312  
   313  echo "Creating simnet vspd wallet"
   314  USE_SPV="0"
   315  ENABLE_VOTING="1"
   316  MANUAL_TICKETS="1"
   317  "${HARNESS_DIR}/create-wallet.sh" "$SESSION:7" "vspdwallet" ${VSPD_WALLET_SEED} \
   318  ${VSPD_WALLET_RPC_PORT} ${USE_SPV} ${ENABLE_VOTING} "_" ${MANUAL_TICKETS} "_"
   319  
   320  echo "Creating simnet vspd"
   321  ALPHA_WALLET_PUBKEY=$("${NODES_ROOT}/harness-ctl/alpha" "getmasterpubkey")
   322  "${HARNESS_DIR}/create-vspd.sh" "$SESSION:8" "${VSPD_PORT}" "${ALPHA_WALLET_PUBKEY}"
   323  
   324  sleep 3
   325  
   326  VSP_PUBKEY=$(curl -sS "http://127.0.0.1:19591/api/v3/vspinfo" | jq -r '.pubkey')
   327  
   328  echo "Creating simnet beta wallet"
   329  USE_SPV="1"
   330  ENABLE_VOTING="0"
   331  MANUAL_TICKETS="0"
   332  "${HARNESS_DIR}/create-wallet.sh" "$SESSION:4" "beta" ${BETA_WALLET_SEED} \
   333  ${BETA_WALLET_RPC_PORT} ${USE_SPV} ${ENABLE_VOTING} ${BETA_WALLET_HTTPPROF_PORT} \
   334  ${MANUAL_TICKETS} ${VSP_PUBKEY}
   335  
   336  # The trading wallets need to be created from scratch every time.
   337  echo "Creating simnet trading wallet 1"
   338  USE_SPV="1"
   339  ENABLE_VOTING="0"
   340  MANUAL_TICKETS="0"
   341  "${HARNESS_DIR}/create-wallet.sh" "$SESSION:5" "trading1" ${TRADING_WALLET1_SEED} \
   342  ${TRADING_WALLET1_PORT} ${USE_SPV} ${ENABLE_VOTING} "_" ${MANUAL_TICKETS} "_"
   343  
   344  echo "Creating simnet trading wallet 2"
   345  USE_SPV="1"
   346  ENABLE_VOTING="0"
   347  MANUAL_TICKETS="0"
   348  "${HARNESS_DIR}/create-wallet.sh" "$SESSION:6" "trading2" ${TRADING_WALLET2_SEED} \
   349  ${TRADING_WALLET2_PORT} ${USE_SPV} ${ENABLE_VOTING} "_" ${MANUAL_TICKETS} "_"
   350  
   351  sleep 3
   352  
   353  # Give beta's "default" account a password, so it uses unlockaccount/lockaccount.
   354  tmux send-keys -t $SESSION:0 "./beta setaccountpassphrase default ${WALLET_PASS}${WAIT}" C-m\; wait-for donedcr
   355  
   356  # Lock the wallet so we know we can function with just account unlocking.
   357  tmux send-keys -t $SESSION:0 "./beta walletlock${WAIT}" C-m\; wait-for donedcr
   358  
   359  # Create fee account on alpha wallet for use by dcrdex simnet instances.
   360  tmux send-keys -t $SESSION:0 "./alpha createnewaccount server_fees${WAIT}" C-m\; wait-for donedcr
   361  tmux send-keys -t $SESSION:0 "./alpha getmasterpubkey server_fees${WAIT}" C-m\; wait-for donedcr
   362  
   363  ################################################################################
   364  # Prepare the wallets
   365  ################################################################################
   366  
   367  for WALLET in alpha beta trading1 trading2; do
   368    tmux send-keys -t $SESSION:0 "./${WALLET} getnewaddress${WAIT}" C-m\; wait-for donedcr
   369    tmux send-keys -t $SESSION:0 "./${WALLET} getnewaddress${WAIT}" C-m\; wait-for donedcr
   370  done
   371  
   372  if [ "$MINE" = "1" ]; then
   373    echo "Mining 600 blocks on alpha"
   374    echo "Mining blocks 0 through 99"
   375    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   376    echo "Mining blocks 100 through 199"
   377    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   378    echo "Mining blocks 200 through 299"
   379    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   380    echo "Mining blocks 300 through 399"
   381    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   382    echo "Mining blocks 400 through 499"
   383    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   384    echo "Mining blocks 500 through 599"
   385    tmux send-keys -t $SESSION:0 "./mine-alpha 100${WAIT}" C-m\; wait-for donedcr
   386  
   387    # Send beta some dough while we're here.
   388    tmux send-keys -t $SESSION:0 "./alpha sendtoaddress ${BETA_MINING_ADDR} 1000${WAIT}" C-m\; wait-for donedcr
   389  
   390    # Have alpha send some credits to the other wallets
   391    for i in 10 18 5 7 1 15 3 25
   392    do
   393      RECIPIENTS="{\"${TRADING_WALLET1_ADDRESS}\":${i},\"${TRADING_WALLET2_ADDRESS}\":${i},\"${BETA_MINING_ADDR}\":${i},\"${VSP_HARNESS_TEST_ADDR}\":${i}}"
   394      tmux send-keys -t $SESSION:0 "./alpha sendmany default '${RECIPIENTS}'${WAIT}" C-m\; wait-for donedcr
   395    done
   396  fi
   397  
   398  # Have alpha share a little more wealth, esp. for trade_simnet_test.go
   399  RECIPIENTS="{\"${TRADING_WALLET1_ADDRESS}\":24,\"${TRADING_WALLET2_ADDRESS}\":24,\"${BETA_MINING_ADDR}\":24,\"${VSP_HARNESS_TEST_ADDR}\":24}"
   400  for i in {1..60}; do
   401    tmux send-keys -t $SESSION:0 "./alpha sendmany default '${RECIPIENTS}'${WAIT}" C-m\; wait-for donedcr
   402  done
   403  
   404  sleep 0.5
   405  tmux send-keys -t $SESSION:0 "./mine-alpha 2${WAIT}" C-m\; wait-for donedcr
   406  
   407  # Watch Miner
   408  if [ -z "$NOMINER" ] ; then
   409    tmux new-window -t $SESSION:9 -n "miner" $SHELL
   410    tmux send-keys -t $SESSION:9 "cd ${NODES_ROOT}/harness-ctl" C-m
   411    tmux send-keys -t $SESSION:9 "watch -n 15 ./mine-alpha 1" C-m
   412  fi
   413  
   414  tmux select-window -t $SESSION:0
   415  
   416  # Reenable history and attach to the control session.
   417  tmux send-keys -t $SESSION:0 "set -o history" C-m
   418  tmux select-window -t $SESSION:0
   419  tmux attach-session -t $SESSION