94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
	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"
 | 
						|
	"github.com/ethereum/go-ethereum/p2p/nat"
 | 
						|
)
 | 
						|
 | 
						|
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)")
 | 
						|
		natdesc     = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:<IP>)")
 | 
						|
 | 
						|
		nodeKey *ecdsa.PrivateKey
 | 
						|
		err     error
 | 
						|
	)
 | 
						|
	flag.Parse()
 | 
						|
	logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel))
 | 
						|
 | 
						|
	if *genKey != "" {
 | 
						|
		writeKey(*genKey)
 | 
						|
		os.Exit(0)
 | 
						|
	}
 | 
						|
 | 
						|
	natm, err := nat.Parse(*natdesc)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("-nat: %v", err)
 | 
						|
	}
 | 
						|
	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, natm, ""); 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)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |