|
|
@ -62,13 +62,14 @@ def make_utxo(node, amount, confirmed=True, scriptPubKey=CScript([1])): |
|
|
|
class ReplaceByFeeTest(BitcoinTestFramework): |
|
|
|
class ReplaceByFeeTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
def set_test_params(self): |
|
|
|
def set_test_params(self): |
|
|
|
self.num_nodes = 1 |
|
|
|
self.num_nodes = 2 |
|
|
|
self.extra_args= [["-maxorphantx=1000", |
|
|
|
self.extra_args= [["-maxorphantx=1000", |
|
|
|
"-whitelist=127.0.0.1", |
|
|
|
"-whitelist=127.0.0.1", |
|
|
|
"-limitancestorcount=50", |
|
|
|
"-limitancestorcount=50", |
|
|
|
"-limitancestorsize=101", |
|
|
|
"-limitancestorsize=101", |
|
|
|
"-limitdescendantcount=200", |
|
|
|
"-limitdescendantcount=200", |
|
|
|
"-limitdescendantsize=101"]] |
|
|
|
"-limitdescendantsize=101"], |
|
|
|
|
|
|
|
["-mempoolreplacement=0"]] |
|
|
|
|
|
|
|
|
|
|
|
def run_test(self): |
|
|
|
def run_test(self): |
|
|
|
make_utxo(self.nodes[0], 1*COIN) |
|
|
|
make_utxo(self.nodes[0], 1*COIN) |
|
|
@ -115,6 +116,8 @@ class ReplaceByFeeTest(BitcoinTestFramework): |
|
|
|
tx1a_hex = txToHex(tx1a) |
|
|
|
tx1a_hex = txToHex(tx1a) |
|
|
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, True) |
|
|
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.sync_all([self.nodes]) |
|
|
|
|
|
|
|
|
|
|
|
# Should fail because we haven't changed the fee |
|
|
|
# Should fail because we haven't changed the fee |
|
|
|
tx1b = CTransaction() |
|
|
|
tx1b = CTransaction() |
|
|
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] |
|
|
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] |
|
|
@ -123,12 +126,17 @@ class ReplaceByFeeTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# This will raise an exception due to insufficient fee |
|
|
|
# This will raise an exception due to insufficient fee |
|
|
|
assert_raises_jsonrpc(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx1b_hex, True) |
|
|
|
assert_raises_jsonrpc(-26, "insufficient fee", self.nodes[0].sendrawtransaction, tx1b_hex, True) |
|
|
|
|
|
|
|
# This will raise an exception due to transaction replacement being disabled |
|
|
|
|
|
|
|
assert_raises_jsonrpc(-26, "txn-mempool-conflict", self.nodes[1].sendrawtransaction, tx1b_hex, True) |
|
|
|
|
|
|
|
|
|
|
|
# Extra 0.1 BTC fee |
|
|
|
# Extra 0.1 BTC fee |
|
|
|
tx1b = CTransaction() |
|
|
|
tx1b = CTransaction() |
|
|
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] |
|
|
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)] |
|
|
|
tx1b.vout = [CTxOut(int(0.9*COIN), CScript([b'b']))] |
|
|
|
tx1b.vout = [CTxOut(int(0.9*COIN), CScript([b'b']))] |
|
|
|
tx1b_hex = txToHex(tx1b) |
|
|
|
tx1b_hex = txToHex(tx1b) |
|
|
|
|
|
|
|
# Replacement still disabled even with "enough fee" |
|
|
|
|
|
|
|
assert_raises_jsonrpc(-26, "txn-mempool-conflict", self.nodes[1].sendrawtransaction, tx1b_hex, True) |
|
|
|
|
|
|
|
# Works when enabled |
|
|
|
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, True) |
|
|
|
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, True) |
|
|
|
|
|
|
|
|
|
|
|
mempool = self.nodes[0].getrawmempool() |
|
|
|
mempool = self.nodes[0].getrawmempool() |
|
|
@ -138,6 +146,11 @@ class ReplaceByFeeTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
assert_equal(tx1b_hex, self.nodes[0].getrawtransaction(tx1b_txid)) |
|
|
|
assert_equal(tx1b_hex, self.nodes[0].getrawtransaction(tx1b_txid)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Second node is running mempoolreplacement=0, will not replace originally-seen txn |
|
|
|
|
|
|
|
mempool = self.nodes[1].getrawmempool() |
|
|
|
|
|
|
|
assert tx1a_txid in mempool |
|
|
|
|
|
|
|
assert tx1b_txid not in mempool |
|
|
|
|
|
|
|
|
|
|
|
def test_doublespend_chain(self): |
|
|
|
def test_doublespend_chain(self): |
|
|
|
"""Doublespend of a long chain""" |
|
|
|
"""Doublespend of a long chain""" |
|
|
|
|
|
|
|
|
|
|
|