/
devnet.go
123 lines (105 loc) · 2.88 KB
/
devnet.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
117
118
119
120
121
122
123
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/Oneledger/protocol/node/consensus"
"github.com/spf13/cobra"
"github.com/tendermint/tendermint/p2p"
"github.com/tendermint/tendermint/privval"
)
// TODO: Put this in a txt file
var nodeNames = []string{
"David",
"Alice",
"Bob",
"Carol",
"Emma",
"Gary",
"Harry",
"Imran",
"Jason",
"Kelly",
"Lisa",
"Max",
"Nora",
"Oliver",
"Pamela",
"Quark",
"Rachel",
"Sam",
"Thomas",
"Ursula",
"Vladimir",
"Wendy",
"Xena",
"Yuri",
"Zoey",
}
type testnetConfig struct {
// Number of validators
numValidators int
numNonValidators int
outputDir string
p2pPort int
}
var testnetArgs = &testnetConfig{}
var testnetCmd = &cobra.Command{
Use: "devnet",
Short: "Initializes files for a devnet",
RunE: runDevnet,
}
func init() {
initCmd.AddCommand(testnetCmd)
testnetCmd.Flags().IntVar(&testnetArgs.numValidators, "validators", 4, "Number of validators to initialize devnet with")
testnetCmd.Flags().IntVar(&testnetArgs.numNonValidators, "nonvalidators", 0, "Number of non-validators to initialize the devnet with")
testnetCmd.Flags().StringVar(&testnetArgs.outputDir, "dir", "./", "Directory to store initialization files for the devnet, default current folder")
}
func runDevnet(cmd *cobra.Command, _ []string) error {
args := testnetArgs
if args.numValidators+args.numNonValidators > len(nodeNames) {
return fmt.Errorf("Don't have enough node names, can't specify more than %d nodes", len(nodeNames))
}
validatorList := make([]consensus.GenesisValidator, testnetArgs.numValidators)
// Create the GenesisValidator list and its key files priv_validator.json and node_key.json
for i := 0; i < args.numValidators+args.numNonValidators; i++ {
isValidator := i < args.numValidators
nodeName := nodeNames[i]
nodeDir := filepath.Join(args.outputDir, nodeName+"-Node")
configDir := filepath.Join(nodeDir, "consensus", "config")
err := os.MkdirAll(configDir, 0755)
if err != nil {
return err
}
// Make node key
_, err = p2p.LoadOrGenNodeKey(filepath.Join(configDir, "node_key.json"))
if err != nil {
return err
}
// Make private validator file
pvFile := privval.GenFilePV(filepath.Join(configDir, "priv_validator.json"))
pvFile.Save()
if isValidator {
validator := consensus.GenesisValidator{
PubKey: pvFile.GetPubKey(),
Name: nodeName,
Power: 1,
}
validatorList[i] = validator
}
}
// Create the non validator nodes
// Create the genesis file
genesisDoc := consensus.DefaultGenesisDoc()
genesisDoc.Validators = validatorList
for i := 0; i < args.numValidators+args.numNonValidators; i++ {
nodeName := nodeNames[i]
nodeDir := filepath.Join(args.outputDir, nodeName+"-Node")
configDir := filepath.Join(nodeDir, "consensus", "config")
err := genesisDoc.SaveAs(filepath.Join(configDir, "genesis.json"))
if err != nil {
return err
}
}
return nil
}