Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
67cc8a6
introduced Duration attribute in state.Staker
abi87 Apr 20, 2023
626643d
fix txs.Validator attributes and nits
abi87 Apr 20, 2023
f096245
made continuous staking default
abi87 Apr 21, 2023
765d8fc
cleanup
abi87 Apr 21, 2023
b1ca315
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 Apr 21, 2023
c6a1e50
nit
abi87 Apr 21, 2023
be64ed4
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 Apr 21, 2023
4d256d5
nit
abi87 Apr 21, 2023
bb23ae6
verify staking periods with continuous stakers
abi87 Apr 21, 2023
6bc6eb6
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 Apr 24, 2023
845b5bf
changed subnet validators staking period validation rule
abi87 Apr 24, 2023
f876278
nit
abi87 Apr 24, 2023
6c95f83
turned RotateStaker into ShiftStaker
abi87 Apr 26, 2023
fd5c10e
wip: shifting continuous staker upon reward. reward UTXOs still to be…
abi87 Apr 26, 2023
b11b7c2
continuous stakers shift UTs
abi87 Apr 26, 2023
5333c4a
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 Apr 26, 2023
76fe587
nit
abi87 Apr 26, 2023
8059147
staking duration syntax validation
abi87 Apr 26, 2023
c85fcb4
fix ValidatorTxs reward utxos generation
abi87 Apr 26, 2023
21f6e5a
nit
abi87 Apr 27, 2023
94cb2aa
fix delegator reward calculation.
abi87 Apr 27, 2023
4238225
wip: added stop staker tx
abi87 Apr 27, 2023
38fccba
wip: fix stakers stopping times
abi87 May 2, 2023
beca7ec
added stop staker builder + UTs update
abi87 May 2, 2023
020a140
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 May 2, 2023
2e8f778
duly released iterator
abi87 May 2, 2023
32a1117
nit
abi87 May 2, 2023
633818d
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 May 3, 2023
35528bf
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 May 4, 2023
ffba4f6
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 May 4, 2023
3c5aa16
Merge branch 'stakerTxs_drop_start_time' into continuous_staking_by_d…
abi87 May 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions vms/platformvm/api/static_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ func (utxo UTXO) Less(other UTXO) bool {
type Staker struct {
TxID ids.ID `json:"txID"`
StartTime json.Uint64 `json:"startTime"`
EndTime json.Uint64 `json:"endTime"`
Weight json.Uint64 `json:"weight"`
NodeID ids.NodeID `json:"nodeID"`
// TODO ABENEGIA: consider adding Duration here too, since
// endTime may be +infinity for continuous stakers
EndTime json.Uint64 `json:"endTime"`
Weight json.Uint64 `json:"weight"`
NodeID ids.NodeID `json:"nodeID"`

// Deprecated: Use Weight instead
// TODO: remove [StakeAmount] after enough time for dependencies to update
Expand Down
7 changes: 4 additions & 3 deletions vms/platformvm/blocks/executor/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,10 @@ var (
type stakerStatus uint

type staker struct {
nodeID ids.NodeID
rewardAddress ids.ShortID
startTime, endTime time.Time
nodeID ids.NodeID
rewardAddress ids.ShortID
startTime time.Time
stakingPeriod time.Duration
}

type test struct {
Expand Down
48 changes: 28 additions & 20 deletions vms/platformvm/blocks/executor/proposal_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ func TestApricotProposalBlockTimeVerification(t *testing.T) {
SubnetID: utx.SubnetID(),
StartTime: utx.StartTime(),
EndTime: chainTime,
NextTime: chainTime,
})
currentStakersIt.EXPECT().Release()
onParentAccept.EXPECT().GetCurrentStakerIterator().Return(currentStakersIt, nil)
Expand All @@ -107,9 +108,11 @@ func TestApricotProposalBlockTimeVerification(t *testing.T) {
SubnetID: utx.SubnetID(),
StartTime: utx.StartTime(),
EndTime: chainTime,
NextTime: chainTime,
}, nil)
onParentAccept.EXPECT().GetTx(addValTx.ID()).Return(addValTx, status.Committed, nil)
onParentAccept.EXPECT().GetCurrentSupply(constants.PrimaryNetworkID).Return(uint64(1000), nil).AnyTimes()
onParentAccept.EXPECT().GetRewardUTXOs(gomock.Any()).Return([]*avax.UTXO{}, nil).AnyTimes()
onParentAccept.EXPECT().GetDelegateeReward(constants.PrimaryNetworkID, utx.NodeID()).Return(uint64(0), nil).AnyTimes()
onParentAccept.EXPECT().GetRewardConfig(gomock.Any()).Return(env.config.RewardConfig, nil).AnyTimes()

Expand Down Expand Up @@ -150,7 +153,7 @@ func TestBanffProposalBlockTimeVerification(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

env := newEnvironment(t, ctrl, ContinuousStakingFork)
env := newEnvironment(t, ctrl, BanffFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand Down Expand Up @@ -234,6 +237,7 @@ func TestBanffProposalBlockTimeVerification(t *testing.T) {
currentStakersIt.EXPECT().Release().AnyTimes()
onParentAccept.EXPECT().GetCurrentStakerIterator().Return(currentStakersIt, nil).AnyTimes()

onParentAccept.EXPECT().GetRewardUTXOs(gomock.Any()).Return([]*avax.UTXO{}, nil).AnyTimes()
onParentAccept.EXPECT().GetDelegateeReward(constants.PrimaryNetworkID, unsignedNextStakerTx.NodeID()).Return(uint64(0), nil).AnyTimes()

pendingStakersIt := state.NewMockStakerIterator(ctrl)
Expand Down Expand Up @@ -401,54 +405,54 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
nodeID: ids.NodeID(staker0RewardAddress),
rewardAddress: staker0RewardAddress,
startTime: defaultGenesisTime,
endTime: time.Time{}, // actual endTime depends on specific test
stakingPeriod: txs.StakerMaxDuration,
}

staker1RewardAddress := ids.GenerateTestShortID()
staker1 := staker{
nodeID: ids.NodeID(staker1RewardAddress),
rewardAddress: staker1RewardAddress,
startTime: defaultGenesisTime.Add(1 * time.Minute),
endTime: defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute),
stakingPeriod: 10*defaultMinStakingDuration + time.Minute,
}

staker2RewardAddress := ids.ShortID{1}
staker2 := staker{
nodeID: ids.NodeID(staker2RewardAddress),
rewardAddress: staker2RewardAddress,
startTime: staker1.startTime.Add(1 * time.Minute),
endTime: staker1.startTime.Add(1 * time.Minute).Add(defaultMinStakingDuration),
stakingPeriod: defaultMinStakingDuration + time.Minute,
}

staker3RewardAddress := ids.GenerateTestShortID()
staker3 := staker{
nodeID: ids.NodeID(staker3RewardAddress),
rewardAddress: staker3RewardAddress,
startTime: staker2.startTime.Add(1 * time.Minute),
endTime: staker2.endTime.Add(1 * time.Minute),
stakingPeriod: staker2.stakingPeriod,
}

staker3Sub := staker{
nodeID: staker3.nodeID,
rewardAddress: staker3.rewardAddress,
startTime: staker3.startTime.Add(1 * time.Minute),
endTime: staker3.endTime.Add(-1 * time.Minute),
stakingPeriod: staker3.stakingPeriod - time.Minute,
}

staker4RewardAddress := ids.GenerateTestShortID()
staker4 := staker{
nodeID: ids.NodeID(staker4RewardAddress),
rewardAddress: staker4RewardAddress,
startTime: staker3.startTime,
endTime: staker3.endTime,
stakingPeriod: staker3.stakingPeriod,
}

staker5RewardAddress := ids.GenerateTestShortID()
staker5 := staker{
nodeID: ids.NodeID(staker5RewardAddress),
rewardAddress: staker5RewardAddress,
startTime: staker2.endTime,
endTime: staker2.endTime.Add(defaultMinStakingDuration),
startTime: staker2.startTime.Add(staker2.stakingPeriod),
stakingPeriod: defaultMinStakingDuration,
}

tests := []test{
Expand Down Expand Up @@ -564,7 +568,7 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
for _, test := range tests {
t.Run(test.description, func(t *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand All @@ -574,10 +578,12 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
env.config.Validators.Add(subnetID, validators.NewSet())

for _, staker := range test.stakers {
start := staker.startTime.Unix()
end := staker.startTime.Add(staker.stakingPeriod).Unix()
tx, err := env.txBuilder.NewAddValidatorTx(
env.config.MinValidatorStake,
uint64(staker.startTime.Unix()),
uint64(staker.endTime.Unix()),
uint64(start),
uint64(end),
staker.nodeID,
staker.rewardAddress,
reward.PercentDenominator,
Expand All @@ -598,10 +604,12 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {
}

for _, subStaker := range test.subnetStakers {
start := subStaker.startTime.Unix()
end := subStaker.startTime.Add(subStaker.stakingPeriod).Unix()
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
10, // Weight
uint64(subStaker.startTime.Unix()),
uint64(subStaker.endTime.Unix()),
uint64(start),
uint64(end),
subStaker.nodeID, // validator ID
subnetID, // Subnet ID
[]*secp256k1.PrivateKey{preFundedKeys[0], preFundedKeys[1]},
Expand All @@ -625,11 +633,11 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {

// add Staker0 (with the right end time) to state
// so to allow proposalBlk issuance
staker0.endTime = newTime
staker0.stakingPeriod = newTime.Sub(staker0.startTime)
addStaker0, err := env.txBuilder.NewAddValidatorTx(
10,
uint64(staker0.startTime.Unix()),
uint64(staker0.endTime.Unix()),
uint64(staker0.startTime.Add(staker0.stakingPeriod).Unix()),
staker0.nodeID,
staker0.rewardAddress,
reward.PercentDenominator,
Expand Down Expand Up @@ -712,7 +720,7 @@ func TestBanffProposalBlockUpdateStakers(t *testing.T) {

func TestBanffProposalBlockRemoveSubnetValidator(t *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand Down Expand Up @@ -853,7 +861,7 @@ func TestBanffProposalBlockTrackedSubnet(t *testing.T) {
for _, tracked := range []bool{true, false} {
t.Run(fmt.Sprintf("tracked %t", tracked), func(ts *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand Down Expand Up @@ -958,7 +966,7 @@ func TestBanffProposalBlockTrackedSubnet(t *testing.T) {

func TestBanffProposalBlockDelegatorStakerWeight(t *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand Down Expand Up @@ -1142,7 +1150,7 @@ func TestBanffProposalBlockDelegatorStakerWeight(t *testing.T) {

func TestBanffProposalBlockDelegatorStakers(t *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand Down
28 changes: 16 additions & 12 deletions vms/platformvm/blocks/executor/standard_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,37 +369,37 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
startTime: defaultGenesisTime.Add(1 * time.Minute),
endTime: defaultGenesisTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute),
stakingPeriod: 10*defaultMinStakingDuration + time.Minute,
}
staker2 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
startTime: staker1.startTime.Add(1 * time.Minute),
endTime: staker1.startTime.Add(1 * time.Minute).Add(defaultMinStakingDuration),
stakingPeriod: defaultMinStakingDuration + time.Minute,
}
staker3 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
startTime: staker2.startTime.Add(1 * time.Minute),
endTime: staker2.endTime.Add(1 * time.Minute),
stakingPeriod: staker2.stakingPeriod,
}
staker3Sub := staker{
nodeID: staker3.nodeID,
rewardAddress: ids.GenerateTestShortID(),
startTime: staker3.startTime.Add(1 * time.Minute),
endTime: staker3.endTime.Add(-1 * time.Minute),
stakingPeriod: staker3.stakingPeriod - time.Minute,
}
staker4 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
startTime: staker3.startTime,
endTime: staker3.endTime,
stakingPeriod: staker3.stakingPeriod,
}
staker5 := staker{
nodeID: ids.GenerateTestNodeID(),
rewardAddress: ids.GenerateTestShortID(),
startTime: staker2.endTime,
endTime: staker2.endTime.Add(defaultMinStakingDuration),
startTime: staker2.startTime.Add(staker2.stakingPeriod),
stakingPeriod: defaultMinStakingDuration,
}

tests := []test{
Expand Down Expand Up @@ -492,7 +492,7 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
for _, test := range tests {
t.Run(test.description, func(t *testing.T) {
require := require.New(t)
env := newEnvironment(t, nil, ContinuousStakingFork)
env := newEnvironment(t, nil, CortinaFork)
defer func() {
require.NoError(shutdownEnvironment(env))
}()
Expand All @@ -502,10 +502,12 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
env.config.Validators.Add(subnetID, validators.NewSet())

for _, staker := range test.stakers {
start := staker.startTime
end := staker.startTime.Add(staker.stakingPeriod)
_, err := addPendingValidator(
env,
staker.startTime,
staker.endTime,
start,
end,
staker.nodeID,
staker.rewardAddress,
[]*secp256k1.PrivateKey{preFundedKeys[0]},
Expand All @@ -514,10 +516,12 @@ func TestBanffStandardBlockUpdateStakers(t *testing.T) {
}

for _, staker := range test.subnetStakers {
start := staker.startTime
end := staker.startTime.Add(staker.stakingPeriod)
tx, err := env.txBuilder.NewAddSubnetValidatorTx(
10, // Weight
uint64(staker.startTime.Unix()),
uint64(staker.endTime.Unix()),
uint64(start.Unix()),
uint64(end.Unix()),
staker.nodeID, // validator ID
subnetID, // Subnet ID
[]*secp256k1.PrivateKey{preFundedKeys[0], preFundedKeys[1]},
Expand Down
9 changes: 8 additions & 1 deletion vms/platformvm/metrics/tx_metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ type txMetrics struct {
numRemoveSubnetValidatorTxs,
numTransformSubnetTxs,
numAddPermissionlessValidatorTxs,
numAddPermissionlessDelegatorTxs prometheus.Counter
numAddPermissionlessDelegatorTxs,
numStopStakerTxs prometheus.Counter
}

func newTxMetrics(
Expand All @@ -49,6 +50,7 @@ func newTxMetrics(
numTransformSubnetTxs: newTxMetric(namespace, "transform_subnet", registerer, &errs),
numAddPermissionlessValidatorTxs: newTxMetric(namespace, "add_permissionless_validator", registerer, &errs),
numAddPermissionlessDelegatorTxs: newTxMetric(namespace, "add_permissionless_delegator", registerer, &errs),
numStopStakerTxs: newTxMetric(namespace, "stop_staker_tx", registerer, &errs),
}
return m, errs.Err
}
Expand Down Expand Up @@ -132,3 +134,8 @@ func (m *txMetrics) AddPermissionlessDelegatorTx(*txs.AddPermissionlessDelegator
m.numAddPermissionlessDelegatorTxs.Inc()
return nil
}

func (m *txMetrics) StopStakerTx(*txs.StopStakerTx) error {
m.numStopStakerTxs.Inc()
return nil
}
2 changes: 1 addition & 1 deletion vms/platformvm/state/masked_iterator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ func buildMaskedIterator(parentStakers []Staker, deletedIndexes []int, updatedIn
s := parentStakers[idx]

cpy := s
RotateStakerTimesInPlace(&cpy)
ShiftStakerAheadInPlace(&cpy)
updatedStakers[s.TxID] = &cpy
}

Expand Down
Loading