这里是读取本地文件的所调用的函数
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
}