nodekey.go 1.2 KB

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