Merge pull request #4268 from matheusdtech/itest-off-by-one
itest: fix off-by-one mining while waiting for CSV-encumbered outputs
This commit is contained in:
commit
ce17c3be96
@ -160,8 +160,11 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest,
|
|||||||
require.NotNil(t.t, htlcTimeout)
|
require.NotNil(t.t, htlcTimeout)
|
||||||
|
|
||||||
// We'll mine the remaining blocks in order to generate the sweep
|
// We'll mine the remaining blocks in order to generate the sweep
|
||||||
// transaction of Bob's commitment output.
|
// transaction of Bob's commitment output. The commitment was just
|
||||||
mineBlocks(t, net, defaultCSV, expectedTxes)
|
// mined at the current tip and the sweep will be broadcast so it can
|
||||||
|
// be mined at the tip+defaultCSV'th block, so mine one less to be able
|
||||||
|
// to make mempool assertions.
|
||||||
|
mineBlocks(t, net, defaultCSV-1, expectedTxes)
|
||||||
|
|
||||||
// Check that the sweep spends from the mined commitment.
|
// Check that the sweep spends from the mined commitment.
|
||||||
txes, err = getNTxsFromMempool(net.Miner.Node, 1, minerMempoolTimeout)
|
txes, err = getNTxsFromMempool(net.Miner.Node, 1, minerMempoolTimeout)
|
||||||
@ -181,10 +184,15 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest,
|
|||||||
require.NotZero(t.t, forceCloseChan.LimboBalance)
|
require.NotZero(t.t, forceCloseChan.LimboBalance)
|
||||||
require.NotZero(t.t, len(forceCloseChan.PendingHtlcs))
|
require.NotZero(t.t, len(forceCloseChan.PendingHtlcs))
|
||||||
|
|
||||||
// Now we'll mine an additional block, which should confirm Bob's commit
|
// Mine a block to confirm Bob's commit sweep tx and assert it was in
|
||||||
// sweep. This block should also prompt Bob to broadcast their second
|
// fact mined.
|
||||||
|
block := mineBlocks(t, net, 1, 1)[0]
|
||||||
|
commitSweepTxid := txes[0].TxHash()
|
||||||
|
assertTxInBlock(t, block, &commitSweepTxid)
|
||||||
|
|
||||||
|
// Mine an additional block to prompt Bob to broadcast their second
|
||||||
// layer sweep due to the CSV on the HTLC timeout output.
|
// layer sweep due to the CSV on the HTLC timeout output.
|
||||||
mineBlocks(t, net, 1, 1)
|
mineBlocks(t, net, 1, 0)
|
||||||
assertSpendingTxInMempool(
|
assertSpendingTxInMempool(
|
||||||
t, net.Miner.Node, minerMempoolTimeout, wire.OutPoint{
|
t, net.Miner.Node, minerMempoolTimeout, wire.OutPoint{
|
||||||
Hash: *htlcTimeout,
|
Hash: *htlcTimeout,
|
||||||
|
@ -97,19 +97,28 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
|
|||||||
err = waitForChannelPendingForceClose(ctxt, alice, aliceChanPoint)
|
err = waitForChannelPendingForceClose(ctxt, alice, aliceChanPoint)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
|
// After closeChannelAndAssertType returns, it has mined a block so now
|
||||||
|
// bob will attempt to redeem his anchor commitment (if the channel
|
||||||
|
// type is of that type).
|
||||||
|
if c == commitTypeAnchors {
|
||||||
|
_, err = waitForNTxsInMempool(net.Miner.Node, 1, minerMempoolTimeout)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to find bob's anchor commit sweep: %v", err)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Mine enough blocks for Alice to sweep her funds from the force
|
// Mine enough blocks for Alice to sweep her funds from the force
|
||||||
// closed channel.
|
// closed channel. closeCHannelAndAssertType() already mined a block
|
||||||
_, err = net.Miner.Node.Generate(defaultCSV)
|
// containing the commitment tx and the commit sweep tx will be
|
||||||
|
// broadcast immediately before it can be included in a block, so mine
|
||||||
|
// one less than defaultCSV in order to perform mempool assertions.
|
||||||
|
_, err = net.Miner.Node.Generate(defaultCSV - 1)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
// Alice should now sweep her funds. If there are anchors, Alice should
|
// Alice should now sweep her funds.
|
||||||
// also sweep hers.
|
|
||||||
expectedTxes := 1
|
|
||||||
if c == commitTypeAnchors {
|
|
||||||
expectedTxes = 2
|
|
||||||
}
|
|
||||||
_, err = waitForNTxsInMempool(
|
_, err = waitForNTxsInMempool(
|
||||||
net.Miner.Node, expectedTxes, minerMempoolTimeout,
|
net.Miner.Node, 1, minerMempoolTimeout,
|
||||||
)
|
)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
@ -138,8 +147,13 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
|
|||||||
_, err = net.Miner.Node.Generate(numBlocks)
|
_, err = net.Miner.Node.Generate(numBlocks)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
// Carol's commitment transaction should now be in the mempool. If there
|
expectedTxes := 1
|
||||||
// are anchors, Carol also sweeps her anchor.
|
if c == commitTypeAnchors {
|
||||||
|
expectedTxes = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Carol's commitment transaction should now be in the mempool. If
|
||||||
|
// there are anchors, Carol also sweeps her anchor.
|
||||||
_, err = waitForNTxsInMempool(
|
_, err = waitForNTxsInMempool(
|
||||||
net.Miner.Node, expectedTxes, minerMempoolTimeout,
|
net.Miner.Node, expectedTxes, minerMempoolTimeout,
|
||||||
)
|
)
|
||||||
|
@ -100,7 +100,11 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
|
|||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = net.Miner.Node.Generate(defaultCSV)
|
// The sweep is broadcast on the block immediately before the CSV
|
||||||
|
// expires and the commitment was already mined inside
|
||||||
|
// closeChannelAndAssertType(), so mine one block less than defaultCSV
|
||||||
|
// in order to perform mempool assertions.
|
||||||
|
_, err = net.Miner.Node.Generate(defaultCSV - 1)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
_, err = waitForTxInMempool(net.Miner.Node, minerMempoolTimeout)
|
_, err = waitForTxInMempool(net.Miner.Node, minerMempoolTimeout)
|
||||||
@ -108,7 +112,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
|
|||||||
|
|
||||||
// We'll now mine enough blocks for the HTLC to expire. After this, Bob
|
// We'll now mine enough blocks for the HTLC to expire. After this, Bob
|
||||||
// should hand off the now expired HTLC output to the utxo nursery.
|
// should hand off the now expired HTLC output to the utxo nursery.
|
||||||
numBlocks := padCLTV(uint32(finalCltvDelta - defaultCSV - 1))
|
numBlocks := padCLTV(uint32(finalCltvDelta - defaultCSV))
|
||||||
_, err = net.Miner.Node.Generate(numBlocks)
|
_, err = net.Miner.Node.Generate(numBlocks)
|
||||||
require.NoError(t.t, err)
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
|
@ -409,7 +409,10 @@ func cleanupForceClose(t *harnessTest, net *lntest.NetworkHarness,
|
|||||||
|
|
||||||
// Mine enough blocks for the node to sweep its funds from the force
|
// Mine enough blocks for the node to sweep its funds from the force
|
||||||
// closed channel.
|
// closed channel.
|
||||||
_, err = net.Miner.Node.Generate(defaultCSV)
|
//
|
||||||
|
// The commit sweep resolver is able to broadcast the sweep tx up to
|
||||||
|
// one block before the CSV elapses, so wait until defaulCSV-1.
|
||||||
|
_, err = net.Miner.Node.Generate(defaultCSV - 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to generate blocks: %v", err)
|
t.Fatalf("unable to generate blocks: %v", err)
|
||||||
}
|
}
|
||||||
@ -7726,7 +7729,7 @@ func testFailingChannel(net *lntest.NetworkHarness, t *harnessTest) {
|
|||||||
|
|
||||||
// Mine enough blocks for Alice to sweep her funds from the force
|
// Mine enough blocks for Alice to sweep her funds from the force
|
||||||
// closed channel.
|
// closed channel.
|
||||||
_, err = net.Miner.Node.Generate(defaultCSV)
|
_, err = net.Miner.Node.Generate(defaultCSV - 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to generate blocks: %v", err)
|
t.Fatalf("unable to generate blocks: %v", err)
|
||||||
}
|
}
|
||||||
@ -9505,7 +9508,11 @@ func assertDLPExecuted(net *lntest.NetworkHarness, t *harnessTest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// After the Carol's output matures, she should also reclaim her funds.
|
// After the Carol's output matures, she should also reclaim her funds.
|
||||||
mineBlocks(t, net, defaultCSV-1, 0)
|
//
|
||||||
|
// The commit sweep resolver publishes the sweep tx at defaultCSV-1 and
|
||||||
|
// we already mined one block after the commitmment was published, so
|
||||||
|
// take that into account.
|
||||||
|
mineBlocks(t, net, defaultCSV-1-1, 0)
|
||||||
carolSweep, err := waitForTxInMempool(
|
carolSweep, err := waitForTxInMempool(
|
||||||
net.Miner.Node, minerMempoolTimeout,
|
net.Miner.Node, minerMempoolTimeout,
|
||||||
)
|
)
|
||||||
@ -9796,7 +9803,7 @@ func testDataLossProtection(net *lntest.NetworkHarness, t *harnessTest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mine enough blocks for Carol to sweep her funds.
|
// Mine enough blocks for Carol to sweep her funds.
|
||||||
mineBlocks(t, net, defaultCSV, 0)
|
mineBlocks(t, net, defaultCSV-1, 0)
|
||||||
|
|
||||||
carolSweep, err := waitForTxInMempool(net.Miner.Node, minerMempoolTimeout)
|
carolSweep, err := waitForTxInMempool(net.Miner.Node, minerMempoolTimeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user