Skip to content

Commit 76fa75b

Browse files
committed
wip
2 parents 75d1640 + 32a9c0c commit 76fa75b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+4855
-1943
lines changed

cmd/bootnode/main.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
This file is part of go-ethereum
3+
4+
go-ethereum is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation, either version 3 of the License, or
7+
(at your option) any later version.
8+
9+
go-ethereum is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU General Public License for more details.
13+
14+
You should have received a copy of the GNU General Public License
15+
along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
// Command bootnode runs a bootstrap node for the Discovery Protocol.
19+
package main
20+
21+
import (
22+
"crypto/ecdsa"
23+
"encoding/hex"
24+
"flag"
25+
"fmt"
26+
"io/ioutil"
27+
"log"
28+
"os"
29+
30+
"github.com/ethereum/go-ethereum/crypto"
31+
"github.com/ethereum/go-ethereum/logger"
32+
"github.com/ethereum/go-ethereum/p2p/discover"
33+
"github.com/ethereum/go-ethereum/p2p/nat"
34+
)
35+
36+
func main() {
37+
var (
38+
listenAddr = flag.String("addr", ":30301", "listen address")
39+
genKey = flag.String("genkey", "", "generate a node key and quit")
40+
nodeKeyFile = flag.String("nodekey", "", "private key filename")
41+
nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)")
42+
natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:<IP>)")
43+
44+
nodeKey *ecdsa.PrivateKey
45+
err error
46+
)
47+
flag.Parse()
48+
logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel))
49+
50+
if *genKey != "" {
51+
writeKey(*genKey)
52+
os.Exit(0)
53+
}
54+
55+
natm, err := nat.Parse(*natdesc)
56+
if err != nil {
57+
log.Fatalf("-nat: %v", err)
58+
}
59+
switch {
60+
case *nodeKeyFile == "" && *nodeKeyHex == "":
61+
log.Fatal("Use -nodekey or -nodekeyhex to specify a private key")
62+
case *nodeKeyFile != "" && *nodeKeyHex != "":
63+
log.Fatal("Options -nodekey and -nodekeyhex are mutually exclusive")
64+
case *nodeKeyFile != "":
65+
if nodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {
66+
log.Fatalf("-nodekey: %v", err)
67+
}
68+
case *nodeKeyHex != "":
69+
if nodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {
70+
log.Fatalf("-nodekeyhex: %v", err)
71+
}
72+
}
73+
74+
if _, err := discover.ListenUDP(nodeKey, *listenAddr, natm); err != nil {
75+
log.Fatal(err)
76+
}
77+
select {}
78+
}
79+
80+
func writeKey(target string) {
81+
key, err := crypto.GenerateKey()
82+
if err != nil {
83+
log.Fatal("could not generate key: %v", err)
84+
}
85+
b := crypto.FromECDSA(key)
86+
if target == "-" {
87+
fmt.Println(hex.EncodeToString(b))
88+
} else {
89+
if err := ioutil.WriteFile(target, b, 0600); err != nil {
90+
log.Fatal("write error: ", err)
91+
}
92+
}
93+
}

cmd/ethereum/flags.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@
2121
package main
2222

2323
import (
24+
"crypto/ecdsa"
2425
"flag"
2526
"fmt"
2627
"log"
2728
"os"
2829
"os/user"
2930
"path"
3031

32+
"github.com/ethereum/go-ethereum/crypto"
3133
"github.com/ethereum/go-ethereum/logger"
34+
"github.com/ethereum/go-ethereum/p2p/nat"
3235
"github.com/ethereum/go-ethereum/vm"
3336
)
3437

@@ -42,14 +45,14 @@ var (
4245
StartWebSockets bool
4346
RpcPort int
4447
WsPort int
45-
NatType string
46-
PMPGateway string
4748
OutboundPort string
4849
ShowGenesis bool
4950
AddPeer string
5051
MaxPeer int
5152
GenAddr bool
52-
SeedNode string
53+
BootNodes string
54+
NodeKey *ecdsa.PrivateKey
55+
NAT nat.Interface
5356
SecretFile string
5457
ExportDir string
5558
NonInteractive bool
@@ -84,6 +87,7 @@ func defaultDataDir() string {
8487
var defaultConfigFile = path.Join(defaultDataDir(), "conf.ini")
8588

8689
func Init() {
90+
// TODO: move common flag processing to cmd/util
8791
flag.Usage = func() {
8892
fmt.Fprintf(os.Stderr, "%s [options] [filename]:\noptions precedence: default < config file < environment variables < command line\n", os.Args[0])
8993
flag.PrintDefaults()
@@ -93,18 +97,12 @@ func Init() {
9397
flag.StringVar(&Identifier, "id", "", "Custom client identifier")
9498
flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use")
9599
flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)")
96-
flag.StringVar(&OutboundPort, "port", "30303", "listening port")
97-
flag.StringVar(&NatType, "nat", "", "NAT support (UPNP|PMP) (none)")
98-
flag.StringVar(&PMPGateway, "pmp", "", "Gateway IP for PMP")
99-
flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
100+
100101
flag.IntVar(&RpcPort, "rpcport", 8545, "port to start json-rpc server on")
101102
flag.IntVar(&WsPort, "wsport", 40404, "port to start websocket rpc server on")
102103
flag.BoolVar(&StartRpc, "rpc", false, "start rpc server")
103104
flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server")
104105
flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
105-
flag.StringVar(&SeedNode, "seednode", "poc-8.ethdev.com:30303", "ip:port of seed node to connect to. Set to blank for skip")
106-
flag.BoolVar(&SHH, "shh", true, "whisper protocol (on)")
107-
flag.BoolVar(&Dial, "dial", true, "dial out connections (on)")
108106
flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key")
109107
flag.StringVar(&SecretFile, "import", "", "imports the file given (hex or mnemonic formats)")
110108
flag.StringVar(&ExportDir, "export", "", "exports the session keyring to files in the directory given")
@@ -127,8 +125,38 @@ func Init() {
127125
flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console")
128126
flag.BoolVar(&PrintVersion, "version", false, "prints version number")
129127

128+
// Network stuff
129+
var (
130+
nodeKeyFile = flag.String("nodekey", "", "network private key file")
131+
nodeKeyHex = flag.String("nodekeyhex", "", "network private key (for testing)")
132+
natstr = flag.String("nat", "any", "port mapping mechanism (any|none|upnp|pmp|extip:<IP>)")
133+
)
134+
flag.BoolVar(&Dial, "dial", true, "dial out connections (default on)")
135+
flag.BoolVar(&SHH, "shh", true, "run whisper protocol (default on)")
136+
flag.StringVar(&OutboundPort, "port", "30303", "listening port")
137+
138+
flag.StringVar(&BootNodes, "bootnodes", "", "space-separated node URLs for discovery bootstrap")
139+
flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
140+
130141
flag.Parse()
131142

143+
var err error
144+
if NAT, err = nat.Parse(*natstr); err != nil {
145+
log.Fatalf("-nat: %v", err)
146+
}
147+
switch {
148+
case *nodeKeyFile != "" && *nodeKeyHex != "":
149+
log.Fatal("Options -nodekey and -nodekeyhex are mutually exclusive")
150+
case *nodeKeyFile != "":
151+
if NodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {
152+
log.Fatalf("-nodekey: %v", err)
153+
}
154+
case *nodeKeyHex != "":
155+
if NodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {
156+
log.Fatalf("-nodekeyhex: %v", err)
157+
}
158+
}
159+
132160
if VmType >= int(vm.MaxVmTy) {
133161
log.Fatal("Invalid VM type ", VmType)
134162
}

cmd/ethereum/main.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/ethereum/go-ethereum/eth"
3232
"github.com/ethereum/go-ethereum/ethutil"
3333
"github.com/ethereum/go-ethereum/logger"
34+
"github.com/ethereum/go-ethereum/p2p"
3435
"github.com/ethereum/go-ethereum/state"
3536
)
3637

@@ -61,21 +62,19 @@ func main() {
6162
utils.InitConfig(VmType, ConfigFile, Datadir, "ETH")
6263

6364
ethereum, err := eth.New(&eth.Config{
64-
Name: ClientIdentifier,
65-
Version: Version,
66-
KeyStore: KeyStore,
67-
DataDir: Datadir,
68-
LogFile: LogFile,
69-
LogLevel: LogLevel,
70-
LogFormat: LogFormat,
71-
Identifier: Identifier,
72-
MaxPeers: MaxPeer,
73-
Port: OutboundPort,
74-
NATType: PMPGateway,
75-
PMPGateway: PMPGateway,
76-
KeyRing: KeyRing,
77-
Shh: SHH,
78-
Dial: Dial,
65+
Name: p2p.MakeName(ClientIdentifier, Version),
66+
KeyStore: KeyStore,
67+
DataDir: Datadir,
68+
LogFile: LogFile,
69+
LogLevel: LogLevel,
70+
MaxPeers: MaxPeer,
71+
Port: OutboundPort,
72+
NAT: NAT,
73+
KeyRing: KeyRing,
74+
Shh: SHH,
75+
Dial: Dial,
76+
BootNodes: BootNodes,
77+
NodeKey: NodeKey,
7978
})
8079

8180
if err != nil {
@@ -135,7 +134,7 @@ func main() {
135134
utils.StartWebSockets(ethereum, WsPort)
136135
}
137136

138-
utils.StartEthereum(ethereum, SeedNode)
137+
utils.StartEthereum(ethereum)
139138

140139
if StartJsConsole {
141140
InitJsConsole(ethereum)

0 commit comments

Comments
 (0)