Skip to content

Commit c11accd

Browse files
authored
Drop Pending Stakers 0 - De-duplicate staking tx verification (#2335)
1 parent 05ce366 commit c11accd

File tree

7 files changed

+151
-166
lines changed

7 files changed

+151
-166
lines changed

tests/e2e/p/staking_rewards.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,18 @@ var _ = ginkgo.Describe("[Staking Rewards]", func() {
103103
betaNodeID, betaPOP, err := betaInfoClient.GetNodeID(e2e.DefaultContext())
104104
require.NoError(err)
105105

106+
pvmClient := platformvm.NewClient(alphaNode.GetProcessContext().URI)
107+
106108
const (
107109
delegationPercent = 0.10 // 10%
108110
delegationShare = reward.PercentDenominator * delegationPercent
109111
weight = 2_000 * units.Avax
110112
)
111113

114+
ginkgo.By("retrieving supply before inserting validators")
115+
supplyAtValidatorsStart, _, err := pvmClient.GetCurrentSupply(e2e.DefaultContext(), constants.PrimaryNetworkID)
116+
require.NoError(err)
117+
112118
alphaValidatorStartTime := time.Now().Add(e2e.DefaultValidatorStartTimeDiff)
113119
alphaValidatorEndTime := alphaValidatorStartTime.Add(validationPeriod)
114120
tests.Outf("alpha node validation period starting at: %v\n", alphaValidatorStartTime)
@@ -171,6 +177,10 @@ var _ = ginkgo.Describe("[Staking Rewards]", func() {
171177
require.NoError(err)
172178
})
173179

180+
ginkgo.By("retrieving supply before inserting delegators")
181+
supplyAtDelegatorsStart, _, err := pvmClient.GetCurrentSupply(e2e.DefaultContext(), constants.PrimaryNetworkID)
182+
require.NoError(err)
183+
174184
gammaDelegatorStartTime := time.Now().Add(e2e.DefaultValidatorStartTimeDiff)
175185
tests.Outf("gamma delegation period starting at: %v\n", gammaDelegatorStartTime)
176186

@@ -227,8 +237,6 @@ var _ = ginkgo.Describe("[Staking Rewards]", func() {
227237
// delegation periods are shorter than the validation periods.
228238
time.Sleep(time.Until(betaValidatorEndTime))
229239

230-
pvmClient := platformvm.NewClient(alphaNode.GetProcessContext().URI)
231-
232240
ginkgo.By("waiting until the alpha and beta nodes are no longer validators")
233241
e2e.Eventually(func() bool {
234242
validators, err := pvmClient.GetCurrentValidators(e2e.DefaultContext(), constants.PrimaryNetworkID, nil)
@@ -270,11 +278,9 @@ var _ = ginkgo.Describe("[Staking Rewards]", func() {
270278
require.Len(rewardBalances, len(rewardKeys))
271279

272280
ginkgo.By("determining expected validation and delegation rewards")
273-
currentSupply, _, err := pvmClient.GetCurrentSupply(e2e.DefaultContext(), constants.PrimaryNetworkID)
274-
require.NoError(err)
275281
calculator := reward.NewCalculator(rewardConfig)
276-
expectedValidationReward := calculator.Calculate(validationPeriod, weight, currentSupply)
277-
potentialDelegationReward := calculator.Calculate(delegationPeriod, weight, currentSupply)
282+
expectedValidationReward := calculator.Calculate(validationPeriod, weight, supplyAtValidatorsStart)
283+
potentialDelegationReward := calculator.Calculate(delegationPeriod, weight, supplyAtDelegatorsStart)
278284
expectedDelegationFee, expectedDelegatorReward := reward.Split(potentialDelegationReward, delegationShare)
279285

280286
ginkgo.By("checking expected rewards against actual rewards")

vms/platformvm/block/builder/builder.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,11 @@ func (b *builder) buildBlock() (block.Block, error) {
126126
return nil, fmt.Errorf("%w: %s", state.ErrMissingParentState, preferredID)
127127
}
128128

129-
timestamp := b.txExecutorBackend.Clk.Time()
130-
if parentTime := preferred.Timestamp(); parentTime.After(timestamp) {
131-
timestamp = parentTime
132-
}
133-
// [timestamp] = max(now, parentTime)
134-
135-
nextStakerChangeTime, err := txexecutor.GetNextStakerChangeTime(preferredState)
129+
timestamp, timeWasCapped, err := txexecutor.NextBlockTime(preferredState, b.txExecutorBackend.Clk)
136130
if err != nil {
137131
return nil, fmt.Errorf("could not calculate next staker change time: %w", err)
138132
}
139133

140-
// timeWasCapped means that [timestamp] was reduced to
141-
// [nextStakerChangeTime]. It is used as a flag for [buildApricotBlock] to
142-
// be willing to issue an advanceTimeTx. It is also used as a flag for
143-
// [buildBanffBlock] to force the issuance of an empty block to advance
144-
// the time forward; if there are no available transactions.
145-
timeWasCapped := !timestamp.Before(nextStakerChangeTime)
146-
if timeWasCapped {
147-
timestamp = nextStakerChangeTime
148-
}
149-
// [timestamp] = min(max(now, parentTime), nextStakerChangeTime)
150-
151134
return buildBlock(
152135
b,
153136
preferredID,

vms/platformvm/state/staker_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func TestNewCurrentStaker(t *testing.T) {
144144
subnetID := ids.GenerateTestID()
145145
weight := uint64(12345)
146146
startTime := time.Now()
147-
endTime := time.Now()
147+
endTime := startTime.Add(time.Hour)
148148
potentialReward := uint64(54321)
149149
currentPriority := txs.SubnetPermissionedValidatorCurrentPriority
150150

vms/platformvm/state/state.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,7 +1448,12 @@ func (s *state) loadCurrentValidators() error {
14481448
}
14491449
tx, _, err := s.GetTx(txID)
14501450
if err != nil {
1451-
return err
1451+
return fmt.Errorf("failed loading validator transaction txID %s, %w", txID, err)
1452+
}
1453+
1454+
stakerTx, ok := tx.Unsigned.(txs.Staker)
1455+
if !ok {
1456+
return fmt.Errorf("expected tx type txs.Staker but got %T", tx.Unsigned)
14521457
}
14531458

14541459
metadataBytes := validatorIt.Value()
@@ -1461,11 +1466,6 @@ func (s *state) loadCurrentValidators() error {
14611466
return err
14621467
}
14631468

1464-
stakerTx, ok := tx.Unsigned.(txs.Staker)
1465-
if !ok {
1466-
return fmt.Errorf("expected tx type txs.Staker but got %T", tx.Unsigned)
1467-
}
1468-
14691469
staker, err := NewCurrentStaker(txID, stakerTx, metadata.PotentialReward)
14701470
if err != nil {
14711471
return err
@@ -1498,11 +1498,12 @@ func (s *state) loadCurrentValidators() error {
14981498
}
14991499

15001500
metadataBytes := subnetValidatorIt.Value()
1501+
startTime := stakerTx.StartTime()
15011502
metadata := &validatorMetadata{
15021503
txID: txID,
15031504
// use the start time as the fallback value
15041505
// in case it's not stored in the database
1505-
LastUpdated: uint64(stakerTx.StartTime().Unix()),
1506+
LastUpdated: uint64(startTime.Unix()),
15061507
}
15071508
if err := parseValidatorMetadata(metadataBytes, metadata); err != nil {
15081509
return err
@@ -1538,6 +1539,11 @@ func (s *state) loadCurrentValidators() error {
15381539
return err
15391540
}
15401541

1542+
stakerTx, ok := tx.Unsigned.(txs.Staker)
1543+
if !ok {
1544+
return fmt.Errorf("expected tx type txs.Staker but got %T", tx.Unsigned)
1545+
}
1546+
15411547
metadata := &delegatorMetadata{
15421548
txID: txID,
15431549
}
@@ -1546,11 +1552,6 @@ func (s *state) loadCurrentValidators() error {
15461552
return err
15471553
}
15481554

1549-
stakerTx, ok := tx.Unsigned.(txs.Staker)
1550-
if !ok {
1551-
return fmt.Errorf("expected tx type txs.Staker but got %T", tx.Unsigned)
1552-
}
1553-
15541555
staker, err := NewCurrentStaker(txID, stakerTx, metadata.PotentialReward)
15551556
if err != nil {
15561557
return err

0 commit comments

Comments
 (0)