这里是读取本地文件的所调用的函数
func
ParseNode(rawurl
string) (*Node,
error) {
if
m := incompleteNodeURL.
FindStringSubmatch(rawurl); m !=
nil {
id,
err :=
HexID(m[
1])
if err !=
nil {
return
nil, fmt.
Errorf(
"invalid node ID (%v)", err)
}
return
NewNode(id,
nil,
0,
0),
nil
}
return
parseComplete(rawurl)
}
func
parseComplete(rawurl
string) (*Node,
error) {
var (
id NodeID
ip net.IP
tcpPort,
udpPort
uint64
)
u,
err := url.
Parse(rawurl)
if err !=
nil {
return
nil, err
}
if u.Scheme !=
"enode" {
return
nil, errors.
New(
"invalid URL scheme, want
\"
enode
\"
")
}
// Parse the Node ID from the user portion.
if u.User ==
nil {
return
nil, errors.
New(
"does not contain node ID")
}
if
id,
err =
HexID(u.User.
String()); err !=
nil {
return
nil, fmt.
Errorf(
"invalid node ID (%v)", err)
}
// Parse the IP address.
host,
port,
err := net.
SplitHostPort(u.Host)
if err !=
nil {
return
nil, fmt.
Errorf(
"invalid host: %v", err)
}
if
ip = net.
ParseIP(host); ip ==
nil {
return
nil, errors.
New(
"invalid IP address")
}
// Ensure the IP is 4 bytes long for IPv4 addresses.
if
ipv4 := ip.
To4(); ipv4 !=
nil {
ip = ipv4
}
// Parse the port numbers.
if
tcpPort,
err = strconv.
ParseUint(port,
10,
16); err !=
nil {
return
nil, errors.
New(
"invalid port")
}
udpPort = tcpPort
qv := u.
Query()
if qv.
Get(
"discport") !=
"" {
udpPort,
err = strconv.
ParseUint(qv.
Get(
"discport"),
10,
16)
if err !=
nil {
return
nil, errors.
New(
"invalid discport in query")
}
}
return
NewNode(id, ip,
uint16(udpPort),
uint16(tcpPort)),
nil
}