Browse Source

cmd/bootnode: new command (replaces cmd/peerserver)

Felix Lange 10 năm trước cách đây
mục cha
commit
4242b05462
1 tập tin đã thay đổi với 86 bổ sung0 xóa
  1. 86 0
      cmd/bootnode/main.go

+ 86 - 0
cmd/bootnode/main.go

@@ -0,0 +1,86 @@
+/*
+	This file is part of go-ethereum
+
+	go-ethereum is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	go-ethereum is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// Command bootnode runs a bootstrap node for the Discovery Protocol.
+package main
+
+import (
+	"crypto/ecdsa"
+	"encoding/hex"
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/p2p/discover"
+)
+
+func main() {
+	var (
+		listenAddr  = flag.String("addr", ":30301", "listen address")
+		genKey      = flag.String("genkey", "", "generate a node key and quit")
+		nodeKeyFile = flag.String("nodekey", "", "private key filename")
+		nodeKeyHex  = flag.String("nodekeyhex", "", "private key as hex (for testing)")
+		nodeKey     *ecdsa.PrivateKey
+		err         error
+	)
+	flag.Parse()
+	logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel))
+
+	if *genKey != "" {
+		writeKey(*genKey)
+		os.Exit(0)
+	}
+
+	switch {
+	case *nodeKeyFile == "" && *nodeKeyHex == "":
+		log.Fatal("Use -nodekey or -nodekeyhex to specify a private key")
+	case *nodeKeyFile != "" && *nodeKeyHex != "":
+		log.Fatal("Options -nodekey and -nodekeyhex are mutually exclusive")
+	case *nodeKeyFile != "":
+		if nodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {
+			log.Fatalf("-nodekey: %v", err)
+		}
+	case *nodeKeyHex != "":
+		if nodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {
+			log.Fatalf("-nodekeyhex: %v", err)
+		}
+	}
+
+	if _, err := discover.ListenUDP(nodeKey, *listenAddr); err != nil {
+		log.Fatal(err)
+	}
+	select {}
+}
+
+func writeKey(target string) {
+	key, err := crypto.GenerateKey()
+	if err != nil {
+		log.Fatal("could not generate key: %v", err)
+	}
+	b := crypto.FromECDSA(key)
+	if target == "-" {
+		fmt.Println(hex.EncodeToString(b))
+	} else {
+		if err := ioutil.WriteFile(target, b, 0600); err != nil {
+			log.Fatal("write error: ", err)
+		}
+	}
+}