decred.org/dcrdex@v1.0.5/dex/testing/btc/base-harness.sh (about) 1 #!/usr/bin/env bash 2 # Tmux script that sets up a simnet harness. 3 set -ex 4 NODES_ROOT=~/dextest/${SYMBOL} 5 rm -rf "${NODES_ROOT}" 6 7 ALPHA_DIR="${NODES_ROOT}/alpha" 8 BETA_DIR="${NODES_ROOT}/beta" 9 HARNESS_DIR="${NODES_ROOT}/harness-ctl" 10 11 echo "Writing node config files" 12 mkdir -p "${HARNESS_DIR}" 13 14 if [ -n "$HARNESS_VER" ]; then 15 HARNESS_VER_FILE="${NODES_ROOT}/v${HARNESS_VER}" 16 fi 17 18 WALLET_PASSWORD="abc" 19 20 [ -z "${ALPHA_WALLET_SEED}" ] && ALPHA_DESCRIPTOR_WALLET="true" || ALPHA_DESCRIPTOR_WALLET="false" 21 [ -z "${BETA_WALLET_SEED}" ] && BETA_DESCRIPTOR_WALLET="true" || BETA_DESCRIPTOR_WALLET="false" 22 23 ALPHA_CLI_CFG="-rpcwallet= -rpcport=${ALPHA_RPC_PORT} -regtest=1 -rpcuser=user -rpcpassword=pass" 24 25 BETA_CLI_CFG="-rpcwallet= -rpcport=${BETA_RPC_PORT} -regtest=1 -rpcuser=user -rpcpassword=pass" 26 27 GAMMA_CLI_CFG="-rpcwallet=gamma -rpcport=${ALPHA_RPC_PORT} -regtest=1 -rpcuser=user -rpcpassword=pass" 28 29 # DONE can be used in a send-keys call along with a `wait-for btc` command to 30 # wait for process termination. 31 DONE="; tmux wait-for -S ${SYMBOL}" 32 WAIT="wait-for ${SYMBOL}" 33 34 SESSION="${SYMBOL}-harness" 35 36 deprecateddbd () { 37 if [ $1 = false ] && [ "$VERSION_26_TEMP_DEPRICATED_DBD" ]; then 38 descs="-deprecatedrpc=create_bdb" 39 else 40 descs="" 41 fi 42 43 echo "$descs" 44 } 45 46 export SHELL=$(which bash) 47 48 ################################################################################ 49 # Load prepared wallet if the files exist. 50 ################################################################################ 51 52 if [ -f ./harnesschain.tar.gz ]; then 53 CHAIN_LOADED=1 54 echo "Seeding alpha chain from compressed file" 55 tar -xzf ./harnesschain.tar.gz -C ${NODES_ROOT} 56 if [[ -n "$HARNESS_VER_FILE" && ! -f "$HARNESS_VER_FILE" ]]; then 57 echo "Harness archive outdated! Deleting it." 58 rm -rf harnesschain.tar.gz "${NODES_ROOT}" 59 mkdir -p "${HARNESS_DIR}" 60 CHAIN_LOADED= 61 fi 62 fi 63 64 if [ ! "$CHAIN_LOADED" ]; then 65 mkdir -p "${ALPHA_DIR}" 66 mkdir -p "${BETA_DIR}" 67 if [ -n "$HARNESS_VER_FILE" ]; then 68 touch "${HARNESS_VER_FILE}" 69 fi 70 FULLCHAINFILE=$(cd $(dirname "${BASH_SOURCE[0]:-$0}") && pwd)/harnesschain.tar.gz 71 fi 72 73 # If there are any descriptor files, copy them to the nodes root folder. 74 cp desc-*.json ${NODES_ROOT} 2> /dev/null || true 75 76 cd ${NODES_ROOT} && tmux new-session -d -s $SESSION $SHELL 77 78 ################################################################################ 79 # Write config files. 80 ################################################################################ 81 82 # These config files aren't actually used here, but can be used by other 83 # programs. I would use them here, but bitcoind seems to have some issues 84 # reading from the file when using regtest. 85 86 cat > "${ALPHA_DIR}/alpha.conf" <<EOF 87 rpcuser=user 88 rpcpassword=pass 89 datadir=${ALPHA_DIR} 90 txindex=1 91 port=${ALPHA_LISTEN_PORT} 92 regtest=1 93 rpcport=${ALPHA_RPC_PORT} 94 EOF 95 96 cat > "${BETA_DIR}/beta.conf" <<EOF 97 rpcuser=user 98 rpcpassword=pass 99 datadir=${BETA_DIR} 100 txindex=1 101 regtest=1 102 rpcport=${BETA_RPC_PORT} 103 EOF 104 105 ################################################################################ 106 # Start the alpha node. 107 ################################################################################ 108 109 tmux rename-window -t $SESSION:0 'alpha' 110 tmux send-keys -t $SESSION:0 "set +o history" C-m 111 tmux send-keys -t $SESSION:0 "cd ${ALPHA_DIR}" C-m 112 echo "Starting simnet alpha node" 113 tmux send-keys -t $SESSION:0 "${DAEMON} -rpcuser=user -rpcpassword=pass \ 114 -rpcport=${ALPHA_RPC_PORT} -datadir=${ALPHA_DIR} $(deprecateddbd $ALPHA_DESCRIPTOR_WALLET) \ 115 -debug=rpc -debug=net -debug=mempool -debug=walletdb -debug=addrman -debug=mempoolrej \ 116 -whitelist=127.0.0.0/8 -whitelist=::1 \ 117 -txindex=1 -regtest=1 -port=${ALPHA_LISTEN_PORT} -fallbackfee=0.00001 \ 118 ${EXTRA_ARGS}; tmux wait-for -S alpha${SYMBOL}" C-m 119 sleep 3 120 121 ################################################################################ 122 # Setup the beta node. 123 ################################################################################ 124 125 tmux new-window -t $SESSION:1 -n 'beta' $SHELL 126 tmux send-keys -t $SESSION:1 "set +o history" C-m 127 tmux send-keys -t $SESSION:1 "cd ${BETA_DIR}" C-m 128 129 echo "Starting simnet beta node" 130 tmux send-keys -t $SESSION:1 "${DAEMON} -rpcuser=user -rpcpassword=pass $(deprecateddbd $BETA_DESCRIPTOR_WALLET)\ 131 -rpcport=${BETA_RPC_PORT} -datadir=${BETA_DIR} -txindex=1 -regtest=1 \ 132 -debug=rpc -debug=net -debug=mempool -debug=walletdb -debug=addrman -debug=mempoolrej \ 133 -whitelist=127.0.0.0/8 -whitelist=::1 \ 134 -port=${BETA_LISTEN_PORT} -fallbackfee=0.00001 ${EXTRA_ARGS}; \ 135 tmux wait-for -S beta${SYMBOL}" C-m 136 sleep 3 137 138 ################################################################################ 139 # Setup the harness-ctl directory 140 ################################################################################ 141 142 tmux new-window -t $SESSION:2 -n 'harness-ctl' $SHELL 143 tmux send-keys -t $SESSION:2 "set +o history" C-m 144 tmux send-keys -t $SESSION:2 "cd ${HARNESS_DIR}" C-m 145 sleep 1 146 147 cd ${HARNESS_DIR} 148 149 cat > "./alpha" <<EOF 150 #!/usr/bin/env bash 151 ${CLI} ${ALPHA_CLI_CFG} "\$@" 152 EOF 153 chmod +x "./alpha" 154 155 cat > "./mine-alpha" <<EOF 156 #!/usr/bin/env bash 157 ${CLI} ${ALPHA_CLI_CFG} generatetoaddress \$1 ${ALPHA_MINING_ADDR} 158 EOF 159 chmod +x "./mine-alpha" 160 161 cat > "./gamma" <<EOF 162 #!/usr/bin/env bash 163 ${CLI} ${GAMMA_CLI_CFG} "\$@" 164 EOF 165 chmod +x "./gamma" 166 167 cat > "./delta" <<EOF 168 #!/usr/bin/env bash 169 ${CLI} -rpcwallet=delta -rpcport=${BETA_RPC_PORT} -regtest=1 -rpcuser=user -rpcpassword=pass "\$@" 170 EOF 171 chmod +x "./delta" 172 173 cat > "./beta" <<EOF 174 #!/usr/bin/env bash 175 ${CLI} ${BETA_CLI_CFG} "\$@" 176 EOF 177 chmod +x "./beta" 178 179 cat > "./mine-beta" <<EOF 180 #!/usr/bin/env bash 181 ${CLI} ${BETA_CLI_CFG} generatetoaddress \$1 ${BETA_MINING_ADDR} 182 EOF 183 chmod +x "./mine-beta" 184 185 cat > "./reorg" <<EOF 186 #!/usr/bin/env bash 187 set -x 188 echo "Disconnecting beta from alpha" 189 sleep 1 190 ./beta disconnectnode 127.0.0.1:${ALPHA_LISTEN_PORT} 191 echo "Mining a block on alpha" 192 sleep 1 193 ./mine-alpha 1 194 echo "Mining 3 blocks on beta" 195 ./mine-beta 3 196 sleep 2 197 echo "Reconnecting beta to alpha" 198 ./beta addnode 127.0.0.1:${ALPHA_LISTEN_PORT} onetry 199 sleep 2 200 EOF 201 chmod +x "./reorg" 202 203 cat > "./new-wallet" <<EOF 204 #!/usr/bin/env bash 205 ${NEW_WALLET_CMD} 206 EOF 207 chmod +x "./new-wallet" 208 209 cat > "${HARNESS_DIR}/quit" <<EOF 210 #!/usr/bin/env bash 211 tmux send-keys -t $SESSION:0 C-c 212 tmux send-keys -t $SESSION:1 C-c 213 tmux send-keys -t $SESSION:3 C-c 214 tmux send-keys -t $SESSION:4 C-c 215 tmux wait-for alpha${SYMBOL} 216 tmux wait-for beta${SYMBOL} 217 # seppuku 218 tmux kill-session 219 EOF 220 chmod +x "${HARNESS_DIR}/quit" 221 222 if [ "$CHAIN_LOADED" ] ; then 223 tmux send-keys -t $SESSION:2 "./alpha loadwallet gamma${DONE}" C-m\; ${WAIT} 224 tmux send-keys -t $SESSION:2 "./beta loadwallet delta${DONE}" C-m\; ${WAIT} 225 # Get the median block time up to date. 226 tmux send-keys -t $SESSION:2 "./mine-alpha 12${DONE}" C-m\; ${WAIT} 227 tmux send-keys -t $SESSION:2 "./beta addnode 127.0.0.1:${ALPHA_LISTEN_PORT} add${DONE}" C-m\; ${WAIT} 228 229 else 230 sleep 1 231 tmux send-keys -t $SESSION:2 "./beta addnode 127.0.0.1:${ALPHA_LISTEN_PORT} add${DONE}" C-m\; ${WAIT} 232 # This timeout is apparently critical. Give the nodes time to sync. 233 sleep 2 234 235 ################################################################################ 236 # Have to generate a block before calling sethdseed 237 ################################################################################ 238 echo "Generating the genesis block" 239 tmux send-keys -t $SESSION:2 "./alpha generatetoaddress 1 ${ALPHA_MINING_ADDR}${DONE}" C-m\; ${WAIT} 240 sleep 2 241 242 if [ "$CREATE_DEFAULT_WALLET" ] ; then # bitcoin core v0.21+ does not create default wallet automatically 243 # Note that assets requiring CREATE_DEFAULT_WALLET also support named args. 244 # Create these as "blank" wallets since sethdseed or importdescriptors 245 # will follow. 246 tmux send-keys -t $SESSION:2 "./alpha -named createwallet wallet_name= blank=true passphrase=\"${WALLET_PASSWORD}\" descriptors=${ALPHA_DESCRIPTOR_WALLET}${DONE}" C-m\; ${WAIT} 247 tmux send-keys -t $SESSION:2 "./beta -named createwallet wallet_name= blank=true passphrase=\"${WALLET_PASSWORD}\" descriptors=${BETA_DESCRIPTOR_WALLET}${DONE}" C-m\; ${WAIT} 248 else 249 echo "Encrypting the alpha wallet (may take a minute)" 250 tmux send-keys -t $SESSION:2 "./alpha encryptwallet ${WALLET_PASSWORD}${DONE}" C-m\; ${WAIT} 251 252 echo "Encrypting the beta wallet" 253 tmux send-keys -t $SESSION:2 "./beta encryptwallet ${WALLET_PASSWORD}${DONE}" C-m\; ${WAIT} 254 fi 255 256 ################################################################################# 257 # Optional restart for some assets 258 ################################################################################ 259 260 if [ "$RESTART_AFTER_ENCRYPT" ] ; then 261 sleep 2 262 echo "Restarting alpha/beta nodes" 263 tmux send-keys -t $SESSION:0 "${DAEMON} -rpcuser=user -rpcpassword=pass \ 264 -rpcport=${ALPHA_RPC_PORT} -datadir=${ALPHA_DIR} \ 265 -txindex=1 -regtest=1 -port=${ALPHA_LISTEN_PORT} -fallbackfee=0.00001 ${EXTRA_ARGS}; \ 266 tmux wait-for -S alpha${SYMBOL}" C-m 267 268 tmux send-keys -t $SESSION:1 "${DAEMON} -rpcuser=user -rpcpassword=pass \ 269 -rpcport=${BETA_RPC_PORT} -datadir=${BETA_DIR} -txindex=1 -regtest=1 \ 270 -port=${BETA_LISTEN_PORT} -fallbackfee=0.00001 ${EXTRA_ARGS}; \ 271 tmux wait-for -S beta${SYMBOL}" C-m 272 sleep 3 273 274 tmux send-keys -t $SESSION:2 "./beta addnode 127.0.0.1:${ALPHA_LISTEN_PORT} add${DONE}" C-m\; ${WAIT} 275 fi 276 277 tmux send-keys -t $SESSION:2 "./alpha walletpassphrase ${WALLET_PASSWORD} 100000000${DONE}" C-m\; ${WAIT} 278 tmux send-keys -t $SESSION:2 "./beta walletpassphrase ${WALLET_PASSWORD} 100000000${DONE}" C-m\; ${WAIT} 279 280 echo "Setting private keys for alpha" 281 if [ -z "$ALPHA_WALLET_SEED" ]; then 282 tmux send-keys -t $SESSION:2 "./alpha importdescriptors \$(< ../desc-alpha.json)${DONE}" C-m\; ${WAIT} 283 else 284 tmux send-keys -t $SESSION:2 "./alpha sethdseed true ${ALPHA_WALLET_SEED}${DONE}" C-m\; ${WAIT} 285 fi 286 287 echo "Setting private keys for beta" 288 if [ -z "$BETA_WALLET_SEED" ]; then 289 tmux send-keys -t $SESSION:2 "./beta importdescriptors \$(< ../desc-beta.json)${DONE}" C-m\; ${WAIT} 290 else 291 tmux send-keys -t $SESSION:2 "./beta sethdseed true ${BETA_WALLET_SEED}${DONE}" C-m\; ${WAIT} 292 fi 293 294 ################################################################################ 295 # Setup the gamma wallet 296 ################################################################################ 297 echo "Creating the gamma wallet" 298 if [ -z "$GAMMA_WALLET_SEED" ]; then 299 tmux send-keys -t $SESSION:2 "./alpha -named createwallet wallet_name=gamma blank=true descriptors=true${DONE}" C-m\; ${WAIT} 300 tmux send-keys -t $SESSION:2 "./gamma importdescriptors \$(< ../desc-gamma.json)${DONE}" C-m\; ${WAIT} 301 else 302 # Use new-wallet since BCH does not support named parameters (or 303 # descriptors), while the descriptor enabled assets all support named. 304 tmux send-keys -t $SESSION:2 "./new-wallet alpha gamma${DONE}" C-m\; ${WAIT} 305 tmux send-keys -t $SESSION:2 "./gamma sethdseed true ${GAMMA_WALLET_SEED}${DONE}" C-m\; ${WAIT} 306 fi 307 308 ################################################################################ 309 # Create the delta wallet 310 ################################################################################ 311 echo "Creating the delta wallet" 312 if [ -z "$DELTA_WALLET_SEED" ]; then 313 tmux send-keys -t $SESSION:2 "./beta -named createwallet wallet_name=delta blank=true descriptors=true${DONE}" C-m\; ${WAIT} 314 tmux send-keys -t $SESSION:2 "./delta importdescriptors \$(< ../desc-delta.json)${DONE}" C-m\; ${WAIT} 315 else 316 tmux send-keys -t $SESSION:2 "./new-wallet beta delta${DONE}" C-m\; ${WAIT} 317 tmux send-keys -t $SESSION:2 "./delta sethdseed true ${DELTA_WALLET_SEED}${DONE}" C-m\; ${WAIT} 318 fi 319 320 ################################################################################# 321 # Generate addresses 322 ################################################################################ 323 324 tmux send-keys -t $SESSION:2 "./alpha getnewaddress${DONE}" C-m\; ${WAIT} 325 tmux send-keys -t $SESSION:2 "./alpha getnewaddress \"\" \"legacy\"${DONE}" C-m\; ${WAIT} 326 327 tmux send-keys -t $SESSION:2 "./beta getnewaddress${DONE}" C-m\; ${WAIT} 328 tmux send-keys -t $SESSION:2 "./beta getnewaddress \"\" \"legacy\"${DONE}" C-m\; ${WAIT} 329 330 tmux send-keys -t $SESSION:2 "./gamma getnewaddress${DONE}" C-m\; ${WAIT} 331 tmux send-keys -t $SESSION:2 "./gamma getnewaddress \"\" \"legacy\"${DONE}" C-m\; ${WAIT} 332 333 tmux send-keys -t $SESSION:2 "./delta getnewaddress${DONE}" C-m\; ${WAIT} 334 tmux send-keys -t $SESSION:2 "./delta getnewaddress \"\" \"legacy\"${DONE}" C-m\; ${WAIT} 335 336 if [ "$NEEDS_MWEB_PEGIN_ACTIVATION" ] ; then 337 ./alpha generatetoaddress 16 ${BETA_MINING_ADDR} 338 HEIGHT=$(./alpha getblockcount) 339 ./alpha generatetoaddress $((432 - $HEIGHT - 1)) ${ALPHA_MINING_ADDR} 340 MWADDR=$(./alpha getnewaddress mweb-peg-in mweb) 341 ./alpha sendtoaddress ${MWADDR} 1.234 && sleep 1 342 ./alpha generatetoaddress 3 ${ALPHA_MINING_ADDR} 343 else 344 BLOCKS_TO_MINE=${BLOCKS_TO_MINE=400} 345 echo "Generating ${BLOCKS_TO_MINE} blocks for alpha" 346 tmux send-keys -t $SESSION:2 "./alpha generatetoaddress ${BLOCKS_TO_MINE} ${ALPHA_MINING_ADDR}${DONE}" C-m\; ${WAIT} 347 fi 348 349 ################################################################################# 350 # Send gamma and delta some coin 351 ################################################################################ 352 353 # Send the beta wallet some dough too. 354 tmux send-keys -t $SESSION:2 "./alpha sendtoaddress ${BETA_MINING_ADDR} 1000${DONE}" C-m\; ${WAIT} 355 356 # Send some bitcoin to gamma and delta wallets, mining some blocks too. 357 echo "Sending 84 BTC each to gamma and delta in 8 blocks" 358 for i in 10 18 5 7 1 15 3 25 359 do 360 tmux send-keys -t $SESSION:2 "./alpha sendtoaddress ${GAMMA_ADDRESS} ${i}${DONE}" C-m\; ${WAIT} 361 tmux send-keys -t $SESSION:2 "./alpha sendtoaddress ${DELTA_ADDRESS} ${i}${DONE}" C-m\; ${WAIT} 362 tmux send-keys -t $SESSION:2 "./mine-alpha 1${DONE}" C-m\; ${WAIT} 363 done 364 365 # End of new wallet setup 366 fi 367 368 # Have alpha share a little more wealth, esp. for trade_simnet_test.go 369 tmux send-keys -t $SESSION:2 "./alpha walletpassphrase ${WALLET_PASSWORD} 100000000${DONE}" C-m\; ${WAIT} 370 RECIPIENTS="{\"${BETA_MINING_ADDR}\":12,\"${GAMMA_ADDRESS}\":12,\"${DELTA_ADDRESS}\":12}" 371 for i in {1..30}; do 372 tmux send-keys -t $SESSION:2 "./alpha sendmany \"\" '${RECIPIENTS}'${DONE}" C-m\; ${WAIT} 373 done 374 375 tmux send-keys -t $SESSION:2 "./mine-alpha 2${DONE}" C-m\; ${WAIT} 376 377 set +x 378 if [ ! "$CHAIN_LOADED" ]; then 379 echo "**********************************************************************" 380 echo "You may wish to recreate your harnesschain.tar.gz file AFTER stopping the nodes:" 381 echo " cd ${NODES_ROOT}" 382 echo " tar czf ${FULLCHAINFILE} alpha beta v${HARNESS_VER}" 383 echo "**********************************************************************" 384 fi 385 386 # Reenable history 387 tmux send-keys -t $SESSION:2 "set -o history" C-m 388 389 # Miner 390 if [ -z "$NOMINER" ] ; then 391 tmux new-window -t $SESSION:3 -n "miner" $SHELL 392 tmux send-keys -t $SESSION:3 "cd ${HARNESS_DIR}" C-m 393 tmux send-keys -t $SESSION:3 "watch -n 15 ./mine-alpha 1" C-m 394 fi 395 396 if [ ! -z "$GODAEMON" ]; then 397 $GODAEMON --version &> /dev/null 398 DAEMON_INSTALLED=$? 399 400 if [ $DAEMON_INSTALLED -eq 0 ]; then 401 echo "Go node found. Starting" 402 403 tmux new-window -t $SESSION:4 -n "go-node" $SHELL 404 tmux send-keys -t $SESSION:4 "set +o history" C-m 405 406 $GOCLIENT --version &> /dev/null 407 CLIENT_INSTALLED=$? 408 if [ $DAEMON_INSTALLED -eq 0 ]; then 409 echo "${GOCLIENT} installed" 410 411 OMEGA_DIR="${NODES_ROOT}/gonode" 412 mkdir -p "${OMEGA_DIR}" 413 414 NODE_CONF="${OMEGA_DIR}/gonode.conf" 415 CLIENT_CONF="${OMEGA_DIR}/goctl.conf" 416 417 418 cat > "${NODE_CONF}" <<EOF 419 addpeer=127.0.0.1:${ALPHA_LISTEN_PORT} 420 listen=:${OMEGA_LISTEN_PORT} 421 rpcuser=user 422 rpcpass=pass 423 rpclisten=0.0.0.0:${OMEGA_RPC_PORT} 424 regtest=1 425 rpccert=${OMEGA_DIR}/rpc.cert 426 rpckey=${OMEGA_DIR}/rpc.key 427 debuglevel=trace 428 EOF 429 430 cat > "${CLIENT_CONF}" <<EOF 431 rpcuser=user 432 rpcpass=pass 433 simnet=1 434 rpccert=${OMEGA_DIR}/rpc.cert 435 rpcserver=127.0.0.1:${OMEGA_RPC_PORT} 436 EOF 437 438 cat > "${HARNESS_DIR}/omega" <<EOF 439 #!/usr/bin/env bash 440 ${GOCLIENT} --configfile=${CLIENT_CONF} "\$@" 441 EOF 442 chmod +x "${HARNESS_DIR}/omega" 443 444 tmux send-keys -t $SESSION:4 "${GODAEMON} --datadir ${OMEGA_DIR} \ 445 --configfile ${NODE_CONF}" C-m 446 447 else 448 echo "Go CLI client not found" 449 fi 450 else 451 echo "Go node not found" 452 fi 453 fi 454 455 tmux select-window -t $SESSION:2 456 tmux attach-session -t $SESSION