diff --git a/p2p/discover/api.go b/p2p/discover/api.go index eaa8c98ff6..a932bdb2b4 100644 --- a/p2p/discover/api.go +++ b/p2p/discover/api.go @@ -252,7 +252,7 @@ func (p *PortalProtocolAPI) RoutingTableInfo() *RoutingTableInfo { func (p *PortalProtocolAPI) AddEnr(enr string) (bool, error) { p.portalProtocol.Log.Debug("serving AddEnr", "enr", enr) - n, err := enode.Parse(enode.ValidSchemes, enr) + n, err := enode.ParseForAddEnr(enode.ValidSchemes, enr) if err != nil { return false, err } @@ -263,7 +263,7 @@ func (p *PortalProtocolAPI) AddEnr(enr string) (bool, error) { func (p *PortalProtocolAPI) AddEnrs(enrs []string) bool { // Note: unspecified RPC, but useful for our local testnet test for _, enr := range enrs { - n, err := enode.Parse(enode.ValidSchemes, enr) + n, err := enode.ParseForAddEnr(enode.ValidSchemes, enr) if err != nil { continue } diff --git a/p2p/discover/portal_protocol.go b/p2p/discover/portal_protocol.go index 21cd76389b..909e7a8349 100644 --- a/p2p/discover/portal_protocol.go +++ b/p2p/discover/portal_protocol.go @@ -293,7 +293,7 @@ func (p *PortalProtocol) AddEnr(n *enode.Node) { defer p.table.mutex.Unlock() added := p.table.handleAddNode(addNodeOp{node: n, isInbound: true, forceSetLive: true}) if !added { - p.Log.Warn("add node failed", "id", n.ID(), n.IPAddr()) + p.Log.Warn("add node failed", "id", n.ID(), "ip", n.IPAddr()) return } id := n.ID().String() diff --git a/p2p/enode/node.go b/p2p/enode/node.go index cb4ac8d172..bb5398f591 100644 --- a/p2p/enode/node.go +++ b/p2p/enode/node.go @@ -149,6 +149,34 @@ func Parse(validSchemes enr.IdentityScheme, input string) (*Node, error) { return New(validSchemes, &r) } +func ParseForAddEnr(validSchemes enr.IdentityScheme, input string) (*Node, error) { + if strings.HasPrefix(input, "enode://") { + return ParseV4(input) + } + if !strings.HasPrefix(input, "enr:") { + return nil, errMissingPrefix + } + bin, err := base64.RawURLEncoding.DecodeString(input[4:]) + if err != nil { + return nil, err + } + var r enr.Record + if err := rlp.DecodeBytes(bin, &r); err != nil { + return nil, err + } + var n *Node + if n, err = New(validSchemes, &r); err != nil { + return nil, err + } + var ip4 netip.Addr + var ip6 netip.Addr + n.Load((*enr.IPv4Addr)(&ip4)) + n.Load((*enr.IPv6Addr)(&ip6)) + n.setIP4(ip4) + n.setIP6(ip6) + return n, nil +} + // ID returns the node identifier. func (n *Node) ID() ID { return n.id