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 }