nodekey.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package common
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/libp2p/go-libp2p/core/crypto"
  6. "github.com/libp2p/go-libp2p/core/peer"
  7. "go.uber.org/zap"
  8. )
  9. func GetOrCreateNodeKey(logger *zap.Logger, path string) (crypto.PrivKey, error) {
  10. b, err := os.ReadFile(path)
  11. if err != nil {
  12. if os.IsNotExist(err) {
  13. logger.Info("No node key found, generating a new one...", zap.String("path", path))
  14. priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, -1)
  15. if err != nil {
  16. panic(err)
  17. }
  18. s, err := crypto.MarshalPrivateKey(priv)
  19. if err != nil {
  20. panic(err)
  21. }
  22. err = os.WriteFile(path, s, 0600)
  23. if err != nil {
  24. return nil, fmt.Errorf("failed to write node key: %w", err)
  25. }
  26. return priv, nil
  27. } else {
  28. return nil, fmt.Errorf("failed to read node key: %w", err)
  29. }
  30. }
  31. priv, err := crypto.UnmarshalPrivateKey(b)
  32. if err != nil {
  33. return nil, fmt.Errorf("failed to unmarshal node key: %w", err)
  34. }
  35. peerID, err := peer.IDFromPrivateKey(priv)
  36. if err != nil {
  37. panic(err)
  38. }
  39. logger.Info("Found existing node key",
  40. zap.String("path", path),
  41. zap.Stringer("peerID", peerID))
  42. return priv, nil
  43. }