import bearssl/rand, chronos, libp2p/crypto/[crypto, secp], libp2p/multiaddress, libp2pdht/discv5/[node, routing_table, spr], libp2pdht/discv5/crypto as dhtcrypto, libp2pdht/discv5/protocol as discv5_protocol, stew/shims/net export net proc localAddress*(port: int): Address = Address(ip: ValidIpAddress.init("127.0.0.1"), port: Port(port)) proc example*(T: type PrivateKey, rng: ref HmacDrbgContext): PrivateKey = PrivateKey.random(rng[]).expect("Valid rng for private key") proc example*(T: type NodeId, rng: ref HmacDrbgContext): NodeId = let privKey = PrivateKey.example(rng) pubKey = privKey.getPublicKey.expect("Valid private key for public key") pubKey.toNodeId().expect("Public key valid for node id") proc initDiscoveryNode*( rng: ref HmacDrbgContext, privKey: PrivateKey, address: Address, bootstrapRecords: openArray[SignedPeerRecord] = [], localEnrFields: openArray[(string, seq[byte])] = [], previousRecord = none[SignedPeerRecord]()): discv5_protocol.Protocol = # set bucketIpLimit to allow bucket split let config = DiscoveryConfig.init(100000, 100000, 5) let protocol = newProtocol( privKey, some(address.ip), some(address.port), some(address.port), bindPort = address.port, bootstrapRecords = bootstrapRecords, localEnrFields = localEnrFields, previousRecord = previousRecord, config = config, rng = rng) protocol.open() protocol proc nodeIdInNodes*(id: NodeId, nodes: openArray[Node]): bool = for n in nodes: if id == n.id: return true proc generateNode*(privKey: PrivateKey, port: int = 20302, ip: ValidIpAddress = ValidIpAddress.init("127.0.0.1")): Node = let port = Port(port) spr = SignedPeerRecord.init(1, privKey, some(ip), some(port), some(port)) .expect("Properly intialized private key") result = newNode(spr).expect("Properly initialized node") proc generateNRandomNodes*(rng: ref HmacDrbgContext, n: int): seq[Node] = var res = newSeq[Node]() for i in 1..n: let privKey = PrivateKey.example(rng) node = privKey.generateNode() res.add(node) res proc nodeAndPrivKeyAtDistance*(n: Node, rng: var HmacDrbgContext, d: uint32, ip: ValidIpAddress = ValidIpAddress.init("127.0.0.1")): (Node, PrivateKey) = while true: let privKey = PrivateKey.random(rng).expect("Valid rng for private key") node = privKey.generateNode(ip = ip) if logDistance(n.id, node.id) == d: return (node, privKey) proc nodeAtDistance*(n: Node, rng: var HmacDrbgContext, d: uint32, ip: ValidIpAddress = ValidIpAddress.init("127.0.0.1")): Node = let (node, _) = n.nodeAndPrivKeyAtDistance(rng, d, ip) node proc nodesAtDistance*( n: Node, rng: var HmacDrbgContext, d: uint32, amount: int, ip: ValidIpAddress = ValidIpAddress.init("127.0.0.1")): seq[Node] = for i in 0..