Refactor fuzzing: pass relay address, allow to enable debug logs

This commit is contained in:
folex 2022-04-04 18:02:44 +04:00
parent 6e320d081d
commit b040f692ce
5 changed files with 183 additions and 295 deletions

View File

@ -1,60 +1,72 @@
import "@fluencelabs/aqua-lib/builtin.aqua"
-- per-node timeout to decide if it's down
const TIMEOUT = 2000
-- simple timestamp getter for kademlia neigborhodd which is max size 20
func ts_getter() -> []u64:
-- simple timestamp getter for kademlia neigborhood which is max size 20
func collect_timestamps_from_neighborhood() -> []u64, []PeerId:
timestamps: *u64
statuses: *string
dead_peers: *PeerId
-- on this peer
on HOST_PEER_ID:
-- convert peer id to b58
k <- Op.string_to_b58(HOST_PEER_ID)
-- get all neighbors
nodes <- Kademlia.neighborhood(k, nil, nil)
res: *u64
-- for each neighbor
for n <- nodes par:
status: *string
-- on selected neighbor peer
on n:
-- get the timestamp from that node
res <- Peer.timestamp_ms()
-- hot fix to force switching to peer
Op.noop()
-- join the results, which is tricky rght now since we can't use array len
-- the testnet size n is 10 so n -1
join res[9]
<- res
timestamps <- Peer.timestamp_ms()
status <<- "ok"
-- run timeout task in parallel, so if node `n` is down, we'll get `timed out` status
-- this pattern is documented: https://doc.fluence.dev/aqua-book/language/flow/parallel#timeout-and-race-patterns
par status <- Peer.timeout(TIMEOUT, "timed out")
statuses <<- status!
if status! != "ok":
dead_peers <<- n
-- wait for all nodes to respond or timeout
length <- Op.array_length(nodes)
join statuses[length - 1]
<- timestamps, dead_peers
-- timestamp getter with error collector over neighborhood
func ts_getter_with_timeout()-> []u64, []string:
-- timeout in ms
rtt = 1000
res: *u64
-- -- timestamp getter with error collector over neighborhood
-- func ts_getter_with_timeout()-> []u64, []string:
-- -- timeout in ms
-- rtt = 1000
-- error value for no timestamp
err_value = 0
-- res: *u64
-- neighborhood n = 20 decr by 1 for array
n_neighborhood = 19
-- -- error value for no timestamp
-- err_value = 0
-- err message
msg = "timeout"
-- -- neighborhood n = 20 decr by 1 for array
-- n_neighborhood = 19
-- collect non-responsive peer ids, if any
dead_peers: *string
on HOST_PEER_ID:
k <- Op.string_to_b58(HOST_PEER_ID)
nodes <- Kademlia.neighborhood(k, nil, nil)
for n <- nodes par:
status: *string
on n:
res <- Peer.timestamp_ms()
status <<- "success"
par status <- Peer.timeout(rtt, msg)
if status! != "success":
res <<- err_value
dead_peers <<- n
Op.noop()
-- -- err message
-- msg = "timeout"
join res[n_neighborhood]
<- res, dead_peers
-- -- collect non-responsive peer ids, if any
-- dead_peers: *string
-- on HOST_PEER_ID:
-- k <- Op.string_to_b58(HOST_PEER_ID)
-- nodes <- Kademlia.neighborhood(k, nil, nil)
-- for n <- nodes par:
-- status: *string
-- on n:
-- res <- Peer.timestamp_ms()
-- status <<- "success"
-- par status <- Peer.timeout(rtt, msg)
-- if status! != "success":
-- res <<- err_value
-- dead_peers <<- n
-- Op.noop()
-- join res[n_neighborhood]
-- <- res, dead_peers

View File

