mirror of https://github.com/status-im/nim-eth.git
Minor adjustments to store bootnode records + deletion test
This commit is contained in:
parent
7464c8cb4b
commit
c3f23e5912
|
@ -309,6 +309,8 @@ proc `$`*(r: Record): string =
|
||||||
result &= $v
|
result &= $v
|
||||||
result &= ')'
|
result &= ')'
|
||||||
|
|
||||||
|
proc `==`*(a, b: Record): bool = a.raw == b.raw
|
||||||
|
|
||||||
proc read*(rlp: var Rlp, T: typedesc[Record]): T {.inline.} =
|
proc read*(rlp: var Rlp, T: typedesc[Record]): T {.inline.} =
|
||||||
if not result.fromBytes(rlp.rawData.toOpenArray):
|
if not result.fromBytes(rlp.rawData.toOpenArray):
|
||||||
raise newException(ValueError, "Could not deserialize")
|
raise newException(ValueError, "Could not deserialize")
|
||||||
|
|
|
@ -48,10 +48,6 @@ proc newNode*(r: Record): Node =
|
||||||
result = newNode(initENode(pk, a))
|
result = newNode(initENode(pk, a))
|
||||||
result.record = r
|
result.record = r
|
||||||
|
|
||||||
proc newNodes*(records: openarray[Record]): seq[Node] =
|
|
||||||
for record in records:
|
|
||||||
result.add(newNode(record))
|
|
||||||
|
|
||||||
proc hash*(n: Node): hashes.Hash = hash(n.node.pubkey.data)
|
proc hash*(n: Node): hashes.Hash = hash(n.node.pubkey.data)
|
||||||
proc `==`*(a, b: Node): bool = (a.isNil and b.isNil) or (not a.isNil and not b.isNil and a.node.pubkey == b.node.pubkey)
|
proc `==`*(a, b: Node): bool = (a.isNil and b.isNil) or (not a.isNil and not b.isNil and a.node.pubkey == b.node.pubkey)
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ type
|
||||||
awaitedPackets: Table[(NodeId, RequestId), Future[Option[Packet]]]
|
awaitedPackets: Table[(NodeId, RequestId), Future[Option[Packet]]]
|
||||||
lookupLoop: Future[void]
|
lookupLoop: Future[void]
|
||||||
revalidateLoop: Future[void]
|
revalidateLoop: Future[void]
|
||||||
bootstrapNodes: seq[Node]
|
bootstrapRecords*: seq[Record]
|
||||||
|
|
||||||
PendingRequest = object
|
PendingRequest = object
|
||||||
node: Node
|
node: Node
|
||||||
|
@ -304,7 +304,7 @@ proc sendPing(d: Protocol, toNode: Node): RequestId =
|
||||||
d.send(toNode, data)
|
d.send(toNode, data)
|
||||||
return reqId
|
return reqId
|
||||||
|
|
||||||
proc ping(d: Protocol, toNode: Node): Future[Option[PongPacket]] {.async.} =
|
proc ping*(d: Protocol, toNode: Node): Future[Option[PongPacket]] {.async.} =
|
||||||
let reqId = d.sendPing(toNode)
|
let reqId = d.sendPing(toNode)
|
||||||
let resp = await d.waitPacket(toNode, reqId)
|
let resp = await d.waitPacket(toNode, reqId)
|
||||||
|
|
||||||
|
@ -392,7 +392,7 @@ proc lookupRandom*(d: Protocol): Future[seq[Node]]
|
||||||
raise newException(RandomSourceDepleted, "Could not randomize bytes")
|
raise newException(RandomSourceDepleted, "Could not randomize bytes")
|
||||||
d.lookup(id)
|
d.lookup(id)
|
||||||
|
|
||||||
proc revalidateNode(d: Protocol, n: Node)
|
proc revalidateNode*(d: Protocol, n: Node)
|
||||||
{.async, raises:[Defect, Exception].} = # TODO: Exception
|
{.async, raises:[Defect, Exception].} = # TODO: Exception
|
||||||
trace "Ping to revalidate node", node = $n
|
trace "Ping to revalidate node", node = $n
|
||||||
let pong = await d.ping(n)
|
let pong = await d.ping(n)
|
||||||
|
@ -408,8 +408,8 @@ proc revalidateNode(d: Protocol, n: Node)
|
||||||
# For now we never remove bootstrap nodes. It might make sense to actually
|
# For now we never remove bootstrap nodes. It might make sense to actually
|
||||||
# do so and to retry them only in case we drop to a really low amount of
|
# do so and to retry them only in case we drop to a really low amount of
|
||||||
# peers in the DHT
|
# peers in the DHT
|
||||||
if n notin d.bootstrapNodes:
|
if n.record notin d.bootstrapRecords:
|
||||||
trace "Revalidation of node failed, removing node", node = $n
|
trace "Revalidation of node failed, removing node", record = n.record
|
||||||
d.routingTable.removeNode(n)
|
d.routingTable.removeNode(n)
|
||||||
# Remove shared secrets when removing the node from routing table.
|
# Remove shared secrets when removing the node from routing table.
|
||||||
# This might be to direct, so we could keep these longer. But better
|
# This might be to direct, so we could keep these longer. But better
|
||||||
|
@ -462,19 +462,20 @@ proc newProtocol*(privKey: PrivateKey, db: Database,
|
||||||
whoareyouMagic: whoareyouMagic(node.id),
|
whoareyouMagic: whoareyouMagic(node.id),
|
||||||
idHash: sha256.digest(node.id.toByteArrayBE).data,
|
idHash: sha256.digest(node.id.toByteArrayBE).data,
|
||||||
codec: Codec(localNode: node, privKey: privKey, db: db),
|
codec: Codec(localNode: node, privKey: privKey, db: db),
|
||||||
bootstrapNodes: newNodes(bootstrapRecords))
|
bootstrapRecords: @bootstrapRecords)
|
||||||
|
|
||||||
result.routingTable.init(node)
|
result.routingTable.init(node)
|
||||||
|
|
||||||
proc open*(d: Protocol) =
|
proc open*(d: Protocol) =
|
||||||
debug "Starting discovery node", node = $d.localNode,
|
info "Starting discovery node", node = $d.localNode,
|
||||||
uri = toURI(d.localNode.record)
|
uri = toURI(d.localNode.record)
|
||||||
# TODO allow binding to specific IP / IPv6 / etc
|
# TODO allow binding to specific IP / IPv6 / etc
|
||||||
let ta = initTAddress(IPv4_any(), d.localNode.node.address.udpPort)
|
let ta = initTAddress(IPv4_any(), d.localNode.node.address.udpPort)
|
||||||
d.transp = newDatagramTransport(processClient, udata = d, local = ta)
|
d.transp = newDatagramTransport(processClient, udata = d, local = ta)
|
||||||
|
|
||||||
for node in d.bootstrapNodes:
|
for record in d.bootstrapRecords:
|
||||||
d.addNode(node)
|
debug "Adding bootstrap node", uri = toURI(record)
|
||||||
|
d.addNode(record)
|
||||||
|
|
||||||
proc start*(d: Protocol) =
|
proc start*(d: Protocol) =
|
||||||
# Might want to move these to a separate proc if this turns out to be needed.
|
# Might want to move these to a separate proc if this turns out to be needed.
|
||||||
|
|
|
@ -133,6 +133,30 @@ suite "Discovery v5 Tests":
|
||||||
|
|
||||||
await node.closeWait()
|
await node.closeWait()
|
||||||
|
|
||||||
|
asyncTest "Node deletion":
|
||||||
|
let
|
||||||
|
bootnode = initDiscoveryNode(newPrivateKey(), localAddress(20301), @[])
|
||||||
|
node1 = initDiscoveryNode(newPrivateKey(), localAddress(20302),
|
||||||
|
@[bootnode.localNode.record])
|
||||||
|
node2 = initDiscoveryNode(newPrivateKey(), localAddress(20303),
|
||||||
|
@[bootnode.localNode.record])
|
||||||
|
pong1 = await discv5_protocol.ping(node1, bootnode.localNode)
|
||||||
|
pong2 = await discv5_protocol.ping(node1, node2.localNode)
|
||||||
|
|
||||||
|
check pong1.isSome() and pong2.isSome()
|
||||||
|
|
||||||
|
await bootnode.closeWait()
|
||||||
|
await node2.closeWait()
|
||||||
|
|
||||||
|
await node1.revalidateNode(bootnode.localNode)
|
||||||
|
await node1.revalidateNode(node2.localNode)
|
||||||
|
|
||||||
|
check node1.getNode(bootnode.localNode.id) == bootnode.localNode
|
||||||
|
check node1.getNode(node2.localNode.id) == nil
|
||||||
|
|
||||||
|
await node1.closeWait()
|
||||||
|
|
||||||
|
|
||||||
asyncTest "Handshake cleanup":
|
asyncTest "Handshake cleanup":
|
||||||
let node = initDiscoveryNode(newPrivateKey(), localAddress(20302), @[])
|
let node = initDiscoveryNode(newPrivateKey(), localAddress(20302), @[])
|
||||||
var tag: PacketTag
|
var tag: PacketTag
|
||||||
|
|
Loading…
Reference in New Issue