1
0
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:
Rusty Russell 2017-03-08 11:05:10 +10:30
parent 373de09154
commit 06a5e6cbdb

174
tools/bolt3-bitcoind-test.sh Executable file
View 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