github.com/prysmaticlabs/prysm@v1.4.4/tools/enr-calculator/main.go (about)

     1  // This binary is a simple rest API endpoint to calculate
     2  // the ENR value of a node given its private key,ip address and port.
     3  package main
     4  
     5  import (
     6  	"crypto/ecdsa"
     7  	"encoding/hex"
     8  	"flag"
     9  	"net"
    10  
    11  	"github.com/ethereum/go-ethereum/p2p/enode"
    12  	"github.com/ethereum/go-ethereum/p2p/enr"
    13  	"github.com/libp2p/go-libp2p-core/crypto"
    14  	"github.com/prysmaticlabs/prysm/shared/fileutil"
    15  	_ "github.com/prysmaticlabs/prysm/shared/maxprocs"
    16  	log "github.com/sirupsen/logrus"
    17  )
    18  
    19  var (
    20  	privateKey = flag.String("private", "", "Hex encoded Private key to use for calculation of ENR")
    21  	udpPort    = flag.Int("udp-port", 0, "UDP Port to use for calculation of ENR")
    22  	tcpPort    = flag.Int("tcp-port", 0, "TCP Port to use for calculation of ENR")
    23  	ipAddr     = flag.String("ipAddress", "", "IP to use in calculation of ENR")
    24  	outfile    = flag.String("out", "", "Filepath to write ENR")
    25  )
    26  
    27  func main() {
    28  	flag.Parse()
    29  
    30  	if *privateKey == "" {
    31  		log.Fatal("No private key given")
    32  	}
    33  	dst, err := hex.DecodeString(*privateKey)
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  	unmarshalledKey, err := crypto.UnmarshalSecp256k1PrivateKey(dst)
    38  	if err != nil {
    39  		panic(err)
    40  	}
    41  	ecdsaPrivKey := (*ecdsa.PrivateKey)(unmarshalledKey.(*crypto.Secp256k1PrivateKey))
    42  
    43  	if net.ParseIP(*ipAddr).To4() == nil {
    44  		log.Fatalf("Invalid ipv4 address given: %v\n", err)
    45  	}
    46  
    47  	if *udpPort == 0 {
    48  		log.Fatalf("Invalid udp port given: %v\n", err)
    49  		return
    50  	}
    51  
    52  	db, err := enode.OpenDB("")
    53  	if err != nil {
    54  		log.Fatalf("Could not open node's peer database: %v\n", err)
    55  		return
    56  	}
    57  	defer db.Close()
    58  
    59  	localNode := enode.NewLocalNode(db, ecdsaPrivKey)
    60  	ipEntry := enr.IP(net.ParseIP(*ipAddr))
    61  	udpEntry := enr.UDP(*udpPort)
    62  	localNode.Set(ipEntry)
    63  	localNode.Set(udpEntry)
    64  	if *tcpPort != 0 {
    65  		tcpEntry := enr.TCP(*tcpPort)
    66  		localNode.Set(tcpEntry)
    67  	}
    68  	log.Info(localNode.Node().String())
    69  
    70  	if *outfile != "" {
    71  		err := fileutil.WriteFile(*outfile, []byte(localNode.Node().String()))
    72  		if err != nil {
    73  			panic(err)
    74  		}
    75  		log.Infof("Wrote to %s", *outfile)
    76  	}
    77  }