diff --git a/execution_chain/networking/discoveryv5.nim b/execution_chain/networking/discoveryv5.nim index 66aa42c4de..661e3cb025 100644 --- a/execution_chain/networking/discoveryv5.nim +++ b/execution_chain/networking/discoveryv5.nim @@ -9,13 +9,62 @@ {.push raises: [].} -include - eth/p2p/discoveryv5/protocol +import + std/[options], + chronos, + chronicles, + results, + metrics, + eth/common/keys, + eth/p2p/discoveryv5/[protocol, encoding, messages_encoding, enr, node, sessions] -proc receiveV5*(d: Protocol, a: Address, packet: openArray[byte]): Result[void, cstring] = +export + # Core types only + protocol.Protocol, + node.Node, + node.Address, + enr.Record + +# Type aliases for cleaner API +type + DiscoveryV5* = protocol.Protocol + NodeV5* = node.Node + AddressV5* = node.Address + + DiscResult*[T] = Result[T, cstring] + +proc newDiscoveryV5*( + privKey: PrivateKey, + enrIp: Opt[IpAddress], + enrTcpPort: Opt[Port], + enrUdpPort: Opt[Port], + bootstrapRecords: openArray[enr.Record] = [], + bindPort: Port, + bindIp = IPv6_any(), + enrAutoUpdate = true, + rng = newRng(), +): DiscoveryV5 = + ## Create a new Discovery v5 protocol instance + protocol.newProtocol( + privKey = privKey, + enrIp = enrIp, + enrTcpPort = enrTcpPort, + enrUdpPort = enrUdpPort, + bootstrapRecords = bootstrapRecords, + bindPort = bindPort, + bindIp = bindIp, + enrAutoUpdate = enrAutoUpdate, + rng = rng + ) + +proc receiveV5*(d: Protocol, a: Address, packet: openArray[byte]): DiscResult[void] = discv5_network_bytes.inc(packet.len.int64, labelValues = [$Direction.In]) - let packet = ?d.codec.decodePacket(a, packet) + let decoded = d.codec.decodePacket(a, packet) + if decoded.isErr(): + return err("discv5: Failed to decode packet") + + let packet = decoded[] case packet.flag of OrdinaryMessage: diff --git a/execution_chain/networking/eth1_discovery.nim b/execution_chain/networking/eth1_discovery.nim index b7fa91ce37..306959b496 100644 --- a/execution_chain/networking/eth1_discovery.nim +++ b/execution_chain/networking/eth1_discovery.nim @@ -29,13 +29,13 @@ logScope: type DiscV4 = discoveryv4.DiscoveryV4 - DiscV5 = discoveryv5.Protocol + DiscV5 = discoveryv5.DiscoveryV5 NodeV4 = discoveryv4.Node - NodeV5 = discoveryv5.Node + NodeV5 = discoveryv5.NodeV5 AddressV4 = discoveryv4.Address - AddressV5 = discoveryv5.Address + AddressV5 = discoveryv5.AddressV5 Eth1Discovery* = ref object discv4: DiscV4 @@ -84,8 +84,9 @@ proc processClient( if discv4.isErr: # unhandled buf will be handled by discv5 let addrv5 = raddr.to(AddressV5) - proto.discv5.receiveV5(addrv5, buf).isOkOr: - debug "Discovery receive error", discv4=discv4.error, discv5=error + let discv5 = proto.discv5.receiveV5(addrv5, buf) + if discv5.isErr: + debug "Discovery receive error", discv4=discv4.error, discv5=discv5.error #------------------------------------------------------------------------------ # Public functions @@ -110,7 +111,7 @@ proc new*( bindIp = bindIp, rng = rng ), - discv5: discoveryv5.newProtocol( + discv5: discoveryv5.newDiscoveryV5( privKey = privKey, enrIp = Opt.some(address.ip), enrTcpPort = Opt.some(address.tcpPort),