@@ -19,10 +19,10 @@ package main
19
19
import (
20
20
"fmt"
21
21
"net"
22
- "sort"
23
22
"strings"
24
23
"time"
25
24
25
+ "github.com/ethereum/go-ethereum/common"
26
26
"github.com/ethereum/go-ethereum/crypto"
27
27
"github.com/ethereum/go-ethereum/p2p/discover"
28
28
"github.com/ethereum/go-ethereum/p2p/enode"
@@ -38,23 +38,34 @@ var (
38
38
discv4PingCommand ,
39
39
discv4RequestRecordCommand ,
40
40
discv4ResolveCommand ,
41
+ discv4ResolveJSONCommand ,
41
42
},
42
43
}
43
44
discv4PingCommand = cli.Command {
44
- Name : "ping" ,
45
- Usage : "Sends ping to a node" ,
46
- Action : discv4Ping ,
45
+ Name : "ping" ,
46
+ Usage : "Sends ping to a node" ,
47
+ Action : discv4Ping ,
48
+ ArgsUsage : "<node>" ,
47
49
}
48
50
discv4RequestRecordCommand = cli.Command {
49
- Name : "requestenr" ,
50
- Usage : "Requests a node record using EIP-868 enrRequest" ,
51
- Action : discv4RequestRecord ,
51
+ Name : "requestenr" ,
52
+ Usage : "Requests a node record using EIP-868 enrRequest" ,
53
+ Action : discv4RequestRecord ,
54
+ ArgsUsage : "<node>" ,
52
55
}
53
56
discv4ResolveCommand = cli.Command {
54
- Name : "resolve" ,
55
- Usage : "Finds a node in the DHT" ,
56
- Action : discv4Resolve ,
57
- Flags : []cli.Flag {bootnodesFlag },
57
+ Name : "resolve" ,
58
+ Usage : "Finds a node in the DHT" ,
59
+ Action : discv4Resolve ,
60
+ ArgsUsage : "<node>" ,
61
+ Flags : []cli.Flag {bootnodesFlag },
62
+ }
63
+ discv4ResolveJSONCommand = cli.Command {
64
+ Name : "resolve-json" ,
65
+ Usage : "Re-resolves nodes in a nodes.json file" ,
66
+ Action : discv4ResolveJSON ,
67
+ Flags : []cli.Flag {bootnodesFlag },
68
+ ArgsUsage : "<nodes.json file>" ,
58
69
}
59
70
)
60
71
@@ -64,10 +75,8 @@ var bootnodesFlag = cli.StringFlag{
64
75
}
65
76
66
77
func discv4Ping (ctx * cli.Context ) error {
67
- n , disc , err := getNodeArgAndStartV4 (ctx )
68
- if err != nil {
69
- return err
70
- }
78
+ n := getNodeArg (ctx )
79
+ disc := startV4 (ctx )
71
80
defer disc .Close ()
72
81
73
82
start := time .Now ()
@@ -79,10 +88,8 @@ func discv4Ping(ctx *cli.Context) error {
79
88
}
80
89
81
90
func discv4RequestRecord (ctx * cli.Context ) error {
82
- n , disc , err := getNodeArgAndStartV4 (ctx )
83
- if err != nil {
84
- return err
85
- }
91
+ n := getNodeArg (ctx )
92
+ disc := startV4 (ctx )
86
93
defer disc .Close ()
87
94
88
95
respN , err := disc .RequestENR (n )
@@ -94,33 +101,43 @@ func discv4RequestRecord(ctx *cli.Context) error {
94
101
}
95
102
96
103
func discv4Resolve (ctx * cli.Context ) error {
97
- n , disc , err := getNodeArgAndStartV4 (ctx )
98
- if err != nil {
99
- return err
100
- }
104
+ n := getNodeArg (ctx )
105
+ disc := startV4 (ctx )
101
106
defer disc .Close ()
102
107
103
108
fmt .Println (disc .Resolve (n ).String ())
104
109
return nil
105
110
}
106
111
107
- func getNodeArgAndStartV4 (ctx * cli.Context ) ( * enode. Node , * discover. UDPv4 , error ) {
108
- if ctx .NArg () != 1 {
109
- return nil , nil , fmt .Errorf ("missing node as command-line argument" )
112
+ func discv4ResolveJSON (ctx * cli.Context ) error {
113
+ if ctx .NArg () < 1 {
114
+ return fmt .Errorf ("need nodes file as argument" )
110
115
}
111
- n , err := parseNode (ctx .Args ()[0 ])
112
- if err != nil {
113
- return nil , nil , err
116
+ disc := startV4 (ctx )
117
+ defer disc .Close ()
118
+ file := ctx .Args ().Get (0 )
119
+
120
+ // Load existing nodes in file.
121
+ var nodes []* enode.Node
122
+ if common .FileExist (file ) {
123
+ nodes = loadNodesJSON (file ).nodes ()
114
124
}
115
- var bootnodes [] * enode. Node
116
- if commandHasFlag ( ctx , bootnodesFlag ) {
117
- bootnodes , err = parseBootnodes (ctx )
125
+ // Add nodes from command line arguments.
126
+ for i := 1 ; i < ctx . NArg (); i ++ {
127
+ n , err := parseNode (ctx . Args (). Get ( i ) )
118
128
if err != nil {
119
- return nil , nil , err
129
+ exit ( err )
120
130
}
131
+ nodes = append (nodes , n )
132
+ }
133
+
134
+ result := make (nodeSet , len (nodes ))
135
+ for _ , n := range nodes {
136
+ n = disc .Resolve (n )
137
+ result [n .ID ()] = nodeJSON {Seq : n .Seq (), N : n }
121
138
}
122
- disc , err := startV4 ( bootnodes )
123
- return n , disc , err
139
+ writeNodesJSON ( file , result )
140
+ return nil
124
141
}
125
142
126
143
func parseBootnodes (ctx * cli.Context ) ([]* enode.Node , error ) {
@@ -139,28 +156,39 @@ func parseBootnodes(ctx *cli.Context) ([]*enode.Node, error) {
139
156
return nodes , nil
140
157
}
141
158
142
- // commandHasFlag returns true if the current command supports the given flag.
143
- func commandHasFlag (ctx * cli.Context , flag cli.Flag ) bool {
144
- flags := ctx .FlagNames ()
145
- sort .Strings (flags )
146
- i := sort .SearchStrings (flags , flag .GetName ())
147
- return i != len (flags ) && flags [i ] == flag .GetName ()
159
+ // startV4 starts an ephemeral discovery V4 node.
160
+ func startV4 (ctx * cli.Context ) * discover.UDPv4 {
161
+ socket , ln , cfg , err := listen ()
162
+ if err != nil {
163
+ exit (err )
164
+ }
165
+ if commandHasFlag (ctx , bootnodesFlag ) {
166
+ bn , err := parseBootnodes (ctx )
167
+ if err != nil {
168
+ exit (err )
169
+ }
170
+ cfg .Bootnodes = bn
171
+ }
172
+ disc , err := discover .ListenV4 (socket , ln , cfg )
173
+ if err != nil {
174
+ exit (err )
175
+ }
176
+ return disc
148
177
}
149
178
150
- // startV4 starts an ephemeral discovery V4 node.
151
- func startV4 (bootnodes []* enode.Node ) (* discover.UDPv4 , error ) {
179
+ func listen () (* net.UDPConn , * enode.LocalNode , discover.Config , error ) {
152
180
var cfg discover.Config
153
- cfg .Bootnodes = bootnodes
154
181
cfg .PrivateKey , _ = crypto .GenerateKey ()
155
182
db , _ := enode .OpenDB ("" )
156
183
ln := enode .NewLocalNode (db , cfg .PrivateKey )
157
184
158
185
socket , err := net .ListenUDP ("udp4" , & net.UDPAddr {IP : net.IP {0 , 0 , 0 , 0 }})
159
186
if err != nil {
160
- return nil , err
187
+ db .Close ()
188
+ return nil , nil , cfg , err
161
189
}
162
190
addr := socket .LocalAddr ().(* net.UDPAddr )
163
191
ln .SetFallbackIP (net.IP {127 , 0 , 0 , 1 })
164
192
ln .SetFallbackUDP (addr .Port )
165
- return discover . ListenUDP ( socket , ln , cfg )
193
+ return socket , ln , cfg , nil
166
194
}
0 commit comments