Skip to content

Commit b5aae08

Browse files
committed
make genesis generation to depend on staking key files
1 parent 02cb1b8 commit b5aae08

File tree

2 files changed

+55
-116
lines changed

2 files changed

+55
-116
lines changed

local/network.go

+49-105
Original file line numberDiff line numberDiff line change
@@ -274,164 +274,108 @@ func NewDefaultNetwork(
274274
// * NodeID-NFBbbJ4qCmNaCzeW7sxErhvWqvEQMnYcN
275275
// * NodeID-GWPcbFJZFfZreETSoWjPimr846mXEKCtu
276276
// * NodeID-P7oB2McjBGgW2NXXWVYjV8JEDFoW9xDE5
277-
func loadDefaultNetworkConfig() (network.Config, error) {
277+
func loadDefaultNetworkFiles() (map[string]interface{}, []byte, []*utils.NodeKeys, error) {
278278
configsDir, err := fs.Sub(embeddedDefaultNetworkConfigDir, "default")
279279
if err != nil {
280-
return network.Config{}, err
280+
return nil, nil, nil, err
281281
}
282282
// network flags
283283
flagsBytes, err := fs.ReadFile(configsDir, "flags.json")
284284
if err != nil {
285-
return network.Config{}, err
285+
return nil, nil, nil, err
286286
}
287287
flags := map[string]interface{}{}
288288
if err = json.Unmarshal(flagsBytes, &flags); err != nil {
289-
return network.Config{}, err
289+
return nil, nil, nil, err
290290
}
291291
// c-chain config
292292
cChainConfig, err := fs.ReadFile(configsDir, "cchain_config.json")
293293
if err != nil {
294-
return network.Config{}, err
295-
}
296-
defaultNetworkConfig := network.Config{
297-
NetworkID: constants.DefaultNetworkID,
298-
NodeConfigs: make([]node.Config, constants.DefaultNumNodes),
299-
Flags: flags,
300-
ChainConfigFiles: map[string]string{
301-
"C": string(cChainConfig),
302-
},
303-
UpgradeConfigFiles: map[string]string{},
304-
SubnetConfigFiles: map[string]string{},
294+
return nil, nil, nil, err
305295
}
296+
nodeKeys := []*utils.NodeKeys{}
306297
for i := 0; i < constants.DefaultNumNodes; i++ {
307298
nodeDir := fmt.Sprintf("node%d", i+1)
308299
stakingKey, err := fs.ReadFile(configsDir, filepath.Join(nodeDir, "staking.key"))
309300
if err != nil {
310-
return network.Config{}, err
301+
return nil, nil, nil, err
311302
}
312303
stakingCert, err := fs.ReadFile(configsDir, filepath.Join(nodeDir, "staking.crt"))
313304
if err != nil {
314-
return network.Config{}, err
305+
return nil, nil, nil, err
315306
}
316307
blsKey, err := fs.ReadFile(configsDir, filepath.Join(nodeDir, "signer.key"))
317308
if err != nil {
318-
return network.Config{}, err
319-
}
320-
defaultNetworkConfig.NodeConfigs[i] = node.Config{
321-
StakingKey: string(stakingKey),
322-
StakingCert: string(stakingCert),
323-
StakingSigningKey: base64.StdEncoding.EncodeToString(blsKey),
324-
IsBeacon: true,
309+
return nil, nil, nil, err
325310
}
311+
nodeKeys = append(nodeKeys, &utils.NodeKeys{
312+
StakingKey: stakingKey,
313+
StakingCert: stakingCert,
314+
BlsKey: blsKey,
315+
})
326316
}
327-
return defaultNetworkConfig, nil
317+
return flags, cChainConfig, nodeKeys, nil
328318
}
329319

330320
// NewDefaultConfigNNodes creates a new default network config, with an arbitrary number of nodes
331321
func NewDefaultConfigNNodes(binaryPath string, numNodes uint32) (network.Config, error) {
332-
netConfig, err := loadDefaultNetworkConfig()
322+
flags, cChainConfig, nodeKeys, err := loadDefaultNetworkFiles()
333323
if err != nil {
334-
return netConfig, err
324+
return network.Config{}, err
335325
}
336-
netConfig.BinaryPath = binaryPath
337326
if int(numNodes) > constants.DefaultNumNodes {
338327
toAdd := int(numNodes) - constants.DefaultNumNodes
339-
keys, err := generateNNodeKeys(toAdd)
328+
newNodeKeys, err := utils.GenerateNNodeKeys(toAdd)
340329
if err != nil {
341-
return netConfig, err
342-
}
343-
for i := 0; i < toAdd; i++ {
344-
netConfig.NodeConfigs = append(netConfig.NodeConfigs, node.Config{
345-
StakingKey: string(keys[i].StakingKey),
346-
StakingCert: string(keys[i].StakingCert),
347-
StakingSigningKey: base64.StdEncoding.EncodeToString(keys[i].BlsKey),
348-
IsBeacon: true,
349-
})
330+
return network.Config{}, err
350331
}
332+
nodeKeys = append(nodeKeys, newNodeKeys...)
351333
}
352334
if int(numNodes) < constants.DefaultNumNodes {
353-
netConfig.NodeConfigs = netConfig.NodeConfigs[:numNodes]
335+
nodeKeys = nodeKeys[:numNodes]
354336
}
337+
nodeConfigs := []node.Config{}
355338
port := constants.FirstAPIPort
356-
for i := 0; i < int(numNodes); i++ {
357-
netConfig.NodeConfigs[i].Flags = map[string]interface{}{
358-
config.HTTPPortKey: port,
359-
config.StakingPortKey: port + 1,
360-
}
339+
for _, keys := range nodeKeys {
340+
encodedKeys := utils.EncodeNodeKeys(keys)
341+
nodeConfigs = append(nodeConfigs, node.Config{
342+
StakingKey: encodedKeys.StakingKey,
343+
StakingCert: encodedKeys.StakingCert,
344+
StakingSigningKey: encodedKeys.BlsKey,
345+
Flags: map[string]interface{}{
346+
config.HTTPPortKey: port,
347+
config.StakingPortKey: port + 1,
348+
},
349+
IsBeacon: true,
350+
})
361351
port += 2
362352
}
363353
if int(numNodes) == 1 {
364-
netConfig.Flags[config.SybilProtectionEnabledKey] = false
354+
flags[config.SybilProtectionEnabledKey] = false
365355
}
366-
genesis, err := utils.GenerateGenesis(netConfig)
356+
genesis, err := utils.GenerateGenesis(constants.DefaultNetworkID, nodeKeys)
367357
if err != nil {
368-
return netConfig, err
358+
return network.Config{}, err
369359
}
370-
netConfig.Genesis = string(genesis)
371-
return netConfig, nil
360+
return network.Config{
361+
NetworkID: constants.DefaultNetworkID,
362+
Flags: flags,
363+
Genesis: string(genesis),
364+
NodeConfigs: nodeConfigs,
365+
BinaryPath: binaryPath,
366+
ChainConfigFiles: map[string]string{
367+
"C": string(cChainConfig),
368+
},
369+
UpgradeConfigFiles: map[string]string{},
370+
SubnetConfigFiles: map[string]string{},
371+
}, nil
372372
}
373373

374374
// NewDefaultConfig creates a new default network config
375375
func NewDefaultConfig(binaryPath string) (network.Config, error) {
376376
return NewDefaultConfigNNodes(binaryPath, constants.DefaultNumNodes)
377377
}
378378

379-
type EncodedNodeKeys struct {
380-
StakingKey string
381-
StakingCert string
382-
BlsKey string
383-
}
384-
385-
type NodeKeys struct {
386-
StakingKey []byte
387-
StakingCert []byte
388-
BlsKey []byte
389-
}
390-
391-
func encodeNodeKeys(key *NodeKeys) *EncodedNodeKeys {
392-
return &EncodedNodeKeys{
393-
StakingKey: string(key.StakingKey),
394-
StakingCert: string(key.StakingCert),
395-
BlsKey: base64.StdEncoding.EncodeToString(key.BlsKey),
396-
}
397-
}
398-
399-
func generateNodeKeys() (*NodeKeys, error) {
400-
stakingCert, stakingKey, err := staking.NewCertAndKeyBytes()
401-
if err != nil {
402-
return nil, fmt.Errorf("couldn't generate staking Cert/Key: %w", err)
403-
}
404-
key, err := bls.NewSecretKey()
405-
if err != nil {
406-
return nil, fmt.Errorf("couldn't generate new signing key: %w", err)
407-
}
408-
return &NodeKeys{
409-
StakingKey: stakingKey,
410-
StakingCert: stakingCert,
411-
BlsKey: bls.SecretKeyToBytes(key),
412-
}, nil
413-
}
414-
415-
func generateNNodeKeys(num int) ([]*NodeKeys, error) {
416-
nodesKeys := []*NodeKeys{}
417-
lock := sync.Mutex{}
418-
eg := errgroup.Group{}
419-
for i := 0; i < num; i++ {
420-
eg.Go(func() error {
421-
keys, err := generateNodeKeys()
422-
if err != nil {
423-
return err
424-
}
425-
lock.Lock()
426-
nodesKeys = append(nodesKeys, keys)
427-
lock.Unlock()
428-
return nil
429-
})
430-
}
431-
err := eg.Wait()
432-
return nodesKeys, err
433-
}
434-
435379
func (ln *localNetwork) loadConfig(ctx context.Context, networkConfig network.Config) error {
436380
if err := networkConfig.Validate(); err != nil {
437381
return fmt.Errorf("config failed validation: %w", err)

utils/genesis.go

+6-11
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
package utils
44

55
import (
6-
"encoding/base64"
76
"encoding/json"
87
"fmt"
98
"time"
109

11-
"github.com/ava-labs/avalanche-network-runner/network"
1210
"github.com/ava-labs/avalanchego/utils/crypto/bls"
1311
"github.com/ava-labs/avalanchego/utils/formatting"
1412
"github.com/ava-labs/avalanchego/vms/platformvm/signer"
@@ -48,7 +46,8 @@ func generateCchainGenesis() ([]byte, error) {
4846
}
4947

5048
func GenerateGenesis(
51-
netConfig network.Config,
49+
networkID uint32,
50+
nodeKeys []*NodeKeys,
5251
) ([]byte, error) {
5352
genesisMap := map[string]interface{}{}
5453

@@ -60,21 +59,17 @@ func GenerateGenesis(
6059
genesisMap["cChainGenesis"] = string(cChainGenesisBytes)
6160

6261
// pchain genesis
63-
genesisMap["networkID"] = netConfig.NetworkID
62+
genesisMap["networkID"] = networkID
6463
startTime := time.Now().Unix()
6564
genesisMap["startTime"] = startTime
6665
initialStakers := []map[string]interface{}{}
6766

68-
for _, nodeConfig := range netConfig.NodeConfigs {
69-
nodeID, err := ToNodeID([]byte(nodeConfig.StakingKey), []byte(nodeConfig.StakingCert))
67+
for _, keys := range nodeKeys {
68+
nodeID, err := ToNodeID(keys.StakingKey, keys.StakingCert)
7069
if err != nil {
7170
return nil, fmt.Errorf("couldn't get node ID: %w", err)
7271
}
73-
blsKeyBytes, err := base64.StdEncoding.DecodeString(nodeConfig.StakingSigningKey)
74-
if err != nil {
75-
return nil, err
76-
}
77-
blsSk, err := bls.SecretKeyFromBytes(blsKeyBytes)
72+
blsSk, err := bls.SecretKeyFromBytes(keys.BlsKey)
7873
if err != nil {
7974
return nil, err
8075
}

0 commit comments

Comments
 (0)