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  }