diff --git a/examples/cbindings/README.md b/examples/cbindings/README.md index e36f54f..7eb887a 100644 --- a/examples/cbindings/README.md +++ b/examples/cbindings/README.md @@ -45,8 +45,8 @@ make run_bob ```text --name= Identity name (default: user) --port= Waku port (default: random 50000-50200) ---cluster= Waku cluster ID (default: 42) ---shard= Waku shard ID (default: 2) +--cluster= Waku cluster ID (default: 2) +--shard= Waku shard ID (default: 1) --peer= Static peer multiaddr to connect to --help Show help ``` diff --git a/examples/cbindings/cbindings_chat_tui.c b/examples/cbindings/cbindings_chat_tui.c index 7ae722c..6424060 100644 --- a/examples/cbindings/cbindings_chat_tui.c +++ b/examples/cbindings/cbindings_chat_tui.c @@ -631,7 +631,7 @@ static void cleanup(void) { int main(int argc, char *argv[]) { const char *name = "user"; - int port = 0, cluster_id = 42, shard_id = 2; + int port = 0, cluster_id = 2, shard_id = 1; const char *peer = NULL; for (int i = 1; i < argc; i++) { @@ -644,8 +644,8 @@ int main(int argc, char *argv[]) { printf("Usage: %s [options]\n", argv[0]); printf(" --name= Your display name\n"); printf(" --port= Listen port (0 for random)\n"); - printf(" --cluster= Cluster ID (default: 42)\n"); - printf(" --shard= Shard ID (default: 2)\n"); + printf(" --cluster= Cluster ID (default: 2)\n"); + printf(" --shard= Shard ID (default: 1)\n"); printf(" --peer= Static peer multiaddr\n"); return 0; } diff --git a/src/chat/delivery/waku_client.nim b/src/chat/delivery/waku_client.nim index 70f59a2..4ecc099 100644 --- a/src/chat/delivery/waku_client.nim +++ b/src/chat/delivery/waku_client.nim @@ -2,7 +2,7 @@ import chronicles, chronos, confutils, - eth/p2p/discoveryv5/enr, + eth/p2p/discoveryv5/enr as eth_enr, libp2p/crypto/crypto, libp2p/peerid, std/random, @@ -10,6 +10,7 @@ import strformat, waku/[ common/logging, + common/enr as common_enr, node/peer_manager, waku_core, waku_node, @@ -40,6 +41,36 @@ const # Placeholder FilterContentTopic = ContentTopic("/chatsdk/test/proto") + ## Logos.dev Fleet ENRs + + # delivery-01.do-ams3.logos.dev.status.im - 16Uiu2HAmTUbnxLGT9JvV6mu9oPyDjqHK4Phs1VDJNUgESgNSkuby + LogosDevDelivery01DoAms3 = "enr:-MG4QNjpXNETi50MXYSQNZyzd7YVi5UDmy53GjC7i9y1rmuRWd_rGhizRXV4YKLrb8G_ezIrE1gVkiuY_GzFGk6lfikBgmlkgnY0gmlwhIpEeomKbXVsdGlhZGRyc4wACgSKRHqJBh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhA9w1_W3QN9zZw8FcFQT5XWJ7I_qBGXFCxeO5iOBgeWXkg3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # delivery-02.do-ams3.logos.dev.status.im - 16Uiu2HAmMK7PYygBtKUQ8EHp7EfaD3bCEsJrkFooK8RQ2PVpJprH + LogosDevDelivery02DoAms3 = "enr:-MG4QO7X4HJ8BfAkbSbtG4uDvX1t4HIjEMTbdh4aYR4EV00cMrpa1NYejjVIGD0SXJGqbrRs2YYf59Me9K92iyyi_X4BgmlkgnY0gmlwhK6KavSKbXVsdGlhZGRyc4wACgSuimr0Bh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhA4ChhnJvGLCZgYfCAn6zGi0_lump80dOnTXuwEdMqnveg3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # delivery-01.gc-us-central1-a.logos.dev.status.im - 16Uiu2HAm4S1JYkuzDKLKQvwgAhZKs9otxXqt8SCGtB4hoJP1S397 + LogosDevDelivery01GcUsCentral1a = "enr:-MG4QIiRL2QYsAMJuofnJ2ketbMf_vq448kZxa0DGzu_Wj8PW7YdeIFEJbEJapA2K-b_UMC-TdEaQ2LukC9ynyegRQ4BgmlkgnY0gmlwhIh3nFeKbXVsdGlhZGRyc4wACgSId5xXBh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhAoXPCAUveBrCoOScJxl_jdLrPu4xyzbCmwP_ovGsqNkGg3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # delivery-02.gc-us-central1-a.logos.dev.status.im - 16Uiu2HAm8Y9kgBNtjxvCnf1X6gnZJW5EGE4UwwCL3CCm55TwqBiH + LogosDevDelivery02GcUsCentral1a = "enr:-MG4QJ2n_Hkl0_ZaGxK4ye_lmXPCHi8qXISESIucQyrPd0oCOFXZf9ws5gjN3hovMw08GTJSAptX2q0GrrjQS9wOpb8BgmlkgnY0gmlwhCJ7yRmKbXVsdGlhZGRyc4wACgQie8kZBh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhAsLQ0aIXN3XPEkZiqfPGU8aQp-Q8Vx8GoEipJx-uf4Dig3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # delivery-01.ac-cn-hongkong-c.logos.dev.status.im - 16Uiu2HAm8YokiNun9BkeA1ZRmhLbtNUvcwRr64F69tYj9fkGyuEP + LogosDevDelivery01AcCnHongkongC = "enr:-MG4QFQc9ULfGsloUceZk2i1XiFDuZ4zDoMWIkfOrQQ2rlW_ZLIN7CAzw67W7oGSQ4-sJ3Ehat6-tKxJ3Vj428TlWyABgmlkgnY0gmlwhC_ygr2KbXVsdGlhZGRyc4wACgQv8oK9Bh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhAsL7yU6Z4_I47DAMN8zTlJxl1DF0GVeBtFXj8uQM5vpog3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # delivery-02.ac-cn-hongkong-c.logos.dev.status.im - 16Uiu2HAkvwhGHKNry6LACrB8TmEFoCJKEX29XR5dDUzk3UT3UNSE + LogosDevDelivery02AcCnHongkongC = "enr:-MG4QDnRm93660fPMd0MAwhYIYS1I6YzNI8lYGZP-IoDy6NYSsmgE-m4aIThWuiveMquo8uZz7f4-jpxjYM48kuZONgBgmlkgnY0gmlwhCtjZwqKbXVsdGlhZGRyc4wACgQrY2cKBh9A3gOCcnOTAAIIAAAAAQACAAMABAAFAAYAB4lzZWNwMjU2azGhAhaMkDdziqKJqwaxdMWwq9A21gF7Wp5eCfDA6VmJkccDg3RjcIJ2X4N1ZHCCIyiFd2FrdTIv" + + # Logos.dev fleet static peers + LogosDevStaticPeers* = @[ + LogosDevDelivery01DoAms3, + LogosDevDelivery02DoAms3, + LogosDevDelivery01GcUsCentral1a, + LogosDevDelivery02GcUsCentral1a, + LogosDevDelivery01AcCnHongkongC, + LogosDevDelivery02AcCnHongkongC, + ] + type QueueRef* = ref object queue*: AsyncQueue[ChatPayload] @@ -58,18 +89,18 @@ type cfg*: WakuConfig node*: WakuNode dispatchQueues: seq[QueueRef] - staticPeerList: seq[string] + staticPeerList: seq[RemotePeerInfo] proc DefaultConfig*(): WakuConfig = let nodeKey = crypto.PrivateKey.random(Secp256k1, crypto.newRng()[])[] - let clusterId = 42'u16 - let shardId = 2'u16 + let clusterId = 2'u16 + let shardId = 1'u16 var port: uint16 = 50000'u16 + uint16(rand(200)) result = WakuConfig(nodeKey: nodeKey, port: port, clusterId: clusterId, shardId: @[shardId], pubsubTopic: &"/waku/2/rs/{clusterId}/{shardId}", - staticPeers: @[]) + staticPeers: LogosDevStaticPeers) proc sendBytes*(client: WakuClient, contentTopic: string, @@ -116,19 +147,17 @@ proc buildWakuNode(cfg: WakuConfig): WakuNode = proc taskKeepAlive(client: WakuClient) {.async.} = while true: - for peerStr in client.staticPeerList: - let peer = parsePeerInfo(peerStr).get() - - debug "maintaining subscription", peer = peerStr + for peerInfo in client.staticPeerList: + debug "maintaining subscription", peerId = $peerInfo.peerId # First use filter-ping to check if we have an active subscription - let pingRes = await client.node.wakuFilterClient.ping(peer) + let pingRes = await client.node.wakuFilterClient.ping(peerInfo) if pingRes.isErr(): # No subscription found. Let's subscribe. warn "no subscription found. Sending subscribe request" # TODO: Use filter. Removing this stops relay from working so keeping for now let subscribeRes = await client.node.wakuFilterClient.subscribe( - peer, client.cfg.pubsubTopic, @[FilterContentTopic] + peerInfo, client.cfg.pubsubTopic, @[FilterContentTopic] ) if subscribeRes.isErr(): @@ -153,16 +182,12 @@ proc start*(client: WakuClient) {.async.} = client.node.peerManager.start() - let dnsDiscoveryUrl = "enrtree://AKHMR2NCDFW5GI7TQIET3Y4SOKAZPDOMIHQACRKNILMGUBER4XW6K@logos-chat.nodes.status.im" - let nameServer = parseIpAddress("1.1.1.1") - let discoveredPeers = await retrieveDynamicBootstrapNodes(dnsDiscoveryUrl, @[nameServer]) - if discoveredPeers.isOk: - info "Connecting to discovered peers" - let remotePeers = discoveredPeers.get() - info "Discovered and connecting to peers", peerCount = remotePeers.len - asyncSpawn client.node.connectToNodes(remotePeers) + # Connect to all configured static peers + if client.staticPeerList.len > 0: + info "Connecting to static peers", peerCount = client.staticPeerList.len + asyncSpawn client.node.connectToNodes(client.staticPeerList) else: - warn "Failed to find peers via DNS discovery", error = discoveredPeers.error + warn "No valid static peers configured" let subscription: SubscriptionEvent = (kind: PubsubSub, topic: client.cfg.pubsubTopic) @@ -185,8 +210,21 @@ proc start*(client: WakuClient) {.async.} = await allFutures(taskKeepAlive(client)) proc initWakuClient*(cfg: WakuConfig): WakuClient = + # Parse ENRs from static peers configuration + var peerInfos: seq[RemotePeerInfo] = @[] + for enrStr in cfg.staticPeers: + let enrRecord = eth_enr.Record.fromURI(enrStr).valueOr: + error "Failed to parse ENR in initWakuClient", enr = enrStr, err = error + continue + + let peerInfo = enrRecord.toRemotePeerInfo().valueOr: + error "Failed to convert ENR to PeerInfo in initWakuClient", enr = enrStr, err = error + continue + + peerInfos.add(peerInfo) + result = WakuClient(cfg: cfg, node: buildWakuNode(cfg), dispatchQueues: @[], - staticPeerList: cfg.staticPeers) + staticPeerList: peerInfos) proc addDispatchQueue*(client: var WakuClient, queue: QueueRef) = client.dispatchQueues.add(queue)