Move code into seedTable and populateTable proc

This commit is contained in:
kdeme 2021-01-07 10:15:48 +01:00
parent ac58a1f35c
commit 9cedbc0cc8
2 changed files with 42 additions and 9 deletions

View File

@ -22,6 +22,11 @@ type
desc: "UDP listening port." desc: "UDP listening port."
name: "udp-port" .}: uint16 name: "udp-port" .}: uint16
listenAddress* {.
defaultValue: defaultListenAddress(config)
desc: "Listening address for the Discovery v5 traffic"
name: "listen-address" }: ValidIpAddress
bootnodes* {. bootnodes* {.
desc: "ENR URI of node to bootstrap discovery with. Argument may be repeated." desc: "ENR URI of node to bootstrap discovery with. Argument may be repeated."
name: "bootnode" .}: seq[enr.Record] name: "bootnode" .}: seq[enr.Record]
@ -42,7 +47,7 @@ type
name: "metrics" .}: bool name: "metrics" .}: bool
metricsAddress* {. metricsAddress* {.
defaultValue: ValidIpAddress.init("127.0.0.1") defaultValue: defaultAdminListenAddress(config)
desc: "Listening address of the metrics server." desc: "Listening address of the metrics server."
name: "metrics-address" .}: ValidIpAddress name: "metrics-address" .}: ValidIpAddress
@ -78,6 +83,12 @@ type
desc: "ENR URI of the node to send a talkreq message" desc: "ENR URI of the node to send a talkreq message"
name: "node" .}: Node name: "node" .}: Node
func defaultListenAddress*(conf: DiscoveryConf): ValidIpAddress =
(static ValidIpAddress.init("0.0.0.0"))
func defaultAdminListenAddress*(conf: DiscoveryConf): ValidIpAddress =
(static ValidIpAddress.init("127.0.0.1"))
proc parseCmdArg*(T: type enr.Record, p: TaintedString): T = proc parseCmdArg*(T: type enr.Record, p: TaintedString): T =
if not fromURI(result, p): if not fromURI(result, p):
raise newException(ConfigurationError, "Invalid ENR") raise newException(ConfigurationError, "Invalid ENR")

View File

@ -102,6 +102,7 @@ const
## refresh the routing table. ## refresh the routing table.
revalidateMax = 10000 ## Revalidation of a peer is done between 0 and this revalidateMax = 10000 ## Revalidation of a peer is done between 0 and this
## value in milliseconds ## value in milliseconds
initialLookups = 1 ## Amount of lookups done when populating the routing table
handshakeTimeout* = 2.seconds ## timeout for the reply on the handshakeTimeout* = 2.seconds ## timeout for the reply on the
## whoareyou message ## whoareyou message
responseTimeout* = 4.seconds ## timeout for the response of a request-response responseTimeout* = 4.seconds ## timeout for the response of a request-response
@ -818,6 +819,32 @@ proc resolve*(d: Protocol, id: NodeId): Future[Option[Node]]
return node return node
proc seedTable*(d: Protocol) =
## Seed the table with known nodes.
for record in d.bootstrapRecords:
if d.addNode(record):
debug "Added bootstrap node", uri = toURI(record)
else:
debug "Bootstrap node could not be added", uri = toURI(record)
# TODO:
# Persistent stored nodes could be added to seed from here
# See: https://github.com/status-im/nim-eth/issues/189
proc populateTable*(d: Protocol) {.async, raises: [Exception, Defect].} =
## Do a set of initial lookups to quickly populate the table.
# start with a self target query (neighbour nodes)
let selfQuery = await d.query(d.localNode.id)
trace "Discovered nodes in self target query", nodes = selfQuery.len
# `initialLookups` random queries
for i in 0..<initialLookups:
let randomQuery = await d.queryRandom()
trace "Discovered nodes in random target query", nodes = randomQuery.len
debug "Total nodes in routing table after populate",
total = d.routingTable.len()
proc revalidateNode*(d: Protocol, n: Node) proc revalidateNode*(d: Protocol, n: Node)
{.async, raises: [Exception, Defect].} = # TODO: Exception {.async, raises: [Exception, Defect].} = # TODO: Exception
let pong = await d.ping(n) let pong = await d.ping(n)
@ -847,9 +874,8 @@ proc refreshLoop(d: Protocol) {.async, raises: [Exception, Defect].} =
## no queries were done since `refreshInterval` or more. ## no queries were done since `refreshInterval` or more.
# TODO: General Exception raised. # TODO: General Exception raised.
try: try:
# start with a query target self (neighbour nodes) await d.populateTable()
let selfQuery = await d.query(d.localNode.id)
trace "Discovered nodes in self target query", nodes = selfQuery.len
while true: while true:
let currentTime = now(chronos.Moment) let currentTime = now(chronos.Moment)
if currentTime > (d.lastLookup + refreshInterval): if currentTime > (d.lastLookup + refreshInterval):
@ -915,11 +941,7 @@ proc open*(d: Protocol) {.raises: [Exception, Defect].} =
# object of Exception. In Nim devel this got changed to CatchableError. # object of Exception. In Nim devel this got changed to CatchableError.
d.transp = newDatagramTransport(processClient, udata = d, local = ta) d.transp = newDatagramTransport(processClient, udata = d, local = ta)
for record in d.bootstrapRecords: d.seedTable()
if d.addNode(record):
debug "Added bootstrap node", uri = toURI(record)
else:
debug "Bootstrap node could not be added", uri = toURI(record)
proc start*(d: Protocol) {.raises: [Exception, Defect].} = proc start*(d: Protocol) {.raises: [Exception, Defect].} =
d.refreshLoop = refreshLoop(d) d.refreshLoop = refreshLoop(d)