@ -9,14 +9,12 @@
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@fluencelabs/aqua-lib": "^0.4.3",
"@fluencelabs/fluence": "0.21.6",
"@fluencelabs/fluence": "^0.21.7",
"@fluencelabs/fluence-network-environment": "1.0.13",
"it-all": "^1.0.6",
"ts-node": "^10.7.0"
"it-all": "^1.0.6"
},
"devDependencies": {
"@fluencelabs/aqua": "^0.7.0-285",
"@fluencelabs/aqua": "0.7.1-293",
"@fluencelabs/aqua-lib": "^0.4.3",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
@ -101,14 +99,14 @@
}
},
"node_modules/@fluencelabs/aqua": {
"version": "0.7.0-287",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.7.0-287.tgz",
"integrity": "sha512-mshgECE6u01MbTU3vZfDdoJn+ZBm3uuvjzRf5xhvytzq4B9v4I2pap/wrpnYezApXEdbgMkhYi8Sp1PHlRz0bg==",
"version": "0.7.1-293",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.7.1-293.tgz",
"integrity": "sha512-D29meiuZrJBq076kCE8UbMq9PPHcLFctsgfRSENEgybfyw4MbgEPQZorHHHOrbDfckmBvAZB7+5oUNTIgiiwEw==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-ipfs": "0.5.2",
"@fluencelabs/aqua-lib": "0.4.0",
"@fluencelabs/fluence": "0.21.5",
"@fluencelabs/fluence": "0.21.7",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -144,40 +142,6 @@
"integrity": "sha512-bad282cCZrE//I+Hzsl/vWgudwXuNiaqJOonv11xkgOBBvL7Gg3SIap8HioNvkaDxIvylVB+POjYJ7E5sGNoVQ==",
"dev": true
},
"node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.5.tgz",
"integrity": "sha512-Zldn2I09ENp+F4MDYxsIMkJQOIQyfpiYmcAmVl60yTdKls78GmmnSyvAI+dZxUcNrhPqscnrtaENJoKwGwgm+Q==",
"dev": true,
"dependencies": {
"@chainsafe/libp2p-noise": "^4.1.1",
"@fluencelabs/avm": "^0.21.3",
"@fluencelabs/avm-runner-background": "0.2.0",
"@fluencelabs/avm-runner-interface": "^0.2.0",
"@fluencelabs/marine-js": "0.1.0",
"async": "3.2.0",
"browser-or-node": "^2.0.0",
"bs58": "4.0.1",
"buffer": "^6.0.3",
"cids": "0.8.1",
"it-length-prefixed": "3.0.1",
"it-pipe": "1.1.0",
"libp2p": "=0.33.0",
"libp2p-crypto": "=0.20.0",
"libp2p-mplex": "=0.10.2",
"libp2p-websockets": "^0.16.2",
"loglevel": "1.7.0",
"multiaddr": "^10.0.1",
"multiformats": "^9.6.4",
"peer-id": "=0.15.4",
"rxjs": "^7.3.0",
"ts-pattern": "^3.3.3",
"uuid": "8.3.0"
},
"bin": {
"copy-avm-public": "dist/tools/copyAvmPublic.js"
}
},
"node_modules/@fluencelabs/avm": {
"version": "0.21.7",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.21.7.tgz",
@ -205,9 +169,9 @@
"integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ=="
},
"node_modules/@fluencelabs/fluence": {
"version": "0.21.6",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.6.tgz",
"integrity": "sha512-g0nbg6IeBdivcU7jutb3M6UdNrUvVX4IIQKsZ80y6yzVqeWTqHbYsb+6q0zzv12q4OllpO4lcUWKUbUQyl4QMg==",
"version": "0.21.7",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.7.tgz",
"integrity": "sha512-ry7sAaWDaMT0tuy4IZ0kaEY5mzuflEV3lPj8c/xkvZmvuf9fVfJdVr+v63yr1Qb/XuA8QHor64BP10/a8aa3Dw==",
"dependencies": {
"@chainsafe/libp2p-noise": "^4.1.1",
"@fluencelabs/avm": "^0.21.3",
@ -215,7 +179,6 @@
"@fluencelabs/avm-runner-interface": "^0.2.0",
"@fluencelabs/marine-js": "0.1.0",
"async": "3.2.0",
"browser-or-node": "^2.0.0",
"bs58": "4.0.1",
"buffer": "^6.0.3",
"cids": "0.8.1",
@ -229,6 +192,7 @@
"multiaddr": "^10.0.1",
"multiformats": "^9.6.4",
"peer-id": "=0.15.4",
"platform": "^1.3.6",
"rxjs": "^7.3.0",
"ts-pattern": "^3.3.3",
"uuid": "8.3.0"
@ -3726,6 +3690,11 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"node_modules/platform": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
"integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
},
"node_modules/private-ip": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.3.3.tgz",
@ -4410,14 +4379,14 @@
}
},
"@fluencelabs/aqua": {
"version": "0.7.0-287",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.7.0-287.tgz",
"integrity": "sha512-mshgECE6u01MbTU3vZfDdoJn+ZBm3uuvjzRf5xhvytzq4B9v4I2pap/wrpnYezApXEdbgMkhYi8Sp1PHlRz0bg==",
"version": "0.7.1-293",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.7.1-293.tgz",
"integrity": "sha512-D29meiuZrJBq076kCE8UbMq9PPHcLFctsgfRSENEgybfyw4MbgEPQZorHHHOrbDfckmBvAZB7+5oUNTIgiiwEw==",
"dev": true,
"requires": {
"@fluencelabs/aqua-ipfs": "0.5.2",
"@fluencelabs/aqua-lib": "0.4.0",
"@fluencelabs/fluence": "0.21.5",
"@fluencelabs/fluence": "0.21.7",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -4427,37 +4396,6 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.4.0.tgz",
"integrity": "sha512-bad282cCZrE//I+Hzsl/vWgudwXuNiaqJOonv11xkgOBBvL7Gg3SIap8HioNvkaDxIvylVB+POjYJ7E5sGNoVQ==",
"dev": true
},
"@fluencelabs/fluence": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.5.tgz",
"integrity": "sha512-Zldn2I09ENp+F4MDYxsIMkJQOIQyfpiYmcAmVl60yTdKls78GmmnSyvAI+dZxUcNrhPqscnrtaENJoKwGwgm+Q==",
"dev": true,
"requires": {
"@chainsafe/libp2p-noise": "^4.1.1",
"@fluencelabs/avm": "^0.21.3",
"@fluencelabs/avm-runner-background": "0.2.0",
"@fluencelabs/avm-runner-interface": "^0.2.0",
"@fluencelabs/marine-js": "0.1.0",
"async": "3.2.0",
"browser-or-node": "^2.0.0",
"bs58": "4.0.1",
"buffer": "^6.0.3",
"cids": "0.8.1",
"it-length-prefixed": "3.0.1",
"it-pipe": "1.1.0",
"libp2p": "=0.33.0",
"libp2p-crypto": "=0.20.0",
"libp2p-mplex": "=0.10.2",
"libp2p-websockets": "^0.16.2",
"loglevel": "1.7.0",
"multiaddr": "^10.0.1",
"multiformats": "^9.6.4",
"peer-id": "=0.15.4",
"rxjs": "^7.3.0",
"ts-pattern": "^3.3.3",
"uuid": "8.3.0"
}
}
}
},
@ -4505,9 +4443,9 @@
"integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ=="
},
"@fluencelabs/fluence": {
"version": "0.21.6",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.6.tgz",
"integrity": "sha512-g0nbg6IeBdivcU7jutb3M6UdNrUvVX4IIQKsZ80y6yzVqeWTqHbYsb+6q0zzv12q4OllpO4lcUWKUbUQyl4QMg==",
"version": "0.21.7",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.21.7.tgz",
"integrity": "sha512-ry7sAaWDaMT0tuy4IZ0kaEY5mzuflEV3lPj8c/xkvZmvuf9fVfJdVr+v63yr1Qb/XuA8QHor64BP10/a8aa3Dw==",
"requires": {
"@chainsafe/libp2p-noise": "^4.1.1",
"@fluencelabs/avm": "^0.21.3",
@ -4515,7 +4453,6 @@
"@fluencelabs/avm-runner-interface": "^0.2.0",
"@fluencelabs/marine-js": "0.1.0",
"async": "3.2.0",
"browser-or-node": "^2.0.0",
"bs58": "4.0.1",
"buffer": "^6.0.3",
"cids": "0.8.1",
@ -4529,6 +4466,7 @@
"multiaddr": "^10.0.1",
"multiformats": "^9.6.4",
"peer-id": "=0.15.4",
"platform": "^1.3.6",
"rxjs": "^7.3.0",
"ts-pattern": "^3.3.3",
"uuid": "8.3.0"
@ -7468,6 +7406,11 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"platform": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
"integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
},
"private-ip": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.3.3.tgz",

View File

@ -13,11 +13,9 @@
"package-lock.json"
],
"dependencies": {
"@fluencelabs/aqua-lib": "^0.4.3",
"@fluencelabs/fluence": "0.21.6",
"@fluencelabs/fluence": "^0.21.7",
"@fluencelabs/fluence-network-environment": "1.0.13",
"it-all": "^1.0.6",
"ts-node": "^10.7.0"
"it-all": "^1.0.6"
},
"scripts": {
"start": "node -r ts-node/register src/index.ts",
@ -34,7 +32,7 @@
"url": "git+https://github.com/fluencelabs/examples/issues"
},
"devDependencies": {
"@fluencelabs/aqua": "^0.7.0-285",
"@fluencelabs/aqua": "0.7.1-293",
"@fluencelabs/aqua-lib": "^0.4.3",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"

View File

@ -3,7 +3,7 @@
* This file is auto-generated. Do not edit manually: changes may be erased.
* Generated by Aqua compiler: https://github.com/fluencelabs/aqua/.
* If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues
* Aqua version: 0.6.0-272
* Aqua version: 0.7.1-293
*
*/
import { Fluence, FluencePeer } from '@fluencelabs/fluence';
@ -11,68 +11,100 @@ import {
CallParams,
callFunction,
registerService,
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v2';
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v3';
// Services
// Functions
export function ts_getter(
export type Collect_timestamps_from_neighborhoodResult = [number[], string[]]
export function collect_timestamps_from_neighborhood(
config?: {ttl?: number}
): Promise<number[]>;
): Promise<Collect_timestamps_from_neighborhoodResult>;
export function ts_getter(
export function collect_timestamps_from_neighborhood(
peer: FluencePeer,
config?: {ttl?: number}
): Promise<number[]>;
): Promise<Collect_timestamps_from_neighborhoodResult>;
export function ts_getter(...args: any) {
export function collect_timestamps_from_neighborhood(...args: any) {
let script = `
(xor
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(new $res
(seq
(xor
(seq
(new $statuses
(new $timestamps
(seq
(new $dead_peers
(seq
(seq
(call -relay- ("op" "string_to_b58") [-relay-] k)
(call -relay- ("kad" "neighborhood") [k [] []] nodes)
)
(par
(fold nodes n
(par
(xor
(seq
(seq
(seq
(xor
(call n ("peer" "timestamp_ms") [] $res)
(seq
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
(call -relay- ("op" "string_to_b58") [-relay-] k)
(call -relay- ("kad" "neighborhood") [k [] []] nodes)
)
(par
(fold nodes n
(par
(new $status
(seq
(seq
(seq
(par
(xor
(seq
(call n ("peer" "timestamp_ms") [] $timestamps)
(ap "ok" $status)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
(call -relay- ("peer" "timeout") [2000 "timed out"] $status)
)
(call -relay- ("op" "identity") [$status.$.[0]!] push-to-stream-30)
)
(ap push-to-stream-30 $statuses)
)
(xor
(mismatch $status.$.[0]! "ok"
(ap n $dead_peers)
)
(null)
)
)
)
(next n)
)
)
(null)
)
)
(call -relay- ("op" "noop") [])
(call -relay- ("op" "array_length") [nodes] length)
)
(next n)
(call -relay- ("math" "sub") [length 1] sub)
)
(call -relay- ("op" "noop") [$statuses.$.[sub]!])
)
(null)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
(call %init_peer_id% ("op" "identity") [$dead_peers] dead_peers-fix)
)
(call -relay- ("op" "noop") [$res.$.[9]!])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
(call %init_peer_id% ("op" "identity") [$timestamps] timestamps-fix)
)
(call %init_peer_id% ("op" "identity") [$res] res-fix)
)
)
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [res-fix])
(call %init_peer_id% ("callbackSrv" "response") [timestamps-fix dead_peers-fix])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
)
@ -82,132 +114,35 @@ export function ts_getter(...args: any) {
return callFunction(
args,
{
"functionName" : "ts_getter",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}
"functionName" : "collect_timestamps_from_neighborhood",
"arrow" : {
"tag" : "arrow",
"domain" : {
"tag" : "labeledProduct",
"fields" : {
export type Ts_getter_with_timeoutResult = [number[], string[]]
export function ts_getter_with_timeout(
config?: {ttl?: number}
): Promise<Ts_getter_with_timeoutResult>;
export function ts_getter_with_timeout(
peer: FluencePeer,
config?: {ttl?: number}
): Promise<Ts_getter_with_timeoutResult>;
export function ts_getter_with_timeout(...args: any) {
let script = `
(xor
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(new $res
(seq
(new $dead_peers
(seq
(xor
(seq
(seq
(seq
(call -relay- ("op" "string_to_b58") [-relay-] k)
(call -relay- ("kad" "neighborhood") [k [] []] nodes)
)
(par
(fold nodes n
(par
(new $status
(seq
(seq
(par
(xor
(seq
(call n ("peer" "timestamp_ms") [] $res)
(ap "success" $status)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
(call -relay- ("peer" "timeout") [1000 "timeout"] $status)
)
(xor
(mismatch $status.$.[0]! "success"
(xor
(seq
(ap 0 $res)
(ap n $dead_peers)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(null)
)
)
(call -relay- ("op" "noop") [])
)
)
(next n)
)
)
(null)
)
)
(call -relay- ("op" "noop") [$res.$.[19]!])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
(call %init_peer_id% ("op" "identity") [$dead_peers] dead_peers-fix)
)
)
(call %init_peer_id% ("op" "identity") [$res] res-fix)
)
)
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [res-fix dead_peers-fix])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5])
)
`
return callFunction(
args,
{
"functionName" : "ts_getter_with_timeout",
"returnType" : {
"tag" : "multiReturn",
"returnItems" : [
{
"tag" : "primitive"
},
{
"tag" : "primitive"
}
]
},
"codomain" : {
"tag" : "unlabeledProduct",
"items" : [
{
"tag" : "array",
"type" : {
"tag" : "scalar",
"name" : "u64"
}
},
{
"tag" : "array",
"type" : {
"tag" : "scalar",
"name" : "string"
}
}
]
}
},
"argDefs" : [
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",

View File

@ -15,14 +15,18 @@
*/
import { setLogLevel, Fluence } from "@fluencelabs/fluence";
import { krasnodar, Node } from "@fluencelabs/fluence-network-environment";
import { ts_getter, ts_getter_with_timeout } from "./_aqua/timestamp_gatherer";
import { krasnodar } from "@fluencelabs/fluence-network-environment";
import { collect_timestamps_from_neighborhood } from "./_aqua/timestamp_gatherer";
async function main() {
if (process.env.DEBUG) {
setLogLevel("DEBUG");
}
// create the Fluence client for the Krasnodar testnet
// and we're using peer 6 to do so
await Fluence.start({ connectTo: krasnodar[5] });
// Connect to the address specified by environment variable RELAY or use krasnodar[5] if not set
let relay = process.env.RELAY || krasnodar[5];
await Fluence.start({ connectTo: relay });
console.log(
"Created a fluence client with peer id %s and relay id %s",
Fluence.getStatus().peerId,
@ -30,13 +34,9 @@ async function main() {
);
// call the simple getter
const ts_result = await ts_getter();
console.log("simple result: ", ts_result);
// call the bounded getter
const ts_result_tuple = await ts_getter_with_timeout();
console.log("raw timestamps: %s\ndead peers: %s ", ts_result_tuple[0].filter(e => e !== 0), ts_result_tuple[1]);
const [timestamps, dead_peers] = await collect_timestamps_from_neighborhood();
console.log("timestamps: %s", timestamps);
console.log("dead peers: %s ", dead_peers);
await Fluence.stop();
}