Skip to content

Commit 4a90930

Browse files
authored
Merge pull request #665 from ava-labs/set-network-id
Set network id on Start() call
2 parents 8feb1b4 + 5e9964d commit 4a90930

File tree

11 files changed

+742
-673
lines changed

11 files changed

+742
-673
lines changed

client/client.go

+8
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ func (c *client) Start(ctx context.Context, execPath string, opts ...OpOption) (
117117
ret.applyOpts(opts)
118118

119119
req := &rpcpb.StartRequest{
120+
NetworkId: ret.networkID,
120121
ExecPath: execPath,
121122
NumNodes: &ret.numNodes,
122123
ChainConfigs: ret.chainConfigs,
@@ -454,6 +455,7 @@ type Op struct {
454455
subnetConfigs map[string]string
455456
reassignPortsIfUsed bool
456457
dynamicPorts bool
458+
networkID uint32
457459
}
458460

459461
type OpOption func(*Op)
@@ -470,6 +472,12 @@ func WithGlobalNodeConfig(nodeConfig string) OpOption {
470472
}
471473
}
472474

475+
func WithNetworkID(networkID uint32) OpOption {
476+
return func(op *Op) {
477+
op.networkID = networkID
478+
}
479+
}
480+
473481
func WithNumNodes(numNodes uint32) OpOption {
474482
return func(op *Op) {
475483
op.numNodes = numNodes

cmd/control/control.go

+8
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ var (
104104
subnetConfigs string
105105
reassignPortsIfUsed bool
106106
dynamicPorts bool
107+
networkID uint32
107108
)
108109

109110
func setLogs() error {
@@ -176,6 +177,12 @@ func newStartCommand() *cobra.Command {
176177
"",
177178
"avalanchego binary path",
178179
)
180+
cmd.PersistentFlags().Uint32Var(
181+
&networkID,
182+
"network-id",
183+
0,
184+
"network id to assign to the network",
185+
)
179186
cmd.PersistentFlags().Uint32Var(
180187
&numNodes,
181188
"number-of-nodes",
@@ -265,6 +272,7 @@ func startFunc(*cobra.Command, []string) error {
265272
client.WithRootDataDir(rootDataDir),
266273
client.WithReassignPortsIfUsed(reassignPortsIfUsed),
267274
client.WithDynamicPorts(dynamicPorts),
275+
client.WithNetworkID(networkID),
268276
}
269277

270278
if globalNodeConfig != "" {

local/network.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/ava-labs/avalanchego/network/peer"
2929
"github.com/ava-labs/avalanchego/staking"
3030
"github.com/ava-labs/avalanchego/utils/beacon"
31+
avagoconstants "github.com/ava-labs/avalanchego/utils/constants"
3132
"github.com/ava-labs/avalanchego/utils/crypto/bls"
3233
"github.com/ava-labs/avalanchego/utils/ips"
3334
"github.com/ava-labs/avalanchego/utils/logging"
@@ -444,11 +445,24 @@ func (ln *localNetwork) loadConfig(ctx context.Context, networkConfig network.Co
444445

445446
ln.genesis = []byte(networkConfig.Genesis)
446447

448+
// Set network ID
447449
var err error
448-
ln.networkID, err = utils.NetworkIDFromGenesis([]byte(networkConfig.Genesis))
450+
ln.networkID, err = utils.NetworkIDFromGenesis(ln.genesis)
449451
if err != nil {
450-
return fmt.Errorf("couldn't get network ID from genesis: %w", err)
452+
return err
453+
}
454+
if networkConfig.NetworkID != 0 {
455+
ln.networkID = networkConfig.NetworkID
456+
}
457+
switch ln.networkID {
458+
case avagoconstants.TestnetID, avagoconstants.MainnetID:
459+
return errors.New("network ID can't be mainnet or testnet")
460+
}
461+
genesis, err := utils.SetGenesisNetworkID(ln.genesis, ln.networkID)
462+
if err != nil {
463+
return fmt.Errorf("couldn't set network ID to genesis: %w", err)
451464
}
465+
ln.genesis = genesis
452466

453467
// save node defaults
454468
ln.flags = networkConfig.Flags

network/config.go

+5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ type AddrAndBalance struct {
5151
type Config struct {
5252
// Must not be empty
5353
Genesis string `json:"genesis"`
54+
// If 0, will use default network ID
55+
NetworkID uint32 `json:"networkID"`
5456
// May have length 0
5557
// (i.e. network may have no nodes on creation.)
5658
NodeConfigs []node.Config `json:"nodeConfigs"`
@@ -87,6 +89,9 @@ func (c *Config) Validate() error {
8789
if err != nil {
8890
return fmt.Errorf("couldn't get network ID from genesis: %w", err)
8991
}
92+
if c.NetworkID != 0 {
93+
networkID = c.NetworkID
94+
}
9095

9196
var someNodeIsBeacon bool
9297
for i, nodeConfig := range c.NodeConfigs {

rpcpb/rpc.pb.go

+674-662
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rpcpb/rpc.proto

+3
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,9 @@ message StartRequest {
350350
// If specified, will create a file "subnetid.json" under subnets config dir with
351351
// the contents provided here.
352352
map<string, string> subnet_configs = 13;
353+
354+
// Network id to assign to the network, instead of default one
355+
uint32 network_id = 14;
353356
}
354357

355358
message RPCVersionRequest {}

rpcpb/rpc_grpc.pb.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/network.go

+4
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ type localNetworkOptions struct {
109109
reassignPortsIfUsed bool
110110

111111
dynamicPorts bool
112+
113+
networkID uint32
112114
}
113115

114116
func newLocalNetwork(opts localNetworkOptions) (*localNetwork, error) {
@@ -161,6 +163,8 @@ func (lc *localNetwork) createConfig() error {
161163
cfg.Flags[config.PluginDirKey] = lc.pluginDir
162164
}
163165

166+
cfg.NetworkID = lc.options.networkID
167+
164168
for i := range cfg.NodeConfigs {
165169
// NOTE: Naming convention for node names is currently `node` + number, i.e. `node1,node2,node3,...node101`
166170
nodeName := fmt.Sprintf("node%d", i+1)

server/server.go

+1
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ func (s *server) Start(_ context.Context, req *rpcpb.StartRequest) (*rpcpb.Start
328328
}
329329

330330
s.network, err = newLocalNetwork(localNetworkOptions{
331+
networkID: req.NetworkId,
331332
execPath: execPath,
332333
rootDataDir: rootDataDir,
333334
numNodes: numNodes,

utils/constants/constants.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ const (
1111
RootDirPrefix = "network-runner-root-data"
1212
DefaultExecPathEnvVar = "AVALANCHEGO_EXEC_PATH"
1313
DefaultPluginDirEnvVar = "AVALANCHEGO_PLUGIN_PATH"
14+
LocalGenesisFile = "genesis.json"
1415
)
1516

16-
var (
17-
LocalConfigDir = filepath.Join("local", "default")
18-
LocalGenesisFile = "genesis.json"
19-
)
17+
var LocalConfigDir = filepath.Join("local", "default")

utils/utils.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ const (
2020
dirTimestampFormat = "20060102_150405"
2121
)
2222

23+
var (
24+
ErrEmptyExecPath = errors.New("avalanche exec is not defined")
25+
ErrNotExists = errors.New("avalanche exec not exists")
26+
ErrNotExistsPlugin = errors.New("plugin exec not exists")
27+
ErrorNoNetworkIDKey = fmt.Errorf("couldn't find key %q in genesis", genesisNetworkIDKey)
28+
)
29+
2330
func ToNodeID(stakingKey, stakingCert []byte) (ids.NodeID, error) {
2431
tlsCert, err := staking.LoadTLSCertFromBytes(stakingKey, stakingCert)
2532
if err != nil {
@@ -47,11 +54,19 @@ func NetworkIDFromGenesis(genesis []byte) (uint32, error) {
4754
return uint32(networkID), nil
4855
}
4956

50-
var (
51-
ErrEmptyExecPath = errors.New("avalanche exec is not defined")
52-
ErrNotExists = errors.New("avalanche exec not exists")
53-
ErrNotExistsPlugin = errors.New("plugin exec not exists")
54-
)
57+
func SetGenesisNetworkID(genesis []byte, networkID uint32) ([]byte, error) {
58+
genesisMap := map[string]interface{}{}
59+
if err := json.Unmarshal(genesis, &genesisMap); err != nil {
60+
return nil, fmt.Errorf("couldn't unmarshal genesis: %w", err)
61+
}
62+
genesisMap[genesisNetworkIDKey] = networkID
63+
var err error
64+
genesis, err = json.Marshal(genesisMap)
65+
if err != nil {
66+
return nil, fmt.Errorf("couldn't marshal genesis: %w", err)
67+
}
68+
return genesis, nil
69+
}
5570

5671
func CheckExecPath(exec string) error {
5772
if exec == "" {

0 commit comments

Comments
 (0)