Browse Source
This removes the `conflictedbalance.sh` test as well, but that test has been broken for a long time and isn't part of any scripts. What it does is, IMO, sufficiently tested by other tests.0.13
Wladimir J. van der Laan
10 years ago
3 changed files with 0 additions and 281 deletions
@ -1,147 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
# Copyright (c) 2014 The Bitcoin Core developers |
|
||||||
# Distributed under the MIT software license, see the accompanying |
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
||||||
|
|
||||||
# Test marking of spent outputs |
|
||||||
|
|
||||||
# Create a transaction graph with four transactions, |
|
||||||
# A/B/C/D |
|
||||||
# C spends A |
|
||||||
# D spends B and C |
|
||||||
|
|
||||||
# Then simulate C being mutated, to create C' |
|
||||||
# that is mined. |
|
||||||
# A is still (correctly) considered spent. |
|
||||||
# B should be treated as unspent |
|
||||||
|
|
||||||
if [ $# -lt 1 ]; then |
|
||||||
echo "Usage: $0 path_to_binaries" |
|
||||||
echo "e.g. $0 ../../src" |
|
||||||
echo "Env vars BITCOIND and BITCOINCLI may be used to specify the exact binaries used" |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
set -f |
|
||||||
|
|
||||||
BITCOIND=${BITCOIND:-${1}/bitcoind} |
|
||||||
CLI=${BITCOINCLI:-${1}/bitcoin-cli} |
|
||||||
|
|
||||||
DIR="${BASH_SOURCE%/*}" |
|
||||||
SENDANDWAIT="${DIR}/send.sh" |
|
||||||
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi |
|
||||||
. "$DIR/util.sh" |
|
||||||
|
|
||||||
D=$(mktemp -d test.XXXXX) |
|
||||||
|
|
||||||
# Two nodes; one will play the part of merchant, the |
|
||||||
# other an evil transaction-mutating miner. |
|
||||||
|
|
||||||
D1=${D}/node1 |
|
||||||
CreateDataDir $D1 port=11000 rpcport=11001 |
|
||||||
B1ARGS="-datadir=$D1 -debug=mempool" |
|
||||||
$BITCOIND $B1ARGS & |
|
||||||
B1PID=$! |
|
||||||
|
|
||||||
D2=${D}/node2 |
|
||||||
CreateDataDir $D2 port=11010 rpcport=11011 |
|
||||||
B2ARGS="-datadir=$D2 -debug=mempool" |
|
||||||
$BITCOIND $B2ARGS & |
|
||||||
B2PID=$! |
|
||||||
|
|
||||||
# Wait until both nodes are at the same block number |
|
||||||
function WaitBlocks { |
|
||||||
while : |
|
||||||
do |
|
||||||
sleep 1 |
|
||||||
declare -i BLOCKS1=$( GetBlocks $B1ARGS ) |
|
||||||
declare -i BLOCKS2=$( GetBlocks $B2ARGS ) |
|
||||||
if (( BLOCKS1 == BLOCKS2 )) |
|
||||||
then |
|
||||||
break |
|
||||||
fi |
|
||||||
done |
|
||||||
} |
|
||||||
|
|
||||||
# Wait until node has $N peers |
|
||||||
function WaitPeers { |
|
||||||
while : |
|
||||||
do |
|
||||||
declare -i PEERS=$( $CLI $1 getconnectioncount ) |
|
||||||
if (( PEERS == "$2" )) |
|
||||||
then |
|
||||||
break |
|
||||||
fi |
|
||||||
sleep 1 |
|
||||||
done |
|
||||||
} |
|
||||||
|
|
||||||
echo "Generating test blockchain..." |
|
||||||
|
|
||||||
# Start with B2 connected to B1: |
|
||||||
$CLI $B2ARGS addnode 127.0.0.1:11000 onetry |
|
||||||
WaitPeers "$B1ARGS" 1 |
|
||||||
|
|
||||||
# 2 block, 50 XBT each == 100 XBT |
|
||||||
# These will be transactions "A" and "B" |
|
||||||
$CLI $B1ARGS generate 2 |
|
||||||
|
|
||||||
WaitBlocks |
|
||||||
# 100 blocks, 0 mature == 0 XBT |
|
||||||
$CLI $B2ARGS generate 100 |
|
||||||
WaitBlocks |
|
||||||
|
|
||||||
CheckBalance "$B1ARGS" 100 |
|
||||||
CheckBalance "$B2ARGS" 0 |
|
||||||
|
|
||||||
# restart B2 with no connection |
|
||||||
$CLI $B2ARGS stop > /dev/null 2>&1 |
|
||||||
wait $B2PID |
|
||||||
$BITCOIND $B2ARGS & |
|
||||||
B2PID=$! |
|
||||||
|
|
||||||
B1ADDRESS=$( $CLI $B1ARGS getnewaddress ) |
|
||||||
B2ADDRESS=$( $CLI $B2ARGS getnewaddress ) |
|
||||||
|
|
||||||
# Transaction C: send-to-self, spend A |
|
||||||
TXID_C=$( $CLI $B1ARGS sendtoaddress $B1ADDRESS 50.0) |
|
||||||
|
|
||||||
# Transaction D: spends B and C |
|
||||||
TXID_D=$( $CLI $B1ARGS sendtoaddress $B2ADDRESS 100.0) |
|
||||||
|
|
||||||
CheckBalance "$B1ARGS" 0 |
|
||||||
|
|
||||||
# Mutate TXID_C and add it to B2's memory pool: |
|
||||||
RAWTX_C=$( $CLI $B1ARGS getrawtransaction $TXID_C ) |
|
||||||
|
|
||||||
# ... mutate C to create C' |
|
||||||
L=${RAWTX_C:82:2} |
|
||||||
NEWLEN=$( printf "%x" $(( 16#$L + 1 )) ) |
|
||||||
MUTATEDTX_C=${RAWTX_C:0:82}${NEWLEN}4c${RAWTX_C:84} |
|
||||||
# ... give mutated tx1 to B2: |
|
||||||
MUTATEDTXID=$( $CLI $B2ARGS sendrawtransaction $MUTATEDTX_C ) |
|
||||||
|
|
||||||
echo "TXID_C: " $TXID_C |
|
||||||
echo "Mutated: " $MUTATEDTXID |
|
||||||
|
|
||||||
# Re-connect nodes, and have both nodes mine some blocks: |
|
||||||
$CLI $B2ARGS addnode 127.0.0.1:11000 onetry |
|
||||||
WaitPeers "$B1ARGS" 1 |
|
||||||
|
|
||||||
# Having B2 mine the next block puts the mutated |
|
||||||
# transaction C in the chain: |
|
||||||
$CLI $B2ARGS generate 1 |
|
||||||
WaitBlocks |
|
||||||
|
|
||||||
# B1 should still be able to spend 100, because D is conflicted |
|
||||||
# so does not count as a spend of B |
|
||||||
CheckBalance "$B1ARGS" 100 |
|
||||||
|
|
||||||
$CLI $B2ARGS stop > /dev/null 2>&1 |
|
||||||
wait $B2PID |
|
||||||
$CLI $B1ARGS stop > /dev/null 2>&1 |
|
||||||
wait $B1PID |
|
||||||
|
|
||||||
echo "Tests successful, cleaning up" |
|
||||||
rm -rf $D |
|
||||||
exit 0 |
|
@ -1,31 +0,0 @@ |
|||||||
#!/bin/bash |
|
||||||
# Copyright (c) 2014 The Bitcoin Core developers |
|
||||||
# Distributed under the MIT software license, see the accompanying |
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
||||||
TIMEOUT=10 |
|
||||||
SIGNAL=HUP |
|
||||||
PIDFILE=.send.pid |
|
||||||
if [ $# -eq 0 ]; then |
|
||||||
echo -e "Usage:\t$0 <cmd>" |
|
||||||
echo -e "\tRuns <cmd> and wait ${TIMEOUT} seconds or until SIG${SIGNAL} is received." |
|
||||||
echo -e "\tReturns: 0 if SIG${SIGNAL} is received, 1 otherwise." |
|
||||||
echo -e "Or:\t$0 -STOP" |
|
||||||
echo -e "\tsends SIG${SIGNAL} to running send.sh" |
|
||||||
exit 0 |
|
||||||
fi |
|
||||||
|
|
||||||
if [ $1 = "-STOP" ]; then |
|
||||||
if [ -s ${PIDFILE} ]; then |
|
||||||
kill -s ${SIGNAL} $(<$PIDFILE 2>/dev/null) 2>/dev/null |
|
||||||
fi |
|
||||||
exit 0 |
|
||||||
fi |
|
||||||
|
|
||||||
trap '[[ ${PID} ]] && kill ${PID}' ${SIGNAL} |
|
||||||
trap 'rm -f ${PIDFILE}' EXIT |
|
||||||
echo $$ > ${PIDFILE} |
|
||||||
"$@" |
|
||||||
sleep ${TIMEOUT} & PID=$! |
|
||||||
wait ${PID} && exit 1 |
|
||||||
|
|
||||||
exit 0 |
|
@ -1,103 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
# Copyright (c) 2014 The Bitcoin Core developers |
|
||||||
# Distributed under the MIT software license, see the accompanying |
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
||||||
|
|
||||||
# Functions used by more than one test |
|
||||||
|
|
||||||
function echoerr { |
|
||||||
echo "$@" 1>&2; |
|
||||||
} |
|
||||||
|
|
||||||
# Usage: ExtractKey <key> "<json_object_string>" |
|
||||||
# Warning: this will only work for the very-well-behaved |
|
||||||
# JSON produced by bitcoind, do NOT use it to try to |
|
||||||
# parse arbitrary/nested/etc JSON. |
|
||||||
function ExtractKey { |
|
||||||
echo $2 | tr -d ' "{}\n' | awk -v RS=',' -F: "\$1 ~ /$1/ { print \$2}" |
|
||||||
} |
|
||||||
|
|
||||||
function CreateDataDir { |
|
||||||
DIR=$1 |
|
||||||
mkdir -p $DIR |
|
||||||
CONF=$DIR/bitcoin.conf |
|
||||||
echo "regtest=1" >> $CONF |
|
||||||
echo "keypool=2" >> $CONF |
|
||||||
echo "rpcuser=rt" >> $CONF |
|
||||||
echo "rpcpassword=rt" >> $CONF |
|
||||||
echo "rpcwait=1" >> $CONF |
|
||||||
echo "walletnotify=${SENDANDWAIT} -STOP" >> $CONF |
|
||||||
shift |
|
||||||
while (( "$#" )); do |
|
||||||
echo $1 >> $CONF |
|
||||||
shift |
|
||||||
done |
|
||||||
} |
|
||||||
|
|
||||||
function AssertEqual { |
|
||||||
if (( $( echo "$1 == $2" | bc ) == 0 )) |
|
||||||
then |
|
||||||
echoerr "AssertEqual: $1 != $2" |
|
||||||
declare -f CleanUp > /dev/null 2>&1 |
|
||||||
if [[ $? -eq 0 ]] ; then |
|
||||||
CleanUp |
|
||||||
fi |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
} |
|
||||||
|
|
||||||
# CheckBalance -datadir=... amount account minconf |
|
||||||
function CheckBalance { |
|
||||||
declare -i EXPECT="$2" |
|
||||||
B=$( $CLI $1 getbalance $3 $4 ) |
|
||||||
if (( $( echo "$B == $EXPECT" | bc ) == 0 )) |
|
||||||
then |
|
||||||
echoerr "bad balance: $B (expected $2)" |
|
||||||
declare -f CleanUp > /dev/null 2>&1 |
|
||||||
if [[ $? -eq 0 ]] ; then |
|
||||||
CleanUp |
|
||||||
fi |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
} |
|
||||||
|
|
||||||
# Use: Address <datadir> [account] |
|
||||||
function Address { |
|
||||||
$CLI $1 getnewaddress $2 |
|
||||||
} |
|
||||||
|
|
||||||
# Send from to amount |
|
||||||
function Send { |
|
||||||
from=$1 |
|
||||||
to=$2 |
|
||||||
amount=$3 |
|
||||||
address=$(Address $to) |
|
||||||
txid=$( ${SENDANDWAIT} $CLI $from sendtoaddress $address $amount ) |
|
||||||
} |
|
||||||
|
|
||||||
# Use: Unspent <datadir> <n'th-last-unspent> <var> |
|
||||||
function Unspent { |
|
||||||
local r=$( $CLI $1 listunspent | awk -F'[ |:,"]+' "\$2 ~ /$3/ { print \$3 }" | tail -n $2 | head -n 1) |
|
||||||
echo $r |
|
||||||
} |
|
||||||
|
|
||||||
# Use: CreateTxn1 <datadir> <n'th-last-unspent> <destaddress> |
|
||||||
# produces hex from signrawtransaction |
|
||||||
function CreateTxn1 { |
|
||||||
TXID=$(Unspent $1 $2 txid) |
|
||||||
AMOUNT=$(Unspent $1 $2 amount) |
|
||||||
VOUT=$(Unspent $1 $2 vout) |
|
||||||
RAWTXN=$( $CLI $1 createrawtransaction "[{\"txid\":\"$TXID\",\"vout\":$VOUT}]" "{\"$3\":$AMOUNT}") |
|
||||||
ExtractKey hex "$( $CLI $1 signrawtransaction $RAWTXN )" |
|
||||||
} |
|
||||||
|
|
||||||
# Use: SendRawTxn <datadir> <hex_txn_data> |
|
||||||
function SendRawTxn { |
|
||||||
${SENDANDWAIT} $CLI $1 sendrawtransaction $2 |
|
||||||
} |
|
||||||
|
|
||||||
# Use: GetBlocks <datadir> |
|
||||||
# returns number of blocks from getinfo |
|
||||||
function GetBlocks { |
|
||||||
$CLI $1 getblockcount |
|
||||||
} |
|
Loading…
Reference in new issue