refactor: use constants for network/chain IDs, fix paths

- cmd/multinet.go: Use constants.MainnetID (1), TestnetID (2), etc.
- cmd/start.go: Use constants, add devnet support
- All data dirs now use ~/.lux/networks/ instead of /tmp/
- Network IDs (P-Chain): 1, 2, 3, 1337
- Chain IDs (C-Chain EVM): 96369, 96368, 96370, 1337
This commit is contained in:
Zach Kelling
2025-12-22 05:42:02 -08:00
parent 35f02edd25
commit 6edf405934
4 changed files with 87 additions and 56 deletions
+32 -26
View File
@@ -7,6 +7,7 @@ import (
"strconv"
"time"
"github.com/luxfi/constants"
"github.com/luxfi/log"
"github.com/luxfi/netrunner/multinet"
"github.com/spf13/cobra"
@@ -108,13 +109,14 @@ func runStartMulti(cmd *cobra.Command, args []string) error {
func loadDefaultNetworks(manager *multinet.MultiNetworkManager) error {
// Lux Mainnet configuration
// Network ID: 1 (P-Chain), Chain ID for EVM: 96369
mainnetConfig := multinet.NetworkConfig{
NetworkID: 96369,
NetworkID: constants.MainnetID, // 1 (P-Chain network identifier)
Name: "Lux Mainnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9630,
StakingPort: 9631,
DataDir: "/tmp/multinetwork/mainnet",
DataDir: "~/.lux/networks/mainnet",
Validators: 5,
ChainConfig: []multinet.ChainConfig{
{
@@ -127,20 +129,21 @@ func loadDefaultNetworks(manager *multinet.MultiNetworkManager) error {
},
{
ChainID: "2bXe2MhhAnXg6WGj6G8oDk55AKT1dMMsN72S8te7JdvzfZX1zM",
VMID: "mgj786NP7uDwBCcq6YwThhaN8FLyybkCa4zBWTQbNgmK6k9A6", // EVM
VMID: "mgj786NP7uDwBCcq6YwThhaN8FLyybkCa4zBWTQbNgmK6k9A6", // EVM (C-Chain ID: 96369)
IsEVM: true,
},
},
}
// Lux Testnet configuration
// Network ID: 2 (P-Chain), Chain ID for EVM: 96368
testnetConfig := multinet.NetworkConfig{
NetworkID: 96368,
NetworkID: constants.TestnetID, // 2 (P-Chain network identifier)
Name: "Lux Testnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9620,
StakingPort: 9621,
DataDir: "/tmp/multinetwork/testnet",
DataDir: "~/.lux/networks/testnet",
Validators: 3,
ChainConfig: []multinet.ChainConfig{
{
@@ -153,33 +156,34 @@ func loadDefaultNetworks(manager *multinet.MultiNetworkManager) error {
},
{
ChainID: "2sdADEgBC3NjLM4inKc1hY1PQpCT3JVyGVJxdmcq6sqrDndjFG",
VMID: "mgj786NP7uDwBCcq6YwThhaN8FLyybkCa4zBWTQbNgmK6k9A6", // EVM
VMID: "mgj786NP7uDwBCcq6YwThhaN8FLyybkCa4zBWTQbNgmK6k9A6", // EVM (C-Chain ID: 96368)
IsEVM: true,
},
},
}
// Zoo Chain on Mainnet
// Zoo Chain on Mainnet (L2 EVM on Lux)
// Zoo is an L2 EVM chain, NOT a P-Chain network
zooMainnetConfig := multinet.NetworkConfig{
NetworkID: 200200,
Name: "Zoo Network (Mainnet Chain)",
NetworkID: 200200, // Zoo L2 EVM Chain ID
Name: "Zoo Network (Mainnet L2)",
Type: multinet.NetworkTypeChain,
ParentID: 96369,
HTTPPort: 0, // Uses parent network's port
StakingPort: 0, // Uses parent network's port
DataDir: "/tmp/multinetwork/mainnet/chains/zoo",
ParentID: constants.MainnetID, // Parent is Lux Mainnet (1)
HTTPPort: 0, // Uses parent network's port
StakingPort: 0, // Uses parent network's port
DataDir: "~/.lux/networks/mainnet/chains/zoo",
Validators: 5,
}
// Hanzo Chain on Mainnet
hanzoMainnetConfig := multinet.NetworkConfig{
NetworkID: 36963,
NetworkID: constants.QChainMainnetID, // 36963 (Q-Chain)
Name: "Hanzo Network (Mainnet Chain)",
Type: multinet.NetworkTypeChain,
ParentID: 96369,
ParentID: constants.MainnetID, // Parent is Lux Mainnet (1)
HTTPPort: 0,
StakingPort: 0,
DataDir: "/tmp/multinetwork/mainnet/chains/hanzo",
DataDir: "~/.lux/networks/mainnet/chains/hanzo",
Validators: 5,
}
@@ -223,39 +227,41 @@ func loadNetworksFromFile(manager *multinet.MultiNetworkManager, path string) er
func runConfigure(cmd *cobra.Command, args []string) error {
// Create default configuration
// Network IDs: 1 (mainnet), 2 (testnet), 3 (devnet)
// Chain IDs for EVM: 96369 (mainnet), 96368 (testnet), 96370 (devnet)
configs := []multinet.NetworkConfig{
{
NetworkID: 96369,
NetworkID: constants.MainnetID, // 1
Name: "Lux Mainnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9630,
StakingPort: 9631,
DataDir: "/tmp/multinetwork/mainnet",
DataDir: "~/.lux/networks/mainnet",
Validators: 5,
},
{
NetworkID: 96368,
NetworkID: constants.TestnetID, // 2
Name: "Lux Testnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9620,
StakingPort: 9621,
DataDir: "/tmp/multinetwork/testnet",
DataDir: "~/.lux/networks/testnet",
Validators: 3,
},
{
NetworkID: 200200,
NetworkID: 200200, // Zoo L2 Chain ID
Name: "Zoo Network",
Type: multinet.NetworkTypeChain,
ParentID: 96369,
DataDir: "/tmp/multinetwork/mainnet/chains/zoo",
ParentID: constants.MainnetID, // 1
DataDir: "~/.lux/networks/mainnet/chains/zoo",
Validators: 5,
},
{
NetworkID: 36963,
NetworkID: constants.QChainMainnetID, // 36963
Name: "Hanzo Network",
Type: multinet.NetworkTypeChain,
ParentID: 96369,
DataDir: "/tmp/multinetwork/mainnet/chains/hanzo",
ParentID: constants.MainnetID, // 1
DataDir: "~/.lux/networks/mainnet/chains/hanzo",
Validators: 5,
},
}
+15 -5
View File
@@ -6,6 +6,7 @@ import (
"os/signal"
"syscall"
"github.com/luxfi/constants"
"github.com/luxfi/keys"
"github.com/luxfi/log"
"github.com/luxfi/netrunner/local"
@@ -173,26 +174,35 @@ func getNetworkConfig(network string) multinet.NetworkConfig {
switch network {
case "mainnet":
return multinet.NetworkConfig{
NetworkID: 96369,
NetworkID: constants.MainnetID, // 1
Name: "Lux Mainnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9630,
StakingPort: 9631,
DataDir: "/tmp/netrunner/mainnet",
DataDir: "~/.lux/networks/mainnet",
Validators: 5,
}
case "testnet":
return multinet.NetworkConfig{
NetworkID: 96368,
NetworkID: constants.TestnetID, // 2
Name: "Lux Testnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9620,
StakingPort: 9621,
DataDir: "/tmp/netrunner/testnet",
DataDir: "~/.lux/networks/testnet",
Validators: 3,
}
case "devnet":
return multinet.NetworkConfig{
NetworkID: constants.DevnetID, // 3
Name: "Lux Devnet",
Type: multinet.NetworkTypePrimary,
HTTPPort: 9610,
StakingPort: 9611,
DataDir: "~/.lux/networks/devnet",
Validators: 3,
}
default:
// Could be a chain name
return multinet.NetworkConfig{}
}
}
+23 -15
View File
@@ -252,7 +252,9 @@ func (ln *localNetwork) waitForChainsDiscoveredOnAllNodes(
}
discovered := false
attemptCount := 0
for time.Now().Before(deadline) {
attemptCount++
// Try to query the chain RPC endpoint with eth_chainId - if it responds, the chain is discovered
chainRPCURL := fmt.Sprintf("%s/ext/bc/%s/rpc", node.GetURL(), blockchainID)
// Use a proper JSON-RPC request body to ensure the EVM endpoint responds
@@ -271,27 +273,33 @@ func (ln *localNetwork) waitForChainsDiscoveredOnAllNodes(
// Check if we got a valid response (not a 404 or other error)
if resp.StatusCode == 200 {
discovered = true
ln.log.Debug("chain discovered on node",
ln.log.Info("chain discovered on node",
"node", nodeName,
"blockchain-id", blockchainID,
"status", resp.StatusCode,
"attempts", attemptCount,
"response", string(body),
)
break
}
ln.log.Debug("chain endpoint returned non-200",
"node", nodeName,
"blockchain-id", blockchainID,
"status", resp.StatusCode,
"response", string(body),
)
if attemptCount%10 == 0 {
ln.log.Warn("chain endpoint returned non-200",
"node", nodeName,
"blockchain-id", blockchainID,
"status", resp.StatusCode,
"attempts", attemptCount,
"response", string(body),
)
}
} else {
ln.log.Debug("chain not yet discovered, waiting",
"node", nodeName,
"blockchain-id", blockchainID,
"error", err.Error(),
"url", chainRPCURL,
)
if attemptCount%10 == 0 {
ln.log.Warn("chain not yet discovered, waiting",
"node", nodeName,
"blockchain-id", blockchainID,
"error", err.Error(),
"attempts", attemptCount,
"url", chainRPCURL,
)
}
}
select {
@@ -303,7 +311,7 @@ func (ln *localNetwork) waitForChainsDiscoveredOnAllNodes(
}
if !discovered {
return fmt.Errorf("chain %s not discovered on node %s after %v", blockchainID, nodeName, maxWait)
return fmt.Errorf("chain %s not discovered on node %s after %v (%d attempts)", blockchainID, nodeName, maxWait, attemptCount)
}
}
}
+17 -10
View File
@@ -275,12 +275,12 @@ func NewConfigForNetwork(binaryPath string, numNodes uint32, networkID uint32) (
// NewMainnetConfig creates a network config for LUX Mainnet (network ID 96369)
func NewMainnetConfig(binaryPath string, numNodes uint32) (network.Config, error) {
return NewConfigForNetwork(binaryPath, numNodes, configs.LuxMainnetID)
return NewConfigForNetwork(binaryPath, numNodes, configs.MainnetChainID)
}
// NewTestnetConfig creates a network config for LUX Testnet (network ID 96368)
func NewTestnetConfig(binaryPath string, numNodes uint32) (network.Config, error) {
return NewConfigForNetwork(binaryPath, numNodes, configs.LuxTestnetID)
return NewConfigForNetwork(binaryPath, numNodes, configs.TestnetChainID)
}
// NewLocalConfig creates a network config for local development (network ID 1337)
@@ -504,7 +504,7 @@ func NewMainnetConfigWithKeys(binaryPath string, keysDir string) (network.Config
if keysDir == "" {
keysDir = DefaultKeysPath()
}
return NewConfigWithPreExistingKeys(binaryPath, configs.LuxMainnetID, keysDir)
return NewConfigWithPreExistingKeys(binaryPath, configs.MainnetChainID, keysDir)
}
// NewTestnetConfigWithKeys creates a testnet config using pre-existing validator keys
@@ -512,7 +512,7 @@ func NewTestnetConfigWithKeys(binaryPath string, keysDir string) (network.Config
if keysDir == "" {
keysDir = DefaultKeysPath()
}
return NewConfigWithPreExistingKeys(binaryPath, configs.LuxTestnetID, keysDir)
return NewConfigWithPreExistingKeys(binaryPath, configs.TestnetChainID, keysDir)
}
// NewConfigFromMnemonic creates a network config by deriving validator keys from LUX_MNEMONIC.
@@ -641,14 +641,21 @@ func NewConfigFromMnemonic(binaryPath string, networkID uint32, numNodes uint32)
}
// Configure node configs with derived keys
// Start with default flags from netConfig.Flags and add per-node overrides
netConfig.NodeConfigs = make([]node.Config, numNodes)
for i, vk := range validatorKeys {
port := 9630 + int(i)*2
// Copy default network flags to each node
nodeFlags := make(map[string]interface{})
for k, v := range netConfig.Flags {
nodeFlags[k] = v
}
// Add per-node specific flags
nodeFlags[config.HTTPPortKey] = port
nodeFlags[config.StakingPortKey] = port + 1
netConfig.NodeConfigs[i] = node.Config{
Flags: map[string]interface{}{
config.HTTPPortKey: port,
config.StakingPortKey: port + 1,
},
Flags: nodeFlags,
StakingKey: string(vk.StakerKey),
StakingCert: string(vk.StakerCert),
StakingSigningKey: base64.StdEncoding.EncodeToString(vk.BLSSecretKey),
@@ -665,12 +672,12 @@ func NewConfigFromMnemonic(binaryPath string, networkID uint32, numNodes uint32)
// NewMainnetConfigFromMnemonic creates mainnet config from LUX_MNEMONIC
func NewMainnetConfigFromMnemonic(binaryPath string, numNodes uint32) (network.Config, error) {
return NewConfigFromMnemonic(binaryPath, configs.LuxMainnetID, numNodes)
return NewConfigFromMnemonic(binaryPath, configs.MainnetChainID, numNodes)
}
// NewTestnetConfigFromMnemonic creates testnet config from LUX_MNEMONIC
func NewTestnetConfigFromMnemonic(binaryPath string, numNodes uint32) (network.Config, error) {
return NewConfigFromMnemonic(binaryPath, configs.LuxTestnetID, numNodes)
return NewConfigFromMnemonic(binaryPath, configs.TestnetChainID, numNodes)
}
// NewLocalConfigFromMnemonic creates local network config from LUX_MNEMONIC