mirror of
https://github.com/lightning/bolts.git
synced 2024-11-19 01:50:03 +01:00
tools/bolt3-bitcoind-test.sh: setup to feed BOLT3 test vector txs to bitcoind.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
373de09154
commit
06a5e6cbdb
174
tools/bolt3-bitcoind-test.sh
Executable file
174
tools/bolt3-bitcoind-test.sh
Executable file
@ -0,0 +1,174 @@
|
||||
#! /bin/sh
|
||||
|
||||
# To run all tests, try:
|
||||
# grep 'name: .*commitment tx' ../03-transactions.md | cut -d: -f2- | while read t; do ./bolt3-test-vector.sh $t || break; done
|
||||
|
||||
TESTDIR=/tmp/bolt3-testdir.$$
|
||||
BOLT3=../03-transactions.md
|
||||
|
||||
set -e
|
||||
CLI="bitcoin-cli -datadir=$TESTDIR"
|
||||
TEST=$TESTDIR/test
|
||||
|
||||
VERBOSE=:
|
||||
VERBOSEPIPE=:
|
||||
if [ x"$1" = x"--verbose" ]; then
|
||||
VERBOSE=echo
|
||||
VERBOSEPIPE=cat
|
||||
shift
|
||||
fi
|
||||
|
||||
# FIXME: This doesn't work in 0.14 (see bitcoin-core commit
|
||||
# 7d4e9509ade0c258728011d8f6544ec3e75d63dc)
|
||||
#FEELESS_TXS_OK=${FEELESS_TXS_OK:-true}
|
||||
FEELESS_TXS_OK=${FEELESS_TXS_OK:-false}
|
||||
|
||||
# Comment this out to postmortem
|
||||
trap "$CLI stop >/dev/null 2>&1 || true; sleep 1; rm -rf $TESTDIR" EXIT
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
echo Usage: $0 "[--verbose] <testname>..." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Usage <fieldname> <document>
|
||||
extract_fields()
|
||||
{
|
||||
grep "^ $1:" $2 || true
|
||||
}
|
||||
|
||||
# Usage <fieldname> <document>
|
||||
extract_field()
|
||||
{
|
||||
if [ $(grep -c "^ $1:" $2) != 1 ]; then
|
||||
echo "Ambigious field $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
extract_fields "$@" | cut -d: -f2-
|
||||
}
|
||||
|
||||
# Usage <htlcnum> <property> <document>
|
||||
htlc_property()
|
||||
{
|
||||
extract_field "htlc $1 $2" $3
|
||||
}
|
||||
|
||||
# Usage <testname>
|
||||
extract_test()
|
||||
{
|
||||
print=:
|
||||
found=false
|
||||
while read LINE; do
|
||||
case "$LINE" in
|
||||
"name: $1")
|
||||
print=echo
|
||||
$print " $LINE"
|
||||
found=true
|
||||
;;
|
||||
"name:"*|"")
|
||||
print=true
|
||||
;;
|
||||
*)
|
||||
$print " $LINE"
|
||||
;;
|
||||
esac
|
||||
done < $BOLT3
|
||||
|
||||
if ! $found; then
|
||||
echo "No test $1 found" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
mkdir $TESTDIR
|
||||
echo regtest=1 > $TESTDIR/bitcoin.conf
|
||||
echo rpcbind=127.0.0.1 >> $TESTDIR/bitcoin.conf
|
||||
echo rpcport=18333 >> $TESTDIR/bitcoin.conf
|
||||
echo rpcpassword=$(od -tx1 -A none -N20 < /dev/urandom | tr -d ' ') >> $TESTDIR/bitcoin.conf
|
||||
|
||||
if $FEELESS_TXS_OK; then
|
||||
echo minrelaytxfee=0 >> $TESTDIR/bitcoin.conf
|
||||
else
|
||||
echo minrelaytxfee=0.00000001 >> $TESTDIR/bitcoin.conf
|
||||
fi
|
||||
|
||||
$VERBOSE Starting bitcoind
|
||||
bitcoind -datadir=$TESTDIR &
|
||||
|
||||
i=0
|
||||
while ! $CLI getinfo >/dev/null 2>&1; do
|
||||
sleep 0.1
|
||||
i=$(($i + 1))
|
||||
if [ $i -ge 50 ]; then
|
||||
echo Bitcoind failed to start >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
$VERBOSE Checking bitcoind genesis block matches BOLT3
|
||||
GENESIS=$($CLI getblock $($CLI getblockhash 0) false)
|
||||
|
||||
if [ $GENESIS != $(extract_field 'Block 0 (genesis)' $BOLT3) ]; then
|
||||
echo Bad genesis block >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
$VERBOSE Submitting block '#1' from BOLT3
|
||||
$CLI submitblock $(extract_field 'Block 1' $BOLT3)
|
||||
# To activate segwit via BIP9, we need at least 432 blocks! Also lets us spend tx.
|
||||
|
||||
$VERBOSE Activating SegWit
|
||||
$CLI generate 432 > /dev/null
|
||||
|
||||
$VERBOSE Sending funding transaction from BOLT3
|
||||
TXID=$($CLI sendrawtransaction $(extract_field 'funding tx' $BOLT3))
|
||||
if [ $TXID != $(extract_field '# txid' $BOLT3) ]; then
|
||||
echo Bad funding txid >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -n Running \""$*"\":\
|
||||
|
||||
extract_test "$*" > $TEST
|
||||
if ! $FEELESS_TXS_OK && [ $(extract_field 'local_feerate_per_kw' $TEST) = 0 ]
|
||||
then
|
||||
echo SKIPPED
|
||||
$VERBOSE "Override by prepending FEELESS_TXS_OK=true to commandline"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# In verbose mode, we need a CR here.
|
||||
$VERBOSE
|
||||
|
||||
TX=$(extract_field 'output commit_tx' $TEST)
|
||||
$VERBOSE -n "Submitting commit_tx: "
|
||||
$CLI sendrawtransaction $TX | $VERBOSEPIPE
|
||||
|
||||
# We can use success txs immediately
|
||||
extract_fields 'output htlc_success_tx [0-9]*' $TEST | while read TX; do
|
||||
$VERBOSE -n "Submitting ${TX%%:*}: "
|
||||
$CLI sendrawtransaction ${TX#*:} | $VERBOSEPIPE
|
||||
done
|
||||
|
||||
# Timeout txs have to wait for timeout; fortunately they're in order.
|
||||
extract_fields 'output htlc_timeout_tx [0-9]*' $TEST | while read TX; do
|
||||
TITLE=${TX%%:*}
|
||||
HTLC=${TITLE##* }
|
||||
EXPIRY=$(htlc_property $HTLC expiry $BOLT3)
|
||||
# Should fail before expiry.
|
||||
$CLI generate $(($EXPIRY - 1 - $($CLI getblockcount) )) >/dev/null
|
||||
HEIGHT=$EXPIRY-1
|
||||
$VERBOSE -n "Submitting ${TX%%:*} TOO EARLY: "
|
||||
if $CLI sendrawtransaction ${TX#*:} > $TESTDIR/too-early 2>&1; then
|
||||
$VERBOSE $TESTDIR/too-early
|
||||
echo "Timeout worked at blockheight $($CLI getblockcount) not $EXPIRY" >&2
|
||||
exit 1
|
||||
fi
|
||||
tail -n1 $TESTDIR/too-early | $VERBOSEPIPE
|
||||
$CLI generate 1 >/dev/null
|
||||
$VERBOSE -n "Submitting ${TX%%:*}: "
|
||||
$CLI sendrawtransaction ${TX#*:} | $VERBOSEPIPE
|
||||
done
|
||||
|
||||
echo Success
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user