# shellcheck shell=bash # Shared config + helpers for the fd-double-close REPRODUCTION harness. # Regtest only. Meant to run INSIDE an unprivileged network namespace (see ns.sh), # so every port is private to the namespace and nothing can reach a real network. set +e REPRO=${REPRO:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)} SRCROOT=$(cd "$REPRO/../../.." && pwd) BIN=${BIN:-$SRCROOT/src} # dir with dragonxd + dragonx-cli (build with -g -rdynamic for backtraces) DRAGONXD=$BIN/dragonxd CLI=$BIN/dragonx-cli RUNS=${RUNS:-$HOME/fd-guard-runs} # run output (block files, logs): keep it out of the repo GOLDEN=${GOLDEN:?set GOLDEN to a regtest datadir with a grown wallet (it is only ever copied)} ASMAP=${ASMAP:-$SRCROOT/asmap.dat} SP=${SP:-$HOME/.zcash-params/sapling-spend.params} OP=${OP:-$HOME/.zcash-params/sapling-output.params} SHIM=${SHIM:-$REPRO/../shim/libfdguard.so} RPCUSER=ab RPCPASS=abpass RPC_T=18901 ; P2P_T=18911 RPC_H1=18902; P2P_H1=18912 RPC_H2=18903; P2P_H2=18913 TORPORT=18950 clin() { local dd=$1 rp=$2; shift 2; "$CLI" -regtest -datadir="$dd" -rpcuser=$RPCUSER -rpcpassword=$RPCPASS -rpcport=$rp "$@"; } write_conf() { printf 'rpcuser=%s\nrpcpassword=%s\nrpcport=%s\n' "$RPCUSER" "$RPCPASS" "$2" > "$1/DRAGONX.conf"; } # prep_golden
: copy of the golden wallet datadir (2041 notes, txindex=1, height 286) prep_golden() { local dd=$1 rm -rf "$dd"; cp -a "$GOLDEN" "$dd" cp -f "$ASMAP" "$dd/asmap.dat"; cp -f "$SP" "$dd/sapling-spend.params"; cp -f "$OP" "$dd/sapling-output.params" write_conf "$dd" "$RPC_T" : > "$dd/regtest/debug.log"; rm -f "$dd/regtest/db.log" } # prep_fresh
: empty regtest datadir (helpers) prep_fresh() { local dd=$1 rp=$2 rm -rf "$dd"; mkdir -p "$dd" cp -f "$ASMAP" "$dd/asmap.dat"; cp -f "$SP" "$dd/sapling-spend.params"; cp -f "$OP" "$dd/sapling-output.params" write_conf "$dd" "$rp" } start_helper() { #
local dd=$1 p2p=$2 rp=$3 lg=$4 ( cd "$dd" && exec nice -n 10 "$DRAGONXD" -regtest -datadir="$dd" -testnode=1 -checkpoints=0 \ -listen=1 -bind=127.0.0.1 -port=$p2p -connect=127.0.0.1:1 -addnode=127.0.0.1:$P2P_T \ -dnsseed=0 -dns=0 -asmap="$dd/asmap.dat" -autoshield=0 \ -rpcuser=$RPCUSER -rpcpassword=$RPCPASS -rpcport=$rp -listenonion=0 -maxinboundfromip=100 \ -debug=net -debug=tls -daemon ) >> "$lg" 2>&1 } waitrpc() { #
[secs] local dd=$1 rp=$2 n=${3:-300} i for i in $(seq 1 "$n"); do clin "$dd" "$rp" getblockcount >/dev/null 2>&1 && return 0; sleep 1; done return 1 } stop_daemon() { #
(helpers, started with -daemon) local dd=$1 rp=$2 pid i pid=$(cat "$dd/regtest/hushd.pid" 2>/dev/null) clin "$dd" "$rp" stop >/dev/null 2>&1 for i in $(seq 1 90); do { [ -z "$pid" ] || ! kill -0 "$pid" 2>/dev/null; } && return 0; sleep 1; done [ -n "$pid" ] && kill -9 "$pid" 2>/dev/null } MARKERS=('libevent: Epoll' 'Socket close failed' 'Bad file descriptor' 'Operation not permitted' 'Illegal seek' 'SSL_write' 'Unable to seek' 'socket select error' 'write failed for page' 'PANIC' 'error scanning DB' 'terminate' 'Assertion' 'EXCEPTION')