Skip to content

Commit

Permalink
Incentive fixes (#6166)
Browse files Browse the repository at this point in the history
  • Loading branch information
jannotti authored Nov 6, 2024
1 parent 0588296 commit fb748a6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 47 deletions.
2 changes: 1 addition & 1 deletion test/e2e-go/features/incentives/payouts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func TestBasicPayouts(t *testing.T) {
var fixture fixtures.RestClientFixture
// Make the seed lookback shorter, otherwise we need to wait 320 rounds to become IncentiveEligible.
const lookback = 32
fixture.FasterConsensus(protocol.ConsensusFuture, time.Second, 32)
fixture.FasterConsensus(protocol.ConsensusFuture, time.Second, lookback)
fmt.Printf("lookback is %d\n", lookback)
fixture.Setup(t, filepath.Join("nettemplates", "Payouts.json"))
defer fixture.Shutdown()
Expand Down
62 changes: 16 additions & 46 deletions test/e2e-go/features/incentives/suspension_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,11 @@ func TestBasicSuspension(t *testing.T) {
const suspend20 = 55

var fixture fixtures.RestClientFixture
// Speed up rounds, but keep long lookback, so 20% node has a chance to get
// back online after being suspended.
fixture.FasterConsensus(protocol.ConsensusFuture, time.Second, 320)
// Speed up rounds. Long enough lookback, so 20% node has a chance to
// get back online after being suspended. (0.8^32 is very small)

const lookback = 32
fixture.FasterConsensus(protocol.ConsensusFuture, time.Second, lookback)
fixture.Setup(t, filepath.Join("nettemplates", "Suspension.json"))
defer fixture.Shutdown()

Expand All @@ -72,71 +74,41 @@ func TestBasicSuspension(t *testing.T) {
rekeyreg(&fixture, a, c10, account10.Address)
rekeyreg(&fixture, a, c20, account20.Address)

// Wait until each have proposed, so they are suspendable
proposed10 := false
proposed20 := false
for !proposed10 || !proposed20 {
status, err := c10.Status()
a.NoError(err)
block, err := c10.BookkeepingBlock(status.LastRound)
a.NoError(err)

fmt.Printf(" block %d proposed by %v\n", status.LastRound, block.Proposer())

fixture.WaitForRoundWithTimeout(status.LastRound + 1)

switch block.Proposer().String() {
case account10.Address:
proposed10 = true
case account20.Address:
proposed20 = true
}
}

// Accounts are now suspendable whether they have proposed yet or not
// because keyreg sets LastHeartbeat. Stop c20 which means account20 will be
// absent about 50 rounds after keyreg goes into effect (lookback)
a.NoError(c20.FullStop())

afterStop, err := c10.Status()
a.NoError(err)

// Advance 55 rounds
err = fixture.WaitForRoundWithTimeout(afterStop.LastRound + suspend20)
a.NoError(err)

// n20 is still online after 55 rounds of absence (the node is off, but the
// account is marked online) because it has not been "noticed".
account, err := fixture.LibGoalClient.AccountData(account20.Address)
// Advance lookback+55 rounds
err = fixture.WaitForRoundWithTimeout(afterStop.LastRound + lookback + suspend20)
a.NoError(err)
a.Equal(basics.Online, account.Status)
voteID := account.VoteID
a.NotZero(voteID)

// pay n10 & n20, so both could be noticed
richAccount, err := fixture.GetRichestAccount()
a.NoError(err)
fixture.SendMoneyAndWait(afterStop.LastRound+suspend20, 5, 1000, richAccount.Address, account10.Address, "")
fixture.SendMoneyAndWait(afterStop.LastRound+suspend20, 5, 1000, richAccount.Address, account20.Address, "")

// make sure c10 node is in-sync with the network
status, err := fixture.LibGoalClient.Status()
a.NoError(err)
fmt.Printf("status.LastRound %d\n", status.LastRound)
_, err = c10.WaitForRound(status.LastRound)
a.NoError(err)

// n20's account is now offline, but has voting key material (suspended)
account, err = c10.AccountData(account20.Address)
// n20's account has been suspended (offline, but has voting key material)
account, err := c10.AccountData(account20.Address)
a.NoError(err)
fmt.Printf("account20 %d %d\n", account.LastProposed, account.LastHeartbeat)
a.Equal(basics.Offline, account.Status)
a.NotZero(account.VoteID)
a.False(account.IncentiveEligible) // suspension turns off flag

// n10's account is still online, because it's got less stake, has not been absent 10 x interval.
// TODO: n10 wasn't turned off, it's still online
account, err = c10.AccountData(account10.Address)
a.NoError(err)
a.Equal(basics.Online, account.Status)
a.NotZero(account.VoteID)
a.True(account.IncentiveEligible)

// Use the fixture to start the node again. Since we're only a bit past the
// Use the fixture to start node20 again. Since we're only a bit past the
// suspension round, it will still be voting. It should get a chance to
// propose soon (20/100 of blocks) which will put it back online.
lg, err := fixture.StartNode(c20.DataDir())
Expand Down Expand Up @@ -172,8 +144,6 @@ func TestBasicSuspension(t *testing.T) {
a.NoError(err)
r.Equal(basics.Online, account.Status, i)
r.Greater(account.LastProposed, restartRound, i)

r.Equal(voteID, account.VoteID, i)
r.False(account.IncentiveEligible, i)
}
}

0 comments on commit fb748a6

Please sign in to comment.