nwaku/waku/node/v2/start_network.nim

125 lines
3.8 KiB
Nim
Raw Normal View History

2020-05-19 05:00:03 +00:00
import
2020-05-27 04:07:11 +00:00
strformat, os, osproc, net, strformat, chronicles,
2020-05-19 05:00:03 +00:00
libp2p/multiaddress,
libp2p/crypto/crypto,
2020-05-20 05:34:43 +00:00
libp2p/crypto/secp,
2020-05-19 05:00:03 +00:00
libp2p/peerinfo
2020-05-20 05:34:43 +00:00
# Fix ambiguous call error
import strutils except fromHex
2020-05-20 06:21:17 +00:00
const
2020-06-02 03:18:21 +00:00
defaults ="--log-level:TRACE --log-metrics --metrics-server --rpc"
2020-05-20 06:21:17 +00:00
wakuNodeBin = "build" / "wakunode"
2020-05-21 04:28:57 +00:00
portOffset = 2
2020-05-20 06:21:17 +00:00
2020-05-19 05:00:03 +00:00
type
NodeInfo* = object
cmd: string
2020-05-21 04:28:57 +00:00
master: bool
2020-05-19 05:00:03 +00:00
address: string
2020-05-20 06:21:17 +00:00
shift: int
2020-05-19 05:00:03 +00:00
label: string
2020-05-27 05:37:27 +00:00
Topology = enum
Star,
FullMesh
2020-05-19 05:00:03 +00:00
2020-05-27 05:37:27 +00:00
# NOTE: Don't distinguish between node types here a la full node, light node etc
2020-05-21 04:28:57 +00:00
proc initNodeCmd(shift: int, staticNodes: seq[string] = @[], master = false, label: string): NodeInfo =
2020-05-19 05:00:03 +00:00
let
key = SkPrivateKey.random()[] #assumes ok
2020-05-20 05:34:43 +00:00
hkey = key.getBytes().toHex()
rkey = SkPrivateKey.init(fromHex(hkey))[] #assumes ok
2020-05-20 05:34:43 +00:00
privKey = PrivateKey(scheme: Secp256k1, skkey: rkey)
#privKey = PrivateKey.random(Secp256k1)
pubkey = privKey.getKey()[] #assumes ok
keys = KeyPair(seckey: privKey, pubkey: pubkey)
2020-05-19 05:00:03 +00:00
peerInfo = PeerInfo.init(privKey)
port = 60000 + shift
#DefaultAddr = "/ip4/127.0.0.1/tcp/55505"
address = "/ip4/127.0.0.1/tcp/" & $port
hostAddress = MultiAddress.init(address).tryGet()
2020-05-19 05:00:03 +00:00
info "Address", address
# TODO: Need to port shift
2020-05-19 05:00:03 +00:00
peerInfo.addrs.add(hostAddress)
2020-05-20 06:21:17 +00:00
let id = peerInfo.id
info "PeerInfo", id = id, addrs = peerInfo.addrs
let listenStr = $peerInfo.addrs[0] & "/p2p/" & id
result.cmd = wakuNodeBin & " " & defaults & " "
result.cmd &= "--nodekey:" & hkey & " "
result.cmd &= "--ports-shift:" & $shift & " "
if staticNodes.len > 0:
for staticNode in staticNodes:
result.cmd &= "--staticnode:" & staticNode & " "
result.shift = shift
result.label = label
2020-05-21 04:28:57 +00:00
result.master = master
2020-05-20 06:21:17 +00:00
result.address = listenStr
info "Node command created.", cmd=result.cmd, address = result.address
2020-05-19 05:00:03 +00:00
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"))
2020-05-19 05:00:03 +00:00
2020-05-27 05:37:27 +00:00
proc fullMeshNetwork(amount: int): seq[NodeInfo] =
debug "amount", amount
for i in 0..<amount:
var staticnodes: seq[string]
for item in result:
staticnodes.add(item.address)
2020-05-28 02:58:37 +00:00
result.add(initNodeCmd(portOffset + i, staticnodes, label = "full node"))
2020-05-27 05:37:27 +00:00
when isMainModule:
# TODO: WakuNetworkConf
var nodes: seq[NodeInfo]
2020-05-28 02:58:37 +00:00
let topology = FullMesh
# Scenario xx2 14
let amount = 16
2020-05-27 05:37:27 +00:00
case topology:
of Star:
nodes = starNetwork(amount)
of FullMesh:
nodes = fullMeshNetwork(amount)
var staticnodes: seq[string]
for i in 0..<amount:
# TODO: could also select nodes randomly
staticnodes.add(nodes[i].address)
# Scenario xx1 - 16 full nodes, one app topic, full mesh, gossip
# Scenario xx2 - 14 full nodes, two edge nodes, one app topic, full mesh, gossip
2020-06-02 03:18:55 +00:00
# NOTE: Only connecting to one node here
#var nodesubseta: seq[string]
#var nodesubsetb: seq[string]
#nodesubseta.add(staticnodes[0])
#nodesubsetb.add(staticnodes[amount-1])
## XXX: Let's turn them into normal nodes
#nodes.add(initNodeCmd(0, nodesubseta, label = "edge node (A)"))
#nodes.add(initNodeCmd(1, nodesubsetb, label = "edge node (B)"))
var commandStr = "multitail -s 2 -M 0 -x \"Waku Simulation\""
var count = 0
var sleepDuration = 0
for node in nodes:
if topology in {Star}: #DiscoveryBased
sleepDuration = if node.master: 0
else: 1
commandStr &= &" -cT ansi -t 'node #{count} {node.label}' -l 'sleep {sleepDuration}; {node.cmd}; echo [node execution completed]; while true; do sleep 100; done'"
if topology == FullMesh:
sleepDuration += 1
count += 1
let errorCode = execCmd(commandStr)
if errorCode != 0:
error "launch command failed", command=commandStr