From 727d7e9493b6c673143262d8e590ae22cc934095 Mon Sep 17 00:00:00 2001 From: niftynei Date: Wed, 19 May 2021 16:51:56 -0500 Subject: [PATCH] df-rbf: test that, with enough bumps, we can eventually add to mempool We don't pass the minimum fee requirement the first few times we attempt an RBF, so it fails. Keep going until actually replaces --- tests/test_opening.py | 62 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/tests/test_opening.py b/tests/test_opening.py index d00fd5fb9..d2bcd30a2 100644 --- a/tests/test_opening.py +++ b/tests/test_opening.py @@ -698,7 +698,8 @@ def test_rbf_no_overlap(node_factory, bitcoind, chainparams): @pytest.mark.openchannel('v2') def test_rbf_fails_to_broadcast(node_factory, bitcoind, chainparams): l1, l2 = node_factory.get_nodes(2, - opts={'allow_warning': True}) + opts={'allow_warning': True, + 'may_reconnect': True}) l1.rpc.connect(l2.info['id'], 'localhost', l2.port) amount = 2**24 @@ -717,29 +718,66 @@ def test_rbf_fails_to_broadcast(node_factory, bitcoind, chainparams): # Check that we're waiting for lockin l1.daemon.wait_for_log(' to DUALOPEND_AWAITING_LOCKIN') + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert inflights[-1]['funding_txid'] in bitcoind.rpc.getrawmempool() - next_feerate = find_next_feerate(l1, l2) + def run_retry(): + startweight = 42 + 173 + next_feerate = find_next_feerate(l1, l2) + initpsbt = l1.rpc.utxopsbt(chan_amount, next_feerate, startweight, + prev_utxos, reservedok=True, + min_witness_weight=110, + excess_as_change=True) - startweight = 42 + 172 # base weight, funding output - initpsbt = l1.rpc.utxopsbt(chan_amount, next_feerate, startweight, - prev_utxos, reservedok=True, - min_witness_weight=110, - excess_as_change=True) + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + bump = l1.rpc.openchannel_bump(chan_id, chan_amount, initpsbt['psbt']) + update = l1.rpc.openchannel_update(chan_id, bump['psbt']) + assert update['commitments_secured'] - # Do the bump - bump = l1.rpc.openchannel_bump(chan_id, chan_amount, initpsbt['psbt']) - update = l1.rpc.openchannel_update(chan_id, bump['psbt']) - assert update['commitments_secured'] + return l1.rpc.signpsbt(update['psbt'])['signed_psbt'] - signed_psbt = l1.rpc.signpsbt(update['psbt'])['signed_psbt'] + signed_psbt = run_retry() with pytest.raises(RpcError, match=r'insufficient fee, rejecting replacement'): l1.rpc.openchannel_signed(chan_id, signed_psbt) + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert inflights[-1]['funding_txid'] not in bitcoind.rpc.getrawmempool() # If we restart and listpeers, it will crash l1.restart() l1.rpc.listpeers() + # We've restarted. Let's RBF until we successfully get a + # new funding transaction for this channel + # do it again + signed_psbt = run_retry() + with pytest.raises(RpcError, match=r'insufficient fee, rejecting replacement'): + l1.rpc.openchannel_signed(chan_id, signed_psbt) + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert inflights[-1]['funding_txid'] not in bitcoind.rpc.getrawmempool() + + # and again + signed_psbt = run_retry() + with pytest.raises(RpcError, match=r'insufficient fee, rejecting replacement'): + l1.rpc.openchannel_signed(chan_id, signed_psbt) + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert inflights[-1]['funding_txid'] not in bitcoind.rpc.getrawmempool() + + # now we should be ok + signed_psbt = run_retry() + l1.rpc.openchannel_signed(chan_id, signed_psbt) + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert len(inflights) == 5 + assert inflights[-1]['funding_txid'] in bitcoind.rpc.getrawmempool() + + l1.restart() + + # Are inflights the same post restart + prev_inflights = inflights + inflights = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['inflight'] + assert prev_inflights == inflights + assert inflights[-1]['funding_txid'] in bitcoind.rpc.getrawmempool() + @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') @pytest.mark.openchannel('v2')