2017-12-21 20:33:47 +01:00
#!/usr/bin/env python3
2016-03-08 22:15:49 +01:00
# Copyright (c) 2014-2015 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 addressindex generation and fetching
#
from test_framework . test_framework import BitcoinTestFramework
from test_framework . util import *
2016-03-10 01:45:08 +01:00
from test_framework . script import *
from test_framework . mininode import *
import binascii
2016-03-08 22:15:49 +01:00
class AddressIndexTest ( BitcoinTestFramework ) :
2019-09-24 00:56:31 +02:00
def set_test_params ( self ) :
2018-04-18 13:48:59 +02:00
self . setup_clean_chain = True
self . num_nodes = 4
2016-03-08 22:15:49 +01:00
def setup_network ( self ) :
2019-09-24 00:56:31 +02:00
self . add_nodes ( self . num_nodes )
2016-03-08 22:15:49 +01:00
# Nodes 0/1 are "wallet" nodes
2019-09-24 00:56:31 +02:00
self . start_node ( 0 , [ " -relaypriority=0 " ] )
self . start_node ( 1 , [ " -addressindex " ] )
2016-03-08 22:15:49 +01:00
# Nodes 2/3 are used for testing
2019-09-24 00:56:31 +02:00
self . start_node ( 2 , [ " -addressindex " , " -relaypriority=0 " ] )
self . start_node ( 3 , [ " -addressindex " ] )
2016-03-08 22:15:49 +01:00
connect_nodes ( self . nodes [ 0 ] , 1 )
connect_nodes ( self . nodes [ 0 ] , 2 )
connect_nodes ( self . nodes [ 0 ] , 3 )
self . is_network_split = False
self . sync_all ( )
def run_test ( self ) :
2019-10-31 18:30:42 +01:00
self . log . info ( " Test that settings can ' t be changed without -reindex... " )
self . stop_node ( 1 )
2020-10-22 20:25:39 +02:00
self . nodes [ 1 ] . assert_start_raises_init_error ( [ " -addressindex=0 " ] , " You need to rebuild the database using -reindex to change -addressindex " , partial_match = True )
2019-10-31 18:30:42 +01:00
self . start_node ( 1 , [ " -addressindex=0 " , " -reindex " ] )
connect_nodes ( self . nodes [ 0 ] , 1 )
self . sync_all ( )
self . stop_node ( 1 )
2020-10-22 20:25:39 +02:00
self . nodes [ 1 ] . assert_start_raises_init_error ( [ " -addressindex " ] , " You need to rebuild the database using -reindex to change -addressindex " , partial_match = True )
2019-10-31 18:30:42 +01:00
self . start_node ( 1 , [ " -addressindex " , " -reindex " ] )
connect_nodes ( self . nodes [ 0 ] , 1 )
self . sync_all ( )
2019-03-08 09:05:00 +01:00
self . log . info ( " Mining blocks... " )
2016-03-08 22:15:49 +01:00
self . nodes [ 0 ] . generate ( 105 )
self . sync_all ( )
chain_height = self . nodes [ 1 ] . getblockcount ( )
assert_equal ( chain_height , 105 )
assert_equal ( self . nodes [ 1 ] . getbalance ( ) , 0 )
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , 0 )
2016-03-17 21:06:08 +01:00
# Check that balances are correct
2016-07-19 08:36:56 +02:00
balance0 = self . nodes [ 1 ] . getaddressbalance ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " )
2016-03-23 19:14:36 +01:00
assert_equal ( balance0 [ " balance " ] , 0 )
2016-03-17 21:06:08 +01:00
2016-03-10 01:45:08 +01:00
# Check p2pkh and p2sh address indexes
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing p2pkh and p2sh address index... " )
2016-03-10 01:45:08 +01:00
2016-07-19 08:36:56 +02:00
txid0 = self . nodes [ 0 ] . sendtoaddress ( " yMNJePdcKvXtWWQnFYHNeJ5u8TF2v1dfK4 " , 10 )
2016-03-15 21:24:55 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-07-19 08:36:56 +02:00
txidb0 = self . nodes [ 0 ] . sendtoaddress ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " , 10 )
2016-03-09 17:27:30 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-03-09 23:40:40 +01:00
2016-07-19 08:36:56 +02:00
txid1 = self . nodes [ 0 ] . sendtoaddress ( " yMNJePdcKvXtWWQnFYHNeJ5u8TF2v1dfK4 " , 15 )
2016-03-15 21:24:55 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-07-19 08:36:56 +02:00
txidb1 = self . nodes [ 0 ] . sendtoaddress ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " , 15 )
2016-03-09 17:27:30 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-03-09 23:40:40 +01:00
2016-07-19 08:36:56 +02:00
txid2 = self . nodes [ 0 ] . sendtoaddress ( " yMNJePdcKvXtWWQnFYHNeJ5u8TF2v1dfK4 " , 20 )
2016-03-15 21:24:55 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-07-19 08:36:56 +02:00
txidb2 = self . nodes [ 0 ] . sendtoaddress ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " , 20 )
2016-03-08 22:15:49 +01:00
self . nodes [ 0 ] . generate ( 1 )
2016-03-09 23:40:40 +01:00
2016-03-08 22:15:49 +01:00
self . sync_all ( )
2016-07-19 08:36:56 +02:00
txids = self . nodes [ 1 ] . getaddresstxids ( " yMNJePdcKvXtWWQnFYHNeJ5u8TF2v1dfK4 " )
2016-03-23 19:14:36 +01:00
assert_equal ( len ( txids ) , 3 )
assert_equal ( txids [ 0 ] , txid0 )
assert_equal ( txids [ 1 ] , txid1 )
assert_equal ( txids [ 2 ] , txid2 )
2016-03-08 22:15:49 +01:00
2016-07-19 08:36:56 +02:00
txidsb = self . nodes [ 1 ] . getaddresstxids ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " )
2016-03-23 19:14:36 +01:00
assert_equal ( len ( txidsb ) , 3 )
assert_equal ( txidsb [ 0 ] , txidb0 )
assert_equal ( txidsb [ 1 ] , txidb1 )
assert_equal ( txidsb [ 2 ] , txidb2 )
2016-03-09 23:40:40 +01:00
2016-04-12 22:04:10 +02:00
# Check that limiting by height works
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing querying txids by range of block heights.. " )
2016-04-12 22:04:10 +02:00
height_txids = self . nodes [ 1 ] . getaddresstxids ( {
2016-07-19 08:36:56 +02:00
" addresses " : [ " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " ] ,
2016-04-13 02:33:18 +02:00
" start " : 105 ,
" end " : 110
2016-04-12 22:04:10 +02:00
} )
2016-04-13 02:33:18 +02:00
assert_equal ( len ( height_txids ) , 2 )
assert_equal ( height_txids [ 0 ] , txidb0 )
assert_equal ( height_txids [ 1 ] , txidb1 )
2016-04-12 22:04:10 +02:00
2016-03-15 20:25:01 +01:00
# Check that multiple addresses works
2016-07-19 08:36:56 +02:00
multitxids = self . nodes [ 1 ] . getaddresstxids ( { " addresses " : [ " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " , " yMNJePdcKvXtWWQnFYHNeJ5u8TF2v1dfK4 " ] } )
2016-03-23 19:14:36 +01:00
assert_equal ( len ( multitxids ) , 6 )
assert_equal ( multitxids [ 0 ] , txid0 )
assert_equal ( multitxids [ 1 ] , txidb0 )
assert_equal ( multitxids [ 2 ] , txid1 )
assert_equal ( multitxids [ 3 ] , txidb1 )
assert_equal ( multitxids [ 4 ] , txid2 )
assert_equal ( multitxids [ 5 ] , txidb2 )
2016-03-15 20:25:01 +01:00
2016-03-17 21:06:08 +01:00
# Check that balances are correct
2016-07-19 08:36:56 +02:00
balance0 = self . nodes [ 1 ] . getaddressbalance ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " )
2016-03-23 19:14:36 +01:00
assert_equal ( balance0 [ " balance " ] , 45 * 100000000 )
2016-03-17 21:06:08 +01:00
2016-03-10 01:45:08 +01:00
# Check that outputs with the same address will only return one txid
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing for txid uniqueness... " )
2017-12-21 20:33:47 +01:00
addressHash = binascii . unhexlify ( " FE30B718DCF0BF8A2A686BF1820C073F8B2C3B37 " )
2016-03-10 01:45:08 +01:00
scriptPubKey = CScript ( [ OP_HASH160 , addressHash , OP_EQUAL ] )
unspent = self . nodes [ 0 ] . listunspent ( )
tx = CTransaction ( )
tx . vin = [ CTxIn ( COutPoint ( int ( unspent [ 0 ] [ " txid " ] , 16 ) , unspent [ 0 ] [ " vout " ] ) ) ]
tx . vout = [ CTxOut ( 10 , scriptPubKey ) , CTxOut ( 11 , scriptPubKey ) ]
tx . rehash ( )
2020-12-11 03:25:55 +01:00
signed_tx = self . nodes [ 0 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2019-03-15 07:18:16 +01:00
sent_txid = self . nodes [ 0 ] . sendrawtransaction ( signed_tx [ " hex " ] , True )
2016-03-10 01:45:08 +01:00
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
2016-07-19 08:36:56 +02:00
txidsmany = self . nodes [ 1 ] . getaddresstxids ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " )
2016-03-23 19:14:36 +01:00
assert_equal ( len ( txidsmany ) , 4 )
assert_equal ( txidsmany [ 3 ] , sent_txid )
2016-03-10 01:45:08 +01:00
2016-03-17 21:06:08 +01:00
# Check that balances are correct
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing balances... " )
2016-07-19 08:36:56 +02:00
balance0 = self . nodes [ 1 ] . getaddressbalance ( " 93bVhahvUKmQu8gu9g3QnPPa2cxFK98pMB " )
2016-03-23 19:14:36 +01:00
assert_equal ( balance0 [ " balance " ] , 45 * 100000000 + 21 )
# Check that balances are correct after spending
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing balances after spending... " )
2016-07-19 08:36:56 +02:00
privkey2 = " cU4zhap7nPJAWeMFu4j6jLrfPmqakDAzy8zn8Fhb3oEevdm4e5Lc "
address2 = " yeMpGzMj3rhtnz48XsfpB8itPHhHtgxLc3 "
2017-12-21 20:33:47 +01:00
addressHash2 = binascii . unhexlify ( " C5E4FB9171C22409809A3E8047A29C83886E325D " )
2016-03-23 19:14:36 +01:00
scriptPubKey2 = CScript ( [ OP_DUP , OP_HASH160 , addressHash2 , OP_EQUALVERIFY , OP_CHECKSIG ] )
self . nodes [ 0 ] . importprivkey ( privkey2 )
unspent = self . nodes [ 0 ] . listunspent ( )
tx = CTransaction ( )
2019-03-15 07:18:16 +01:00
tx_fee_sat = 1000
2016-03-23 19:14:36 +01:00
tx . vin = [ CTxIn ( COutPoint ( int ( unspent [ 0 ] [ " txid " ] , 16 ) , unspent [ 0 ] [ " vout " ] ) ) ]
2019-03-15 07:18:16 +01:00
amount = int ( unspent [ 0 ] [ " amount " ] * 100000000 ) - tx_fee_sat
2016-03-23 19:14:36 +01:00
tx . vout = [ CTxOut ( amount , scriptPubKey2 ) ]
tx . rehash ( )
2020-12-11 03:25:55 +01:00
signed_tx = self . nodes [ 0 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2019-03-15 07:18:16 +01:00
spending_txid = self . nodes [ 0 ] . sendrawtransaction ( signed_tx [ " hex " ] , True )
2016-03-23 19:14:36 +01:00
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
balance1 = self . nodes [ 1 ] . getaddressbalance ( address2 )
assert_equal ( balance1 [ " balance " ] , amount )
tx = CTransaction ( )
tx . vin = [ CTxIn ( COutPoint ( int ( spending_txid , 16 ) , 0 ) ) ]
send_amount = 1 * 100000000 + 12840
change_amount = amount - send_amount - 10000
2016-03-23 19:41:08 +01:00
tx . vout = [ CTxOut ( change_amount , scriptPubKey2 ) , CTxOut ( send_amount , scriptPubKey ) ]
2016-03-23 19:14:36 +01:00
tx . rehash ( )
2020-12-11 03:25:55 +01:00
signed_tx = self . nodes [ 0 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2019-03-15 07:18:16 +01:00
sent_txid = self . nodes [ 0 ] . sendrawtransaction ( signed_tx [ " hex " ] , True )
2016-03-23 19:14:36 +01:00
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
balance2 = self . nodes [ 1 ] . getaddressbalance ( address2 )
assert_equal ( balance2 [ " balance " ] , change_amount )
2016-03-17 21:06:08 +01:00
2016-03-24 20:44:23 +01:00
# Check that deltas are returned correctly
deltas = self . nodes [ 1 ] . getaddressdeltas ( { " addresses " : [ address2 ] , " start " : 0 , " end " : 200 } )
2016-03-28 22:47:20 +02:00
balance3 = 0
2016-03-24 20:44:23 +01:00
for delta in deltas :
balance3 + = delta [ " satoshis " ]
assert_equal ( balance3 , change_amount )
2016-04-21 21:59:51 +02:00
assert_equal ( deltas [ 0 ] [ " address " ] , address2 )
2016-05-10 16:27:03 +02:00
assert_equal ( deltas [ 0 ] [ " blockindex " ] , 1 )
2016-03-24 20:44:23 +01:00
2016-04-21 22:07:42 +02:00
# Check that entire range will be queried
deltasAll = self . nodes [ 1 ] . getaddressdeltas ( { " addresses " : [ address2 ] } )
assert_equal ( len ( deltasAll ) , len ( deltas ) )
2016-03-24 20:44:23 +01:00
# Check that deltas can be returned from range of block heights
deltas = self . nodes [ 1 ] . getaddressdeltas ( { " addresses " : [ address2 ] , " start " : 113 , " end " : 113 } )
2016-03-28 22:47:20 +02:00
assert_equal ( len ( deltas ) , 1 )
2016-03-29 21:17:30 +02:00
# Check that unspent outputs can be queried
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing utxos... " )
2016-03-29 21:17:30 +02:00
utxos = self . nodes [ 1 ] . getaddressutxos ( { " addresses " : [ address2 ] } )
2016-03-30 21:12:19 +02:00
assert_equal ( len ( utxos ) , 1 )
assert_equal ( utxos [ 0 ] [ " satoshis " ] , change_amount )
2016-03-29 21:17:30 +02:00
2016-03-28 22:47:20 +02:00
# Check that indexes will be updated with a reorg
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing reorg... " )
2016-03-28 22:47:20 +02:00
best_hash = self . nodes [ 0 ] . getbestblockhash ( )
self . nodes [ 0 ] . invalidateblock ( best_hash )
self . nodes [ 1 ] . invalidateblock ( best_hash )
self . nodes [ 2 ] . invalidateblock ( best_hash )
self . nodes [ 3 ] . invalidateblock ( best_hash )
2016-08-20 18:51:01 +02:00
# Allow some time for the reorg to start
2019-08-09 01:14:11 +02:00
self . bump_mocktime ( 2 )
2016-03-28 22:47:20 +02:00
self . sync_all ( )
balance4 = self . nodes [ 1 ] . getaddressbalance ( address2 )
assert_equal ( balance4 , balance1 )
2016-03-24 20:44:23 +01:00
2016-03-29 23:56:57 +02:00
utxos2 = self . nodes [ 1 ] . getaddressutxos ( { " addresses " : [ address2 ] } )
2016-03-30 21:12:19 +02:00
assert_equal ( len ( utxos2 ) , 1 )
2016-08-23 13:27:52 +02:00
assert_equal ( utxos2 [ 0 ] [ " satoshis " ] , amount )
2016-03-29 23:56:57 +02:00
2016-03-30 22:42:37 +02:00
# Check sorting of utxos
self . nodes [ 2 ] . generate ( 150 )
2020-09-27 07:43:00 +02:00
self . nodes [ 2 ] . sendtoaddress ( address2 , 50 )
2016-03-30 22:42:37 +02:00
self . nodes [ 2 ] . generate ( 1 )
2020-09-27 07:43:00 +02:00
self . nodes [ 2 ] . sendtoaddress ( address2 , 50 )
2016-03-30 22:42:37 +02:00
self . nodes [ 2 ] . generate ( 1 )
self . sync_all ( )
utxos3 = self . nodes [ 1 ] . getaddressutxos ( { " addresses " : [ address2 ] } )
assert_equal ( len ( utxos3 ) , 3 )
assert_equal ( utxos3 [ 0 ] [ " height " ] , 114 )
assert_equal ( utxos3 [ 1 ] [ " height " ] , 264 )
assert_equal ( utxos3 [ 2 ] [ " height " ] , 265 )
2016-04-04 22:37:43 +02:00
# Check mempool indexing
2019-03-08 09:05:00 +01:00
self . log . info ( " Testing mempool indexing... " )
2016-04-04 22:37:43 +02:00
2016-07-19 08:36:56 +02:00
privKey3 = " cRyrMvvqi1dmpiCmjmmATqjAwo6Wu7QTjKu1ABMYW5aFG4VXW99K "
address3 = " yWB15aAdpeKuSaQHFVJpBDPbNSLZJSnDLA "
2017-12-21 20:33:47 +01:00
addressHash3 = binascii . unhexlify ( " 6C186B3A308A77C779A9BB71C3B5A7EC28232A13 " )
2016-04-04 22:37:43 +02:00
scriptPubKey3 = CScript ( [ OP_DUP , OP_HASH160 , addressHash3 , OP_EQUALVERIFY , OP_CHECKSIG ] )
2016-07-19 08:36:56 +02:00
# address4 = "2N8oFVB2vThAKury4vnLquW2zVjsYjjAkYQ"
2016-06-10 20:02:51 +02:00
scriptPubKey4 = CScript ( [ OP_HASH160 , addressHash3 , OP_EQUAL ] )
2016-04-04 22:37:43 +02:00
unspent = self . nodes [ 2 ] . listunspent ( )
tx = CTransaction ( )
tx . vin = [ CTxIn ( COutPoint ( int ( unspent [ 0 ] [ " txid " ] , 16 ) , unspent [ 0 ] [ " vout " ] ) ) ]
2019-03-15 07:18:16 +01:00
amount = int ( unspent [ 0 ] [ " amount " ] * 100000000 ) - tx_fee_sat
2016-04-04 22:37:43 +02:00
tx . vout = [ CTxOut ( amount , scriptPubKey3 ) ]
tx . rehash ( )
2020-12-11 03:25:55 +01:00
signed_tx = self . nodes [ 2 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2019-03-15 07:18:16 +01:00
memtxid1 = self . nodes [ 2 ] . sendrawtransaction ( signed_tx [ " hex " ] , True )
2019-08-09 01:14:11 +02:00
self . bump_mocktime ( 2 )
2016-04-04 22:37:43 +02:00
tx2 = CTransaction ( )
tx2 . vin = [ CTxIn ( COutPoint ( int ( unspent [ 1 ] [ " txid " ] , 16 ) , unspent [ 1 ] [ " vout " ] ) ) ]
2019-03-15 07:18:16 +01:00
amount = int ( unspent [ 1 ] [ " amount " ] * 100000000 ) - tx_fee_sat
2016-06-10 20:02:51 +02:00
tx2 . vout = [
2017-12-21 20:33:47 +01:00
CTxOut ( int ( amount / 4 ) , scriptPubKey3 ) ,
CTxOut ( int ( amount / 4 ) , scriptPubKey3 ) ,
CTxOut ( int ( amount / 4 ) , scriptPubKey4 ) ,
CTxOut ( int ( amount / 4 ) , scriptPubKey4 )
2016-06-10 20:02:51 +02:00
]
2016-04-04 22:37:43 +02:00
tx2 . rehash ( )
2020-12-11 03:25:55 +01:00
signed_tx2 = self . nodes [ 2 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx2 . serialize ( ) ) . decode ( " utf-8 " ) )
2019-03-15 07:18:16 +01:00
memtxid2 = self . nodes [ 2 ] . sendrawtransaction ( signed_tx2 [ " hex " ] , True )
2019-08-09 01:14:11 +02:00
self . bump_mocktime ( 2 )
2016-04-04 22:37:43 +02:00
mempool = self . nodes [ 2 ] . getaddressmempool ( { " addresses " : [ address3 ] } )
2016-06-09 20:02:30 +02:00
assert_equal ( len ( mempool ) , 3 )
2016-04-04 22:37:43 +02:00
assert_equal ( mempool [ 0 ] [ " txid " ] , memtxid1 )
2016-04-21 21:59:51 +02:00
assert_equal ( mempool [ 0 ] [ " address " ] , address3 )
2016-06-09 20:02:30 +02:00
assert_equal ( mempool [ 0 ] [ " index " ] , 0 )
assert_equal ( mempool [ 1 ] [ " txid " ] , memtxid2 )
assert_equal ( mempool [ 1 ] [ " index " ] , 0 )
assert_equal ( mempool [ 2 ] [ " txid " ] , memtxid2 )
assert_equal ( mempool [ 2 ] [ " index " ] , 1 )
2016-04-04 22:37:43 +02:00
2020-06-14 03:58:03 +02:00
self . nodes [ 2 ] . generate ( 1 )
self . sync_all ( )
2016-04-04 22:37:43 +02:00
mempool2 = self . nodes [ 2 ] . getaddressmempool ( { " addresses " : [ address3 ] } )
assert_equal ( len ( mempool2 ) , 0 )
2016-04-21 21:23:52 +02:00
tx = CTransaction ( )
2016-06-10 20:02:51 +02:00
tx . vin = [
CTxIn ( COutPoint ( int ( memtxid2 , 16 ) , 0 ) ) ,
CTxIn ( COutPoint ( int ( memtxid2 , 16 ) , 1 ) )
]
2017-12-21 20:33:47 +01:00
tx . vout = [ CTxOut ( int ( amount / 2 - 10000 ) , scriptPubKey2 ) ]
2016-04-21 21:23:52 +02:00
tx . rehash ( )
self . nodes [ 2 ] . importprivkey ( privKey3 )
2020-12-11 03:25:55 +01:00
signed_tx3 = self . nodes [ 2 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2020-09-27 07:43:00 +02:00
self . nodes [ 2 ] . sendrawtransaction ( signed_tx3 [ " hex " ] , True )
2019-08-09 01:14:11 +02:00
self . bump_mocktime ( 2 )
2016-04-21 21:23:52 +02:00
mempool3 = self . nodes [ 2 ] . getaddressmempool ( { " addresses " : [ address3 ] } )
2016-06-09 20:02:30 +02:00
assert_equal ( len ( mempool3 ) , 2 )
2016-04-21 21:23:52 +02:00
assert_equal ( mempool3 [ 0 ] [ " prevtxid " ] , memtxid2 )
assert_equal ( mempool3 [ 0 ] [ " prevout " ] , 0 )
2016-06-09 20:02:30 +02:00
assert_equal ( mempool3 [ 1 ] [ " prevtxid " ] , memtxid2 )
assert_equal ( mempool3 [ 1 ] [ " prevout " ] , 1 )
2016-04-21 21:23:52 +02:00
2016-06-10 20:41:51 +02:00
# sending and receiving to the same address
2016-07-19 08:36:56 +02:00
privkey1 = " cMvZn1pVWntTEcsK36ZteGQXRAcZ8CoTbMXF1QasxBLdnTwyVQCc "
address1 = " yM9Eed1bxjy7tYxD3yZDHxjcVT48WdRoB1 "
2017-12-21 20:33:47 +01:00
address1hash = binascii . unhexlify ( " 0909C84A817651502E020AAD0FBCAE5F656E7D8A " )
2016-06-10 20:41:51 +02:00
address1script = CScript ( [ OP_DUP , OP_HASH160 , address1hash , OP_EQUALVERIFY , OP_CHECKSIG ] )
self . nodes [ 0 ] . sendtoaddress ( address1 , 10 )
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
utxos = self . nodes [ 1 ] . getaddressutxos ( { " addresses " : [ address1 ] } )
assert_equal ( len ( utxos ) , 1 )
tx = CTransaction ( )
tx . vin = [
CTxIn ( COutPoint ( int ( utxos [ 0 ] [ " txid " ] , 16 ) , utxos [ 0 ] [ " outputIndex " ] ) )
]
2017-12-21 20:33:47 +01:00
amount = int ( utxos [ 0 ] [ " satoshis " ] - 10000 )
2016-06-10 20:41:51 +02:00
tx . vout = [ CTxOut ( amount , address1script ) ]
tx . rehash ( )
self . nodes [ 0 ] . importprivkey ( privkey1 )
2020-12-11 03:25:55 +01:00
signed_tx = self . nodes [ 0 ] . signrawtransactionwithwallet ( binascii . hexlify ( tx . serialize ( ) ) . decode ( " utf-8 " ) )
2020-09-27 07:43:00 +02:00
self . nodes [ 0 ] . sendrawtransaction ( signed_tx [ " hex " ] , True )
2016-06-10 20:41:51 +02:00
self . sync_all ( )
mempool_deltas = self . nodes [ 2 ] . getaddressmempool ( { " addresses " : [ address1 ] } )
assert_equal ( len ( mempool_deltas ) , 2 )
2019-03-08 09:05:00 +01:00
self . log . info ( " Passed " )
2016-03-10 01:45:08 +01:00
2016-03-09 23:40:40 +01:00
2016-03-08 22:15:49 +01:00
if __name__ == ' __main__ ' :
AddressIndexTest ( ) . main ( )