diff --git a/libs/waku-utils/example/js-waku/initiator.nim b/libs/waku-utils/example/js-waku/initiator.nim index be95e7c..9cb5662 100644 --- a/libs/waku-utils/example/js-waku/initiator.nim +++ b/libs/waku-utils/example/js-waku/initiator.nim @@ -1,6 +1,4 @@ import - std/[tables, times, sequtils], - stew/shims/net, chronicles, chronos, confutils, @@ -16,14 +14,7 @@ import waku/common/[logging, protobuf] import ../../waku_handshake_utils - -const bootstrapNode = "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-I" & - "CAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0" & - "gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1z" & - "My5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0w" & - "MS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94D" & - "iXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPId" & - "sV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8" +import ../../waku_node const wakuPort = 60000 @@ -60,61 +51,9 @@ proc exampleJSWaku(rng: ref HmacDrbgContext) {.async.} = initiatorHS = initHS(initiatorInfo, qr, true) initiatorHSResult: HandshakeResult - # Setup the Waku node - let - nodeKey = crypto.PrivateKey.random(Secp256k1, rng[]).get() - ip = parseIpAddress("0.0.0.0") - flags = CapabilitiesBitfield.init(lightpush = false, filter = false, - store = false, relay = true) - - var enrBuilder = EnrBuilder.init(nodeKey) - - let recordRes = enrBuilder.build() - let record = - if recordRes.isErr(): - error "failed to create enr record", error = recordRes.error - quit(QuitFailure) - else: recordRes.get() - - var builder = WakuNodeBuilder.init() - builder.withNodeKey(nodeKey) - builder.withRecord(record) - builder.withNetworkConfigurationDetails(ip, Port(wakuPort)).tryGet() - let node = builder.build().tryGet() - - var bootstrapNodeEnr: enr.Record - discard bootstrapNodeEnr.fromURI(bootstrapNode) - - let discv5Conf = WakuDiscoveryV5Config(discv5Config: none(DiscoveryConfig), - address: ip, port: Port(discv5Port), - privateKey: keys.PrivateKey(nodeKey.skkey), - bootstrapRecords: @[bootstrapNodeEnr], - autoupdateRecord: true) - - # assumes behind a firewall, so not care about being discoverable - let wakuDiscv5 = WakuDiscoveryV5.new(node.rng, discv5Conf, some(node.enr), - some(node.peerManager), - node.topicSubscriptionQueue) - - await node.start() - await node.mountRelay() - node.peerManager.start() - - (await wakuDiscv5.start()).isOkOr: - error "failed to start discv5", error = error - quit(1) - - # Wait for a minimum of peers to be connected, otherwise messages wont be gossiped - while true: - let numConnectedPeers = node.peerManager.peerStore[ - ConnectionBook].book.values().countIt(it == Connected) - if numConnectedPeers >= requiredConnectedPeers: - notice "Node is ready", connectedPeers = numConnectedPeers, - required = requiredConnectedPeers - break - notice "Waiting for the node to be ready", - connectedPeers = numConnectedPeers, required = requiredConnectedPeers - await sleepAsync(5000) + # Start nwaku instance + let node = await startWakuNode(rng, wakuPort, discv5Port, + requiredConnectedPeers) # Perform the handshake initiatorHSResult = await initiatorHandshake(rng, node, pubSubTopic, diff --git a/libs/waku-utils/example/nwaku/agentA.nim b/libs/waku-utils/example/nwaku/agentA.nim index f86f4fa..c78f73e 100644 --- a/libs/waku-utils/example/nwaku/agentA.nim +++ b/libs/waku-utils/example/nwaku/agentA.nim @@ -1,12 +1,9 @@ import - std/[tables, times, sequtils], - stew/shims/net, chronicles, chronos, confutils, libp2p/crypto/crypto, - eth/[keys, p2p/discoveryv5/enr], - nimcrypto/utils + eth/[keys, p2p/discoveryv5/enr] import waku/[waku_core, waku_node, waku_enr, waku_discv5], @@ -16,15 +13,8 @@ import waku/common/[logging, protobuf] import ../../waku_handshake_utils +import ../../waku_node -const bootstrapNode = "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-I" & - "CAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0" & - "gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1z" & - "My5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0w" & - "MS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94D" & - "iXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPId" & - "sV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8" -# careful if running pub and sub in the same machine const wakuPort = 60000 discv5Port = 9000 @@ -59,61 +49,9 @@ proc exampleNwakuAgentA(rng: ref HmacDrbgContext) {.async.} = agentAHS = initHS(agentAInfo, qr, true) agentAHSResult: HandshakeResult - # Setup the Waku node - let - nodeKey = crypto.PrivateKey.random(Secp256k1, rng[]).get() - ip = parseIpAddress("0.0.0.0") - flags = CapabilitiesBitfield.init(lightpush = false, filter = false, - store = false, relay = true) - - var enrBuilder = EnrBuilder.init(nodeKey) - - let recordRes = enrBuilder.build() - let record = - if recordRes.isErr(): - error "failed to create enr record", error = recordRes.error - quit(QuitFailure) - else: recordRes.get() - - var builder = WakuNodeBuilder.init() - builder.withNodeKey(nodeKey) - builder.withRecord(record) - builder.withNetworkConfigurationDetails(ip, Port(wakuPort)).tryGet() - let node = builder.build().tryGet() - - var bootstrapNodeEnr: enr.Record - discard bootstrapNodeEnr.fromURI(bootstrapNode) - - let discv5Conf = WakuDiscoveryV5Config(discv5Config: none(DiscoveryConfig), - address: ip, port: Port(discv5Port), - privateKey: keys.PrivateKey(nodeKey.skkey), - bootstrapRecords: @[bootstrapNodeEnr], - autoupdateRecord: true) - - # assumes behind a firewall, so not care about being discoverable - let wakuDiscv5 = WakuDiscoveryV5.new(node.rng, discv5Conf, some(node.enr), - some(node.peerManager), - node.topicSubscriptionQueue) - - await node.start() - await node.mountRelay() - node.peerManager.start() - - (await wakuDiscv5.start()).isOkOr: - error "failed to start discv5", error = error - quit(1) - - # Wait for a minimum of peers to be connected, otherwise messages wont be gossiped - while true: - let numConnectedPeers = node.peerManager.peerStore[ - ConnectionBook].book.values().countIt(it == Connected) - if numConnectedPeers >= requiredConnectedPeers: - notice "Node is ready", connectedPeers = numConnectedPeers, - required = requiredConnectedPeers - break - notice "Waiting for the node to be ready", - connectedPeers = numConnectedPeers, required = requiredConnectedPeers - await sleepAsync(5000) + # Start nwaku instance + let node = await startWakuNode(rng, wakuPort, discv5Port, + requiredConnectedPeers) # Perform the handshake agentAHSResult = await initiatorHandshake(rng, node, pubSubTopic, contentTopic, diff --git a/libs/waku-utils/example/nwaku/agentB.nim b/libs/waku-utils/example/nwaku/agentB.nim index 4af86e0..600f83f 100644 --- a/libs/waku-utils/example/nwaku/agentB.nim +++ b/libs/waku-utils/example/nwaku/agentB.nim @@ -1,12 +1,10 @@ import - std/[tables, times, sequtils], stew/shims/net, chronicles, chronos, confutils, libp2p/crypto/crypto, - eth/[keys, p2p/discoveryv5/enr], - nimcrypto/utils + eth/[keys, p2p/discoveryv5/enr] import waku/[waku_core, waku_node, waku_enr, waku_discv5], @@ -16,14 +14,8 @@ import waku/common/[logging, protobuf] import ../../waku_handshake_utils +import ../../waku_node -const bootstrapNode = "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-I" & - "CAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0" & - "gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1z" & - "My5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0w" & - "MS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94D" & - "iXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPId" & - "sV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8" const wakuPort = 50000 discv5Port = 8000 @@ -68,68 +60,9 @@ proc exampleNwakuAgentB(rng: ref HmacDrbgContext) {.async.} = agentBMessageNametag: MessageNametag agentBHSResult: HandshakeResult - # Setup the Waku node - let - nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[] - ip = parseIpAddress("0.0.0.0") - flags = CapabilitiesBitfield.init(lightpush = false, filter = false, - store = false, relay = true) - - var enrBuilder = EnrBuilder.init(nodeKey) - - let recordRes = enrBuilder.build() - let record = - if recordRes.isErr(): - error "failed to create enr record", error = recordRes.error - quit(QuitFailure) - else: recordRes.get() - - var builder = WakuNodeBuilder.init() - builder.withNodeKey(nodeKey) - builder.withRecord(record) - builder.withNetworkConfigurationDetails(ip, Port(wakuPort)).tryGet() - let node = builder.build().tryGet() - - var bootstrapNodeEnr: enr.Record - discard bootstrapNodeEnr.fromURI(bootstrapNode) - - let discv5Conf = WakuDiscoveryV5Config( - discv5Config: none(DiscoveryConfig), - address: ip, - port: Port(discv5Port), - privateKey: keys.PrivateKey(nodeKey.skkey), - bootstrapRecords: @[bootstrapNodeEnr], - autoupdateRecord: true, - ) - - # assumes behind a firewall, so not care about being discoverable - let wakuDiscv5 = WakuDiscoveryV5.new( - node.rng, - discv5Conf, - some(node.enr), - some(node.peerManager), - node.topicSubscriptionQueue, - ) - - await node.start() - await node.mountRelay() - node.peerManager.start() - - (await wakuDiscv5.start()).isOkOr: - error "failed to start discv5", error = error - quit(1) - - # wait for a minimum of peers to be connected, otherwise messages wont be gossiped - while true: - let numConnectedPeers = node.peerManager.peerStore[ - ConnectionBook].book.values().countIt(it == Connected) - if numConnectedPeers >= requiredConnectedPeers: - notice "subscriber is ready", connectedPeers = numConnectedPeers, - required = requiredConnectedPeers - break - notice "waiting to be ready", connectedPeers = numConnectedPeers, - required = requiredConnectedPeers - await sleepAsync(5000) + # Start nwaku instance + let node = await startWakuNode(rng, wakuPort, discv5Port, + requiredConnectedPeers) # Make sure it matches the publisher. Use default value # see spec: https://rfc.vac.dev/spec/23/ diff --git a/libs/waku-utils/waku_node.nim b/libs/waku-utils/waku_node.nim new file mode 100644 index 0000000..ec2767d --- /dev/null +++ b/libs/waku-utils/waku_node.nim @@ -0,0 +1,80 @@ +import + std/[tables, sequtils], + stew/shims/net, + chronicles, + chronos, + confutils, + libp2p/crypto/crypto, + eth/[keys, p2p/discoveryv5/enr] + +import + waku/[waku_core, waku_node, waku_enr, waku_discv5], + waku/node/peer_manager, + waku/common/[logging, protobuf] + +proc startWakuNode*(rng: ref HmacDrbgContext, + wakuPort, discv5Port, requiredConnectedPeers: int + ):Future[WakuNode] {.async.} = + let + bootstrapNode = "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-I" & + "CAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0" & + "gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1z" & + "My5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0w" & + "MS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94D" & + "iXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPId" & + "sV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8" + nodeKey = crypto.PrivateKey.random(Secp256k1, rng[]).get() + ip = parseIpAddress("0.0.0.0") + flags = CapabilitiesBitfield.init(lightpush = false, filter = false, + store = false, relay = true) + + var enrBuilder = EnrBuilder.init(nodeKey) + + let recordRes = enrBuilder.build() + let record = + if recordRes.isErr(): + error "failed to create enr record", error = recordRes.error + quit(QuitFailure) + else: recordRes.get() + + var builder = WakuNodeBuilder.init() + builder.withNodeKey(nodeKey) + builder.withRecord(record) + builder.withNetworkConfigurationDetails(ip, Port(wakuPort)).tryGet() + let node = builder.build().tryGet() + + var bootstrapNodeEnr: enr.Record + discard bootstrapNodeEnr.fromURI(bootstrapNode) + + let discv5Conf = WakuDiscoveryV5Config(discv5Config: none(DiscoveryConfig), + address: ip, port: Port(discv5Port), + privateKey: keys.PrivateKey(nodeKey.skkey), + bootstrapRecords: @[bootstrapNodeEnr], + autoupdateRecord: true) + + # assumes behind a firewall, so not care about being discoverable + let wakuDiscv5 = WakuDiscoveryV5.new(node.rng, discv5Conf, some(node.enr), + some(node.peerManager), + node.topicSubscriptionQueue) + + await node.start() + await node.mountRelay() + node.peerManager.start() + + (await wakuDiscv5.start()).isOkOr: + error "failed to start discv5", error = error + quit(1) + + # Wait for a minimum of peers to be connected, otherwise messages wont be gossiped + while true: + let numConnectedPeers = node.peerManager.peerStore[ + ConnectionBook].book.values().countIt(it == Connected) + if numConnectedPeers >= requiredConnectedPeers: + notice "Node is ready", connectedPeers = numConnectedPeers, + required = requiredConnectedPeers + break + notice "Waiting for the node to be ready", + connectedPeers = numConnectedPeers, required = requiredConnectedPeers + await sleepAsync(5000) + + return node