|
@ -3,7 +3,6 @@ package consensus |
|
|
import ( |
|
|
import ( |
|
|
"bytes" |
|
|
"bytes" |
|
|
"context" |
|
|
"context" |
|
|
"fmt" |
|
|
|
|
|
"testing" |
|
|
"testing" |
|
|
"time" |
|
|
"time" |
|
|
|
|
|
|
|
@ -312,8 +311,6 @@ func TestStateOversizedBlock(t *testing.T) { |
|
|
// start the machine
|
|
|
// start the machine
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
|
t.Log("Block Sizes", "Limit", cs1.state.ConsensusParams.Block.MaxBytes, "Current", totalBytes) |
|
|
|
|
|
|
|
|
|
|
|
// c1 should log an error with the block part message as it exceeds the consensus params. The
|
|
|
// c1 should log an error with the block part message as it exceeds the consensus params. The
|
|
|
// block is not added to cs.ProposalBlock so the node timeouts.
|
|
|
// block is not added to cs.ProposalBlock so the node timeouts.
|
|
|
ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) |
|
|
ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) |
|
@ -490,7 +487,6 @@ func TestStateLock_NoPOL(t *testing.T) { |
|
|
|
|
|
|
|
|
round++ // moving to the next round
|
|
|
round++ // moving to the next round
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("#### ONTO ROUND 1") |
|
|
|
|
|
/* |
|
|
/* |
|
|
Round2 (cs1, B) // B B2
|
|
|
Round2 (cs1, B) // B B2
|
|
|
*/ |
|
|
*/ |
|
@ -533,7 +529,6 @@ func TestStateLock_NoPOL(t *testing.T) { |
|
|
|
|
|
|
|
|
round++ // entering new round
|
|
|
round++ // entering new round
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("#### ONTO ROUND 2") |
|
|
|
|
|
/* |
|
|
/* |
|
|
Round3 (vs2, _) // B, B2
|
|
|
Round3 (vs2, _) // B, B2
|
|
|
*/ |
|
|
*/ |
|
@ -590,7 +585,6 @@ func TestStateLock_NoPOL(t *testing.T) { |
|
|
|
|
|
|
|
|
round++ // entering new round
|
|
|
round++ // entering new round
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("#### ONTO ROUND 3") |
|
|
|
|
|
/* |
|
|
/* |
|
|
Round4 (vs2, C) // B C // B C
|
|
|
Round4 (vs2, C) // B C // B C
|
|
|
*/ |
|
|
*/ |
|
@ -662,7 +656,6 @@ func TestStateLock_POLUpdateLock(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
|
|
|
|
|
|
// start round and wait for propose and prevote
|
|
|
// start round and wait for propose and prevote
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
@ -700,7 +693,6 @@ func TestStateLock_POLUpdateLock(t *testing.T) { |
|
|
|
|
|
|
|
|
Check that cs1 is now locked on the new block, D and no longer on the old block. |
|
|
Check that cs1 is now locked on the new block, D and no longer on the old block. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
|
|
|
|
|
@ -769,7 +761,6 @@ func TestStateLock_POLRelock(t *testing.T) { |
|
|
Send a precommit for nil from all of the validators to cs1. |
|
|
Send a precommit for nil from all of the validators to cs1. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
|
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
@ -808,7 +799,6 @@ func TestStateLock_POLRelock(t *testing.T) { |
|
|
|
|
|
|
|
|
Check that cs1 updates its 'locked round' value to the current round. |
|
|
Check that cs1 updates its 'locked round' value to the current round. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
propR1 := types.NewProposal(height, round, cs1.ValidRound, blockID, theBlock.Header.Time) |
|
|
propR1 := types.NewProposal(height, round, cs1.ValidRound, blockID, theBlock.Header.Time) |
|
@ -868,7 +858,6 @@ func TestStateLock_PrevoteNilWhenLockedAndMissProposal(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
|
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
@ -905,7 +894,6 @@ func TestStateLock_PrevoteNilWhenLockedAndMissProposal(t *testing.T) { |
|
|
Check that cs1 prevotes nil instead of its locked block, but ensure |
|
|
Check that cs1 prevotes nil instead of its locked block, but ensure |
|
|
that it maintains its locked block. |
|
|
that it maintains its locked block. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
|
|
|
|
|
@ -957,7 +945,6 @@ func TestStateLock_PrevoteNilWhenLockedAndDifferentProposal(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
@ -994,7 +981,6 @@ func TestStateLock_PrevoteNilWhenLockedAndDifferentProposal(t *testing.T) { |
|
|
Check that cs1 prevotes nil instead of its locked block, but ensure |
|
|
Check that cs1 prevotes nil instead of its locked block, but ensure |
|
|
that it maintains its locked block. |
|
|
that it maintains its locked block. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
@ -1059,7 +1045,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round. |
|
|
This ensures that cs1 will lock on B in this round. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("#### ONTO ROUND 0") |
|
|
|
|
|
|
|
|
|
|
|
// start round and wait for propose and prevote
|
|
|
// start round and wait for propose and prevote
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
@ -1101,7 +1086,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { |
|
|
Check that cs1 maintains its lock on B but precommits nil. |
|
|
Check that cs1 maintains its lock on B but precommits nil. |
|
|
Send a precommit for nil from >2/3 of the validators to `cs1`. |
|
|
Send a precommit for nil from >2/3 of the validators to `cs1`. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("#### ONTO ROUND 1") |
|
|
|
|
|
round++ |
|
|
round++ |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
@ -1136,7 +1120,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { |
|
|
Send the validator >2/3 prevotes for nil and ensure that it did not |
|
|
Send the validator >2/3 prevotes for nil and ensure that it did not |
|
|
unlock its block at the end of the previous round. |
|
|
unlock its block at the end of the previous round. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("#### ONTO ROUND 2") |
|
|
|
|
|
round++ |
|
|
round++ |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
cs3 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs3 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
@ -1193,7 +1176,6 @@ func TestStateLock_MissingProposalWhenPOLSeenDoesNotUpdateLock(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
@ -1225,7 +1207,6 @@ func TestStateLock_MissingProposalWhenPOLSeenDoesNotUpdateLock(t *testing.T) { |
|
|
|
|
|
|
|
|
Check that cs1 does not update its locked block to this missed block D. |
|
|
Check that cs1 does not update its locked block to this missed block D. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
@ -1281,7 +1262,6 @@ func TestStateLock_DoesNotLockOnOldProposal(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will not lock on B. |
|
|
This ensures that cs1 will not lock on B. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
@ -1315,7 +1295,6 @@ func TestStateLock_DoesNotLockOnOldProposal(t *testing.T) { |
|
|
cs1 saw a POL for the block it saw in round 0. We ensure that it does not |
|
|
cs1 saw a POL for the block it saw in round 0. We ensure that it does not |
|
|
lock on this block, since it did not see a proposal for it in this round. |
|
|
lock on this block, since it did not see a proposal for it in this round. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
round++ |
|
|
round++ |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
|
|
|
|
|
@ -1379,7 +1358,6 @@ func TestStateLock_POLSafety1(t *testing.T) { |
|
|
ensurePrecommit(t, voteCh, height, round) |
|
|
ensurePrecommit(t, voteCh, height, round) |
|
|
ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) |
|
|
ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) |
|
|
|
|
|
|
|
|
t.Log("### ONTO ROUND 1") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ // moving to the next round
|
|
|
round++ // moving to the next round
|
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
@ -1407,8 +1385,6 @@ func TestStateLock_POLSafety1(t *testing.T) { |
|
|
|
|
|
|
|
|
require.Nil(t, rs.LockedBlock, "we should not be locked!") |
|
|
require.Nil(t, rs.LockedBlock, "we should not be locked!") |
|
|
|
|
|
|
|
|
t.Logf("new prop hash %v", fmt.Sprintf("%X", propBlock.Hash())) |
|
|
|
|
|
|
|
|
|
|
|
// go to prevote, prevote for proposal block
|
|
|
// go to prevote, prevote for proposal block
|
|
|
ensurePrevoteMatch(t, voteCh, height, round, r2BlockID.Hash) |
|
|
ensurePrevoteMatch(t, voteCh, height, round, r2BlockID.Hash) |
|
|
|
|
|
|
|
@ -1428,7 +1404,6 @@ func TestStateLock_POLSafety1(t *testing.T) { |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
|
|
|
|
|
|
t.Log("### ONTO ROUND 2") |
|
|
|
|
|
/*Round3 |
|
|
/*Round3 |
|
|
we see the polka from round 1 but we shouldn't unlock! |
|
|
we see the polka from round 1 but we shouldn't unlock! |
|
|
*/ |
|
|
*/ |
|
@ -1494,7 +1469,7 @@ func TestStateLock_POLSafety2(t *testing.T) { |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
|
|
|
|
|
|
round++ // moving to the next round
|
|
|
round++ // moving to the next round
|
|
|
t.Log("### ONTO Round 1") |
|
|
|
|
|
|
|
|
|
|
|
// jump in at round 1
|
|
|
// jump in at round 1
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
@ -1536,7 +1511,7 @@ func TestStateLock_POLSafety2(t *testing.T) { |
|
|
addVotes(cs1, prevotes...) |
|
|
addVotes(cs1, prevotes...) |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("### ONTO Round 2") |
|
|
|
|
|
|
|
|
|
|
|
/*Round2 |
|
|
/*Round2 |
|
|
// now we see the polka from round 1, but we shouldnt unlock
|
|
|
// now we see the polka from round 1, but we shouldnt unlock
|
|
|
*/ |
|
|
*/ |
|
@ -1579,7 +1554,6 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { |
|
|
|
|
|
|
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
This ensures that cs1 will lock on B in this round but not precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 0") |
|
|
|
|
|
|
|
|
|
|
|
startTestRound(ctx, cs1, height, round) |
|
|
startTestRound(ctx, cs1, height, round) |
|
|
|
|
|
|
|
@ -1617,14 +1591,16 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { |
|
|
cs1 has now seen greater than 2/3 of the voting power prevote D in this round |
|
|
cs1 has now seen greater than 2/3 of the voting power prevote D in this round |
|
|
but cs1 did not see the proposal for D in this round so it will not prevote or precommit it. |
|
|
but cs1 did not see the proposal for D in this round so it will not prevote or precommit it. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 1") |
|
|
|
|
|
|
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
// Generate a new proposal block.
|
|
|
// Generate a new proposal block.
|
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) |
|
|
cs2.ValidRound = 1 |
|
|
cs2.ValidRound = 1 |
|
|
propR1, propBlockR1 := decideProposal(ctx, t, cs2, vs2, vs2.Height, round) |
|
|
propR1, propBlockR1 := decideProposal(ctx, t, cs2, vs2, vs2.Height, round) |
|
|
t.Log(propR1.POLRound) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, 1, propR1.POLRound) |
|
|
|
|
|
|
|
|
propBlockR1Parts, err := propBlockR1.MakePartSet(partSize) |
|
|
propBlockR1Parts, err := propBlockR1.MakePartSet(partSize) |
|
|
require.NoError(t, err) |
|
|
require.NoError(t, err) |
|
|
r1BlockID := types.BlockID{ |
|
|
r1BlockID := types.BlockID{ |
|
@ -1658,7 +1634,6 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { |
|
|
Send cs1 prevotes for nil and check that it still prevotes its locked block |
|
|
Send cs1 prevotes for nil and check that it still prevotes its locked block |
|
|
and not the block that it prevoted. |
|
|
and not the block that it prevoted. |
|
|
*/ |
|
|
*/ |
|
|
t.Log("### Starting Round 2") |
|
|
|
|
|
incrementRound(vs2, vs3, vs4) |
|
|
incrementRound(vs2, vs3, vs4) |
|
|
round++ |
|
|
round++ |
|
|
propR2 := types.NewProposal(height, round, 1, r1BlockID, propBlockR1.Header.Time) |
|
|
propR2 := types.NewProposal(height, round, 1, r1BlockID, propBlockR1.Header.Time) |
|
@ -1745,7 +1720,6 @@ func TestProposeValidBlock(t *testing.T) { |
|
|
round++ // moving to the next round
|
|
|
round++ // moving to the next round
|
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("### ONTO ROUND 1") |
|
|
|
|
|
|
|
|
|
|
|
// timeout of propose
|
|
|
// timeout of propose
|
|
|
ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) |
|
|
ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) |
|
@ -1768,7 +1742,6 @@ func TestProposeValidBlock(t *testing.T) { |
|
|
round += 2 // increment by multiple rounds
|
|
|
round += 2 // increment by multiple rounds
|
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
t.Log("### ONTO ROUND 3") |
|
|
|
|
|
|
|
|
|
|
|
ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) |
|
|
ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) |
|
|
|
|
|
|
|
@ -2474,7 +2447,6 @@ func TestStateHalt1(t *testing.T) { |
|
|
|
|
|
|
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
ensureNewRound(t, newRoundCh, height, round) |
|
|
|
|
|
|
|
|
t.Log("### ONTO ROUND 1") |
|
|
|
|
|
/*Round2 |
|
|
/*Round2 |
|
|
// we timeout and prevote
|
|
|
// we timeout and prevote
|
|
|
// a polka happened but we didn't see it!
|
|
|
// a polka happened but we didn't see it!
|
|
|