github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/p2p/identity.go (about) 1 package p2p 2 3 import ( 4 "crypto/rand" 5 "errors" 6 7 "github.com/libp2p/go-libp2p/core/crypto" 8 "github.com/libp2p/go-libp2p/core/peer" 9 "github.com/libp2p/go-libp2p/core/peerstore" 10 11 "github.com/celestiaorg/celestia-node/libs/keystore" 12 ) 13 14 const keyName = "p2p-key" 15 16 // Key provides a networking private key and PeerID of the node. 17 func Key(kstore keystore.Keystore) (crypto.PrivKey, error) { 18 ksPriv, err := kstore.Get(keyName) 19 if err != nil { 20 if errors.Is(err, keystore.ErrNotFound) { 21 // No existing private key in the keystore so generate a new one 22 priv, _, err := crypto.GenerateEd25519Key(rand.Reader) 23 if err != nil { 24 return nil, err 25 } 26 27 bytes, err := crypto.MarshalPrivateKey(priv) 28 if err != nil { 29 return nil, err 30 } 31 32 ksPriv = keystore.PrivKey{Body: bytes} 33 err = kstore.Put(keyName, ksPriv) 34 if err != nil { 35 return nil, err 36 } 37 } else { 38 return nil, err 39 } 40 } 41 42 return crypto.UnmarshalPrivateKey(ksPriv.Body) 43 } 44 45 func id(key crypto.PrivKey, pstore peerstore.Peerstore) (peer.ID, error) { 46 id, err := peer.IDFromPrivateKey(key) 47 if err != nil { 48 return "", err 49 } 50 51 err = pstore.AddPrivKey(id, key) 52 if err != nil { 53 return "", err 54 } 55 56 return id, pstore.AddPubKey(id, key.GetPublic()) 57 }