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