44# file COPYING or http://www.opensource.org/licenses/mit-license.php.
55"""Test the prioritisetransaction mining RPC."""
66
7+ from decimal import Decimal
78import time
89
10+ from test_framework .blocktools import COINBASE_MATURITY
911from test_framework .messages import COIN , MAX_BLOCK_WEIGHT
1012from test_framework .test_framework import BitcoinTestFramework
1113from test_framework .util import assert_equal , assert_raises_rpc_error , create_confirmed_utxos , create_lots_of_big_transactions , gen_return_txouts
14+ from test_framework .wallet import MiniWallet
15+
1216
1317class PrioritiseTransactionTest (BitcoinTestFramework ):
1418 def set_test_params (self ):
@@ -23,7 +27,84 @@ def set_test_params(self):
2327 def skip_test_if_missing_module (self ):
2428 self .skip_if_no_wallet ()
2529
30+ def test_diamond (self ):
31+ self .log .info ("Test diamond-shape package with priority" )
32+ self .generate (self .wallet , COINBASE_MATURITY + 1 )
33+ mock_time = int (time .time ())
34+ self .nodes [0 ].setmocktime (mock_time )
35+
36+ # tx_a
37+ # / \
38+ # / \
39+ # tx_b tx_c
40+ # \ /
41+ # \ /
42+ # tx_d
43+
44+ tx_o_a = self .wallet .send_self_transfer_multi (
45+ from_node = self .nodes [0 ],
46+ num_outputs = 2 ,
47+ )
48+ txid_a = tx_o_a ["txid" ]
49+
50+ tx_o_b , tx_o_c = [self .wallet .send_self_transfer (
51+ from_node = self .nodes [0 ],
52+ utxo_to_spend = u ,
53+ ) for u in tx_o_a ["new_utxos" ]]
54+ txid_b = tx_o_b ["txid" ]
55+ txid_c = tx_o_c ["txid" ]
56+
57+ tx_o_d = self .wallet .send_self_transfer_multi (
58+ from_node = self .nodes [0 ],
59+ utxos_to_spend = [
60+ self .wallet .get_utxo (txid = txid_b ),
61+ self .wallet .get_utxo (txid = txid_c ),
62+ ],
63+ )
64+ txid_d = tx_o_d ["txid" ]
65+
66+ self .log .info ("Test priority while txs are in mempool" )
67+ raw_before = self .nodes [0 ].getrawmempool (verbose = True )
68+ fee_delta_b = Decimal (9999 ) / COIN
69+ fee_delta_c_1 = Decimal (- 1234 ) / COIN
70+ fee_delta_c_2 = Decimal (8888 ) / COIN
71+ self .nodes [0 ].prioritisetransaction (txid = txid_b , fee_delta = int (fee_delta_b * COIN ))
72+ self .nodes [0 ].prioritisetransaction (txid = txid_c , fee_delta = int (fee_delta_c_1 * COIN ))
73+ self .nodes [0 ].prioritisetransaction (txid = txid_c , fee_delta = int (fee_delta_c_2 * COIN ))
74+ raw_before [txid_a ]["fees" ]["descendant" ] += fee_delta_b + fee_delta_c_1 + fee_delta_c_2
75+ raw_before [txid_b ]["fees" ]["modified" ] += fee_delta_b
76+ raw_before [txid_b ]["fees" ]["ancestor" ] += fee_delta_b
77+ raw_before [txid_b ]["fees" ]["descendant" ] += fee_delta_b
78+ raw_before [txid_c ]["fees" ]["modified" ] += fee_delta_c_1 + fee_delta_c_2
79+ raw_before [txid_c ]["fees" ]["ancestor" ] += fee_delta_c_1 + fee_delta_c_2
80+ raw_before [txid_c ]["fees" ]["descendant" ] += fee_delta_c_1 + fee_delta_c_2
81+ raw_before [txid_d ]["fees" ]["ancestor" ] += fee_delta_b + fee_delta_c_1 + fee_delta_c_2
82+ raw_after = self .nodes [0 ].getrawmempool (verbose = True )
83+ assert_equal (raw_before [txid_a ], raw_after [txid_a ])
84+ assert_equal (raw_before , raw_after )
85+
86+ self .log .info ("Test priority while txs are not in mempool" )
87+ self .restart_node (0 , extra_args = ["-nopersistmempool" ])
88+ self .nodes [0 ].setmocktime (mock_time )
89+ assert_equal (self .nodes [0 ].getmempoolinfo ()["size" ], 0 )
90+ self .nodes [0 ].prioritisetransaction (txid = txid_b , fee_delta = int (fee_delta_b * COIN ))
91+ self .nodes [0 ].prioritisetransaction (txid = txid_c , fee_delta = int (fee_delta_c_1 * COIN ))
92+ self .nodes [0 ].prioritisetransaction (txid = txid_c , fee_delta = int (fee_delta_c_2 * COIN ))
93+ for t in [tx_o_a ["hex" ], tx_o_b ["hex" ], tx_o_c ["hex" ], tx_o_d ["hex" ]]:
94+ self .nodes [0 ].sendrawtransaction (t )
95+ raw_after = self .nodes [0 ].getrawmempool (verbose = True )
96+ assert_equal (raw_before [txid_a ], raw_after [txid_a ])
97+ assert_equal (raw_before , raw_after )
98+
99+ # Clear mempool
100+ self .generate (self .nodes [0 ], 1 )
101+
102+ # Use default extra_args
103+ self .restart_node (0 )
104+
26105 def run_test (self ):
106+ self .wallet = MiniWallet (self .nodes [0 ])
107+
27108 # Test `prioritisetransaction` required parameters
28109 assert_raises_rpc_error (- 1 , "prioritisetransaction" , self .nodes [0 ].prioritisetransaction )
29110 assert_raises_rpc_error (- 1 , "prioritisetransaction" , self .nodes [0 ].prioritisetransaction , '' )
@@ -44,6 +125,8 @@ def run_test(self):
44125 # Test `prioritisetransaction` invalid `fee_delta`
45126 assert_raises_rpc_error (- 1 , "JSON value is not an integer as expected" , self .nodes [0 ].prioritisetransaction , txid = txid , fee_delta = 'foo' )
46127
128+ self .test_diamond ()
129+
47130 self .txouts = gen_return_txouts ()
48131 self .relayfee = self .nodes [0 ].getnetworkinfo ()['relayfee' ]
49132
0 commit comments