diff --git a/examples/v2/chat2.nim b/examples/v2/chat2.nim index e7d2adcd5..b69462656 100644 --- a/examples/v2/chat2.nim +++ b/examples/v2/chat2.nim @@ -10,21 +10,18 @@ import confutils, chronicles, chronos, stew/shims/net as stewNet, nimcrypto/pbkdf2 import libp2p/[switch, # manage transports, a single entry point for dialing and listening crypto/crypto, # cryptographic functions - protocols/identify, # identify the peer info of a peer stream/connection, # create and close stream read / write connections - transports/tcptransport, # listen and dial to other peers using client-server protocol multiaddress, # encode different addressing schemes. For example, /ip4/7.7.7.7/tcp/6543 means it is using IPv4 protocol and TCP peerinfo, # manage the information of a peer, such as peer ID and public / private key peerid, # Implement how peers interact protocols/protocol, # define the protocol base type - protocols/secure/secure, # define the protocol of secure connection protocols/secure/secio, # define the protocol of secure input / output, allows encrypted communication that uses public keys to validate signed messages instead of a certificate authority like in TLS - muxers/muxer, # define an interface for stream multiplexing, allowing peers to offer many protocols over a single connection - muxers/mplex/mplex] # define some contants and message types for stream multiplexing + muxers/muxer] # define an interface for stream multiplexing, allowing peers to offer many protocols over a single connection import ../../waku/v2/node/[config, wakunode2, waku_payload], - ../../waku/v2/protocol/[waku_relay, waku_message], + ../../waku/v2/protocol/waku_message, ../../waku/v2/protocol/waku_store/waku_store, ../../waku/v2/protocol/waku_filter/waku_filter, + ../../waku/v2/utils/peers, ../../waku/common/utils/nat const Help = """ @@ -68,19 +65,6 @@ proc generateSymKey(contentTopic: ContentTopic): SymKey = let DefaultSymKey = generateSymKey(DefaultContentTopic) -proc initAddress(T: type MultiAddress, str: string): T = - let address = MultiAddress.init(str).tryGet() - if IPFS.match(address) and matchPartial(multiaddress.TCP, address): - result = address - else: - raise newException(ValueError, - "Invalid bootstrap node multi-address") - -proc parsePeer(address: string): PeerInfo = - let multiAddr = MultiAddress.initAddress(address) - let parts = address.split("/") - result = PeerInfo.init(parts[^1], [multiAddr]) - proc connectToNodes(c: Chat, nodes: seq[string]) {.async.} = echo "Connecting to nodes" await c.node.connectToNodes(nodes) @@ -211,7 +195,7 @@ proc processInput(rfd: AsyncFD, rng: ref BrHmacDrbgContext) {.async.} = if conf.storenode != "": node.mountStore() - node.wakuStore.setPeer(parsePeer(conf.storenode)) + node.wakuStore.setPeer(parsePeerInfo(conf.storenode)) proc storeHandler(response: HistoryResponse) {.gcsafe.} = for msg in response.messages: @@ -224,7 +208,7 @@ proc processInput(rfd: AsyncFD, rng: ref BrHmacDrbgContext) {.async.} = if conf.filternode != "": node.mountFilter() - node.wakuFilter.setPeer(parsePeer(conf.filternode)) + node.wakuFilter.setPeer(parsePeerInfo(conf.filternode)) proc filterHandler(msg: WakuMessage) {.gcsafe.} = let payload = string.fromBytes(msg.payload) diff --git a/tests/v2/test_wakunode.nim b/tests/v2/test_wakunode.nim index b5d9dc0a2..75a22502f 100644 --- a/tests/v2/test_wakunode.nim +++ b/tests/v2/test_wakunode.nim @@ -5,11 +5,14 @@ import chronicles, chronos, stew/shims/net as stewNet, stew/byteutils, libp2p/crypto/crypto, libp2p/crypto/secp, + libp2p/peerid, + libp2p/multiaddress, libp2p/switch, eth/keys, ../../waku/v2/protocol/[waku_relay, waku_message, message_notifier], ../../waku/v2/protocol/waku_store/waku_store, ../../waku/v2/protocol/waku_filter/waku_filter, + ../../waku/v2/utils/peers, ../../waku/v2/node/wakunode2, ../test_helpers @@ -251,3 +254,42 @@ procSuite "WakuNode": await node1.stop() await node2.stop() await node3.stop() + + asyncTest "Peer info parses correctly": + ## This is such an important utility function for wakunode2 + ## that it deserves its own test :) + + # First test the `happy path` expected case + let + addrStr = "/ip4/127.0.0.1/tcp/60002/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc" + peerInfo = parsePeerInfo(addrStr) + + check: + $(peerInfo.peerId) == "16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc" + $(peerInfo.addrs[0][0].tryGet()) == "/ip4/127.0.0.1" + $(peerInfo.addrs[0][1].tryGet()) == "/tcp/60002" + + # Now test some common corner cases + expect ValueError: + # gibberish + discard parsePeerInfo("/p2p/$UCH GIBBER!SH") + + expect ValueError: + # leading whitespace + discard parsePeerInfo(" /ip4/127.0.0.1/tcp/60002/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc") + + expect ValueError: + # trailing whitespace + discard parsePeerInfo("/ip4/127.0.0.1/tcp/60002/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc ") + + expect ValueError: + # invalid IP address + discard parsePeerInfo("/ip4/127.0.0.0.1/tcp/60002/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc") + + expect ValueError: + # no PeerID + discard parsePeerInfo("/ip4/127.0.0.1/tcp/60002") + + expect ValueError: + # unsupported transport + discard parsePeerInfo("/ip4/127.0.0.1/udp/60002/p2p/16Uuu2HBmAcHvhLqQKwSSbX6BG5JLWUDRcaLVrehUVqpw7fz1hbYc") diff --git a/waku/v2/node/quicksim2.nim b/waku/v2/node/quicksim2.nim index 78510fda5..c8a524fd1 100644 --- a/waku/v2/node/quicksim2.nim +++ b/waku/v2/node/quicksim2.nim @@ -2,17 +2,24 @@ import os, strutils, chronicles, json_rpc/[rpcclient, rpcserver], libp2p/protobuf/minprotobuf, eth/common as eth_common, eth/keys, - options + ../protocol/waku_filter/waku_filter_types, + ../protocol/waku_store/waku_store_types, + ../protocol/waku_message, + ./wakunode2, ./waku_payload, + ./jsonrpc/[jsonrpc_types,jsonrpc_utils], + std/options #options as what # TODO: Huh? Redefinition? from strutils import rsplit template sourceDir: string = currentSourcePath.rsplit(DirSep, 1)[0] -const sigWakuPath = sourceDir / "rpc" / "wakucallsigs.nim" +const sigWakuPath = sourceDir / "jsonrpc" / "jsonrpc_callsigs.nim" createRpcSigs(RpcHttpClient, sigWakuPath) const defaultTopic = "/waku/2/default-waku/proto" +const defaultContentTopic = ContentTopic(1) + const topicAmount = 10 #100 proc message(i: int): ProtoBuffer = @@ -33,7 +40,7 @@ for i in 0..