mirror of
https://github.com/luxfi/netrunner.git
synced 2026-07-27 00:04:23 +00:00
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/luxfi/keys"
|
|
"github.com/luxfi/kms/pkg/mnemonic"
|
|
)
|
|
|
|
func main() {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
// Bootstrap loader: identity is nil (the mnemonic is the root; no service
|
|
// identity exists yet to sign the KMS envelope). With MNEMONIC set the KMS
|
|
// dial is never reached.
|
|
phrase, err := mnemonic.Load(ctx,
|
|
os.Getenv("KMS_ADDR"),
|
|
os.Getenv("KMS_ENV"),
|
|
envOr("KMS_MNEMONIC_PATH", "/mnemonic"),
|
|
nil)
|
|
if err != nil {
|
|
fmt.Printf("ERROR: load mnemonic: %v\n", err)
|
|
fmt.Println("Set MNEMONIC env var, or KMS_ADDR + KMS_ENV + KMS_MNEMONIC_PATH for native ZAP.")
|
|
os.Exit(1)
|
|
}
|
|
|
|
home, _ := os.UserHomeDir()
|
|
keysDir := home + "/.lux/keys"
|
|
ks := keys.NewKeyStore(keysDir)
|
|
|
|
// Check if node0-4 keys already exist
|
|
existingNodeKeys := make([]*keys.ValidatorKey, 5)
|
|
allExist := true
|
|
for i := 0; i < 5; i++ {
|
|
name := fmt.Sprintf("node%d", i)
|
|
loaded, err := ks.Load(name)
|
|
if err != nil || loaded == nil {
|
|
allExist = false
|
|
break
|
|
}
|
|
existingNodeKeys[i] = loaded
|
|
}
|
|
|
|
if allExist {
|
|
fmt.Println("=== Loading existing keys (stable NodeIDs) ===")
|
|
for i, vk := range existingNodeKeys {
|
|
fmt.Printf("V%d: NodeID=%s P-addr=%s\n", i, vk.NodeID.String(), vk.PChainAddr.String())
|
|
}
|
|
return
|
|
}
|
|
|
|
// Keys don't exist - derive from mnemonic and persist (first run only)
|
|
fmt.Println("=== Deriving 5 validators from mnemonic (first run) ===")
|
|
validators, err := keys.DeriveValidatorsFromMnemonic(phrase, 5)
|
|
if err != nil {
|
|
fmt.Printf("Error deriving: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
for i, vk := range validators {
|
|
fmt.Printf("V%d: NodeID=%s P-addr=%s\n", i, vk.NodeID.String(), vk.PChainAddr.String())
|
|
|
|
// Save key
|
|
name := fmt.Sprintf("node%d", i)
|
|
if err := ks.Save(name, vk); err != nil {
|
|
fmt.Printf(" Error saving: %v\n", err)
|
|
} else {
|
|
fmt.Printf(" Saved to %s/%s\n", keysDir, name)
|
|
}
|
|
}
|
|
|
|
// Also list what's in keys directory
|
|
fmt.Println("\n=== Keys directory contents ===")
|
|
entries, _ := os.ReadDir(keysDir)
|
|
var names []string
|
|
for _, e := range entries {
|
|
if e.IsDir() && strings.HasPrefix(e.Name(), "node") {
|
|
names = append(names, e.Name())
|
|
}
|
|
}
|
|
sort.Strings(names)
|
|
for _, n := range names {
|
|
fmt.Printf(" %s\n", n)
|
|
}
|
|
}
|
|
|
|
// envOr returns the value of env var `name` if set + non-empty, else def.
|
|
func envOr(name, def string) string {
|
|
if v := strings.TrimSpace(os.Getenv(name)); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|