diff --git a/Makefile b/Makefile index 324b10053..d8f058e1a 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ GIT_SUBMODULE_UPDATE := git submodule update --init --recursive else # "variables.mk" was included. Business as usual until the end of this file. # default target, because it's the first one that doesn't start with '.' -all: | wakunode wakusim +all: | wakunode wakusim wakunode2 wakusim2 # must be included after the default target -include $(BUILD_SYSTEM_DIR)/makefiles/targets.mk @@ -112,10 +112,11 @@ docker-push: # builds and runs the test suite test: | build deps $(ENV_SCRIPT) nim test $(NIM_PARAMS) waku.nims + $(ENV_SCRIPT) nim test2 $(NIM_PARAMS) waku.nims # usual cleaning clean: | clean-common - rm -rf build/{wakunode,quicksim,start_network,all_tests} + rm -rf build ifneq ($(USE_LIBBACKTRACE), 0) + $(MAKE) -C vendor/nim-libbacktrace clean $(HANDLE_OUTPUT) endif diff --git a/tests/all_tests.nim b/tests/all_tests.nim index 66a3d68f9..0c9b07164 100644 --- a/tests/all_tests.nim +++ b/tests/all_tests.nim @@ -1,4 +1,5 @@ import + # Waku v1 tests ./v1/test_waku_connect, ./v1/test_waku_config, ./v1/test_waku_bridge, diff --git a/tests/all_tests_v2.nim b/tests/all_tests_v2.nim new file mode 100644 index 000000000..efaa1f09b --- /dev/null +++ b/tests/all_tests_v2.nim @@ -0,0 +1,3 @@ +import + # Waku v2 tests + ./v2/test_waku \ No newline at end of file diff --git a/tests/v1/test_helpers.nim b/tests/v1/test_helpers.nim index b7c5bf351..4f28733fe 100644 --- a/tests/v1/test_helpers.nim +++ b/tests/v1/test_helpers.nim @@ -9,10 +9,12 @@ proc localAddress*(port: int): Address = result = Address(udpPort: port, tcpPort: port, ip: parseIpAddress("127.0.0.1")) -proc setupTestNode*(capabilities: varargs[ProtocolInfo, `protocolInfo`]): EthereumNode = - let keys1 = KeyPair.random()[] +proc setupTestNode*( + rng: ref BrHmacDrbgContext, + capabilities: varargs[ProtocolInfo, `protocolInfo`]): EthereumNode = + let keys1 = KeyPair.random(rng[]) result = newEthereumNode(keys1, localAddress(nextPort), 1, nil, - addAllCapabilities = false) + addAllCapabilities = false, rng = rng) nextPort.inc for capability in capabilities: result.addCapability capability diff --git a/tests/v1/test_rpc_waku.nim b/tests/v1/test_rpc_waku.nim index f31ac5a15..32c68e5a7 100644 --- a/tests/v1/test_rpc_waku.nim +++ b/tests/v1/test_rpc_waku.nim @@ -11,19 +11,21 @@ import const sigPath = sourceDir / ParDir / ParDir / "waku" / "node" / "v1" / "rpc" / "wakucallsigs.nim" createRpcSigs(RpcSocketClient, sigPath) -proc setupNode(capabilities: varargs[ProtocolInfo, `protocolInfo`]): EthereumNode = +proc setupNode(capabilities: varargs[ProtocolInfo, `protocolInfo`], + rng: ref BrHmacDrbgContext, ): EthereumNode = let - keypair = KeyPair.random()[] + keypair = KeyPair.random(rng[]) srvAddress = Address(ip: parseIpAddress("0.0.0.0"), tcpPort: Port(30303), udpPort: Port(30303)) result = newEthereumNode(keypair, srvAddress, 1, nil, "waku test rpc", - addAllCapabilities = false) + addAllCapabilities = false, rng = rng) for capability in capabilities: result.addCapability capability proc doTests {.async.} = - var ethNode = setupNode(Waku) + let rng = keys.newRng() + var ethNode = setupNode(Waku, rng) # Create Ethereum RPCs let rpcPort = 8545 @@ -31,7 +33,7 @@ proc doTests {.async.} = rpcServer = newRpcSocketServer(["localhost:" & $rpcPort]) client = newRpcSocketClient() let keys = newKeyStorage() - setupWakuRPC(ethNode, keys, rpcServer) + setupWakuRPC(ethNode, keys, rpcServer, rng) # Begin tests rpcServer.start() diff --git a/tests/v1/test_waku_bridge.nim b/tests/v1/test_waku_bridge.nim index 5b70427b5..d6b71bc8c 100644 --- a/tests/v1/test_waku_bridge.nim +++ b/tests/v1/test_waku_bridge.nim @@ -18,12 +18,13 @@ let safeTTL = 5'u32 let waitInterval = waku.messageInterval + 150.milliseconds procSuite "Waku - Whisper bridge tests": + let rng = newRng() # Waku Whisper node has both capabilities, listens to Whisper and Waku and # relays traffic between the two. var - nodeWakuWhisper = setupTestNode(Whisper, Waku) # This will be the bridge - nodeWhisper = setupTestNode(Whisper) - nodeWaku = setupTestNode(Waku) + nodeWakuWhisper = setupTestNode(rng, Whisper, Waku) # This will be the bridge + nodeWhisper = setupTestNode(rng, Whisper) + nodeWaku = setupTestNode(rng, Waku) nodeWakuWhisper.startListening() let bridgeNode = newNode(nodeWakuWhisper.toENode()) diff --git a/tests/v1/test_waku_connect.nim b/tests/v1/test_waku_connect.nim index ce88d4cfe..813e89326 100644 --- a/tests/v1/test_waku_connect.nim +++ b/tests/v1/test_waku_connect.nim @@ -33,13 +33,14 @@ proc eventually(timeout: Duration, condition: proc(): bool {.gcsafe.}): return await f return withTimeout(wrappedCondition(), timeout) -suite "Waku connections": +procSuite "Waku connections": + let rng = keys.newRng() asyncTest "Waku connections": var - n1 = setupTestNode(Waku) - n2 = setupTestNode(Waku) - n3 = setupTestNode(Waku) - n4 = setupTestNode(Waku) + n1 = setupTestNode(rng, Waku) + n2 = setupTestNode(rng, Waku) + n3 = setupTestNode(rng, Waku) + n4 = setupTestNode(rng, Waku) var topics: seq[Topic] n1.protocolState(Waku).config.topics = some(topics) @@ -60,13 +61,13 @@ suite "Waku connections": p3.isNil == false asyncTest "Filters with encryption and signing": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) - let encryptKeyPair = KeyPair.random()[] - let signKeyPair = KeyPair.random()[] + let encryptKeyPair = KeyPair.random(rng[]) + let signKeyPair = KeyPair.random(rng[]) var symKey: SymKey let topic = [byte 0x12, 0, 0, 0] var filters: seq[string] = @[] @@ -135,8 +136,8 @@ suite "Waku connections": check node1.unsubscribeFilter(filter) == true asyncTest "Filters with topics": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -168,8 +169,8 @@ suite "Waku connections": node1.unsubscribeFilter(filter2) == true asyncTest "Filters with PoW": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -199,8 +200,8 @@ suite "Waku connections": node1.unsubscribeFilter(filter2) == true asyncTest "Filters with queues": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -219,8 +220,8 @@ suite "Waku connections": node1.unsubscribeFilter(filter) == true asyncTest "Local filter notify": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -234,8 +235,8 @@ suite "Waku connections": node1.unsubscribeFilter(filter) == true asyncTest "Bloomfilter blocking": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -277,8 +278,8 @@ suite "Waku connections": await node1.setBloomFilter(fullBloom()) asyncTest "PoW blocking": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -304,8 +305,8 @@ suite "Waku connections": node1.protocolState(Waku).queue.items.len == 1 asyncTest "Queue pruning": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -327,8 +328,8 @@ suite "Waku connections": check node2.protocolState(Waku).queue.items.len == 0 asyncTest "P2P post": - var node1 = setupTestNode(Waku) - var node2 = setupTestNode(Waku) + var node1 = setupTestNode(rng, Waku) + var node2 = setupTestNode(rng, Waku) node2.startListening() waitFor node1.peerPool.connectToNode(newNode(node2.toENode())) @@ -358,9 +359,9 @@ suite "Waku connections": node1.unsubscribeFilter(filter) == true asyncTest "Light node posting": - var ln = setupTestNode(Waku) + var ln = setupTestNode(rng, Waku) await ln.setLightNode(true) - var fn = setupTestNode(Waku) + var fn = setupTestNode(rng, Waku) fn.startListening() await ln.peerPool.connectToNode(newNode(fn.toENode())) @@ -375,8 +376,8 @@ suite "Waku connections": # TODO: add test on message relaying asyncTest "Connect two light nodes": - var ln1 = setupTestNode(Waku) - var ln2 = setupTestNode(Waku) + var ln1 = setupTestNode(rng, Waku) + var ln2 = setupTestNode(rng, Waku) await ln1.setLightNode(true) await ln2.setLightNode(true) @@ -387,8 +388,8 @@ suite "Waku connections": asyncTest "Waku set-topic-interest": var - wakuTopicNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuTopicNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) let topic1 = [byte 0xDA, 0xDA, 0xDA, 0xAA] @@ -417,8 +418,8 @@ suite "Waku connections": asyncTest "Waku set-minimum-pow": var - wakuPowNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuPowNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) wakuNode.startListening() await wakuPowNode.peerPool.connectToNode(newNode(wakuNode.toENode())) @@ -437,8 +438,8 @@ suite "Waku connections": asyncTest "Waku set-light-node": var - wakuLightNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuLightNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) wakuNode.startListening() await wakuLightNode.peerPool.connectToNode(newNode(wakuNode.toENode())) @@ -457,8 +458,8 @@ suite "Waku connections": asyncTest "Waku set-bloom-filter": var - wakuBloomNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuBloomNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) bloom = fullBloom() topics = @[[byte 0xDA, 0xDA, 0xDA, 0xAA]] @@ -506,8 +507,8 @@ suite "Waku connections": asyncTest "Waku topic-interest": var - wakuTopicNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuTopicNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) let topic1 = [byte 0xDA, 0xDA, 0xDA, 0xAA] @@ -531,8 +532,8 @@ suite "Waku connections": asyncTest "Waku topic-interest versus bloom filter": var - wakuTopicNode = setupTestNode(Waku) - wakuNode = setupTestNode(Waku) + wakuTopicNode = setupTestNode(rng, Waku) + wakuNode = setupTestNode(rng, Waku) let topic1 = [byte 0xDA, 0xDA, 0xDA, 0xAA] diff --git a/tests/v1/test_waku_mail.nim b/tests/v1/test_waku_mail.nim index e9314c466..5e133bcfd 100644 --- a/tests/v1/test_waku_mail.nim +++ b/tests/v1/test_waku_mail.nim @@ -12,8 +12,9 @@ proc waitForConnected(node: EthereumNode) {.async.} = await sleepAsync(chronos.milliseconds(1)) procSuite "Waku Mail Client": - var client = setupTestNode(Waku) - var simpleServer = setupTestNode(Waku) + let rng = newRng() + var client = setupTestNode(rng, Waku) + var simpleServer = setupTestNode(rng, Waku) simpleServer.startListening() let simpleServerNode = newNode(simpleServer.toENode()) diff --git a/tests/v2/standard_setup.nim b/tests/v2/standard_setup.nim index 27971f813..79cfa276c 100644 --- a/tests/v2/standard_setup.nim +++ b/tests/v2/standard_setup.nim @@ -6,19 +6,20 @@ const import options, tables, chronicles, chronos, - libp2p/[switch, peer, peerinfo, connection, multiaddress, crypto/crypto], + libp2p/[switch, peerinfo, multiaddress, crypto/crypto], + libp2p/stream/connection, libp2p/transports/[transport, tcptransport], libp2p/muxers/[muxer, mplex/mplex, mplex/types], libp2p/protocols/[identify, secure/secure], libp2p/protocols/pubsub/[pubsub, gossipsub], - ../../waku/protocol/v2/waku_protocol + ../../waku/protocol/v2/waku_protocol2 import libp2p/protocols/secure/noise, libp2p/protocols/secure/secio export - switch, peer, peerinfo, connection, multiaddress, crypto + switch, peerinfo, connection, multiaddress, crypto type SecureProtocol* {.pure.} = enum @@ -28,6 +29,7 @@ type proc newStandardSwitch*(privKey = none(PrivateKey), address = MultiAddress.init("/ip4/127.0.0.1/tcp/0").tryGet(), triggerSelf = false, + gossip = false, secureManagers: openarray[SecureProtocol] = [ # NOTE below relates to Eth2 # TODO investigate why we're getting fewer peers on public testnets with noise @@ -36,13 +38,14 @@ proc newStandardSwitch*(privKey = none(PrivateKey), ], verifySignature = libp2p_pubsub_verify, sign = libp2p_pubsub_sign, - transportFlags: set[ServerFlags] = {}): Switch = + transportFlags: set[ServerFlags] = {}, + rng = newRng()): Switch = info "newStandardSwitch" proc createMplex(conn: Connection): Muxer = result = newMplex(conn) let - seckey = privKey.get(otherwise = PrivateKey.random(ECDSA).tryGet()) + seckey = privKey.get(otherwise = PrivateKey.random(ECDSA, rng[]).tryGet()) peerInfo = PeerInfo.init(seckey, [address]) mplexProvider = newMuxerProvider(createMplex, MplexCodec) transports = @[Transport(TcpTransport.init(transportFlags))] @@ -54,9 +57,9 @@ proc newStandardSwitch*(privKey = none(PrivateKey), for sec in secureManagers: case sec of SecureProtocol.Noise: - secureManagerInstances &= newNoise(seckey).Secure + secureManagerInstances &= newNoise(rng, seckey).Secure of SecureProtocol.Secio: - secureManagerInstances &= newSecio(seckey).Secure + secureManagerInstances &= newSecio(rng, seckey).Secure let pubSub = PubSub newPubSub(WakuSub, peerInfo, triggerSelf) diff --git a/tests/v2/test_waku.nim b/tests/v2/test_waku.nim index 59bfe5817..f0fc70b00 100644 --- a/tests/v2/test_waku.nim +++ b/tests/v2/test_waku.nim @@ -10,13 +10,12 @@ import unittest, options, tables, sets import chronos, chronicles import utils, - libp2p/[errors, - switch, - connection, - stream/bufferstream, - crypto/crypto, - protocols/pubsub/floodsub] -import ../../waku/protocol/v2/waku_protocol + libp2p/errors, + libp2p/switch, + libp2p/stream/[bufferstream, connection], + libp2p/crypto/crypto, + libp2p/protocols/pubsub/floodsub +import ../../waku/protocol/v2/waku_protocol2 const StreamTransportTrackerName = "stream.transport" @@ -71,7 +70,8 @@ suite "FloodSub": await nodes[1].subscribe("foobar", handler) await waitSub(nodes[0], nodes[1], "foobar") - await nodes[0].publish("foobar", cast[seq[byte]]("Hello!")) + # TODO: you might want to check the value here + discard await nodes[0].publish("foobar", cast[seq[byte]]("Hello!")) result = await completionFut.wait(5.seconds) diff --git a/vendor/nim-bearssl b/vendor/nim-bearssl index 68c6d2730..33b2303fc 160000 --- a/vendor/nim-bearssl +++ b/vendor/nim-bearssl @@ -1 +1 @@ -Subproject commit 68c6d27304245c948526487b37e10951acf7dbc8 +Subproject commit 33b2303fc3b64359970b77bb09274c3e012ff37f diff --git a/vendor/nim-chronos b/vendor/nim-chronos index 528688d01..ce6e7d17b 160000 --- a/vendor/nim-chronos +++ b/vendor/nim-chronos @@ -1 +1 @@ -Subproject commit 528688d01e8983763c51fbd9ccd0c797190fc0fe +Subproject commit ce6e7d17b11b33d5dd17123827dda43af553a7eb diff --git a/vendor/nim-eth b/vendor/nim-eth index 4f533eb5e..7f77ba230 160000 --- a/vendor/nim-eth +++ b/vendor/nim-eth @@ -1 +1 @@ -Subproject commit 4f533eb5e6d6248ee2c1e94a628d1bc77880da67 +Subproject commit 7f77ba230806c58f8cdff782559c8b133ae48f4e diff --git a/vendor/nim-libp2p b/vendor/nim-libp2p index 85b56d0b3..bec9a0658 160000 --- a/vendor/nim-libp2p +++ b/vendor/nim-libp2p @@ -1 +1 @@ -Subproject commit 85b56d0b3a53611feaddd9247dd55bb43dc27103 +Subproject commit bec9a0658f612bcaec518021717462fd5f509ba8 diff --git a/vendor/nim-secp256k1 b/vendor/nim-secp256k1 index be9896359..bf6cc94a3 160000 --- a/vendor/nim-secp256k1 +++ b/vendor/nim-secp256k1 @@ -1 +1 @@ -Subproject commit be989635994377e0e421e4a039230098ba5ccd28 +Subproject commit bf6cc94a3cbab16cf7ffadad11b50c52f161d0a8 diff --git a/vendor/nim-stew b/vendor/nim-stew index 61d5cfc37..32b86bfd1 160000 --- a/vendor/nim-stew +++ b/vendor/nim-stew @@ -1 +1 @@ -Subproject commit 61d5cfc37677f2b434d43c06d06695b00e56613b +Subproject commit 32b86bfd1ff97764e94447675559bf37a4ffb407 diff --git a/waku.nimble b/waku.nimble index 35280d1ef..8f3176ba8 100644 --- a/waku.nimble +++ b/waku.nimble @@ -37,9 +37,12 @@ proc test(name: string, lang = "c") = exec "build/" & name ### Tasks -task test, "Run tests": +task test, "Run waku v1 tests": test "all_tests" +task test2, "Run waku v2 tests": + test "all_tests_v2" + task wakunode, "Build Waku cli": buildBinary "wakunode", "waku/node/v1/", "-d:chronicles_log_level=TRACE" @@ -48,7 +51,7 @@ task wakusim, "Build Waku simulation tools": buildBinary "start_network", "waku/node/v1/", "-d:chronicles_log_level=DEBUG" task protocol2, "Build the experimental Waku protocol": - buildBinary "waku_protocol", "waku/protocol/v2/", "-d:chronicles_log_level=TRACE" + buildBinary "waku_protocol2", "waku/protocol/v2/", "-d:chronicles_log_level=TRACE" task wakutest2, "Build Experimental Waku tests": let name = "v2/test_waku" @@ -56,8 +59,8 @@ task wakutest2, "Build Experimental Waku tests": exec "build/" & name task wakunode2, "Build Experimental Waku cli": - buildBinary "wakunode", "waku/node/v2/", "-d:chronicles_log_level=TRACE" + buildBinary "wakunode2", "waku/node/v2/", "-d:chronicles_log_level=TRACE" task wakusim2, "Build Experimental Waku simulation tools": - buildBinary "quicksim", "waku/node/v2/", "-d:chronicles_log_level=DEBUG" - buildBinary "start_network", "waku/node/v2/", "-d:chronicles_log_level=TRACE" + buildBinary "quicksim2", "waku/node/v2/", "-d:chronicles_log_level=DEBUG" + buildBinary "start_network2", "waku/node/v2/", "-d:chronicles_log_level=TRACE" diff --git a/waku/node/v1/config.nim b/waku/node/v1/config.nim index d332ce11a..34ccf7847 100644 --- a/waku/node/v1/config.nim +++ b/waku/node/v1/config.nim @@ -93,7 +93,8 @@ type nodekey* {. desc: "P2P node private key as hex.", - defaultValue: KeyPair.random().tryGet() + # TODO: can the rng be passed in somehow via Load? + defaultValue: KeyPair.random(keys.newRng()[]) name: "nodekey" .}: KeyPair # TODO: Add nodekey file option diff --git a/waku/node/v1/rpc/waku.nim b/waku/node/v1/rpc/waku.nim index 34bb20a3b..de4d78fdb 100644 --- a/waku/node/v1/rpc/waku.nim +++ b/waku/node/v1/rpc/waku.nim @@ -9,7 +9,8 @@ from stew/byteutils import hexToSeqByte, hexToByteArray # Blatant copy of Whisper RPC but for the Waku protocol -proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = +proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer, + rng: ref BrHmacDrbgContext) = rpcsrv.rpc("waku_version") do() -> string: ## Returns string of the current Waku protocol version. @@ -70,8 +71,8 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = ## encryption. ## ## Returns key identifier on success and an error on failure. - result = generateRandomID().Identifier - keys.asymKeys.add(result.string, KeyPair.random().tryGet()) + result = generateRandomID(rng[]).Identifier + keys.asymKeys.add(result.string, KeyPair.random(rng[])) rpcsrv.rpc("waku_addPrivateKey") do(key: PrivateKey) -> Identifier: ## Stores the key pair, and returns its ID. @@ -79,7 +80,7 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = ## key: Private key as hex bytes. ## ## Returns key identifier on success and an error on failure. - result = generateRandomID().Identifier + result = generateRandomID(rng[]).Identifier keys.asymKeys.add(result.string, key.toKeyPair()) @@ -127,7 +128,7 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = ## known to both parties. ## ## Returns key identifier on success and an error on failure. - result = generateRandomID().Identifier + result = generateRandomID(rng[]).Identifier var key: SymKey if randomBytes(key) != key.len: raise newException(KeyGenerationError, "Failed generating key") @@ -141,7 +142,7 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = ## key: The raw key for symmetric encryption as hex bytes. ## ## Returns key identifier on success and an error on failure. - result = generateRandomID().Identifier + result = generateRandomID(rng[]).Identifier keys.symKeys.add(result.string, key) @@ -159,7 +160,7 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = if pbkdf2(ctx, password, "", 65356, symKey) != sizeof(SymKey): raise newException(KeyGenerationError, "Failed generating key") - result = generateRandomID().Identifier + result = generateRandomID(rng[]).Identifier keys.symKeys.add(result.string, symKey) rpcsrv.rpc("waku_hasSymKey") do(id: Identifier) -> bool: diff --git a/waku/node/v1/start_network.nim b/waku/node/v1/start_network.nim index ed57a82ef..c445ed4e4 100644 --- a/waku/node/v1/start_network.nim +++ b/waku/node/v1/start_network.nim @@ -45,7 +45,8 @@ proc initNodeCmd(nodeType: NodeType, shift: int, staticNodes: seq[string] = @[], discovery = false, bootNodes: seq[string] = @[], topicInterest = false, master = false, label: string): NodeInfo = let - keypair = KeyPair.random().tryGet() + rng = keys.newRng() + keypair = KeyPair.random(rng[]) address = Address(ip: parseIpAddress("127.0.0.1"), udpPort: (30303 + shift).Port, tcpPort: (30303 + shift).Port) enode = ENode(pubkey: keypair.pubkey, address: address) diff --git a/waku/node/v1/wakunode.nim b/waku/node/v1/wakunode.nim index 429420423..b1c1aa933 100644 --- a/waku/node/v1/wakunode.nim +++ b/waku/node/v1/wakunode.nim @@ -61,7 +61,7 @@ proc setupNat(conf: WakuNodeConf): tuple[ip: IpAddress, if extPorts.isSome: (result.tcpPort, result.udpPort) = extPorts.get() -proc run(config: WakuNodeConf) = +proc run(config: WakuNodeConf, rng: ref BrHmacDrbgContext) = let (ip, tcpPort, udpPort) = setupNat(config) address = Address(ip: ip, tcpPort: tcpPort, udpPort: udpPort) @@ -112,7 +112,7 @@ proc run(config: WakuNodeConf) = Port(config.rpcPort + config.portsShift)) var rpcServer = newRpcHttpServer([ta]) let keys = newKeyStorage() - setupWakuRPC(node, keys, rpcServer) + setupWakuRPC(node, keys, rpcServer, rng) setupWakuSimRPC(node, rpcServer) rpcServer.start() @@ -154,13 +154,15 @@ proc run(config: WakuNodeConf) = runForever() when isMainModule: - let conf = WakuNodeConf.load() + let + rng = keys.newRng() + conf = WakuNodeConf.load() if conf.logLevel != LogLevel.NONE: setLogLevel(conf.logLevel) case conf.cmd of genNodekey: - echo PrivateKey.random().expect("Enough randomness to generate a key") + echo PrivateKey.random(rng[]) of noCommand: - run(conf) + run(conf, rng) diff --git a/waku/node/v2/config.nim b/waku/node/v2/config.nim index b1df4d896..d9faad87a 100644 --- a/waku/node/v2/config.nim +++ b/waku/node/v2/config.nim @@ -88,7 +88,7 @@ type # NOTE: Signature is different here, we return PrivateKey and not KeyPair nodekey* {. desc: "P2P node private key as hex.", - defaultValue: PrivateKey.random(Secp256k1).tryGet() + defaultValue: PrivateKey.random(Secp256k1, keys.newRng()[]).tryGet() name: "nodekey" }: PrivateKey # TODO: Add nodekey file option diff --git a/waku/node/v2/quicksim.nim b/waku/node/v2/quicksim2.nim similarity index 100% rename from waku/node/v2/quicksim.nim rename to waku/node/v2/quicksim2.nim diff --git a/waku/node/v2/rpc/wakurpc.nim b/waku/node/v2/rpc/wakurpc.nim index 4551130a9..68c504dff 100644 --- a/waku/node/v2/rpc/wakurpc.nim +++ b/waku/node/v2/rpc/wakurpc.nim @@ -1,7 +1,7 @@ import json_rpc/rpcserver, options, eth/[common, rlp, keys, p2p], - ../../../protocol/v2/waku_protocol, + ../../../protocol/v2/waku_protocol2, nimcrypto/[sysrand, hmac, sha2], ../waku_types diff --git a/waku/node/v2/start_network.nim b/waku/node/v2/start_network2.nim similarity index 98% rename from waku/node/v2/start_network.nim rename to waku/node/v2/start_network2.nim index ca9cdf33a..7f0c09969 100644 --- a/waku/node/v2/start_network.nim +++ b/waku/node/v2/start_network2.nim @@ -10,7 +10,7 @@ import strutils except fromHex const defaults ="--log-level:TRACE --log-metrics --metrics-server --rpc" - wakuNodeBin = "build" / "wakunode" + wakuNodeBin = "build" / "wakunode2" metricsDir = "metrics" portOffset = 2 @@ -29,7 +29,8 @@ type # NOTE: Don't distinguish between node types here a la full node, light node etc proc initNodeCmd(shift: int, staticNodes: seq[string] = @[], master = false, label: string): NodeInfo = let - key = SkPrivateKey.random()[] #assumes ok + rng = crypto.newRng() + key = SkPrivateKey.random(rng[]) hkey = key.getBytes().toHex() rkey = SkPrivateKey.init(fromHex(hkey))[] #assumes ok privKey = PrivateKey(scheme: Secp256k1, skkey: rkey) diff --git a/waku/node/v2/wakunode.nim b/waku/node/v2/wakunode2.nim similarity index 99% rename from waku/node/v2/wakunode.nim rename to waku/node/v2/wakunode2.nim index 642ec463c..da20f9482 100644 --- a/waku/node/v2/wakunode.nim +++ b/waku/node/v2/wakunode2.nim @@ -8,7 +8,7 @@ import libp2p/protocols/protocol, libp2p/peerinfo, rpc/wakurpc, - ../../protocol/v2/waku_protocol, + ../../protocol/v2/waku_protocol2, # TODO: Pull out standard switch from tests ../../tests/v2/standard_setup, waku_types diff --git a/waku/protocol/v1/waku_mail.nim b/waku/protocol/v1/waku_mail.nim index 3c72082b3..aea073465 100644 --- a/waku/protocol/v1/waku_mail.nim +++ b/waku/protocol/v1/waku_mail.nim @@ -48,7 +48,7 @@ proc requestMail*(node: EthereumNode, peerId: NodeId, request: MailRequest, var writer = initRlpWriter() writer.append(request) let payload = writer.finish() - let data = encode(Payload(payload: payload, symKey: some(symKey))) + let data = encode(node.rng[], Payload(payload: payload, symKey: some(symKey))) if not data.isSome(): error "Encoding of payload failed" return result diff --git a/waku/protocol/v1/waku_protocol.nim b/waku/protocol/v1/waku_protocol.nim index f245b9a08..f96beef7e 100644 --- a/waku/protocol/v1/waku_protocol.nim +++ b/waku/protocol/v1/waku_protocol.nim @@ -486,8 +486,8 @@ proc postMessage*(node: EthereumNode, pubKey = none[PublicKey](), ## ## NOTE: This call allows a post without encryption. If encryption is ## mandatory it should be enforced a layer up - let payload = encode(Payload(payload: payload, src: src, dst: pubKey, - symKey: symKey, padding: padding)) + let payload = encode(node.rng[], Payload( + payload: payload, src: src, dst: pubKey, symKey: symKey, padding: padding)) if payload.isSome(): var env = Envelope(expiry:epochTime().uint32 + ttl, ttl: ttl, topic: topic, data: payload.get(), nonce: 0) @@ -539,7 +539,8 @@ proc subscribeFilter*(node: EthereumNode, filter: Filter, ## ## NOTE: This call allows for a filter without decryption. If encryption is ## mandatory it should be enforced a layer up. - return node.protocolState(Waku).filters.subscribeFilter(filter, handler) + return subscribeFilter( + node.rng[], node.protocolState(Waku).filters, filter, handler) proc unsubscribeFilter*(node: EthereumNode, filterId: string): bool = ## Remove a previously subscribed filter. diff --git a/waku/protocol/v2/waku_protocol.nim b/waku/protocol/v2/waku_protocol2.nim similarity index 95% rename from waku/protocol/v2/waku_protocol.nim rename to waku/protocol/v2/waku_protocol2.nim index 5d37f7637..bd9096c41 100644 --- a/waku/protocol/v2/waku_protocol.nim +++ b/waku/protocol/v2/waku_protocol2.nim @@ -10,7 +10,7 @@ import libp2p/protocols/pubsub/pubsub, libp2p/protocols/pubsub/floodsub, libp2p/protocols/pubsub/gossipsub, libp2p/protocols/pubsub/rpc/[messages], - libp2p/connection + libp2p/stream/connection import metrics @@ -119,13 +119,13 @@ method rpcHandler*(w: WakuSub, method publish*(w: WakuSub, topic: string, - data: seq[byte]) {.async.} = + data: seq[byte]): Future[int] {.async.} = debug "publish", topic=topic if w.gossip_enabled: - await procCall GossipSub(w).publish(topic, data) + return await procCall GossipSub(w).publish(topic, data) else: - await procCall FloodSub(w).publish(topic, data) + return await procCall FloodSub(w).publish(topic, data) method unsubscribe*(w: WakuSub, topics: seq[TopicPair]) {.async.} =