-
Notifications
You must be signed in to change notification settings - Fork 665
/
validator_sets.go
116 lines (101 loc) · 3.75 KB
/
validator_sets.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package p
import (
"fmt"
"time"
"github.com/stretchr/testify/require"
"github.com/ava-labs/avalanchego/genesis"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow/validators"
"github.com/ava-labs/avalanchego/tests"
"github.com/ava-labs/avalanchego/tests/fixture/e2e"
"github.com/ava-labs/avalanchego/tests/fixture/tmpnet"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/secp256k1"
"github.com/ava-labs/avalanchego/vms/platformvm"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
ginkgo "github.com/onsi/ginkgo/v2"
)
var _ = e2e.DescribePChain("[Validator Sets]", func() {
require := require.New(ginkgo.GinkgoT())
ginkgo.It("should be identical for every height for all nodes in the network", func() {
network := e2e.Env.GetNetwork()
ginkgo.By("creating wallet with a funded key to source delegated funds from")
keychain := e2e.Env.NewKeychain(1)
nodeURI := e2e.Env.GetRandomNodeURI()
baseWallet := e2e.NewWallet(keychain, nodeURI)
pWallet := baseWallet.P()
pBuilder := pWallet.Builder()
pContext := pBuilder.Context()
const delegatorCount = 15
ginkgo.By(fmt.Sprintf("adding %d delegators", delegatorCount), func() {
rewardKey, err := secp256k1.NewPrivateKey()
require.NoError(err)
avaxAssetID := pContext.AVAXAssetID
startTime := time.Now().Add(tmpnet.DefaultValidatorStartTimeDiff)
endTime := startTime.Add(time.Second * 360)
// This is the default flag value for MinDelegatorStake.
weight := genesis.LocalParams.StakingConfig.MinDelegatorStake
for i := 0; i < delegatorCount; i++ {
_, err = pWallet.IssueAddPermissionlessDelegatorTx(
&txs.SubnetValidator{
Validator: txs.Validator{
NodeID: nodeURI.NodeID,
Start: uint64(startTime.Unix()),
End: uint64(endTime.Unix()),
Wght: weight,
},
Subnet: constants.PrimaryNetworkID,
},
avaxAssetID,
&secp256k1fx.OutputOwners{
Threshold: 1,
Addrs: []ids.ShortID{rewardKey.Address()},
},
e2e.WithDefaultContext(),
)
require.NoError(err)
}
})
ginkgo.By("getting the current P-Chain height from the wallet")
currentPChainHeight, err := platformvm.NewClient(nodeURI.URI).GetHeight(e2e.DefaultContext())
require.NoError(err)
ginkgo.By("checking that validator sets are equal across all heights for all nodes", func() {
pvmClients := make([]platformvm.Client, len(e2e.Env.URIs))
for i, nodeURI := range e2e.Env.URIs {
pvmClients[i] = platformvm.NewClient(nodeURI.URI)
// Ensure that the height of the target node is at least the expected height
e2e.Eventually(
func() bool {
pChainHeight, err := pvmClients[i].GetHeight(e2e.DefaultContext())
require.NoError(err)
return pChainHeight >= currentPChainHeight
},
e2e.DefaultTimeout,
e2e.DefaultPollingInterval,
fmt.Sprintf("failed to see expected height %d for %s before timeout", currentPChainHeight, nodeURI.NodeID),
)
}
for height := uint64(0); height <= currentPChainHeight; height++ {
tests.Outf(" checked validator sets for height %d\n", height)
var observedValidatorSet map[ids.NodeID]*validators.GetValidatorOutput
for _, pvmClient := range pvmClients {
validatorSet, err := pvmClient.GetValidatorsAt(
e2e.DefaultContext(),
constants.PrimaryNetworkID,
height,
)
require.NoError(err)
if observedValidatorSet == nil {
observedValidatorSet = validatorSet
continue
}
require.Equal(observedValidatorSet, validatorSet)
}
}
})
e2e.CheckBootstrapIsPossible(network)
})
})