discv5 stage1 testnet (#863)

This commit is contained in:
Daniel Kaiser 2022-03-01 17:12:23 +01:00 committed by GitHub
parent dbe76d29ce
commit 2972a50035
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 86 additions and 7 deletions

View File

@ -99,3 +99,4 @@ task chat2bridge, "Build chat2-matterbridge":
let name = "chat2bridge"
buildBinary name, "examples/v2/matterbridge/", "-d:chronicles_log_level=DEBUG"

View File

@ -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..<amount:
# result.add(initNodeCmd(portOffset + i, @[masterNode.address], label = "full node"))
# Scenarios using discv5
proc starNetwork(amount: int): seq[NodeInfo] =
let masterNode = initNodeCmd(portOffset, master = true, label = "master node")
let bootstrapEnrList = @[masterNode.enrUri]
result.add(masterNode)
for i in 1..<amount:
result.add(initNodeCmd(portOffset + i, @[masterNode.address], label = "full node"))
result.add(initNodeCmd(portOffset + i, label = "full node", discv5BootStrapEnrs = bootstrapEnrList)) # no waku bootstrap nodes; get bootstrap waku nodes via discv5
# Scenarios using discv5
proc bootstrapFleetNetwork(amount: int, numFleetNodes: int): seq[NodeInfo] =
debug "number of fleet nodes", numFleetNodes
debug "number of satellite nodes", amount
var bootstrapEnrList: seq[string] = @[] # bootstrap for discv5
var bootstrapNodeList: seq[string] = @[] # bootstrap for waku relay
for i in 0..<numFleetNodes:
for fleetNode in result:
bootstrapEnrList.add(fleetNode.enrUri)
bootstrapNodeList.add(fleetNode.address)
result.add(initNodeCmd(portOffset + i, staticNodes = bootstrapNodeList, label = "fleet node", discv5BootStrapEnrs = bootstrapEnrList))
for i in 0..<amount:
result.add(initNodeCmd(portOffset + numFleetNodes + i, label = "full node", discv5BootStrapEnrs = bootstrapEnrList)) # no waku bootstrap nodes; get bootstrap waku nodes via discv5
# Scenarios without discv5
proc fullMeshNetwork(amount: int): seq[NodeInfo] =
debug "amount", amount
for i in 0..<amount:
@ -144,6 +215,9 @@ proc proccessGrafanaDashboard(nodes: int, inputFile: string,
outputData["title"] = %* (outputData["title"].getStr() & " (all nodes)")
writeFile(outputFile, pretty(outputData))
when isMainModule:
let conf = WakuNetworkConf.load()
@ -153,12 +227,15 @@ when isMainModule:
# Scenario xx2 14
let amount = conf.amount
let numFleetNodes = conf.numFleetNodes
case topology:
of Star:
nodes = starNetwork(amount)
of FullMesh:
nodes = fullMeshNetwork(amount)
of BootstrapFleet:
nodes = bootstrapFleetNetwork(amount, numFleetNodes)
# var staticnodes: seq[string]
# for i in 0..<amount:
@ -189,6 +266,7 @@ when isMainModule:
sleepDuration += 1
count += 1
generatePrometheusConfig(nodes, metricsDir / "prometheus" / "prometheus.yml")
proccessGrafanaDashboard(nodes.len,
metricsDir / "waku-grafana-dashboard.json",