From 2972a5003568848164033da3fe0d7f52a3d54824 Mon Sep 17 00:00:00 2001 From: Daniel Kaiser Date: Tue, 1 Mar 2022 17:12:23 +0100 Subject: [PATCH] discv5 stage1 testnet (#863) --- waku.nimble | 1 + waku/v2/node/start_network2.nim | 92 ++++++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/waku.nimble b/waku.nimble index 26ee46f07..c526f8426 100644 --- a/waku.nimble +++ b/waku.nimble @@ -99,3 +99,4 @@ task chat2bridge, "Build chat2-matterbridge": let name = "chat2bridge" buildBinary name, "examples/v2/matterbridge/", "-d:chronicles_log_level=DEBUG" + diff --git a/waku/v2/node/start_network2.nim b/waku/v2/node/start_network2.nim index a514537ba..9958cd29f 100644 --- a/waku/v2/node/start_network2.nim +++ b/waku/v2/node/start_network2.nim @@ -1,5 +1,8 @@ import strformat, os, osproc, net, strformat, chronicles, confutils, json, + eth/p2p/discoveryv5/enr, + eth/keys, + stew/shims/net as stewNet, libp2p/multiaddress, libp2p/crypto/crypto, libp2p/crypto/secp, @@ -9,10 +12,14 @@ import import strutils except fromHex const - defaults ="--log-level:TRACE --metrics-logging --metrics-server --rpc" + # Scenarios without discv5 + # defaults ="--log-level:TRACE --metrics-logging --metrics-server --rpc" + # # Scenarios using discv5 + defaults ="--log-level:TRACE --metrics-logging --metrics-server --rpc --discv5-discovery --discv5-table-ip-limit=1024 --discv5-bucket-ip-limit=16 --discv5-bits-per-hop=1" wakuNodeBin = "build" / "wakunode2" metricsDir = "metrics" portOffset = 2 + discv5ExtIpAddr = "127.0.0.1" # Scenarios using discv5 type NodeInfo* = object @@ -21,11 +28,13 @@ type address: string shift: int label: string + enrUri: string # Scenarios using discv5 Topology = enum Star, - FullMesh - + FullMesh, + BootstrapFleet # comprising one full-mesh core (fleet) and satellites (full nodes) using the fleet as bootstrap nodes + WakuNetworkConf* = object topology* {. desc: "Set the network topology." @@ -37,19 +46,32 @@ type defaultValue: 16 name: "amount" .}: int + numFleetNodes* {. + desc: "Number of Fleetnodes." + defaultValue: 3 + name: "numFleetNodes" .}: int + + +proc debugPrintEnrURI(enrUri: string) = + var r: Record + if not fromURI(r, enrUri): + echo "could not read ENR URI" + echo "ENR content: ", r + # 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 = +proc initNodeCmd(shift: int, staticNodes: seq[string] = @[], master = false, label: string, discv5BootStrapEnrs: seq[string] = @[]): NodeInfo = let rng = crypto.newRng() key = SkPrivateKey.random(rng[]) hkey = key.getBytes().toHex() rkey = SkPrivateKey.init(fromHex(hkey))[] #assumes ok - privKey = PrivateKey(scheme: Secp256k1, skkey: rkey) + privKey = crypto.PrivateKey(scheme: Secp256k1, skkey: rkey) #privKey = PrivateKey.random(Secp256k1) pubkey = privKey.getPublicKey()[] #assumes ok - keys = KeyPair(seckey: privKey, pubkey: pubkey) + keyPair = crypto.KeyPair(seckey: privKey, pubkey: pubkey) peerInfo = PeerInfo.new(privKey) port = 60000 + shift + discv5Port = 9000 + shift #DefaultAddr = "/ip4/127.0.0.1/tcp/55505" address = "/ip4/127.0.0.1/tcp/" & $port hostAddress = MultiAddress.init(address).tryGet() @@ -68,19 +90,68 @@ proc initNodeCmd(shift: int, staticNodes: seq[string] = @[], master = false, lab if staticNodes.len > 0: for staticNode in staticNodes: result.cmd &= "--staticnode:" & staticNode & " " + + # Scenarios using discv5 + result.cmd &= "--nat:extip:" & discv5ExtIpAddr & " " + if discv5BootStrapEnrs.len > 0: + for enr in discv5BootStrapEnrs: + result.cmd &= "--discv5-bootstrap-node:" & enr & " " + result.shift = shift result.label = label result.master = master result.address = listenStr + # Scenarios using discv5 + # We have to manually build the ENR which the node ran with the currently build node command will generate, + # because we need to know it before the node starts in order to be able to provide it as bootstrap information. + # Note: the ENR built here is not exactly the same as we don't integrate the waku2 key in this test scenario. + let enr = enr.Record.init(1, + keys.PrivateKey.fromHex(hkey).expect("could not convert priv key from hex"), + some(stewNet.ValidIpAddress.init(discv5ExtIpAddr)), + some(Port(discv5Port)), # tcp-port + some(Port(discv5Port))) # udp-port + .expect("Record within size limits") + result.enrUri = "enr:" & enr.toBase64 + info "Node command created.", cmd=result.cmd, address = result.address + +# # Scenarios without discv5 +# proc starNetwork(amount: int): seq[NodeInfo] = +# let masterNode = initNodeCmd(portOffset, master = true, label = "master node") +# result.add(masterNode) +# for i in 1..