4
4
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
5
"""Test the prioritisetransaction mining RPC."""
6
6
7
+ from decimal import Decimal
7
8
import time
8
9
10
+ from test_framework .blocktools import COINBASE_MATURITY
9
11
from test_framework .messages import COIN , MAX_BLOCK_WEIGHT
10
12
from test_framework .test_framework import BitcoinTestFramework
11
13
from 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
+
12
16
13
17
class PrioritiseTransactionTest (BitcoinTestFramework ):
14
18
def set_test_params (self ):
@@ -23,7 +27,84 @@ def set_test_params(self):
23
27
def skip_test_if_missing_module (self ):
24
28
self .skip_if_no_wallet ()
25
29
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
+
26
105
def run_test (self ):
106
+ self .wallet = MiniWallet (self .nodes [0 ])
107
+
27
108
# Test `prioritisetransaction` required parameters
28
109
assert_raises_rpc_error (- 1 , "prioritisetransaction" , self .nodes [0 ].prioritisetransaction )
29
110
assert_raises_rpc_error (- 1 , "prioritisetransaction" , self .nodes [0 ].prioritisetransaction , '' )
@@ -44,6 +125,8 @@ def run_test(self):
44
125
# Test `prioritisetransaction` invalid `fee_delta`
45
126
assert_raises_rpc_error (- 1 , "JSON value is not an integer as expected" , self .nodes [0 ].prioritisetransaction , txid = txid , fee_delta = 'foo' )
46
127
128
+ self .test_diamond ()
129
+
47
130
self .txouts = gen_return_txouts ()
48
131
self .relayfee = self .nodes [0 ].getnetworkinfo ()['relayfee' ]
49
132
0 commit comments