Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion eth/p2p/discoveryv5/encoding.nim
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ logScope:
# Support overriding the default discv5 protocol version and protocol id
# via compile time defines (e.g., '-d:discv5_protocol_id=d5waku')
const
discv5_protocol_version {.intdefine.} : uint16 = 1
discv5_protocol_version {.intdefine.} : uint16 = 2
discv5_protocol_id {.strdefine.} = "discv5"

const
Expand Down Expand Up @@ -82,6 +82,7 @@ type
OrdinaryMessage = 0x00
Whoareyou = 0x01
HandshakeMessage = 0x02
SessionMessage = 0x03

Packet* = object
case flag*: Flag
Expand All @@ -96,6 +97,9 @@ type
# TODO record or node immediately?
node*: Option[Node]
srcIdHs*: NodeId
of SessionMessage:
# TODO: Implement
discard

HandshakeKey* = object
nodeId*: NodeId
Expand Down Expand Up @@ -570,3 +574,7 @@ proc decodePacket*(c: var Codec, fromAddr: Address, input: openArray[byte]):
return decodeHandshakePacket(c, fromAddr, staticHeader.nonce,
input.toOpenArray(0, ivSize - 1), header,
input.toOpenArray(ivSize + header.len, input.high))

of SessionMessage:
# TODO: Implement
return ok(Packet(flag: Flag.SessionMessage))
33 changes: 15 additions & 18 deletions eth/p2p/discoveryv5/messages.nim
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

import
std/[hashes, net],
./enr
"."/[enr, node]

type
MessageKind* = enum
Expand All @@ -25,16 +25,16 @@ type
unused = 0x00

# The supported message types
# Request & response
ping = 0x01
pong = 0x02
findNode = 0x03
nodes = 0x04
talkReq = 0x05
talkResp = 0x06
regTopic = 0x07
ticket = 0x08
regConfirmation = 0x09
topicQuery = 0x0A
# Notifications
relayInit = 0x07
relayMsg = 0x08

RequestId* = object
id*: seq[byte]
Expand All @@ -61,15 +61,20 @@ type
TalkRespMessage* = object
response*: seq[byte]

# Not implemented, specification is not final here.
RegTopicMessage* = object
TicketMessage* = object
RegConfirmationMessage* = object
TopicQueryMessage* = object
RelayInitNotification* = object
initiatorEnr*: Record
targetId*: NodeId
nonce*: array[12, byte] # TODO: is this ok?

RelayMsgNotification* = object
initiatorEnr*: Record
nonce*: array[12, byte]

SomeMessage* = PingMessage or PongMessage or FindNodeMessage or NodesMessage or
TalkReqMessage or TalkRespMessage

SomeNotification* = RelayInitNotification or RelayMsgNotification

Message* = object
reqId*: RequestId
case kind*: MessageKind
Expand All @@ -85,14 +90,6 @@ type
talkReq*: TalkReqMessage
of talkResp:
talkResp*: TalkRespMessage
of regTopic:
regtopic*: RegTopicMessage
of ticket:
ticket*: TicketMessage
of regConfirmation:
regConfirmation*: RegConfirmationMessage
of topicQuery:
topicQuery*: TopicQueryMessage
else:
discard

Expand Down
8 changes: 2 additions & 6 deletions eth/p2p/discoveryv5/messages_encoding.nim
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,8 @@ func decodeMessage*(body: openArray[byte]): Result[Message, cstring] =
of nodes: rlp.decode(message.nodes)
of talkReq: rlp.decode(message.talkReq)
of talkResp: rlp.decode(message.talkResp)
of regTopic, ticket, regConfirmation, topicQuery:
# We just pass the empty type of this message without attempting to
# decode, so that the protocol knows what was received.
# But we ignore the message as per specification as "the content and
# semantics of this message are not final".
discard
of relayInit: return err("To implement")
of relayMsg: return err("To implement")
except RlpError, ValueError:
return err("Invalid message encoding")

Expand Down
8 changes: 3 additions & 5 deletions eth/p2p/discoveryv5/protocol.nim
Original file line number Diff line number Diff line change
Expand Up @@ -368,11 +368,6 @@ proc handleMessage(d: Protocol, srcId: NodeId, fromAddr: Address,
of talkReq:
discovery_message_requests_incoming.inc()
d.handleTalkReq(srcId, fromAddr, message.talkReq, message.reqId)
of regTopic, topicQuery:
discovery_message_requests_incoming.inc()
discovery_message_requests_incoming.inc(labelValues = ["no_response"])
trace "Received unimplemented message kind", kind = message.kind,
origin = fromAddr
else:
var waiter: Future[Option[Message]]
if d.awaitedMessages.take((srcId, message.reqId), waiter):
Expand Down Expand Up @@ -459,6 +454,9 @@ proc receive*(d: Protocol, a: Address, packet: openArray[byte]) =
if node.address.isSome() and a == node.address.get():
if d.addNode(node):
trace "Added new node to routing table after handshake", node
of SessionMessage:
# TODO: implement
discard
else:
trace "Packet decoding error", error = decoded.error, address = a

Expand Down
2 changes: 0 additions & 2 deletions tests/fuzzing/discoveryv5/fuzz_decode_message.nim
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ test:
of nodes: encoded = encodeMessage(message.nodes, message.reqId)
of talkReq: encoded = encodeMessage(message.talkReq, message.reqId)
of talkResp: encoded = encodeMessage(message.talkResp, message.reqId)
of regTopic, ticket, regConfirmation, topicQuery:
break

# This will hit assert because of issue:
# https://github.com/status-im/nim-eth/issues/255
Expand Down