@ -39,7 +39,8 @@ class MerkleBlockTest(BitcoinTestFramework):
txid1 = self . nodes [ 0 ] . sendrawtransaction ( self . nodes [ 0 ] . signrawtransaction ( tx1 ) [ " hex " ] )
tx2 = self . nodes [ 0 ] . createrawtransaction ( [ node0utxos . pop ( ) ] , { self . nodes [ 1 ] . getnewaddress ( ) : 49.99 } )
txid2 = self . nodes [ 0 ] . sendrawtransaction ( self . nodes [ 0 ] . signrawtransaction ( tx2 ) [ " hex " ] )
assert_raises ( JSONRPCException , self . nodes [ 0 ] . gettxoutproof , [ txid1 ] )
# This will raise an exception because the transaction is not yet in a block
assert_raises_jsonrpc ( - 5 , " Transaction not yet in block " , self . nodes [ 0 ] . gettxoutproof , [ txid1 ] )
self . nodes [ 0 ] . generate ( 1 )
blockhash = self . nodes [ 0 ] . getblockhash ( chain_height + 1 )
@ -56,7 +57,7 @@ class MerkleBlockTest(BitcoinTestFramework):
txin_spent = self . nodes [ 1 ] . listunspent ( 1 ) . pop ( )
tx3 = self . nodes [ 1 ] . createrawtransaction ( [ txin_spent ] , { self . nodes [ 0 ] . getnewaddress ( ) : 49.98 } )
self . nodes [ 0 ] . sendrawtransaction ( self . nodes [ 1 ] . signrawtransaction ( tx3 ) [ " hex " ] )
txid3 = self . nodes [ 0 ] . sendrawtransaction ( self . nodes [ 1 ] . signrawtransaction ( tx3 ) [ " hex " ] )
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
@ -64,17 +65,21 @@ class MerkleBlockTest(BitcoinTestFramework):
txid_unspent = txid1 if txin_spent [ " txid " ] != txid1 else txid2
# We can't find the block from a fully-spent tx
assert_raises ( JSONRPCException , self . nodes [ 2 ] . gettxoutproof , [ txid_spent ] )
# ...but we can if we specify the block
assert_raises _jsonrpc( - 5 , " Transaction not yet in block " , self . nodes [ 2 ] . gettxoutproof , [ txid_spent ] )
# We can get the proof if we specify the block
assert_equal ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid_spent ] , blockhash ) ) , [ txid_spent ] )
# ...or if the first tx is not fully-spent
# We can't get the proof if we specify a non-existent block
assert_raises_jsonrpc ( - 5 , " Block not found " , self . nodes [ 2 ] . gettxoutproof , [ txid_spent ] , " 00000000000000000000000000000000 " )
# We can get the proof if the transaction is unspent
assert_equal ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid_unspent ] ) ) , [ txid_unspent ] )
try :
assert_equal ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid1 , txid2 ] ) ) , txlist )
except JSONRPCException :
assert_equal ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid2 , txid1 ] ) ) , txlist )
# ...or if we have a -txindex
# We can get the proof if we provide a list of transactions and one of them is unspent. The ordering of the list should not matter.
assert_equal ( sorted ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid1 , txid2 ] ) ) ) , sorted ( txlist ) )
assert_equal ( sorted ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 2 ] . gettxoutproof ( [ txid2 , txid1 ] ) ) ) , sorted ( txlist ) )
# We can always get a proof if we have a -txindex
assert_equal ( self . nodes [ 2 ] . verifytxoutproof ( self . nodes [ 3 ] . gettxoutproof ( [ txid_spent ] ) ) , [ txid_spent ] )
# We can't get a proof if we specify transactions from different blocks
assert_raises_jsonrpc ( - 5 , " Not all transactions found in specified or retrieved block " , self . nodes [ 2 ] . gettxoutproof , [ txid1 , txid3 ] )
if __name__ == ' __main__ ' :
MerkleBlockTest ( ) . main ( )