// cmd/peerid — prints the libp2p peer ID for a key file. // Usage: peerid --key node1.json package main import ( "crypto/ed25519" "encoding/hex" "encoding/json" "flag" "fmt" "log" "os" libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" ) type keyJSON struct { PubKey string `json:"pub_key"` PrivKey string `json:"priv_key"` } func main() { keyFile := flag.String("key", "", "path to key JSON file") listenIP := flag.String("ip", "0.0.0.0", "IP for multiaddr output") port := flag.String("port", "4001", "port for multiaddr output") flag.Parse() if *keyFile == "" { log.Fatal("--key is required") } data, err := os.ReadFile(*keyFile) if err != nil { log.Fatalf("read key: %v", err) } var kj keyJSON if err := json.Unmarshal(data, &kj); err != nil { log.Fatalf("parse key: %v", err) } privBytes, err := hexDecode(kj.PrivKey) if err != nil { log.Fatalf("decode priv key: %v", err) } privStd := ed25519.PrivateKey(privBytes) lk, _, err := libp2pcrypto.KeyPairFromStdKey(&privStd) if err != nil { log.Fatalf("convert key: %v", err) } pid, err := peer.IDFromPrivateKey(lk) if err != nil { log.Fatalf("peer ID: %v", err) } fmt.Printf("pub_key: %s\n", kj.PubKey) fmt.Printf("peer_id: %s\n", pid) fmt.Printf("multiaddr: /ip4/%s/tcp/%s/p2p/%s\n", *listenIP, *port, pid) } func hexDecode(s string) ([]byte, error) { return hex.DecodeString(s) }