From c2377f2de1d909f910d3deef9727eb447ef54f5c Mon Sep 17 00:00:00 2001 From: Cayman Date: Tue, 27 Sep 2022 19:56:01 +0200 Subject: [PATCH] Update libp2p to ESM version (#4114) * WIP * Revert eslint changes * Revert dependency update * Revert dependencies * Revert yarn.lock * Update yarn.lock * Update noise * Fix lint errors * Update discv5 * Fix linter errors * Fix check-types * Fix up libp2p connection manager handling * Update gossipsub * Add import statement * Use upstream GossipsubEvents type * Remove stray lint disable comment * Only ping a single peer when it connects * Update gossipsub * libp2p-gossipsub 3.5.0 * Use libp2p-noise 7.0.3 * Use @libp2p/mplex 4.0.3 * Fix write heap dump in libp2p esm branch (#4387) * Remove 'require' check in writeHeapDump * Fix BELLATRIX_FORK_EPOCH * Update libp2p dependencies * Bump libp2p * Fix heap memory issue * Fix some tests * Fix type error * Fix req/resp 'index out of bounds' issue * Fix linter errors * Add libp2p metrics and dashboard * Update gossipsub and set max outbound buffer size * Update @libp2p/tcp * Update uint8arrays * v0.0.0 * Lint libp2p grafana dashboard * Add leveldown dev dependency * Set msgIdToStrFn to Buffer.toString * Do not set udp to enr (#4591) * Fix e2e reqresp test * Fix lint * Fix unit tests * Update yarn.lock after merge * Update libp2p Co-authored-by: Tuyen Nguyen Co-authored-by: tuyennhv --- dashboards/libp2p.json | 657 ++++++ packages/beacon-node/package.json | 39 +- .../src/api/impl/beacon/blocks/index.ts | 2 +- .../src/api/impl/lodestar/index.ts | 13 +- .../beacon-node/src/api/impl/node/index.ts | 8 +- .../beacon-node/src/api/impl/node/utils.ts | 14 +- .../beacon-node/src/metrics/metrics/libp2p.ts | 84 + packages/beacon-node/src/network/events.ts | 2 +- .../src/network/gossip/encoding.ts | 11 +- .../src/network/gossip/gossipsub.ts | 41 +- .../src/network/gossip/handlers/index.ts | 4 +- .../src/network/gossip/interface.ts | 9 +- .../src/network/gossip/scoringParameters.ts | 9 +- .../src/network/gossip/validation/index.ts | 2 +- packages/beacon-node/src/network/interface.ts | 6 +- packages/beacon-node/src/network/network.ts | 29 +- .../beacon-node/src/network/nodejs/bundle.ts | 151 +- .../beacon-node/src/network/nodejs/util.ts | 14 +- .../src/network/peers/datastore.ts | 12 +- .../beacon-node/src/network/peers/discover.ts | 22 +- .../src/network/peers/peerManager.ts | 67 +- .../src/network/peers/peersData.ts | 2 +- .../beacon-node/src/network/peers/score.ts | 6 +- .../peers/utils/getConnectedPeerIds.ts | 16 +- .../network/peers/utils/prioritizePeers.ts | 2 +- .../network/reqresp/encoders/requestDecode.ts | 8 +- .../reqresp/encoders/responseDecode.ts | 15 +- .../encodingStrategies/sszSnappy/decode.ts | 12 +- .../sszSnappy/snappyFrames/uncompress.ts | 23 +- .../src/network/reqresp/interface.ts | 40 +- .../src/network/reqresp/reqResp.ts | 27 +- .../src/network/reqresp/request/index.ts | 20 +- .../src/network/reqresp/response/index.ts | 13 +- .../network/reqresp/response/rateLimiter.ts | 6 +- .../network/reqresp/utils/bufferedSource.ts | 12 +- .../src/network/reqresp/utils/errorMessage.ts | 2 +- packages/beacon-node/src/network/util.ts | 28 +- packages/beacon-node/src/node/nodejs.ts | 6 +- .../beacon-node/src/sync/backfill/backfill.ts | 2 +- .../beacon-node/src/sync/backfill/errors.ts | 2 +- packages/beacon-node/src/sync/range/batch.ts | 2 +- packages/beacon-node/src/sync/range/chain.ts | 4 +- packages/beacon-node/src/sync/range/range.ts | 4 +- .../src/sync/range/utils/peerBalancer.ts | 2 +- packages/beacon-node/src/sync/sync.ts | 6 +- packages/beacon-node/src/sync/unknownBlock.ts | 10 +- packages/beacon-node/src/util/peerId.ts | 23 - packages/beacon-node/src/util/peerMap.ts | 8 +- .../test/e2e/network/network.test.ts | 17 +- .../e2e/network/peers/peerManager.test.ts | 36 +- .../test/e2e/network/reqresp.test.ts | 9 +- .../test/e2e/sync/unknownBlockSync.test.ts | 2 +- .../peers/util/prioritizePeers.test.ts | 9 +- .../network/gossip/scoringParameters.test.ts | 2 +- .../sszSnappy/decode.test.ts | 3 +- .../sszSnappy/encode.test.ts | 2 +- .../test/unit/api/impl/node/node.test.ts | 63 +- .../test/unit/network/nodejs/libp2p.test.ts | 59 - .../test/unit/network/peers/datastore.test.ts | 4 +- .../test/unit/network/peers/discover.test.ts | 8 +- .../unit/network/peers/priorization.test.ts | 11 +- .../test/unit/network/peers/score.test.ts | 6 +- .../network/reqresp/encoders/request.test.ts | 12 +- .../reqresp/encoders/requestTypes.test.ts | 2 +- .../network/reqresp/encoders/response.test.ts | 87 +- .../reqresp/encoders/responseTypes.test.ts | 2 +- .../sszSnappy/decode.test.ts | 3 +- .../sszSnappy/encode.test.ts | 7 +- .../snappy-frames/uncompress.test.ts | 9 +- .../encodingStrategies/sszSnappy/testData.ts | 15 +- .../request/responseTimeoutsHandler.test.ts | 31 +- .../network/reqresp/response/index.test.ts | 9 +- .../reqresp/response/rateLimiter.test.ts | 21 +- .../test/unit/network/reqresp/utils.ts | 36 +- .../test/unit/network/util.test.ts | 16 +- .../test/unit/sync/range/batch.test.ts | 6 +- .../test/unit/sync/range/chain.test.ts | 2 +- .../sync/range/utils/peerBalancer.test.ts | 24 +- .../test/unit/sync/unknownBlock.test.ts | 4 +- .../beacon-node/test/unit/util/peerId.test.ts | 14 - .../test/unit/util/peerMap.test.ts | 6 +- packages/beacon-node/test/utils/network.ts | 19 +- .../beacon-node/test/utils/node/beacon.ts | 6 +- packages/beacon-node/test/utils/peer.ts | 5 +- .../test/utils/validationData/attestation.ts | 7 +- packages/cli/package.json | 6 +- packages/cli/src/cmds/beacon/handler.ts | 12 +- packages/cli/src/config/fileEnr.ts | 2 +- packages/cli/src/config/peerId.ts | 49 +- packages/cli/test/unit/cmds/beacon.test.ts | 11 +- packages/cli/test/unit/config/fileEnr.test.ts | 5 +- packages/cli/test/unit/config/peerId.test.ts | 7 +- tsconfig.build.json | 2 +- types/libp2p-mdns/index.d.ts | 41 - types/libp2p-mdns/libp2p-mdns-tests.ts | 0 types/libp2p-mdns/tsconfig.json | 16 - types/libp2p-mdns/tslint.json | 1 - types/libp2p-mplex/index.d.ts | 9 - types/libp2p-mplex/libp2p-mplex-tests.ts | 0 types/libp2p-mplex/tsconfig.json | 16 - types/libp2p-mplex/tslint.json | 1 - types/libp2p-tcp/index.d.ts | 9 - types/libp2p-tcp/tsconfig.json | 16 - types/libp2p-tcp/tslint.json | 1 - yarn.lock | 1988 ++++++++++------- 105 files changed, 2616 insertions(+), 1647 deletions(-) create mode 100644 dashboards/libp2p.json create mode 100644 packages/beacon-node/src/metrics/metrics/libp2p.ts delete mode 100644 packages/beacon-node/src/util/peerId.ts delete mode 100644 packages/beacon-node/test/unit/network/nodejs/libp2p.test.ts delete mode 100644 packages/beacon-node/test/unit/util/peerId.test.ts delete mode 100644 types/libp2p-mdns/index.d.ts delete mode 100644 types/libp2p-mdns/libp2p-mdns-tests.ts delete mode 100644 types/libp2p-mdns/tsconfig.json delete mode 100644 types/libp2p-mdns/tslint.json delete mode 100644 types/libp2p-mplex/index.d.ts delete mode 100644 types/libp2p-mplex/libp2p-mplex-tests.ts delete mode 100644 types/libp2p-mplex/tsconfig.json delete mode 100644 types/libp2p-mplex/tslint.json delete mode 100644 types/libp2p-tcp/index.d.ts delete mode 100644 types/libp2p-tcp/tsconfig.json delete mode 100644 types/libp2p-tcp/tslint.json diff --git a/dashboards/libp2p.json b/dashboards/libp2p.json new file mode 100644 index 0000000000..67c11d61d8 --- /dev/null +++ b/dashboards/libp2p.json @@ -0,0 +1,657 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": null, + "graphTooltip": 0, + "id": 5, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": ["lodestar"], + "targetBlank": false, + "title": "Lodestar dashboards", + "tooltip": "", + "type": "dashboards", + "url": "" + } + ], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 12, + "panels": [], + "title": "Bandwidth", + "type": "row" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_global_stats", + "interval": "", + "legendFormat": "{{direction}}", + "refId": "A" + } + ], + "title": "Total Bandwidth", + "type": "timeseries" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_protocol__meshsub_1_1_0_bytes", + "interval": "", + "legendFormat": "{{direction}}", + "refId": "A" + } + ], + "title": "Gossip Bandwidth", + "type": "timeseries" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_protocol__ipfs_id_push_1_0_0_bytes", + "interval": "", + "legendFormat": "{{direction}}", + "refId": "A" + } + ], + "title": "Identify-Push Protocol Bandwidth", + "type": "timeseries" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_protocol__ipfs_id_1_0_0_bytes", + "interval": "", + "legendFormat": "{{direction}}", + "refId": "A" + } + ], + "title": "Identify Protocol Bandwidth", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 14, + "panels": [], + "title": "Connection Manager", + "type": "row" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_connection_manager_connections", + "interval": "", + "legendFormat": "{{direction}}", + "refId": "A" + } + ], + "title": "Total Connections", + "type": "timeseries" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_connection_manager_protocol_streams_total", + "interval": "", + "legendFormat": "{{protocol}}", + "refId": "A" + } + ], + "title": "Total Streams", + "type": "timeseries" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": false, + "expr": "libp2p_connection_manager_protocol_streams_per_connection_90th_percentile", + "interval": "", + "legendFormat": "{{protocol}}", + "refId": "A" + } + ], + "title": "Streams Per Connection (90th percentile)", + "type": "timeseries" + } + ], + "schemaVersion": 32, + "style": "dark", + "tags": ["lodestar"], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Libp2p", + "uid": "C5u1rHZVk", + "version": 1 +} diff --git a/packages/beacon-node/package.json b/packages/beacon-node/package.json index 538e487c45..f695d16e93 100644 --- a/packages/beacon-node/package.json +++ b/packages/beacon-node/package.json @@ -99,13 +99,24 @@ "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/bls": "7.1.1", - "@chainsafe/discv5": "^0.7.1", - "@chainsafe/libp2p-noise": "5.0.3", + "@chainsafe/discv5": "^1.1.2", + "@chainsafe/libp2p-gossipsub": "^4.1.1", + "@chainsafe/libp2p-noise": "^8.0.0", "@chainsafe/persistent-merkle-tree": "^0.4.2", "@chainsafe/snappy-stream": "5.1.1", "@chainsafe/ssz": "^0.9.2", "@chainsafe/threads": "^1.10.0", "@ethersproject/abi": "^5.0.0", + "@libp2p/bootstrap": "^2.0.0", + "@libp2p/interface-connection": "^3.0.2", + "@libp2p/interface-connection-manager": "^1.1.1", + "@libp2p/interface-peer-id": "^1.0.4", + "@libp2p/interface-pubsub": "^2.1.0", + "@libp2p/mdns": "^3.0.1", + "@libp2p/mplex": "^5.2.4", + "@libp2p/peer-id-factory": "^1.0.18", + "@libp2p/tcp": "^3.1.2", + "@multiformats/multiaddr": "^11.0.0", "@lodestar/api": "^1.1.0", "@lodestar/config": "^1.1.0", "@lodestar/db": "^1.1.0", @@ -117,33 +128,26 @@ "@lodestar/utils": "^1.1.0", "@lodestar/validator": "^1.1.0", "@types/datastore-level": "^3.0.0", - "bl": "^5.0.0", "buffer-xor": "^2.0.2", "cross-fetch": "^3.1.4", - "datastore-core": "^7.0.1", - "datastore-level": "^6.0.2", + "datastore-core": "^8.0.1", + "datastore-level": "^9.0.1", "deepmerge": "^3.2.0", "fastify": "3.15.1", "fastify-bearer-auth": "6.1.0", "fastify-cors": "^6.0.1", "gc-stats": "^1.4.0", - "interface-datastore": "^5.1.2", - "it-all": "^1.0.4", - "it-pipe": "^1.1.0", + "interface-datastore": "^7.0.0", + "it-all": "^1.0.6", + "it-pipe": "^2.0.4", "jwt-simple": "0.5.6", - "libp2p": "^0.36.2", - "libp2p-bootstrap": "^0.14.0", - "libp2p-gossipsub": "^0.14.1", - "libp2p-mdns": "^0.18.0", - "libp2p-mplex": "^0.10.5", - "libp2p-tcp": "^0.17.2", - "multiaddr": "^10.0.1", - "peer-id": "^0.16.0", + "libp2p": "0.39.2", "prom-client": "^13.2.0", "prometheus-gc-stats": "^0.6.3", "snappyjs": "^0.7.0", "stream-to-it": "^0.2.0", "strict-event-emitter-types": "^2.0.0", + "uint8arraylist": "^2.3.2", "varint": "^6.0.0" }, "devDependencies": { @@ -153,10 +157,11 @@ "@types/jwt-simple": "0.5.33", "@types/leveldown": "^4.0.2", "@types/prometheus-gc-stats": "^0.6.1", - "@types/supertest": "^2.0.8", + "@types/supertest": "^2.0.12", "@types/tmp": "^0.2.0", "@types/varint": "^6.0.0", "eventsource": "^2.0.2", + "leveldown": "^6.1.1", "rewiremock": "^3.14.3", "rimraf": "^3.0.2", "tmp": "^0.2.1" diff --git a/packages/beacon-node/src/api/impl/beacon/blocks/index.ts b/packages/beacon-node/src/api/impl/beacon/blocks/index.ts index e9a10c2ac5..dfd2f2889d 100644 --- a/packages/beacon-node/src/api/impl/beacon/blocks/index.ts +++ b/packages/beacon-node/src/api/impl/beacon/blocks/index.ts @@ -193,7 +193,7 @@ export function getBeaconBlockApi({ chain.processBlock(signedBlock).catch((e) => { if (e instanceof BlockError && e.type.code === BlockErrorCode.PARENT_UNKNOWN) { - network.events.emit(NetworkEvent.unknownBlockParent, signedBlock, network.peerId.toB58String()); + network.events.emit(NetworkEvent.unknownBlockParent, signedBlock, network.peerId.toString()); } throw e; }), diff --git a/packages/beacon-node/src/api/impl/lodestar/index.ts b/packages/beacon-node/src/api/impl/lodestar/index.ts index baadaa2e7f..bd912df5cc 100644 --- a/packages/beacon-node/src/api/impl/lodestar/index.ts +++ b/packages/beacon-node/src/api/impl/lodestar/index.ts @@ -1,4 +1,5 @@ -import {Multiaddr} from "multiaddr"; +import {peerIdFromString} from "@libp2p/peer-id"; +import {multiaddr} from "@multiformats/multiaddr"; import {routes} from "@lodestar/api"; import {Bucket, Repository} from "@lodestar/db"; import {toHex} from "@lodestar/utils"; @@ -8,7 +9,6 @@ import {IChainForkConfig} from "@lodestar/config"; import {ssz} from "@lodestar/types"; import {BeaconChain} from "../../../chain/index.js"; import {QueuedStateRegenerator, RegenRequest} from "../../../chain/regen/index.js"; -import {createFromB58String} from "../../../util/peerId.js"; import {GossipType} from "../../../network/index.js"; import {IBeaconDb} from "../../../db/interface.js"; import {ApiModules} from "../types.js"; @@ -25,9 +25,6 @@ export function getLodestarApi({ return { async writeHeapdump(dirpath = ".") { - // Browser interop - if (typeof require !== "function") throw Error("NodeJS only"); - if (writingHeapdump) { throw Error("Already writing heapdump"); } @@ -123,13 +120,13 @@ export function getLodestarApi({ }, async connectPeer(peerIdStr, multiaddrStrs) { - const peerId = createFromB58String(peerIdStr); - const multiaddrs = multiaddrStrs.map((multiaddrStr) => new Multiaddr(multiaddrStr)); + const peerId = peerIdFromString(peerIdStr); + const multiaddrs = multiaddrStrs.map((multiaddrStr) => multiaddr(multiaddrStr)); await network.connectToPeer(peerId, multiaddrs); }, async disconnectPeer(peerIdStr) { - const peerId = createFromB58String(peerIdStr); + const peerId = peerIdFromString(peerIdStr); await network.disconnectPeer(peerId); }, diff --git a/packages/beacon-node/src/api/impl/node/index.ts b/packages/beacon-node/src/api/impl/node/index.ts index 828f80e5c0..40d8265206 100644 --- a/packages/beacon-node/src/api/impl/node/index.ts +++ b/packages/beacon-node/src/api/impl/node/index.ts @@ -17,7 +17,7 @@ export function getNodeApi(opts: IApiOptions, {network, sync}: Pick m.toString()), @@ -60,13 +60,13 @@ export function getNodeApi(opts: IApiOptions, {network, sync}: Pick(); for (const conn of connections) { - if (conn.stat.status === "open") return conn; + if (conn.stat.status === "OPEN") return conn; if (!byStatus.has(conn.stat.status)) byStatus.set(conn.stat.status, conn); } - return byStatus.get("open") || byStatus.get("closing") || byStatus.get("closed") || null; + return byStatus.get("OPEN") || byStatus.get("CLOSING") || byStatus.get("CLOSED") || null; } /** @@ -40,11 +40,11 @@ export function getRevelantConnection(connections: Connection[]): Connection | n */ function getPeerState(status: PeerStatus): routes.node.PeerState { switch (status) { - case "open": + case "OPEN": return "connected"; - case "closing": + case "CLOSING": return "disconnecting"; - case "closed": + case "CLOSED": default: return "disconnected"; } diff --git a/packages/beacon-node/src/metrics/metrics/libp2p.ts b/packages/beacon-node/src/metrics/metrics/libp2p.ts new file mode 100644 index 0000000000..1ac1cfe086 --- /dev/null +++ b/packages/beacon-node/src/metrics/metrics/libp2p.ts @@ -0,0 +1,84 @@ +import {Libp2p} from "libp2p"; +import {GaugeExtra} from "../utils/gauge.js"; +import {RegistryMetricCreator} from "../utils/registryMetricCreator.js"; + +export type ILibp2pMetrics = ReturnType; + +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type +export function createLibp2pMetrics(libp2p: Libp2p, register: RegistryMetricCreator) { + const libp2pMetrics = libp2p.metrics; + if (libp2pMetrics === undefined) { + return; + } + + const metrics: Record> = {}; + + const ensureLibp2pMetrics = async (): Promise => { + // protocol metrics + const protocols = libp2pMetrics.getProtocols(); + protocols.forEach((protocol) => { + const protocolStat = libp2pMetrics.forProtocol(protocol); + if (protocolStat === undefined) { + return; + } + + // create metric if undefined + if (metrics[protocol] === undefined) { + const name = `libp2p_protocol_${protocol}_bytes`.replace(/(\/|-|\.)/g, "_"); + metrics[protocol] = register.gauge<"direction">({ + name, + help: name, + labelNames: ["direction"], + }); + } + + // set metric + const protocolSnapshot = protocolStat.getSnapshot(); + metrics[protocol].set({direction: "received"}, Number(protocolSnapshot.dataReceived)); + metrics[protocol].set({direction: "sent"}, Number(protocolSnapshot.dataSent)); + }); + + // component metrics + for (const [systemName, systemMetrics] of libp2pMetrics.getComponentMetrics().entries()) { + for (const [componentName, componentMetrics] of systemMetrics.entries()) { + for (const [metricName, trackedMetric] of componentMetrics.entries()) { + // In practice `systemName` is always libp2p + const name = `${systemName}_${componentName}_${metricName}`.replace(/-/g, "_"); + + // create metric if undefined + if (metrics[name] === undefined) { + metrics[name] = register.gauge({ + name, + help: trackedMetric.help ?? name, + labelNames: trackedMetric.label !== undefined ? [trackedMetric.label] : [], + }); + } + + // set metric + const m = await trackedMetric.calculate(); + if (typeof m === "number") { + metrics[name].set(m); + } else { + const labelName = trackedMetric.label ?? name; + Object.entries(m).forEach(([label, value]) => { + metrics[name].set({[labelName]: label}, value); + }); + } + } + } + } + }; + + metrics.global = register.gauge<"direction">({ + name: "libp2p_global_stats", + help: "libp2p global stats", + labelNames: ["direction"], + collect: async () => { + const globalSnapshot = libp2pMetrics.getGlobal().getSnapshot(); + metrics.global.set({direction: "received"}, Number(globalSnapshot.dataReceived)); + metrics.global.set({direction: "sent"}, Number(globalSnapshot.dataSent)); + + await ensureLibp2pMetrics(); + }, + }); +} diff --git a/packages/beacon-node/src/network/events.ts b/packages/beacon-node/src/network/events.ts index 226df44fe2..60d072432b 100644 --- a/packages/beacon-node/src/network/events.ts +++ b/packages/beacon-node/src/network/events.ts @@ -1,5 +1,5 @@ import {EventEmitter} from "events"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import StrictEventEmitter from "strict-event-emitter-types"; import {allForks, phase0} from "@lodestar/types"; import {RequestTypedContainer} from "./reqresp/index.js"; diff --git a/packages/beacon-node/src/network/gossip/encoding.ts b/packages/beacon-node/src/network/gossip/encoding.ts index 7c4dbaac6f..983d29ff32 100644 --- a/packages/beacon-node/src/network/gossip/encoding.ts +++ b/packages/beacon-node/src/network/gossip/encoding.ts @@ -1,9 +1,9 @@ import {compress, uncompress} from "snappyjs"; -import {RPC} from "libp2p-gossipsub/src/message/rpc"; -import {GossipsubMessage} from "libp2p-gossipsub/src/types"; +import {Message} from "@libp2p/interface-pubsub"; import {digest} from "@chainsafe/as-sha256"; import {intToBytes} from "@lodestar/utils"; import {ForkName} from "@lodestar/params"; +import {RPC} from "@chainsafe/libp2p-gossipsub/message"; import {MESSAGE_DOMAIN_VALID_SNAPPY} from "./constants.js"; import {GossipTopicCache} from "./topic.js"; @@ -19,10 +19,15 @@ export function fastMsgIdFn(rpcMsg: RPC.IMessage): string { } } +export function msgIdToStrFn(msgId: Uint8Array): string { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + return Buffer.prototype.toString.call(msgId, "base64"); +} + /** * Only valid msgId. Messages that fail to snappy_decompress() are not tracked */ -export function msgIdFn(gossipTopicCache: GossipTopicCache, msg: GossipsubMessage): Uint8Array { +export function msgIdFn(gossipTopicCache: GossipTopicCache, msg: Message): Uint8Array { const topic = gossipTopicCache.getTopic(msg.topic); let vec: Uint8Array[]; diff --git a/packages/beacon-node/src/network/gossip/gossipsub.ts b/packages/beacon-node/src/network/gossip/gossipsub.ts index 8d755ed793..86880815a9 100644 --- a/packages/beacon-node/src/network/gossip/gossipsub.ts +++ b/packages/beacon-node/src/network/gossip/gossipsub.ts @@ -1,12 +1,9 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import Libp2p from "libp2p"; -import GossipsubDefault from "libp2p-gossipsub"; -// TODO remove once Gossipsub goes ESM -const Gossipsub = ((GossipsubDefault as unknown) as {default: unknown}).default as typeof GossipsubDefault; -import {GossipsubMessage, SignaturePolicy, TopicStr} from "libp2p-gossipsub/src/types.js"; -import {PeerScore, PeerScoreParams} from "libp2p-gossipsub/src/score/index.js"; -import PeerId from "peer-id"; -import {MetricsRegister, TopicLabel, TopicStrToLabel} from "libp2p-gossipsub/src/metrics"; +import {Libp2p} from "libp2p"; +import {GossipSub, GossipsubEvents} from "@chainsafe/libp2p-gossipsub"; +import {SignaturePolicy, TopicStr} from "@chainsafe/libp2p-gossipsub/types"; +import {PeerScore, PeerScoreParams} from "@chainsafe/libp2p-gossipsub/score"; +import {MetricsRegister, TopicLabel, TopicStrToLabel} from "@chainsafe/libp2p-gossipsub/metrics"; import {IBeaconConfig} from "@lodestar/config"; import {ATTESTATION_SUBNET_COUNT, ForkName, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; import {allForks, altair, phase0} from "@lodestar/types"; @@ -29,7 +26,7 @@ import { GossipHandlers, } from "./interface.js"; import {getGossipSSZType, GossipTopicCache, stringifyGossipTopic} from "./topic.js"; -import {DataTransformSnappy, fastMsgIdFn, msgIdFn} from "./encoding.js"; +import {DataTransformSnappy, fastMsgIdFn, msgIdFn, msgIdToStrFn} from "./encoding.js"; import {createValidatorFnsByType} from "./validation/index.js"; import { @@ -44,14 +41,7 @@ import { /** As specified in https://github.com/ethereum/consensus-specs/blob/v1.1.10/specs/phase0/p2p-interface.md */ const GOSSIPSUB_HEARTBEAT_INTERVAL = 0.7 * 1000; -// TODO: Export this type -type GossipsubEvents = { - "gossipsub:message": { - propagationSource: PeerId; - msgId: string; - msg: GossipsubMessage; - }; -}; +const MAX_OUTBOUND_BUFFER_SIZE = 2 ** 24; // 16MB export type Eth2GossipsubModules = { config: IBeaconConfig; @@ -81,7 +71,7 @@ export type Eth2GossipsubOpts = { * * See https://github.com/ethereum/consensus-specs/blob/v1.1.10/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub */ -export class Eth2Gossipsub extends Gossipsub { +export class Eth2Gossipsub extends GossipSub { readonly jobQueues: GossipJobQueues; readonly scoreParams: Partial; private readonly config: IBeaconConfig; @@ -101,8 +91,7 @@ export class Eth2Gossipsub extends Gossipsub { // Gossipsub parameters defined here: // https://github.com/ethereum/consensus-specs/blob/v1.1.10/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub - super(modules.libp2p, { - gossipIncoming: true, + super({ globalSignaturePolicy: SignaturePolicy.StrictNoSign, allowPublishToZeroPeers: opts.allowPublishToZeroPeers, D: GOSSIP_D, @@ -120,6 +109,7 @@ export class Eth2Gossipsub extends Gossipsub { gossipsubIWantFollowupMs: 12 * 1000, // 12s fastMsgIdFn: fastMsgIdFn, msgIdFn: msgIdFn.bind(msgIdFn, gossipTopicCache), + msgIdToStrFn: msgIdToStrFn, // Use the bellatrix max size if the merge is configured. pre-merge using this size // could only be an issue on outgoing payloads, its highly unlikely we will send out // a chunk bigger than GOSSIP_MAX_SIZE pre merge even on mainnet network. @@ -131,6 +121,8 @@ export class Eth2Gossipsub extends Gossipsub { metricsRegister: modules.metrics ? ((modules.metrics.register as unknown) as MetricsRegister) : null, metricsTopicStrToLabel: modules.metrics ? getMetricsTopicStrToLabel(modules.config) : undefined, asyncValidation: true, + + maxOutboundBufferSize: MAX_OUTBOUND_BUFFER_SIZE, }); this.scoreParams = scoreParams; this.config = config; @@ -154,7 +146,7 @@ export class Eth2Gossipsub extends Gossipsub { metrics.gossipMesh.peersByType.addCollect(() => this.onScrapeLodestarMetrics(metrics)); } - this.on("gossipsub:message", this.onGossipsubMessage.bind(this)); + this.addEventListener("gossipsub:message", this.onGossipsubMessage.bind(this)); // Having access to this data is CRUCIAL for debugging. While this is a massive log, it must not be deleted. // Scoring issues require this dump + current peer score stats to re-calculate scores. @@ -168,7 +160,8 @@ export class Eth2Gossipsub extends Gossipsub { const topicStr = this.getGossipTopicString(topic); const sszType = getGossipSSZType(topic); const messageData = (sszType.serialize as (object: GossipTypeMap[GossipType]) => Uint8Array)(object); - const sentPeers = await this.publish(topicStr, messageData); + const result = await this.publish(topicStr, messageData); + const sentPeers = result.recipients.length; this.logger.verbose("Publish to topic", {topic: topicStr, sentPeers}); return sentPeers; } @@ -256,7 +249,7 @@ export class Eth2Gossipsub extends Gossipsub { private onScrapeLodestarMetrics(metrics: IMetrics): void { const mesh = this["mesh"] as Map>; const topics = this["topics"] as Map>; - const peers = this["peers"] as Map; + const peers = this["peers"] as Set; const score = this["score"] as PeerScore; const meshPeersByClient = new Map(); const meshPeerIdStrs = new Set(); @@ -355,7 +348,7 @@ export class Eth2Gossipsub extends Gossipsub { } private onGossipsubMessage(event: GossipsubEvents["gossipsub:message"]): void { - const {propagationSource, msgId, msg} = event; + const {propagationSource, msgId, msg} = event.detail; // Also validates that the topicStr is known const topic = this.gossipTopicCache.getTopic(msg.topic); diff --git a/packages/beacon-node/src/network/gossip/handlers/index.ts b/packages/beacon-node/src/network/gossip/handlers/index.ts index a9d7f0bcc0..6d0fecca71 100644 --- a/packages/beacon-node/src/network/gossip/handlers/index.ts +++ b/packages/beacon-node/src/network/gossip/handlers/index.ts @@ -1,3 +1,4 @@ +import {peerIdFromString} from "@libp2p/peer-id"; import {toHexString} from "@chainsafe/ssz"; import {IBeaconConfig} from "@lodestar/config"; import {phase0, ssz} from "@lodestar/types"; @@ -28,7 +29,6 @@ import { import {INetwork} from "../../interface.js"; import {NetworkEvent} from "../../events.js"; import {PeerAction} from "../../peers/index.js"; -import {createFromB58String} from "../../../util/peerId.js"; /** * Gossip handler options as part of network options @@ -130,7 +130,7 @@ export function getGossipHandlers(modules: ValidatorFnsModules, options: GossipH case BlockErrorCode.EXECUTION_ENGINE_ERROR: break; default: - network.reportPeer(createFromB58String(peerIdStr), PeerAction.LowToleranceError, "BadGossipBlock"); + network.reportPeer(peerIdFromString(peerIdStr), PeerAction.LowToleranceError, "BadGossipBlock"); } } logger.error("Error receiving block", {slot, peer: peerIdStr}, e as Error); diff --git a/packages/beacon-node/src/network/gossip/interface.ts b/packages/beacon-node/src/network/gossip/interface.ts index 4a11f4a8f4..974e8a49ae 100644 --- a/packages/beacon-node/src/network/gossip/interface.ts +++ b/packages/beacon-node/src/network/gossip/interface.ts @@ -1,7 +1,8 @@ import {EventEmitter} from "events"; +import {Libp2p} from "libp2p"; +import {Message} from "@libp2p/interface-pubsub"; import StrictEventEmitter from "strict-event-emitter-types"; -import LibP2p from "libp2p"; -import {GossipsubMessage, MessageAcceptance, PeerIdStr} from "libp2p-gossipsub/src/types"; +import {MessageAcceptance, PeerIdStr} from "@chainsafe/libp2p-gossipsub/types"; import {ForkName} from "@lodestar/params"; import {allForks, altair, phase0} from "@lodestar/types"; import {IBeaconConfig} from "@lodestar/config"; @@ -94,7 +95,7 @@ export type GossipEventEmitter = StrictEventEmitter export interface IGossipModules { config: IBeaconConfig; - libp2p: LibP2p; + libp2p: Libp2p; logger: ILogger; chain: IBeaconChain; } @@ -112,7 +113,7 @@ export interface IGossipModules { */ export type GossipValidatorFn = ( topic: GossipTopic, - msg: GossipsubMessage, + msg: Message, propagationSource: PeerIdStr, seenTimestampSec: number ) => Promise; diff --git a/packages/beacon-node/src/network/gossip/scoringParameters.ts b/packages/beacon-node/src/network/gossip/scoringParameters.ts index a190e65b28..c9734a6caf 100644 --- a/packages/beacon-node/src/network/gossip/scoringParameters.ts +++ b/packages/beacon-node/src/network/gossip/scoringParameters.ts @@ -1,9 +1,9 @@ -import {PeerScoreThresholds} from "libp2p-gossipsub/src/score/index.js"; import { defaultTopicScoreParams, PeerScoreParams, TopicScoreParams, -} from "libp2p-gossipsub/src/score/peer-score-params.js"; + PeerScoreThresholds, +} from "@chainsafe/libp2p-gossipsub/score"; import {computeCommitteeCount} from "@lodestar/state-transition"; import {IBeaconConfig} from "@lodestar/config"; import {ATTESTATION_SUBNET_COUNT, SLOTS_PER_EPOCH, TARGET_AGGREGATORS_PER_COMMITTEE} from "@lodestar/params"; @@ -282,7 +282,10 @@ function scoreParameterDecayWithBase(decayTimeMs: number, decayIntervalMs: numbe function expectedAggregatorCountPerSlot( activeValidatorCount: number -): {aggregatorsPerslot: number; committeesPerSlot: number} { +): { + aggregatorsPerslot: number; + committeesPerSlot: number; +} { const committeesPerSlot = computeCommitteeCount(activeValidatorCount); const committeesPerEpoch = committeesPerSlot * SLOTS_PER_EPOCH; const smallerCommitteeSize = Math.floor(activeValidatorCount / committeesPerEpoch); diff --git a/packages/beacon-node/src/network/gossip/validation/index.ts b/packages/beacon-node/src/network/gossip/validation/index.ts index 75ee58759c..083ce25640 100644 --- a/packages/beacon-node/src/network/gossip/validation/index.ts +++ b/packages/beacon-node/src/network/gossip/validation/index.ts @@ -1,4 +1,4 @@ -import {MessageAcceptance} from "libp2p-gossipsub/src/types.js"; +import {MessageAcceptance} from "@chainsafe/libp2p-gossipsub/types"; import {IChainForkConfig} from "@lodestar/config"; import {ILogger, mapValues} from "@lodestar/utils"; import {IMetrics} from "../../../metrics/index.js"; diff --git a/packages/beacon-node/src/network/interface.ts b/packages/beacon-node/src/network/interface.ts index dd79b38395..8b0910d8df 100644 --- a/packages/beacon-node/src/network/interface.ts +++ b/packages/beacon-node/src/network/interface.ts @@ -1,6 +1,6 @@ -import {Connection} from "libp2p"; -import {Multiaddr} from "multiaddr"; -import PeerId from "peer-id"; +import {Connection} from "@libp2p/interface-connection"; +import {Multiaddr} from "@multiformats/multiaddr"; +import {PeerId} from "@libp2p/interface-peer-id"; import {Discv5, ENR} from "@chainsafe/discv5"; import {INetworkEventBus} from "./events.js"; import {Eth2Gossipsub} from "./gossip/index.js"; diff --git a/packages/beacon-node/src/network/network.ts b/packages/beacon-node/src/network/network.ts index 9d4d1c19d7..e1ba36780a 100644 --- a/packages/beacon-node/src/network/network.ts +++ b/packages/beacon-node/src/network/network.ts @@ -1,6 +1,8 @@ -import LibP2p, {Connection} from "libp2p"; -import PeerId from "peer-id"; -import {Multiaddr} from "multiaddr"; +import {Libp2p} from "libp2p"; +import {DefaultConnectionManager} from "libp2p/connection-manager"; +import {Connection} from "@libp2p/interface-connection"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Multiaddr} from "@multiformats/multiaddr"; import {IBeaconConfig} from "@lodestar/config"; import {ILogger} from "@lodestar/utils"; import {ATTESTATION_SUBNET_COUNT, ForkName, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; @@ -20,10 +22,11 @@ import {IPeerRpcScoreStore, PeerAction, PeerRpcScoreStore} from "./peers/index.j import {INetworkEventBus, NetworkEventBus} from "./events.js"; import {AttnetsService, SyncnetsService, CommitteeSubscription} from "./subnets/index.js"; import {PeersData} from "./peers/peersData.js"; +import {getConnectionsMap} from "./util.js"; interface INetworkModules { config: IBeaconConfig; - libp2p: LibP2p; + libp2p: Libp2p; logger: ILogger; metrics: IMetrics | null; chain: IBeaconChain; @@ -44,7 +47,7 @@ export class Network implements INetwork { private readonly peersData: PeersData; private readonly peerManager: PeerManager; - private readonly libp2p: LibP2p; + private readonly libp2p: Libp2p; private readonly logger: ILogger; private readonly config: IBeaconConfig; private readonly clock: IBeaconClock; @@ -95,6 +98,8 @@ export class Network implements INetwork { }, peersData: this.peersData, }); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any + void this.gossip.init((libp2p as any).components).catch((e) => this.logger.error(e)); this.attnetsService = new AttnetsService(config, chain, this.gossip, metadata, logger, opts); this.syncnetsService = new SyncnetsService(config, chain, this.gossip, metadata, logger, opts); @@ -129,7 +134,8 @@ export class Network implements INetwork { async start(): Promise { await this.libp2p.start(); // Stop latency monitor since we handle disconnects here and don't want additional load on the event loop - this.libp2p.connectionManager._latencyMonitor.stop(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + (this.libp2p.connectionManager as DefaultConnectionManager)["latencyMonitor"].stop(); this.reqResp.start(); this.metadata.start(this.getEnr(), this.config.getForkName(this.clock.currentSlot)); @@ -137,8 +143,11 @@ export class Network implements INetwork { await this.gossip.start(); this.attnetsService.start(); this.syncnetsService.start(); - const multiaddresses = this.libp2p.multiaddrs.map((m) => m.toString()).join(","); - this.logger.info(`PeerId ${this.libp2p.peerId.toB58String()}, Multiaddrs ${multiaddresses}`); + const multiaddresses = this.libp2p + .getMultiaddrs() + .map((m) => m.toString()) + .join(","); + this.logger.info(`PeerId ${this.libp2p.peerId.toString()}, Multiaddrs ${multiaddresses}`); } async stop(): Promise { @@ -157,7 +166,7 @@ export class Network implements INetwork { } get localMultiaddrs(): Multiaddr[] { - return this.libp2p.multiaddrs; + return this.libp2p.getMultiaddrs(); } get peerId(): PeerId { @@ -169,7 +178,7 @@ export class Network implements INetwork { } getConnectionsByPeer(): Map { - return this.libp2p.connectionManager.connections; + return getConnectionsMap(this.libp2p.connectionManager); } getConnectedPeers(): PeerId[] { diff --git a/packages/beacon-node/src/network/nodejs/bundle.ts b/packages/beacon-node/src/network/nodejs/bundle.ts index ca6c4c250d..c0693533e8 100644 --- a/packages/beacon-node/src/network/nodejs/bundle.ts +++ b/packages/beacon-node/src/network/nodejs/bundle.ts @@ -1,11 +1,11 @@ -import LibP2p from "libp2p"; -import TCP from "libp2p-tcp"; -import Mplex from "libp2p-mplex"; -import PeerId from "peer-id"; +import {createLibp2p, Libp2p} from "libp2p"; +import {TCP} from "@libp2p/tcp"; +import {Mplex} from "@libp2p/mplex"; +import {Bootstrap} from "@libp2p/bootstrap"; +import {MulticastDNS} from "@libp2p/mdns"; +import {PeerId} from "@libp2p/interface-peer-id"; import {Datastore} from "interface-datastore"; -import Bootstrap from "libp2p-bootstrap"; -import MDNS from "libp2p-mdns"; -import {NOISE} from "@chainsafe/libp2p-noise"; +import {Noise} from "@chainsafe/libp2p-noise"; export interface ILibp2pOptions { peerId: PeerId; @@ -14,82 +14,75 @@ export interface ILibp2pOptions { announce?: string[]; }; datastore?: Datastore; - peerDiscovery?: (typeof Bootstrap | typeof MDNS)[]; + peerDiscovery?: (Bootstrap | MulticastDNS)[]; bootMultiaddrs?: string[]; maxConnections?: number; minConnections?: number; + metrics?: boolean; } -export class NodejsNode extends LibP2p { - constructor(options: ILibp2pOptions) { - super({ - peerId: options.peerId, - addresses: { - listen: options.addresses.listen, - announce: options.addresses.announce || [], - }, - modules: { - connEncryption: [NOISE], - transport: [TCP], - streamMuxer: [Mplex], - peerDiscovery: options.peerDiscovery || [Bootstrap, MDNS], - }, - dialer: { - maxParallelDials: 100, - maxAddrsToDial: 4, - maxDialsPerPeer: 2, - dialTimeout: 30_000, - }, - connectionManager: { - autoDial: false, - // DOCS: the maximum number of connections libp2p is willing to have before it starts disconnecting. - // If ConnectionManager.size > maxConnections calls _maybeDisconnectOne() which will sort peers disconnect - // the one with the least `_peerValues`. That's a custom peer generalized score that's not used, so it always - // has the same value in current Lodestar usage. - maxConnections: options.maxConnections, - // DOCS: the minimum number of connections below which libp2p not activate preemptive disconnections. - // If ConnectionManager.size < minConnections, it won't prune peers in _maybeDisconnectOne(). If autoDial is - // off it doesn't have any effect in behaviour. - minConnections: options.minConnections, - }, - datastore: options.datastore, - peerStore: { - persistence: !!options.datastore, - }, - config: { - nat: { - // libp2p usage of nat-api is broken as shown in this issue. https://github.com/ChainSafe/lodestar/issues/2996 - // Also, unnsolicited usage of UPnP is not great, and should be customizable with flags - enabled: false, - }, - relay: { - enabled: false, - hop: { - enabled: false, - active: false, - }, - advertise: { - enabled: false, - ttl: 0, - bootDelay: 0, - }, - autoRelay: { - enabled: false, - maxListeners: 0, - }, - }, - peerDiscovery: { - autoDial: false, - mdns: { - peerId: options.peerId, - }, - bootstrap: { - enabled: !!(options.bootMultiaddrs && options.bootMultiaddrs.length), - interval: 2000, - list: (options.bootMultiaddrs || []) as string[], - }, - }, - }, - }); +export async function createNodejsLibp2p(options: ILibp2pOptions): Promise { + const peerDiscovery = []; + if (options.peerDiscovery) { + peerDiscovery.push(...options.peerDiscovery); + } else { + if ((options.bootMultiaddrs?.length ?? 0) > 0) { + peerDiscovery.push(new Bootstrap({interval: 2000, list: options.bootMultiaddrs ?? []})); + } + peerDiscovery.push(new MulticastDNS()); } + return await createLibp2p({ + peerId: options.peerId, + addresses: { + listen: options.addresses.listen, + announce: options.addresses.announce || [], + }, + connectionEncryption: [new Noise()], + transports: [new TCP()], + streamMuxers: [new Mplex()], + peerDiscovery, + metrics: { + enabled: Boolean(options.metrics), + }, + connectionManager: { + // dialer config + maxParallelDials: 100, + maxAddrsToDial: 4, + maxDialsPerPeer: 2, + dialTimeout: 30_000, + + autoDial: false, + // DOCS: the maximum number of connections libp2p is willing to have before it starts disconnecting. + // If ConnectionManager.size > maxConnections calls _maybeDisconnectOne() which will sort peers disconnect + // the one with the least `_peerValues`. That's a custom peer generalized score that's not used, so it always + // has the same value in current Lodestar usage. + maxConnections: options.maxConnections, + // DOCS: the minimum number of connections below which libp2p not activate preemptive disconnections. + // If ConnectionManager.size < minConnections, it won't prune peers in _maybeDisconnectOne(). If autoDial is + // off it doesn't have any effect in behaviour. + minConnections: options.minConnections, + }, + datastore: options.datastore, + nat: { + // libp2p usage of nat-api is broken as shown in this issue. https://github.com/ChainSafe/lodestar/issues/2996 + // Also, unnsolicited usage of UPnP is not great, and should be customizable with flags + enabled: false, + }, + relay: { + enabled: false, + hop: { + enabled: false, + active: false, + }, + advertise: { + enabled: false, + ttl: 0, + bootDelay: 0, + }, + autoRelay: { + enabled: false, + maxListeners: 0, + }, + }, + }); } diff --git a/packages/beacon-node/src/network/nodejs/util.ts b/packages/beacon-node/src/network/nodejs/util.ts index 169ac34852..f275251bc7 100644 --- a/packages/beacon-node/src/network/nodejs/util.ts +++ b/packages/beacon-node/src/network/nodejs/util.ts @@ -1,14 +1,15 @@ -import PeerId from "peer-id"; -import LibP2p from "libp2p"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Libp2p} from "libp2p"; import {ENR} from "@chainsafe/discv5"; -import {defaultDiscv5Options, defaultNetworkOptions, INetworkOptions} from "../options.js"; import {Eth2PeerDataStore} from "../peers/datastore.js"; +import {defaultDiscv5Options, defaultNetworkOptions, INetworkOptions} from "../options.js"; import {isLocalMultiAddr, clearMultiaddrUDP} from "../util.js"; -import {NodejsNode} from "./bundle.js"; +import {createNodejsLibp2p as _createNodejsLibp2p} from "./bundle.js"; export type NodeJsLibp2pOpts = { peerStoreDir?: string; disablePeerDiscovery?: boolean; + metrics?: boolean; }; /** @@ -21,7 +22,7 @@ export async function createNodeJsLibp2p( peerIdOrPromise: PeerId | Promise, networkOpts: Partial = {}, nodeJsLibp2pOpts: NodeJsLibp2pOpts = {} -): Promise { +): Promise { const peerId = await Promise.resolve(peerIdOrPromise); const localMultiaddrs = networkOpts.localMultiaddrs || defaultNetworkOptions.localMultiaddrs; const bootMultiaddrs = networkOpts.bootMultiaddrs || defaultNetworkOptions.bootMultiaddrs; @@ -62,7 +63,7 @@ export async function createNodeJsLibp2p( } } - return new NodejsNode({ + return _createNodejsLibp2p({ peerId, addresses: {listen: localMultiaddrs}, datastore, @@ -71,5 +72,6 @@ export async function createNodeJsLibp2p( minConnections: networkOpts.targetPeers, // If peer discovery is enabled let the default in NodejsNode peerDiscovery: disablePeerDiscovery ? [] : undefined, + metrics: nodeJsLibp2pOpts.metrics, }); } diff --git a/packages/beacon-node/src/network/peers/datastore.ts b/packages/beacon-node/src/network/peers/datastore.ts index 05fe15c858..a999cd1c5a 100644 --- a/packages/beacon-node/src/network/peers/datastore.ts +++ b/packages/beacon-node/src/network/peers/datastore.ts @@ -1,6 +1,6 @@ import {BaseDatastore} from "datastore-core"; -import LevelDatastore from "datastore-level"; -import {Key, KeyQuery, Query, Options, Pair} from "interface-datastore"; +import {LevelDatastore} from "datastore-level"; +import {Key, KeyQuery, Query, Pair} from "interface-datastore"; type MemoryItem = { lastAccessedMs: number; @@ -124,21 +124,21 @@ export class Eth2PeerDataStore extends BaseDatastore { await this._dbDatastore.delete(key); } - async *_all(q: Query, options?: Options): AsyncIterable { + async *_all(q: Query): AsyncIterable { for (const [key, value] of this._memoryDatastore.entries()) { yield { key: new Key(key), value: value.data, }; } - yield* this._dbDatastore.query(q, options); + yield* this._dbDatastore.query(q); } - async *_allKeys(q: KeyQuery, options?: Options): AsyncIterable { + async *_allKeys(q: KeyQuery): AsyncIterable { for (const key of this._memoryDatastore.keys()) { yield new Key(key); } - yield* this._dbDatastore.queryKeys(q, options); + yield* this._dbDatastore.queryKeys(q); } private async _addDirtyItem(keyStr: string): Promise { diff --git a/packages/beacon-node/src/network/peers/discover.ts b/packages/beacon-node/src/network/peers/discover.ts index 8601c2538f..acc4d46966 100644 --- a/packages/beacon-node/src/network/peers/discover.ts +++ b/packages/beacon-node/src/network/peers/discover.ts @@ -1,16 +1,16 @@ import crypto from "node:crypto"; import {promisify} from "node:util"; -import LibP2p from "libp2p"; -import PeerId from "peer-id"; -import {Multiaddr} from "multiaddr"; +import {Libp2p} from "libp2p"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {multiaddr, Multiaddr} from "@multiformats/multiaddr"; import {IBeaconConfig} from "@lodestar/config"; import {ILogger} from "@lodestar/utils"; import {Discv5, ENR, IDiscv5Metrics, IDiscv5DiscoveryInputOptions} from "@chainsafe/discv5"; import {ATTESTATION_SUBNET_COUNT, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; import {IMetrics} from "../../metrics/index.js"; -import {ENRKey, SubnetType} from "../metadata.js"; -import {prettyPrintPeerId} from "../util.js"; import {pruneSetToMax} from "../../util/map.js"; +import {ENRKey, SubnetType} from "../metadata.js"; +import {getConnectionsMap, prettyPrintPeerId} from "../util.js"; import {IPeerRpcScoreStore, ScoreState} from "./score.js"; import {deserializeEnrSubnets, zeroAttnets, zeroSyncnets} from "./utils/enrSubnetsDeserialize.js"; @@ -29,7 +29,7 @@ export type PeerDiscoveryOpts = { }; export type PeerDiscoveryModules = { - libp2p: LibP2p; + libp2p: Libp2p; peerRpcScores: IPeerRpcScoreStore; metrics: IMetrics | null; logger: ILogger; @@ -77,7 +77,7 @@ type CachedENR = { */ export class PeerDiscovery { readonly discv5: Discv5; - private libp2p: LibP2p; + private libp2p: Libp2p; private peerRpcScores: IPeerRpcScoreStore; private metrics: IMetrics | null; private logger: ILogger; @@ -112,7 +112,7 @@ export class PeerDiscovery { this.discv5 = Discv5.create({ enr: opts.discv5.enr, peerId: modules.libp2p.peerId, - multiaddr: new Multiaddr(opts.discv5.bindAddr), + multiaddr: multiaddr(opts.discv5.bindAddr), config: opts.discv5, // TODO: IDiscv5Metrics is not properly defined, should remove the collect() function metrics: (modules.metrics?.discv5 as unknown) as { @@ -295,7 +295,7 @@ export class PeerDiscovery { } // Ignore connected peers. TODO: Is this check necessary? - if (this.isPeerConnected(peerId.toB58String())) { + if (this.isPeerConnected(peerId.toString())) { return DiscoveredPeerStatus.already_connected; } @@ -397,8 +397,8 @@ export class PeerDiscovery { /** Check if there is 1+ open connection with this peer */ private isPeerConnected(peerIdStr: PeerIdStr): boolean { - const connections = this.libp2p.connectionManager.connections.get(peerIdStr); - return Boolean(connections && connections.some((connection) => connection.stat.status === "open")); + const connections = getConnectionsMap(this.libp2p.connectionManager).get(peerIdStr); + return Boolean(connections && connections.some((connection) => connection.stat.status === "OPEN")); } } diff --git a/packages/beacon-node/src/network/peers/peerManager.ts b/packages/beacon-node/src/network/peers/peerManager.ts index aba4be63fb..62e0e08aed 100644 --- a/packages/beacon-node/src/network/peers/peerManager.ts +++ b/packages/beacon-node/src/network/peers/peerManager.ts @@ -1,5 +1,6 @@ -import LibP2p, {Connection} from "libp2p"; -import PeerId from "peer-id"; +import {Libp2p} from "libp2p"; +import {Connection} from "@libp2p/interface-connection"; +import {PeerId} from "@libp2p/interface-peer-id"; import {IDiscv5DiscoveryInputOptions} from "@chainsafe/discv5"; import {BitArray} from "@chainsafe/ssz"; import {SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; @@ -11,7 +12,7 @@ import {GoodByeReasonCode, GOODBYE_KNOWN_CODES, Libp2pEvent} from "../../constan import {IMetrics} from "../../metrics/index.js"; import {NetworkEvent, INetworkEventBus} from "../events.js"; import {IReqResp, ReqRespMethod, RequestTypedContainer} from "../reqresp/index.js"; -import {prettyPrintPeerId} from "../util.js"; +import {getConnection, getConnectionsMap, prettyPrintPeerId} from "../util.js"; import {ISubnetsService} from "../subnets/index.js"; import {SubnetType} from "../metadata.js"; import {Eth2Gossipsub} from "../gossip/gossipsub.js"; @@ -72,7 +73,7 @@ export type PeerManagerOpts = { }; export type PeerManagerModules = { - libp2p: LibP2p; + libp2p: Libp2p; logger: ILogger; metrics: IMetrics | null; reqResp: IReqResp; @@ -103,7 +104,7 @@ enum RelevantPeerStatus { * - Disconnect peers if over target peers */ export class PeerManager { - private libp2p: LibP2p; + private libp2p: Libp2p; private logger: ILogger; private metrics: IMetrics | null; private reqResp: IReqResp; @@ -156,8 +157,8 @@ export class PeerManager { async start(): Promise { await this.discovery?.start(); - this.libp2p.connectionManager.on(Libp2pEvent.peerConnect, this.onLibp2pPeerConnect); - this.libp2p.connectionManager.on(Libp2pEvent.peerDisconnect, this.onLibp2pPeerDisconnect); + this.libp2p.connectionManager.addEventListener(Libp2pEvent.peerConnect, this.onLibp2pPeerConnect); + this.libp2p.connectionManager.addEventListener(Libp2pEvent.peerDisconnect, this.onLibp2pPeerDisconnect); this.networkEventBus.on(NetworkEvent.reqRespRequest, this.onRequest); // On start-up will connected to existing peers in libp2p.peerStore, same as autoDial behaviour @@ -174,8 +175,8 @@ export class PeerManager { async stop(): Promise { await this.discovery?.stop(); - this.libp2p.connectionManager.removeListener(Libp2pEvent.peerConnect, this.onLibp2pPeerConnect); - this.libp2p.connectionManager.removeListener(Libp2pEvent.peerDisconnect, this.onLibp2pPeerDisconnect); + this.libp2p.connectionManager.removeEventListener(Libp2pEvent.peerConnect, this.onLibp2pPeerConnect); + this.libp2p.connectionManager.removeEventListener(Libp2pEvent.peerDisconnect, this.onLibp2pPeerDisconnect); this.networkEventBus.off(NetworkEvent.reqRespRequest, this.onRequest); for (const interval of this.intervals) clearInterval(interval); } @@ -217,7 +218,7 @@ export class PeerManager { */ reStatusPeers(peers: PeerId[]): void { for (const peer of peers) { - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); if (peerData) { // Set to 0 to trigger a status request after calling pingAndStatusTimeouts() peerData.lastStatusUnixTsMs = 0; @@ -231,7 +232,7 @@ export class PeerManager { */ private onRequest = (request: RequestTypedContainer, peer: PeerId): void => { try { - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); if (peerData) { peerData.lastReceivedMsgUnixTsMs = Date.now(); } @@ -254,7 +255,7 @@ export class PeerManager { */ private onPing(peer: PeerId, seqNumber: phase0.Ping): void { // if the sequence number is unknown update the peer's metadata - const metadata = this.connectedPeers.get(peer.toB58String())?.metadata; + const metadata = this.connectedPeers.get(peer.toString())?.metadata; if (!metadata || metadata.seqNumber < seqNumber) { void this.requestMetadata(peer); } @@ -266,7 +267,7 @@ export class PeerManager { private onMetadata(peer: PeerId, metadata: allForks.Metadata): void { // Store metadata always in case the peer updates attnets but not the sequence number // Trust that the peer always sends the latest metadata (From Lighthouse) - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); if (peerData) { peerData.metadata = { seqNumber: metadata.seqNumber, @@ -284,7 +285,7 @@ export class PeerManager { this.logger.verbose("Received goodbye request", {peer: prettyPrintPeerId(peer), goodbye, reason}); this.metrics?.peerGoodbyeReceived.inc({reason}); - const conn = this.libp2p.connectionManager.get(peer); + const conn = getConnection(this.libp2p.connectionManager, peer.toString()); if (conn && Date.now() - conn.stat.timeline.open > LONG_PEER_CONNECTION_MS) { this.metrics?.peerLongConnectionDisconnect.inc({reason}); } @@ -299,7 +300,7 @@ export class PeerManager { */ private onStatus(peer: PeerId, status: phase0.Status): void { // reset the to-status timer of this peer - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); if (peerData) peerData.lastStatusUnixTsMs = Date.now(); let isIrrelevant: boolean; @@ -329,7 +330,7 @@ export class PeerManager { // NOTE: Peer may not be connected anymore at this point, potential race condition // libp2p.connectionManager.get() returns not null if there's +1 open connections with `peer` if (peerData) peerData.relevantStatus = RelevantPeerStatus.relevant; - if (this.libp2p.connectionManager.get(peer)) { + if (getConnection(this.libp2p.connectionManager, peer.toString())) { this.networkEventBus.emit(NetworkEvent.peerConnected, peer, status); } } @@ -347,7 +348,7 @@ export class PeerManager { this.onPing(peer, await this.reqResp.ping(peer)); // If peer replies a PING request also update lastReceivedMsg - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); if (peerData) peerData.lastReceivedMsgUnixTsMs = Date.now(); } catch (e) { // TODO: Downvote peer here or in the reqResp layer @@ -402,7 +403,7 @@ export class PeerManager { const {peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries} = prioritizePeers( connectedHealthyPeers.map((peer) => { - const peerData = this.connectedPeers.get(peer.toB58String()); + const peerData = this.connectedPeers.get(peer.toString()); return { id: peer, attnets: peerData?.metadata?.attnets ?? null, @@ -457,7 +458,7 @@ export class PeerManager { // Prune connectedPeers map in case it leaks. It has happen in previous nodes, // disconnect is not always called for all peers if (this.connectedPeers.size > connectedPeers.length * 2) { - const actualConnectedPeerIds = new Set(connectedPeers.map((peerId) => peerId.toB58String())); + const actualConnectedPeerIds = new Set(connectedPeers.map((peerId) => peerId.toString())); for (const [peerIdStr, peerData] of this.connectedPeers) { if (!actualConnectedPeerIds.has(peerIdStr)) { this.connectedPeers.delete(peerIdStr); @@ -514,11 +515,12 @@ export class PeerManager { * Registers a peer as connected. The `direction` parameter determines if the peer is being * dialed or connecting to us. */ - private onLibp2pPeerConnect = async (libp2pConnection: Connection): Promise => { + private onLibp2pPeerConnect = async (evt: CustomEvent): Promise => { + const libp2pConnection = evt.detail; const {direction, status} = libp2pConnection.stat; const peer = libp2pConnection.remotePeer; - if (!this.connectedPeers.has(peer.toB58String())) { + if (!this.connectedPeers.has(peer.toString())) { // On connection: // - Outbound connections: send a STATUS and PING request // - Inbound connections: expect to be STATUS'd, schedule STATUS and PING for latter @@ -538,14 +540,12 @@ export class PeerManager { agentClient: null, encodingPreference: null, }; - this.connectedPeers.set(peer.toB58String(), peerData); + this.connectedPeers.set(peer.toString(), peerData); if (direction === "outbound") { - // There's an issue that cause libp2p to open another connection in peer:connect event handler - // This causes the sim test multiThreadSingleNode fails because no gossip block is received - // TODO: remove setTimeout once this is done - // https://github.com/libp2p/js-libp2p/pull/1171 - setTimeout(() => this.pingAndStatusTimeouts(), 0); + //this.pingAndStatusTimeouts(); + void this.requestPing(peer); + void this.requestStatus(peer, this.chain.getStatus()); } // AgentVersion was set in libp2p IdentifyService, 'peer:connect' event handler @@ -569,12 +569,13 @@ export class PeerManager { /** * The libp2p Upgrader has ended a connection */ - private onLibp2pPeerDisconnect = (libp2pConnection: Connection): void => { + private onLibp2pPeerDisconnect = (evt: CustomEvent): void => { + const libp2pConnection = evt.detail; const {direction, status} = libp2pConnection.stat; const peer = libp2pConnection.remotePeer; // remove the ping and status timer for the peer - this.connectedPeers.delete(peer.toB58String()); + this.connectedPeers.delete(peer.toString()); this.logger.verbose("peer disconnected", {peer: prettyPrintPeerId(peer), direction, status}); this.networkEventBus.emit(NetworkEvent.peerDisconnected, peer); @@ -595,7 +596,7 @@ export class PeerManager { const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || ""; this.metrics?.peerGoodbyeSent.inc({reason}); - const conn = this.libp2p.connectionManager.get(peer); + const conn = getConnection(this.libp2p.connectionManager, peer.toString()); if (conn && Date.now() - conn.stat.timeline.open > LONG_PEER_CONNECTION_MS) { this.metrics?.peerLongConnectionDisconnect.inc({reason}); } @@ -620,13 +621,13 @@ export class PeerManager { metrics.peerLongLivedAttnets.reset(); metrics.peerConnectionLength.reset(); - for (const connections of this.libp2p.connectionManager.connections.values()) { - const openCnx = connections.find((cnx) => cnx.stat.status === "open"); + for (const connections of getConnectionsMap(this.libp2p.connectionManager).values()) { + const openCnx = connections.find((cnx) => cnx.stat.status === "OPEN"); if (openCnx) { const direction = openCnx.stat.direction; peersByDirection.set(direction, 1 + (peersByDirection.get(direction) ?? 0)); const peerId = openCnx.remotePeer; - const peerData = this.connectedPeers.get(peerId.toB58String()); + const peerData = this.connectedPeers.get(peerId.toString()); const client = peerData?.agentClient ?? ClientKind.Unknown; peersByClient.set(client, 1 + (peersByClient.get(client) ?? 0)); diff --git a/packages/beacon-node/src/network/peers/peersData.ts b/packages/beacon-node/src/network/peers/peersData.ts index 7682a491d6..cd3b90307c 100644 --- a/packages/beacon-node/src/network/peers/peersData.ts +++ b/packages/beacon-node/src/network/peers/peersData.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {altair} from "@lodestar/types"; import {Encoding} from "../reqresp/types.js"; import {ClientKind} from "./client.js"; diff --git a/packages/beacon-node/src/network/peers/score.ts b/packages/beacon-node/src/network/peers/score.ts index 9e8b4ed830..5c85f36640 100644 --- a/packages/beacon-node/src/network/peers/score.ts +++ b/packages/beacon-node/src/network/peers/score.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {MapDef, pruneSetToMax} from "../../util/map.js"; import {gossipScoreThresholds} from "../gossip/scoringParameters.js"; import {IMetrics} from "../../metrics/index.js"; @@ -105,7 +105,7 @@ export class PeerRpcScoreStore implements IPeerRpcScoreStore { } getScore(peer: PeerId): number { - return this.scores.get(peer.toB58String())?.getScore() ?? DEFAULT_SCORE; + return this.scores.get(peer.toString())?.getScore() ?? DEFAULT_SCORE; } getScoreState(peer: PeerId): ScoreState { @@ -113,7 +113,7 @@ export class PeerRpcScoreStore implements IPeerRpcScoreStore { } applyAction(peer: PeerId, action: PeerAction, actionName: string): void { - const peerScore = this.scores.getOrDefault(peer.toB58String()); + const peerScore = this.scores.getOrDefault(peer.toString()); peerScore.add(peerActionScore[action]); this.metrics?.peersReportPeerCount.inc({reason: actionName}); diff --git a/packages/beacon-node/src/network/peers/utils/getConnectedPeerIds.ts b/packages/beacon-node/src/network/peers/utils/getConnectedPeerIds.ts index 5dfed8b744..9f06cd8199 100644 --- a/packages/beacon-node/src/network/peers/utils/getConnectedPeerIds.ts +++ b/packages/beacon-node/src/network/peers/utils/getConnectedPeerIds.ts @@ -1,12 +1,14 @@ -import LibP2p, {Connection} from "libp2p"; -import PeerId from "peer-id"; +import {Libp2p} from "libp2p"; +import {Connection} from "@libp2p/interface-connection"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {getConnectionsMap} from "../../util.js"; /** * Return peers with at least one connection in status "open" */ -export function getConnectedPeerIds(libp2p: LibP2p): PeerId[] { +export function getConnectedPeerIds(libp2p: Libp2p): PeerId[] { const peerIds: PeerId[] = []; - for (const connections of libp2p.connectionManager.connections.values()) { + for (const connections of getConnectionsMap(libp2p.connectionManager).values()) { const openConnection = connections.find(isConnectionOpen); if (openConnection) { peerIds.push(openConnection.remotePeer); @@ -18,8 +20,8 @@ export function getConnectedPeerIds(libp2p: LibP2p): PeerId[] { /** * Efficiently check if there is at least one peer connected */ -export function hasSomeConnectedPeer(libp2p: LibP2p): boolean { - for (const connections of libp2p.connectionManager.connections.values()) { +export function hasSomeConnectedPeer(libp2p: Libp2p): boolean { + for (const connections of getConnectionsMap(libp2p.connectionManager).values()) { if (connections.some(isConnectionOpen)) { return true; } @@ -28,5 +30,5 @@ export function hasSomeConnectedPeer(libp2p: LibP2p): boolean { } function isConnectionOpen(connection: Connection): boolean { - return connection.stat.status === "open"; + return connection.stat.status === "OPEN"; } diff --git a/packages/beacon-node/src/network/peers/utils/prioritizePeers.ts b/packages/beacon-node/src/network/peers/utils/prioritizePeers.ts index 9e0cce820c..53768e965b 100644 --- a/packages/beacon-node/src/network/peers/utils/prioritizePeers.ts +++ b/packages/beacon-node/src/network/peers/utils/prioritizePeers.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {altair, phase0} from "@lodestar/types"; import {BitArray} from "@chainsafe/ssz"; import {ATTESTATION_SUBNET_COUNT, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; diff --git a/packages/beacon-node/src/network/reqresp/encoders/requestDecode.ts b/packages/beacon-node/src/network/reqresp/encoders/requestDecode.ts index e05f336110..b3645cf6fb 100644 --- a/packages/beacon-node/src/network/reqresp/encoders/requestDecode.ts +++ b/packages/beacon-node/src/network/reqresp/encoders/requestDecode.ts @@ -1,8 +1,8 @@ -import BufferList from "bl"; +import {Sink} from "it-stream-types"; +import {Uint8ArrayList} from "uint8arraylist"; import {getRequestSzzTypeByMethod, Protocol, RequestBody} from "../types.js"; import {BufferedSource} from "../utils/index.js"; import {readEncodedPayload} from "../encodingStrategies/index.js"; - /** * Consumes a stream source to read a `` * ```bnf @@ -11,7 +11,7 @@ import {readEncodedPayload} from "../encodingStrategies/index.js"; */ export function requestDecode( protocol: Pick -): (source: AsyncIterable) => Promise { +): Sink> { return async function requestDecodeSink(source) { const type = getRequestSzzTypeByMethod(protocol.method); if (!type) { @@ -20,7 +20,7 @@ export function requestDecode( } // Request has a single payload, so return immediately - const bufferedSource = new BufferedSource(source as AsyncGenerator); + const bufferedSource = new BufferedSource(source as AsyncGenerator); return await readEncodedPayload(bufferedSource, protocol.encoding, type); }; } diff --git a/packages/beacon-node/src/network/reqresp/encoders/responseDecode.ts b/packages/beacon-node/src/network/reqresp/encoders/responseDecode.ts index 37c5644d49..59fe006a4a 100644 --- a/packages/beacon-node/src/network/reqresp/encoders/responseDecode.ts +++ b/packages/beacon-node/src/network/reqresp/encoders/responseDecode.ts @@ -1,3 +1,4 @@ +import {Uint8ArrayList} from "uint8arraylist"; import {ForkName} from "@lodestar/params"; import {IForkDigestContext} from "@lodestar/config"; import {RespStatus} from "../../../constants/index.js"; @@ -35,10 +36,10 @@ export function responseDecode( onFirstHeader: () => void; onFirstResponseChunk: () => void; } -): (source: AsyncIterable) => AsyncIterable { +): (source: AsyncIterable) => AsyncIterable { return async function* responseDecodeSink(source) { const contextBytesType = contextBytesTypeByProtocol(protocol); - const bufferedSource = new BufferedSource(source as AsyncGenerator); + const bufferedSource = new BufferedSource(source as AsyncGenerator); let readFirstHeader = false; let readFirstResponseChunk = false; @@ -108,21 +109,25 @@ export async function readResultHeader(bufferedSource: BufferedSource): Promise< */ export async function readErrorMessage(bufferedSource: BufferedSource): Promise { // Read at least 256 or wait for the stream to end + let length; for await (const buffer of bufferedSource) { // Wait for next chunk with bytes or for the stream to end // Note: The entire is expected to be in the same chunk if (buffer.length >= 256) { + length = 256; break; } + length = buffer.length; } - const bytes = bufferedSource["buffer"].slice(0, 256); + const bytes = bufferedSource["buffer"].slice(0, length); try { return decodeErrorMessage(bytes); } catch { // Error message is optional and may not be included in the response stream - return bytes.toString("hex"); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + return Buffer.prototype.toString.call(bytes, "hex"); } } @@ -150,7 +155,7 @@ export async function readForkName( /** * Consumes a stream source to read ``, where it's a fixed-width 4 byte */ -export async function readContextBytesForkDigest(bufferedSource: BufferedSource): Promise { +export async function readContextBytesForkDigest(bufferedSource: BufferedSource): Promise { for await (const buffer of bufferedSource) { if (buffer.length >= CONTEXT_BYTES_FORK_DIGEST_LENGTH) { const bytes = buffer.slice(0, CONTEXT_BYTES_FORK_DIGEST_LENGTH); diff --git a/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/decode.ts b/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/decode.ts index 109d4893d0..0598ad0c9d 100644 --- a/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/decode.ts +++ b/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/decode.ts @@ -1,5 +1,5 @@ -import BufferList from "bl"; import varint from "varint"; +import {Uint8ArrayList} from "uint8arraylist"; import {MAX_VARINT_BYTES} from "../../../../constants/index.js"; import {BufferedSource} from "../../utils/index.js"; import {RequestOrResponseType, RequestOrIncomingResponseBody} from "../../types.js"; @@ -79,9 +79,9 @@ export async function readSszSnappyHeader( * Reads `` for ssz-snappy and decompress. * The returned bytes can be SSZ deseralized */ -export async function readSszSnappyBody(bufferedSource: BufferedSource, sszDataLength: number): Promise { +export async function readSszSnappyBody(bufferedSource: BufferedSource, sszDataLength: number): Promise { const decompressor = new SnappyFramesUncompress(); - const uncompressedData = new BufferList(); + const uncompressedData = new Uint8ArrayList(); let readBytes = 0; for await (const buffer of bufferedSource) { @@ -98,7 +98,7 @@ export async function readSszSnappyBody(bufferedSource: BufferedSource, sszDataL // stream contents can be passed through a buffered Snappy reader to decompress frame by frame try { - const uncompressed = decompressor.uncompress(buffer.slice()); + const uncompressed = decompressor.uncompress(buffer); buffer.consume(buffer.length); if (uncompressed !== null) { uncompressedData.append(uncompressed); @@ -118,7 +118,7 @@ export async function readSszSnappyBody(bufferedSource: BufferedSource, sszDataL } // buffer.length === n - return uncompressedData.slice(0, sszDataLength); + return uncompressedData.subarray(0, sszDataLength); } // SHOULD consider invalid: An early EOF before fully reading the declared length-prefix worth of SSZ bytes @@ -130,7 +130,7 @@ export async function readSszSnappyBody(bufferedSource: BufferedSource, sszDataL * `isSszTree` option allows the SignedBeaconBlock type to be deserialized as a tree */ function deserializeSszBody( - bytes: Buffer, + bytes: Uint8Array, type: RequestOrResponseTypeRead ): T { try { diff --git a/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/snappyFrames/uncompress.ts b/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/snappyFrames/uncompress.ts index 3934b4bcc8..744c722546 100644 --- a/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/snappyFrames/uncompress.ts +++ b/packages/beacon-node/src/network/reqresp/encodingStrategies/sszSnappy/snappyFrames/uncompress.ts @@ -1,10 +1,10 @@ -import BufferList from "bl"; import {uncompress} from "snappyjs"; +import {Uint8ArrayList} from "uint8arraylist"; const IDENTIFIER = Buffer.from([0x73, 0x4e, 0x61, 0x50, 0x70, 0x59]); export class SnappyFramesUncompress { - private buffer = new BufferList(); + private buffer = new Uint8ArrayList(); private state: IUncompressState = { foundIdentifier: false, @@ -15,20 +15,20 @@ export class SnappyFramesUncompress { * @param chunk * @return Buffer if there is one or more whole frames, null if it's partial */ - uncompress(chunk: Buffer): Buffer | null { + uncompress(chunk: Uint8ArrayList): Uint8ArrayList | null { this.buffer.append(chunk); - const result = new BufferList(); + const result = new Uint8ArrayList(); while (this.buffer.length > 0) { if (this.buffer.length < 4) break; const type = getChunkType(this.buffer.get(0)); const frameSize = getFrameSize(this.buffer, 1); - const data = this.buffer.slice(4, 4 + frameSize); if (this.buffer.length - 4 < frameSize) { break; } + const data = this.buffer.subarray(4, 4 + frameSize); this.buffer.consume(4 + frameSize); if (!this.state.foundIdentifier && type !== ChunkType.IDENTIFIER) { @@ -36,7 +36,8 @@ export class SnappyFramesUncompress { } if (type === ChunkType.IDENTIFIER) { - if (!data.equals(IDENTIFIER)) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + if (!Buffer.prototype.equals.call(data, IDENTIFIER)) { throw "malformed input: bad identifier"; } this.state.foundIdentifier = true; @@ -44,21 +45,21 @@ export class SnappyFramesUncompress { } if (type === ChunkType.COMPRESSED) { - result.append(uncompress(data.slice(4))); + result.append(uncompress(data.subarray(4))); } if (type === ChunkType.UNCOMPRESSED) { - result.append(data.slice(4)); + result.append(data.subarray(4)); } } if (result.length === 0) { return null; } else { - return result.slice(); + return result; } } reset(): void { - this.buffer = new BufferList(); + this.buffer = new Uint8ArrayList(); this.state = { foundIdentifier: false, }; @@ -76,7 +77,7 @@ enum ChunkType { PADDING = 0xfe, } -function getFrameSize(buffer: BufferList, offset: number): number { +function getFrameSize(buffer: Uint8ArrayList, offset: number): number { return buffer.get(offset) + (buffer.get(offset + 1) << 8) + (buffer.get(offset + 2) << 16); } diff --git a/packages/beacon-node/src/network/reqresp/interface.ts b/packages/beacon-node/src/network/reqresp/interface.ts index be23c6d67e..eb8355f9bf 100644 --- a/packages/beacon-node/src/network/reqresp/interface.ts +++ b/packages/beacon-node/src/network/reqresp/interface.ts @@ -1,5 +1,5 @@ -import LibP2p from "libp2p"; -import PeerId from "peer-id"; +import {Libp2p} from "libp2p"; +import {PeerId} from "@libp2p/interface-peer-id"; import {ForkName} from "@lodestar/params"; import {IBeaconConfig} from "@lodestar/config"; import {allForks, phase0} from "@lodestar/types"; @@ -29,7 +29,7 @@ export interface IReqResp { export interface IReqRespModules { config: IBeaconConfig; - libp2p: LibP2p; + libp2p: Libp2p; peersData: PeersData; logger: ILogger; metadata: MetadataController; @@ -39,40 +39,6 @@ export interface IReqRespModules { metrics: IMetrics | null; } -export type Libp2pConnection = { - stream: Libp2pStream; - /** - * When dialing a protocol you may request multiple protocols by order of preference. - * Libp2p will negotiate a protocol and the one stablished will be returned in this variable. - * Example value: `'/eth2/beacon_chain/req/metadata/1/ssz_snappy'` - */ - protocol: string; -}; - -/** - * Stream types from libp2p.dialProtocol are too vage and cause compilation type issues - * These source and sink types are more precise to our usage - */ -export type Libp2pStream = { - source: AsyncIterable; - sink: (source: AsyncIterable) => Promise; - /** - * `libp2p-mplex`: Close for reading - * ```ts - * () => stream.source.end() - * ``` - */ - close: () => void; - /** - * `libp2p-mplex`: Close immediately for reading and writing (remote error) - */ - reset: () => void; - /** - * `libp2p-mplex`: Close for reading and writing (local error) - */ - abort: (err: Error) => void; -}; - /** * Rate limiter interface for inbound and outbound requests. */ diff --git a/packages/beacon-node/src/network/reqresp/reqResp.ts b/packages/beacon-node/src/network/reqresp/reqResp.ts index 5e3e174ab3..bf2ba6329b 100644 --- a/packages/beacon-node/src/network/reqresp/reqResp.ts +++ b/packages/beacon-node/src/network/reqresp/reqResp.ts @@ -1,19 +1,18 @@ import {setMaxListeners} from "node:events"; -import {Connection} from "libp2p"; -import {HandlerProps} from "libp2p/src/registrar"; -import LibP2p from "libp2p"; -import PeerId from "peer-id"; +import {Libp2p} from "libp2p"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Connection, Stream} from "@libp2p/interface-connection"; import {ForkName} from "@lodestar/params"; import {IBeaconConfig} from "@lodestar/config"; import {allForks, phase0} from "@lodestar/types"; import {ILogger} from "@lodestar/utils"; import {RespStatus, timeoutOptions} from "../../constants/index.js"; -import {IPeerRpcScoreStore} from "../peers/index.js"; -import {MetadataController} from "../metadata.js"; -import {INetworkEventBus, NetworkEvent} from "../events.js"; import {PeersData} from "../peers/peersData.js"; -import {IMetrics} from "../../metrics/index.js"; -import {IReqResp, IReqRespModules, IRateLimiter, Libp2pStream} from "./interface.js"; +import {MetadataController} from "../metadata.js"; +import {IPeerRpcScoreStore} from "../peers/score.js"; +import {INetworkEventBus, NetworkEvent} from "../events.js"; +import {IMetrics} from "../../metrics/metrics.js"; +import {IReqResp, IReqRespModules, IRateLimiter} from "./interface.js"; import {sendRequest} from "./request/index.js"; import {handleRequest, ResponseError} from "./response/index.js"; import {onOutgoingReqRespError} from "./score.js"; @@ -42,7 +41,7 @@ export type IReqRespOptions = Partial; */ export class ReqResp implements IReqResp { private config: IBeaconConfig; - private libp2p: LibP2p; + private libp2p: Libp2p; private readonly peersData: PeersData; private logger: ILogger; private reqRespHandlers: ReqRespHandlers; @@ -78,7 +77,7 @@ export class ReqResp implements IReqResp { for (const [method, version, encoding] of protocolsSupported) { await this.libp2p.handle( formatProtocolId(method, version, encoding), - (this.getRequestHandler({method, version, encoding}) as unknown) as (props: HandlerProps) => void + this.getRequestHandler({method, version, encoding}) ); } this.inboundRateLimiter.start(); @@ -154,7 +153,7 @@ export class ReqResp implements IReqResp { const timer = this.metrics?.reqResp.outgoingRequestRoundtripTime.startTimer({method}); try { - const encoding = this.peersData.getEncodingPreference(peerId.toB58String()) ?? Encoding.SSZ_SNAPPY; + const encoding = this.peersData.getEncodingPreference(peerId.toString()) ?? Encoding.SSZ_SNAPPY; const result = await sendRequest( {forkDigestContext: this.config, logger: this.logger, libp2p: this.libp2p, peersData: this.peersData}, peerId, @@ -189,13 +188,13 @@ export class ReqResp implements IReqResp { } private getRequestHandler({method, version, encoding}: Protocol) { - return async ({connection, stream}: {connection: Connection; stream: Libp2pStream}) => { + return async ({connection, stream}: {connection: Connection; stream: Stream}) => { const peerId = connection.remotePeer; // TODO: Do we really need this now that there is only one encoding? // Remember the prefered encoding of this peer if (method === Method.Status) { - this.peersData.setEncodingPreference(peerId.toB58String(), encoding); + this.peersData.setEncodingPreference(peerId.toString(), encoding); } this.metrics?.reqResp.incomingRequests.inc({method}); diff --git a/packages/beacon-node/src/network/reqresp/request/index.ts b/packages/beacon-node/src/network/reqresp/request/index.ts index c680c04d84..9cf1a0f5f6 100644 --- a/packages/beacon-node/src/network/reqresp/request/index.ts +++ b/packages/beacon-node/src/network/reqresp/request/index.ts @@ -1,6 +1,7 @@ -import pipe from "it-pipe"; -import PeerId from "peer-id"; -import {Libp2p} from "libp2p/src/connection-manager"; +import {pipe} from "it-pipe"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Libp2p} from "libp2p"; +import {Uint8ArrayList} from "uint8arraylist"; import {IForkDigestContext} from "@lodestar/config"; import {ErrorAborted, ILogger, withTimeout, TimeoutError} from "@lodestar/utils"; import {timeoutOptions} from "../../../constants/index.js"; @@ -12,7 +13,6 @@ import {formatProtocolId, renderRequestBody} from "../utils/index.js"; import {ResponseError} from "../response/index.js"; import {requestEncode} from "../encoders/requestEncode.js"; import {responseDecode} from "../encoders/responseDecode.js"; -import {Libp2pConnection} from "../interface.js"; import {collectResponses} from "./collectResponses.js"; import { RequestError, @@ -55,7 +55,7 @@ export async function sendRequest { const {REQUEST_TIMEOUT, DIAL_TIMEOUT} = {...timeoutOptions, ...options}; - const peerIdStr = peerId.toB58String(); + const peerIdStr = peerId.toString(); const peerIdStrShort = prettyPrintPeerId(peerId); const client = peersData.getPeerKind(peerIdStr); const logCtx = {method, encoding, client, peer: peerIdStrShort, requestId}; @@ -85,16 +85,13 @@ export async function sendRequest { const protocolIds = Array.from(protocols.keys()); const conn = await libp2p.dialProtocol(peerId, protocolIds, {signal: timeoutAndParentSignal}); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!conn) throw Error("dialProtocol timeout"); - // TODO: libp2p-ts type Stream does not declare .abort() and requires casting to unknown here - // Remove when https://github.com/ChainSafe/lodestar/issues/2167 - // After #2167 upstream types are still not good enough, and require casting - return (conn as unknown) as Libp2pConnection; + return conn; }, DIAL_TIMEOUT, signal @@ -107,6 +104,7 @@ export async function sendRequest, [ { signal: ttfbTimeoutController.signal, getError: () => new RequestInternalError({code: RequestErrorCode.TTFB_TIMEOUT}), diff --git a/packages/beacon-node/src/network/reqresp/response/index.ts b/packages/beacon-node/src/network/reqresp/response/index.ts index 4549e99c14..03e27ecf69 100644 --- a/packages/beacon-node/src/network/reqresp/response/index.ts +++ b/packages/beacon-node/src/network/reqresp/response/index.ts @@ -1,5 +1,7 @@ -import PeerId from "peer-id"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Stream} from "@libp2p/interface-connection"; +import {Uint8ArrayList} from "uint8arraylist"; import {ILogger, TimeoutError, withTimeout} from "@lodestar/utils"; import {IBeaconConfig} from "@lodestar/config"; import {REQUEST_TIMEOUT, RespStatus} from "../../../constants/index.js"; @@ -7,7 +9,6 @@ import {prettyPrintPeerId} from "../../util.js"; import {PeersData} from "../../peers/peersData.js"; import {Protocol, RequestBody, OutgoingResponseBody} from "../types.js"; import {renderRequestBody} from "../utils/index.js"; -import {Libp2pStream} from "../interface.js"; import {requestDecode} from "../encoders/requestDecode.js"; import {responseEncodeError, responseEncodeSuccess} from "../encoders/responseEncode.js"; import {ResponseError} from "./errors.js"; @@ -39,13 +40,13 @@ type HandleRequestModules = { export async function handleRequest( {config, logger, peersData: peersData}: HandleRequestModules, performRequestHandler: PerformRequestHandler, - stream: Libp2pStream, + stream: Stream, peerId: PeerId, protocol: Protocol, signal?: AbortSignal, requestId = 0 ): Promise { - const client = peersData.getPeerKind(peerId.toB58String()); + const client = peersData.getPeerKind(peerId.toString()); const logCtx = {method: protocol.method, client, peer: prettyPrintPeerId(peerId), requestId}; let responseError: Error | null = null; @@ -56,7 +57,7 @@ export async function handleRequest( (async function* requestHandlerSource() { try { const requestBody = await withTimeout( - () => pipe(stream.source, requestDecode(protocol)), + () => pipe(stream.source as AsyncIterable, requestDecode(protocol)), REQUEST_TIMEOUT, signal ).catch((e: unknown) => { diff --git a/packages/beacon-node/src/network/reqresp/response/rateLimiter.ts b/packages/beacon-node/src/network/reqresp/response/rateLimiter.ts index 8a2568af0a..108297364a 100644 --- a/packages/beacon-node/src/network/reqresp/response/rateLimiter.ts +++ b/packages/beacon-node/src/network/reqresp/response/rateLimiter.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {ILogger} from "@lodestar/utils"; import {IMetrics} from "../../../metrics/index.js"; import {MapDef} from "../../../util/map.js"; @@ -98,7 +98,7 @@ export class InboundRateLimiter implements IRateLimiter { * Tracks a request from a peer and returns whether to allow the request based on the configured rate limit params. */ allowRequest(peerId: PeerId, requestTyped: RequestTypedContainer): boolean { - const peerIdStr = peerId.toB58String(); + const peerIdStr = peerId.toString(); this.lastSeenRequestsByPeer.set(peerIdStr, Date.now()); // rate limit check for request @@ -154,7 +154,7 @@ export class InboundRateLimiter implements IRateLimiter { } prune(peerId: PeerId): void { - const peerIdStr = peerId.toB58String(); + const peerIdStr = peerId.toString(); this.pruneByPeerIdStr(peerIdStr); } diff --git a/packages/beacon-node/src/network/reqresp/utils/bufferedSource.ts b/packages/beacon-node/src/network/reqresp/utils/bufferedSource.ts index 38ab7f0f2c..227f1e5828 100644 --- a/packages/beacon-node/src/network/reqresp/utils/bufferedSource.ts +++ b/packages/beacon-node/src/network/reqresp/utils/bufferedSource.ts @@ -1,4 +1,4 @@ -import BufferList from "bl"; +import {Uint8ArrayList} from "uint8arraylist"; /** * Wraps a buffer chunk stream source with another async iterable @@ -9,15 +9,15 @@ import BufferList from "bl"; */ export class BufferedSource { isDone = false; - private buffer: BufferList; - private source: AsyncGenerator; + private buffer: Uint8ArrayList; + private source: AsyncGenerator; - constructor(source: AsyncGenerator) { - this.buffer = new BufferList(); + constructor(source: AsyncGenerator) { + this.buffer = new Uint8ArrayList(); this.source = source; } - [Symbol.asyncIterator](): AsyncIterator { + [Symbol.asyncIterator](): AsyncIterator { // eslint-disable-next-line @typescript-eslint/no-this-alias const that = this; diff --git a/packages/beacon-node/src/network/reqresp/utils/errorMessage.ts b/packages/beacon-node/src/network/reqresp/utils/errorMessage.ts index 0f419e3203..c9ca6505d2 100644 --- a/packages/beacon-node/src/network/reqresp/utils/errorMessage.ts +++ b/packages/beacon-node/src/network/reqresp/utils/errorMessage.ts @@ -28,7 +28,7 @@ export async function* encodeErrorMessage(errorMessage: string, encoding: Encodi /** * Decodes error message from network bytes and removes non printable, non ascii characters. */ -export function decodeErrorMessage(errorMessage: Buffer): string { +export function decodeErrorMessage(errorMessage: Uint8Array): string { const encoder = new TextDecoder(); // remove non ascii characters from string return encoder.decode(errorMessage.slice(0, 256)).replace(/[^\x20-\x7F]/g, ""); diff --git a/packages/beacon-node/src/network/util.ts b/packages/beacon-node/src/network/util.ts index 71e95bc34f..1a39a91b15 100644 --- a/packages/beacon-node/src/network/util.ts +++ b/packages/beacon-node/src/network/util.ts @@ -1,19 +1,15 @@ import {networkInterfaces} from "node:os"; -import PeerId from "peer-id"; -import {Multiaddr} from "multiaddr"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Multiaddr} from "@multiformats/multiaddr"; +import {Connection} from "@libp2p/interface-connection"; +import {ConnectionManager} from "@libp2p/interface-connection-manager"; +import {DefaultConnectionManager} from "libp2p/connection-manager"; import {ENR} from "@chainsafe/discv5"; /* eslint-disable @typescript-eslint/no-explicit-any */ // peers -/** - * Return a fresh PeerId instance - */ -export async function createPeerId(): Promise { - return await PeerId.create({bits: 256, keyType: "secp256k1"}); -} - /** * Check if multiaddr belongs to the local network interfaces. */ @@ -65,6 +61,18 @@ export function clearMultiaddrUDP(enr: ENR): void { } export function prettyPrintPeerId(peerId: PeerId): string { - const id = peerId.toB58String(); + const id = peerId.toString(); return `${id.substr(0, 2)}...${id.substr(id.length - 6, id.length)}`; } + +/** + * Get the connections map from a connection manager + */ +// Compat function for type mismatch reasons +export function getConnectionsMap(connectionManager: ConnectionManager): Map { + return (connectionManager as DefaultConnectionManager)["connections"] as Map; +} + +export function getConnection(connectionManager: ConnectionManager, peerIdStr: string): Connection | undefined { + return getConnectionsMap(connectionManager).get(peerIdStr)?.[0] ?? undefined; +} diff --git a/packages/beacon-node/src/node/nodejs.ts b/packages/beacon-node/src/node/nodejs.ts index d7c37d97ad..0647225302 100644 --- a/packages/beacon-node/src/node/nodejs.ts +++ b/packages/beacon-node/src/node/nodejs.ts @@ -1,5 +1,5 @@ import {setMaxListeners} from "node:events"; -import LibP2p from "libp2p"; +import {Libp2p} from "libp2p"; import {Registry} from "prom-client"; import {IBeaconConfig} from "@lodestar/config"; @@ -18,6 +18,7 @@ import {createMetrics, IMetrics, HttpMetricsServer} from "../metrics/index.js"; import {getApi, BeaconRestApiServer} from "../api/index.js"; import {initializeExecutionEngine, initializeExecutionBuilder} from "../execution/index.js"; import {initializeEth1ForBlockProduction} from "../eth1/index.js"; +import {createLibp2pMetrics} from "../metrics/metrics/libp2p.js"; import {IBeaconNodeOptions} from "./options.js"; import {runNodeNotifier} from "./notifier.js"; @@ -44,7 +45,7 @@ export interface IBeaconNodeInitModules { db: IBeaconDb; logger: ILogger; processShutdownCallback: ProcessShutdownCallback; - libp2p: LibP2p; + libp2p: Libp2p; anchorState: BeaconStateAllForks; wsCheckpoint?: phase0.Checkpoint; metricsRegistries?: Registry[]; @@ -155,6 +156,7 @@ export class BeaconNode { initBeaconMetrics(metrics, anchorState); // Since the db is instantiated before this, metrics must be injected manually afterwards db.setMetrics(metrics.db); + createLibp2pMetrics(libp2p, metrics.register); } const chain = new BeaconChain(opts.chain, { diff --git a/packages/beacon-node/src/sync/backfill/backfill.ts b/packages/beacon-node/src/sync/backfill/backfill.ts index 64e0b4fb2e..9e701c5370 100644 --- a/packages/beacon-node/src/sync/backfill/backfill.ts +++ b/packages/beacon-node/src/sync/backfill/backfill.ts @@ -1,5 +1,5 @@ import {EventEmitter} from "events"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {StrictEventEmitter} from "strict-event-emitter-types"; import {BeaconStateAllForks, blockToHeader} from "@lodestar/state-transition"; import {IBeaconConfig, IChainForkConfig} from "@lodestar/config"; diff --git a/packages/beacon-node/src/sync/backfill/errors.ts b/packages/beacon-node/src/sync/backfill/errors.ts index 548b993b50..ba86d0bbd0 100644 --- a/packages/beacon-node/src/sync/backfill/errors.ts +++ b/packages/beacon-node/src/sync/backfill/errors.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {LodestarError} from "@lodestar/utils"; import {Root} from "@lodestar/types"; diff --git a/packages/beacon-node/src/sync/range/batch.ts b/packages/beacon-node/src/sync/range/batch.ts index 70590314ba..6061574546 100644 --- a/packages/beacon-node/src/sync/range/batch.ts +++ b/packages/beacon-node/src/sync/range/batch.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {allForks, Epoch, phase0, RootHex} from "@lodestar/types"; import {IChainForkConfig} from "@lodestar/config"; import {LodestarError} from "@lodestar/utils"; diff --git a/packages/beacon-node/src/sync/range/chain.ts b/packages/beacon-node/src/sync/range/chain.ts index 97bfed3b53..db51ecc4ef 100644 --- a/packages/beacon-node/src/sync/range/chain.ts +++ b/packages/beacon-node/src/sync/range/chain.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {Epoch, Root, Slot, phase0, allForks} from "@lodestar/types"; import {ErrorAborted, ILogger} from "@lodestar/utils"; import {IChainForkConfig} from "@lodestar/config"; @@ -483,7 +483,7 @@ export class SyncChain { const attemptOk = batch.validationSuccess(); for (const attempt of batch.failedProcessingAttempts) { if (attempt.hash !== attemptOk.hash) { - if (attemptOk.peer.toB58String() === attempt.peer.toB58String()) { + if (attemptOk.peer.toString() === attempt.peer.toString()) { // The same peer corrected its previous attempt this.reportPeer(attempt.peer, PeerAction.MidToleranceError, "SyncChainInvalidBatchSelf"); } else { diff --git a/packages/beacon-node/src/sync/range/range.ts b/packages/beacon-node/src/sync/range/range.ts index d8c21661f9..dbe9d0dcdf 100644 --- a/packages/beacon-node/src/sync/range/range.ts +++ b/packages/beacon-node/src/sync/range/range.ts @@ -1,6 +1,6 @@ import {EventEmitter} from "events"; import StrictEventEmitter from "strict-event-emitter-types"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {computeStartSlotAtEpoch} from "@lodestar/state-transition"; import {IBeaconConfig} from "@lodestar/config"; import {Epoch, phase0} from "@lodestar/types"; @@ -114,7 +114,7 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) { // Compute if we should do a Finalized or Head sync with this peer const {syncType, startEpoch, target} = getRangeSyncTarget(localStatus, peerStatus, this.chain.forkChoice); this.logger.debug("Sync peer joined", { - peer: peerId.toB58String(), + peer: peerId.toString(), syncType, startEpoch, targetSlot: target.slot, diff --git a/packages/beacon-node/src/sync/range/utils/peerBalancer.ts b/packages/beacon-node/src/sync/range/utils/peerBalancer.ts index 70a7772529..325c60d0ad 100644 --- a/packages/beacon-node/src/sync/range/utils/peerBalancer.ts +++ b/packages/beacon-node/src/sync/range/utils/peerBalancer.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {PeerMap} from "../../../util/peerMap.js"; import {shuffle} from "../../../util/shuffle.js"; import {sortBy} from "../../../util/sortBy.js"; diff --git a/packages/beacon-node/src/sync/sync.ts b/packages/beacon-node/src/sync/sync.ts index da9ae05b91..7e6e0d6f6a 100644 --- a/packages/beacon-node/src/sync/sync.ts +++ b/packages/beacon-node/src/sync/sync.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {ILogger} from "@lodestar/utils"; import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {Slot, phase0} from "@lodestar/types"; @@ -155,7 +155,7 @@ export class BeaconSync implements IBeaconSync { const syncType = getPeerSyncType(localStatus, peerStatus, this.chain.forkChoice, this.slotImportTolerance); // For metrics only - this.peerSyncType.set(peerId.toB58String(), syncType); + this.peerSyncType.set(peerId.toString(), syncType); if (syncType === PeerSyncType.Advanced) { this.rangeSync.addPeer(peerId, localStatus, peerStatus); @@ -170,7 +170,7 @@ export class BeaconSync implements IBeaconSync { private removePeer = (peerId: PeerId): void => { this.rangeSync.removePeer(peerId); - this.peerSyncType.delete(peerId.toB58String()); + this.peerSyncType.delete(peerId.toString()); }; /** diff --git a/packages/beacon-node/src/sync/unknownBlock.ts b/packages/beacon-node/src/sync/unknownBlock.ts index 803af0af4c..18ab97f155 100644 --- a/packages/beacon-node/src/sync/unknownBlock.ts +++ b/packages/beacon-node/src/sync/unknownBlock.ts @@ -1,4 +1,5 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {peerIdFromString} from "@libp2p/peer-id"; import {IChainForkConfig} from "@lodestar/config"; import {ILogger} from "@lodestar/utils"; import {allForks, Root, RootHex} from "@lodestar/types"; @@ -7,7 +8,6 @@ import {INetwork, NetworkEvent, PeerAction} from "../network/index.js"; import {IBeaconChain} from "../chain/index.js"; import {IMetrics} from "../metrics/index.js"; import {shuffle} from "../util/shuffle.js"; -import {createFromB58String} from "../util/peerId.js"; import {byteArrayEquals} from "../util/bytes.js"; import {BlockError, BlockErrorCode} from "../chain/errors/index.js"; import {wrapError} from "../util/wrapError.js"; @@ -273,11 +273,11 @@ export class UnknownBlockSync { throw Error(`Wrong block received by peer, expected ${toHexString(receivedBlockRoot)} got ${blockRootHex}`); } - return {signedBlock, peerIdStr: peer.toB58String()}; + return {signedBlock, peerIdStr: peer.toString()}; } catch (e) { this.logger.debug( "Error fetching UnknownBlockRoot", - {attempt: i, blockRootHex, peer: peer.toB58String()}, + {attempt: i, blockRootHex, peer: peer.toString()}, e as Error ); lastError = e as Error; @@ -311,7 +311,7 @@ export class UnknownBlockSync { for (const peerIdStr of block.peerIdStrs) { // TODO: Refactor peerRpcScores to work with peerIdStr only - const peer = createFromB58String(peerIdStr); + const peer = peerIdFromString(peerIdStr); this.network.reportPeer(peer, PeerAction.LowToleranceError, "BadBlockByRoot"); } } diff --git a/packages/beacon-node/src/util/peerId.ts b/packages/beacon-node/src/util/peerId.ts deleted file mode 100644 index 71e5609ff5..0000000000 --- a/packages/beacon-node/src/util/peerId.ts +++ /dev/null @@ -1,23 +0,0 @@ -import PeerId from "peer-id"; - -/** - * Wrapper on PeerId.createFromB58String that logs the actual peerIdStr if it's invalid. - * Else it logs a non-helpful message - * - * ```bash - * Error: Non-base58btc character - * at decode (/usr/app/node_modules/multiformats/cjs/vendor/base-x.js:125:11) - * at Decoder.decode [as baseDecode] (/usr/app/node_modules/multiformats/cjs/src/bases/base.js:90:34) - * at Decoder.decode (/usr/app/node_modules/multiformats/cjs/src/bases/base.js:37:19) - * at Codec.decode (/usr/app/node_modules/multiformats/cjs/src/bases/base.js:80:25) - * at Function.exports.createFromB58String (/usr/app/node_modules/@chainsafe/lodestar/node_modules/peer-id/src/index.js:286:44) - * ``` - */ -export function createFromB58String(peerIdStr: string): PeerId { - try { - return PeerId.createFromB58String(peerIdStr); - } catch (e) { - (e as Error).message = `Invalid PeerId str '${peerIdStr}': ${(e as Error).message}`; - throw e; - } -} diff --git a/packages/beacon-node/src/util/peerMap.ts b/packages/beacon-node/src/util/peerMap.ts index 492ccff385..220bcfc103 100644 --- a/packages/beacon-node/src/util/peerMap.ts +++ b/packages/beacon-node/src/util/peerMap.ts @@ -1,4 +1,4 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; export class PeerSet { private peerMap = new PeerMap(); @@ -23,7 +23,7 @@ export class PeerSet { /** * Special ES6 Map that allows using PeerId objects as indexers - * Also, uses a WeakMap to reduce unnecessary calls to `PeerId.toB58String()` + * Also, uses a WeakMap to reduce unnecessary calls to `PeerId.toString()` */ export class PeerMap { private map: Map = new Map(); @@ -69,9 +69,9 @@ export class PeerMap { } /** - * Caches peerId.toB58String result in a WeakMap + * Caches peerId.toString result in a WeakMap */ private getPeerIdString(peerId: PeerId): string { - return peerId.toB58String(); + return peerId.toString(); } } diff --git a/packages/beacon-node/test/e2e/network/network.test.ts b/packages/beacon-node/test/e2e/network/network.test.ts index 95ad1b7be5..00e873c4b5 100644 --- a/packages/beacon-node/test/e2e/network/network.test.ts +++ b/packages/beacon-node/test/e2e/network/network.test.ts @@ -1,9 +1,8 @@ import sinon from "sinon"; import {expect} from "chai"; -import PeerId from "peer-id"; -import {Multiaddr} from "multiaddr"; - +import {PeerId} from "@libp2p/interface-peer-id"; +import {multiaddr} from "@multiformats/multiaddr"; import {ENR} from "@chainsafe/discv5"; import {createIBeaconConfig} from "@lodestar/config"; import {config} from "@lodestar/config/default"; @@ -27,7 +26,7 @@ import {ENRKey} from "../../../src/network/metadata.js"; import {memoOnce} from "../../utils/cache.js"; let port = 9000; -const multiaddr = "/ip4/127.0.0.1/tcp/0"; +const mu = "/ip4/127.0.0.1/tcp/0"; describe("network", function () { if (this.timeout() < 5000) this.timeout(5000); @@ -48,7 +47,7 @@ describe("network", function () { async function getOpts(peerId: PeerId): Promise { const bindAddrUdp = `/ip4/0.0.0.0/udp/${port++}`; const enr = ENR.createFromPeerId(peerId); - enr.setLocationMultiaddr(new Multiaddr(bindAddrUdp)); + enr.setLocationMultiaddr(multiaddr(bindAddrUdp)); return { ...defaultNetworkOptions, @@ -86,7 +85,7 @@ describe("network", function () { const reqRespHandlers = getReqRespHandlers({db, chain}); const gossipHandlers = {} as GossipHandlers; - const libp2p = await createNode(multiaddr); + const libp2p = await createNode(mu); const logger = testLogger(nodeName); const opts = await getOpts(libp2p.peerId); @@ -188,7 +187,7 @@ describe("network", function () { netA.prepareBeaconCommitteeSubnet([subscription]); await connected; - expect(netA.getConnectionsByPeer().has(netB.peerId.toB58String())).to.be.equal( + expect(netA.getConnectionsByPeer().has(netB.peerId.toString())).to.be.equal( true, "netA has not connected to peerB" ); @@ -214,7 +213,7 @@ describe("network", function () { expect(onGoodbyeNetB.callCount).to.equal(1, "netB must receive 1 goodbye"); const [goodbye, peer] = onGoodbyeNetB.getCall(0).args; - expect(peer.toB58String()).to.equal(netA.peerId.toB58String(), "netA must be the goodbye requester"); + expect(peer.toString()).to.equal(netA.peerId.toString(), "netA must be the goodbye requester"); expect(goodbye).to.equal(BigInt(GoodByeReasonCode.CLIENT_SHUTDOWN), "goodbye reason must be CLIENT_SHUTDOWN"); }); @@ -238,7 +237,7 @@ describe("network", function () { expect(onGoodbyeNetB.callCount).to.equal(1, "netB must receive 1 goodbye"); const [goodbye, peer] = onGoodbyeNetB.getCall(0).args; - expect(peer.toB58String()).to.equal(netA.peerId.toB58String(), "netA must be the goodbye requester"); + expect(peer.toString()).to.equal(netA.peerId.toString(), "netA must be the goodbye requester"); expect(goodbye).to.equal(BigInt(GoodByeReasonCode.CLIENT_SHUTDOWN), "goodbye reason must be CLIENT_SHUTDOWN"); }); diff --git a/packages/beacon-node/test/e2e/network/peers/peerManager.test.ts b/packages/beacon-node/test/e2e/network/peers/peerManager.test.ts index 05bb9776e4..c8142a85b5 100644 --- a/packages/beacon-node/test/e2e/network/peers/peerManager.test.ts +++ b/packages/beacon-node/test/e2e/network/peers/peerManager.test.ts @@ -1,7 +1,8 @@ -import {EventEmitter} from "events"; -import {Connection} from "libp2p"; +import {Connection} from "@libp2p/interface-connection"; +import {CustomEvent} from "@libp2p/interfaces/events"; import sinon from "sinon"; import {expect} from "chai"; +import {DefaultConnectionManager} from "libp2p/connection-manager"; import {config} from "@lodestar/config/default"; import {BitArray} from "@chainsafe/ssz"; import {altair, phase0, ssz} from "@lodestar/types"; @@ -9,7 +10,7 @@ import {sleep} from "@lodestar/utils"; import {createIBeaconConfig} from "@lodestar/config"; import {IReqResp, ReqRespMethod} from "../../../../src/network/reqresp/index.js"; import {PeerRpcScoreStore, PeerManager} from "../../../../src/network/peers/index.js"; -import {Eth2Gossipsub, NetworkEvent, NetworkEventBus} from "../../../../src/network/index.js"; +import {Eth2Gossipsub, getConnectionsMap, NetworkEvent, NetworkEventBus} from "../../../../src/network/index.js"; import {PeersData} from "../../../../src/network/peers/peersData.js"; import {createNode, getAttnets, getSyncnets} from "../../../utils/network.js"; import {MockBeaconChain} from "../../../utils/mocks/chain/chain.js"; @@ -116,10 +117,14 @@ describe("network / peers / PeerManager", function () { const {reqResp, networkEventBus, peerManager} = await mockModules(); // Simulate connection so that PeerManager persists the metadata response - await peerManager["onLibp2pPeerConnect"]({ - stat: {direction: "inbound", status: "open"}, - remotePeer: peerId1, - } as Connection); + await peerManager["onLibp2pPeerConnect"]( + new CustomEvent("evt", { + detail: { + stat: {direction: "inbound", status: "OPEN"}, + remotePeer: peerId1, + } as Connection, + }) + ); const seqNumber = BigInt(2); const metadata: phase0.Metadata = {seqNumber, attnets: BitArray.fromBitLen(0)}; @@ -144,7 +149,7 @@ describe("network / peers / PeerManager", function () { }); const libp2pConnectionOutboud = { - stat: {direction: "outbound", status: "open"}, + stat: {direction: "outbound", status: "OPEN"}, remotePeer: peerId1, } as Connection; @@ -152,7 +157,8 @@ describe("network / peers / PeerManager", function () { const {chain, libp2p, networkEventBus} = await mockModules(); // Simualate a peer connection, get() should return truthy - libp2p.connectionManager.connections.set(peerId1.toB58String(), [libp2pConnectionOutboud]); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + getConnectionsMap(libp2p.connectionManager).set(peerId1.toString(), [libp2pConnectionOutboud]); // Subscribe to `peerConnected` event, which must fire after checking peer relevance const peerConnectedPromise = waitForEvent(networkEventBus, NetworkEvent.peerConnected, this.timeout() / 2); @@ -168,7 +174,8 @@ describe("network / peers / PeerManager", function () { const {chain, libp2p, reqResp, peerManager, networkEventBus} = await mockModules(); // Simualate a peer connection, get() should return truthy - libp2p.connectionManager.get = sinon.stub().returns({}); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + getConnectionsMap(libp2p.connectionManager).set(peerId1.toString(), [libp2pConnectionOutboud]); // Subscribe to `peerConnected` event, which must fire after checking peer relevance const peerConnectedPromise = waitForEvent(networkEventBus, NetworkEvent.peerConnected, this.timeout() / 2); @@ -181,8 +188,11 @@ describe("network / peers / PeerManager", function () { reqResp.metadata.resolves(remoteMetadata); // Simualate a peer connection, get() should return truthy - libp2p.connectionManager.connections.set(peerId1.toB58String(), [libp2pConnectionOutboud]); - ((libp2p.connectionManager as any) as EventEmitter).emit("peer:connect", libp2pConnectionOutboud); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + getConnectionsMap(libp2p.connectionManager).set(peerId1.toString(), [libp2pConnectionOutboud]); + (libp2p.connectionManager as DefaultConnectionManager).dispatchEvent( + new CustomEvent("peer:connect", {detail: libp2pConnectionOutboud}) + ); await peerConnectedPromise; @@ -198,7 +208,7 @@ describe("network / peers / PeerManager", function () { expect(reqResp.status.callCount).to.equal(1, "reqResp.status must be called"); expect(reqResp.metadata.callCount).to.equal(1, "reqResp.metadata must be called"); - expect(peerManager["connectedPeers"].get(peerId1.toB58String())?.metadata).to.deep.equal( + expect(peerManager["connectedPeers"].get(peerId1.toString())?.metadata).to.deep.equal( remoteMetadata, "Wrong stored metadata" ); diff --git a/packages/beacon-node/test/e2e/network/reqresp.test.ts b/packages/beacon-node/test/e2e/network/reqresp.test.ts index f11a15c129..a0395d073c 100644 --- a/packages/beacon-node/test/e2e/network/reqresp.test.ts +++ b/packages/beacon-node/test/e2e/network/reqresp.test.ts @@ -1,13 +1,14 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {createIBeaconConfig} from "@lodestar/config"; import {config} from "@lodestar/config/default"; import {sleep as _sleep} from "@lodestar/utils"; import {altair, phase0, ssz} from "@lodestar/types"; import {ForkName} from "@lodestar/params"; import {BitArray} from "@chainsafe/ssz"; -import {createPeerId, IReqRespOptions, Network} from "../../../src/network/index.js"; +import {IReqRespOptions, Network} from "../../../src/network/index.js"; import {defaultNetworkOptions, INetworkOptions} from "../../../src/network/options.js"; import {Method, Encoding} from "../../../src/network/reqresp/types.js"; import {ReqRespHandlers} from "../../../src/network/reqresp/handlers/index.js"; @@ -71,7 +72,7 @@ describe("network / ReqResp", function () { reqRespOpts?: IReqRespOptions ): Promise<[Network, Network]> { const controller = new AbortController(); - const peerIdB = await createPeerId(); + const peerIdB = await createSecp256k1PeerId(); const [libp2pA, libp2pB] = await Promise.all([createNode(multiaddr), createNode(multiaddr, peerIdB)]); // eslint-disable-next-line @@ -323,5 +324,5 @@ describe("network / ReqResp", function () { /** Helper to reduce code-duplication */ function formatMetadata(method: Method, encoding: Encoding, peer: PeerId): IRequestErrorMetadata { - return {method, encoding, peer: peer.toB58String()}; + return {method, encoding, peer: peer.toString()}; } diff --git a/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts b/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts index d3318aeedd..3c6f87f4dd 100644 --- a/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts +++ b/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts @@ -101,7 +101,7 @@ describe("sync / unknown block sync", function () { await bn2.chain.processBlock(head).catch((e) => { if (e instanceof BlockError && e.type.code === BlockErrorCode.PARENT_UNKNOWN) { // Expected - bn2.network.events.emit(NetworkEvent.unknownBlockParent, head, bn2.network.peerId.toB58String()); + bn2.network.events.emit(NetworkEvent.unknownBlockParent, head, bn2.network.peerId.toString()); } else { throw e; } diff --git a/packages/beacon-node/test/perf/network/peers/util/prioritizePeers.test.ts b/packages/beacon-node/test/perf/network/peers/util/prioritizePeers.test.ts index 63dcd2c3e0..026cd9ddec 100644 --- a/packages/beacon-node/test/perf/network/peers/util/prioritizePeers.test.ts +++ b/packages/beacon-node/test/perf/network/peers/util/prioritizePeers.test.ts @@ -1,5 +1,6 @@ import {itBench} from "@dapplion/benchmark"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {ATTESTATION_SUBNET_COUNT, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; import {altair, phase0} from "@lodestar/types"; import {defaultNetworkOptions} from "../../../../../src/network/options.js"; @@ -9,10 +10,10 @@ import {getAttnets, getSyncnets} from "../../../../utils/network.js"; describe("prioritizePeers", () => { const seedPeers: {id: PeerId; attnets: phase0.AttestationSubnets; syncnets: altair.SyncSubnets; score: number}[] = []; - before(function () { + before(async function () { for (let i = 0; i < defaultNetworkOptions.maxPeers; i++) { - const peer = new PeerId(Buffer.from(`peer-${i}`)); - peer.toB58String = () => `peer-${i}`; + const peer = await createSecp256k1PeerId(); + peer.toString = () => `peer-${i}`; seedPeers.push({ id: peer, attnets: getAttnets([]), diff --git a/packages/beacon-node/test/unit-mainnet/network/gossip/scoringParameters.test.ts b/packages/beacon-node/test/unit-mainnet/network/gossip/scoringParameters.test.ts index 458e310bf6..d0d912a06b 100644 --- a/packages/beacon-node/test/unit-mainnet/network/gossip/scoringParameters.test.ts +++ b/packages/beacon-node/test/unit-mainnet/network/gossip/scoringParameters.test.ts @@ -1,5 +1,5 @@ import {expect} from "chai"; -import {TopicScoreParams} from "libp2p-gossipsub/src/score/index.js"; +import {TopicScoreParams} from "@chainsafe/libp2p-gossipsub/score"; import {ATTESTATION_SUBNET_COUNT, ForkName, SLOTS_PER_EPOCH} from "@lodestar/params"; import {createIBeaconConfig} from "@lodestar/config"; import {mainnetChainConfig} from "@lodestar/config/presets"; diff --git a/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts b/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts index 3a00d5074f..a663dac76b 100644 --- a/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts +++ b/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts @@ -1,6 +1,7 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; import varint from "varint"; +import {Uint8ArrayList} from "uint8arraylist"; import {BufferedSource} from "../../../../../../src/network/reqresp/utils/index.js"; import {readSszSnappyPayload} from "../../../../../../src/network/reqresp/encodingStrategies/sszSnappy/index.js"; import {isEqualSszType} from "../../../../../utils/ssz.js"; @@ -15,7 +16,7 @@ describe("network / reqresp / sszSnappy / decode", () => { for (const {id, type, bytes, streamedBody, body} of testCases) { const deserializedBody = body ?? type.deserialize(Buffer.from(bytes)); - const streamedBytes = Buffer.concat([Buffer.from(varint.encode(bytes.length)), streamedBody]); + const streamedBytes = new Uint8ArrayList(Buffer.concat([Buffer.from(varint.encode(bytes.length)), streamedBody])); it(id, async () => { const bufferedSource = new BufferedSource(arrToSource([streamedBytes])); diff --git a/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts b/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts index 9fec9855b2..19cc8ae402 100644 --- a/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts +++ b/packages/beacon-node/test/unit-mainnet/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts @@ -1,5 +1,5 @@ import all from "it-all"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; import {expect} from "chai"; import varint from "varint"; diff --git a/packages/beacon-node/test/unit/api/impl/node/node.test.ts b/packages/beacon-node/test/unit/api/impl/node/node.test.ts index cc79388b5a..b2eaf71bb3 100644 --- a/packages/beacon-node/test/unit/api/impl/node/node.test.ts +++ b/packages/beacon-node/test/unit/api/impl/node/node.test.ts @@ -1,17 +1,18 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-return */ -import {Connection} from "libp2p"; +import {Connection} from "@libp2p/interface-connection"; import sinon, {SinonStubbedInstance} from "sinon"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import {expect, use} from "chai"; import chaiAsPromised from "chai-as-promised"; -import {Multiaddr} from "multiaddr"; -import {BitArray} from "@chainsafe/ssz"; +import {multiaddr} from "@multiformats/multiaddr"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {createKeypairFromPeerId, ENR} from "@chainsafe/discv5"; +import {BitArray} from "@chainsafe/ssz"; import {altair} from "@lodestar/types"; import {routes} from "@lodestar/api"; -import {createPeerId, INetwork, Network} from "../../../../../src/network/index.js"; import {BeaconSync, IBeaconSync} from "../../../../../src/sync/index.js"; +import {INetwork, Network} from "../../../../../src/network/index.js"; import {MetadataController} from "../../../../../src/network/metadata.js"; import {defaultApiOptions} from "../../../../../src/api/options.js"; import {PeerStatus, PeerDirection} from "../../../../../src/network/index.js"; @@ -45,16 +46,16 @@ describe("node api implementation", function () { networkStub = sinon.createStubInstance(Network); syncStub = sinon.createStubInstance(BeaconSync); api = getNodeApi(defaultApiOptions, {network: networkStub, sync: syncStub}); - peerId = await PeerId.create({keyType: "secp256k1"}); + peerId = await createSecp256k1PeerId(); sinon.stub(networkStub, "peerId").get(() => peerId); - sinon.stub(networkStub, "localMultiaddrs").get(() => [new Multiaddr("/ip4/127.0.0.1/tcp/36000")]); + sinon.stub(networkStub, "localMultiaddrs").get(() => [multiaddr("/ip4/127.0.0.1/tcp/36000")]); }); describe("getNetworkIdentity", function () { it("should get node identity", async function () { const keypair = createKeypairFromPeerId(peerId); const enr = ENR.createV4(keypair.publicKey); - enr.setLocationMultiaddr(new Multiaddr("/ip4/127.0.0.1/tcp/36001")); + enr.setLocationMultiaddr(multiaddr("/ip4/127.0.0.1/tcp/36001")); networkStub.getEnr.returns(enr); networkStub.metadata = { get json(): altair.Metadata { @@ -86,24 +87,24 @@ describe("node api implementation", function () { let peer1: PeerId, peer2: PeerId, peer3: PeerId; before(async function () { - peer1 = await createPeerId(); - peer2 = await createPeerId(); - peer3 = await createPeerId(); + peer1 = await createSecp256k1PeerId(); + peer2 = await createSecp256k1PeerId(); + peer3 = await createSecp256k1PeerId(); }); it("it should return peer count", async function () { const connectionsByPeer = new Map([ - [peer1.toB58String(), [libp2pConnection(peer1, "open", "outbound")]], + [peer1.toString(), [libp2pConnection(peer1, "OPEN", "outbound")]], [ - peer2.toB58String(), - [libp2pConnection(peer2, "closing", "inbound"), libp2pConnection(peer2, "closing", "inbound")], + peer2.toString(), + [libp2pConnection(peer2, "CLOSING", "inbound"), libp2pConnection(peer2, "CLOSING", "inbound")], ], [ - peer3.toB58String(), + peer3.toString(), [ - libp2pConnection(peer3, "closed", "inbound"), - libp2pConnection(peer3, "closed", "inbound"), - libp2pConnection(peer3, "closed", "inbound"), + libp2pConnection(peer3, "CLOSED", "inbound"), + libp2pConnection(peer3, "CLOSED", "inbound"), + libp2pConnection(peer3, "CLOSED", "inbound"), ], ], ]); @@ -127,14 +128,14 @@ describe("node api implementation", function () { let peer1: PeerId, peer2: PeerId; before(async function () { - peer1 = await createPeerId(); - peer2 = await createPeerId(); + peer1 = await createSecp256k1PeerId(); + peer2 = await createSecp256k1PeerId(); }); it("should return connected and disconnecting peers", async function () { const connectionsByPeer = new Map([ - [peer1.toB58String(), [libp2pConnection(peer1, "open", "outbound")]], - [peer2.toB58String(), [libp2pConnection(peer2, "closing", "inbound")]], + [peer1.toString(), [libp2pConnection(peer1, "OPEN", "outbound")]], + [peer2.toString(), [libp2pConnection(peer2, "CLOSING", "inbound")]], ]); networkStub.getConnectionsByPeer.returns(connectionsByPeer); @@ -148,8 +149,8 @@ describe("node api implementation", function () { it("should return disconnected peers", async function () { const connectionsByPeer = new Map([ - [peer1.toB58String(), [libp2pConnection(peer1, "closed", "outbound")]], - [peer2.toB58String(), []], // peer2 has no connections in the connection manager + [peer1.toString(), [libp2pConnection(peer1, "CLOSED", "outbound")]], + [peer2.toString(), []], // peer2 has no connections in the connection manager ]); networkStub.getConnectionsByPeer.returns(connectionsByPeer); @@ -164,17 +165,17 @@ describe("node api implementation", function () { describe("getPeer", function () { it("success", async function () { - const peer1 = await createPeerId(); - const peer2 = await createPeerId(); + const peer1 = await createSecp256k1PeerId(); + const peer2 = await createSecp256k1PeerId(); const connectionsByPeer = new Map([ - [peer1.toB58String(), [libp2pConnection(peer1, "open", "outbound")]], - [peer2.toB58String(), [libp2pConnection(peer2, "closing", "inbound")]], + [peer1.toString(), [libp2pConnection(peer1, "OPEN", "outbound")]], + [peer2.toString(), [libp2pConnection(peer2, "CLOSING", "inbound")]], ]); networkStub.getConnectionsByPeer.returns(connectionsByPeer); - const {data: peer} = await api.getPeer(peer1.toB58String()); + const {data: peer} = await api.getPeer(peer1.toString()); if (peer === undefined) throw Error("getPeer returned no peer"); - expect(peer.peerId).to.equal(peer1.toB58String()); + expect(peer.peerId).to.equal(peer1.toString()); expect(peer.lastSeenP2pAddress).not.empty; expect(peer.peerId).not.empty; // expect(peers[0].enr).not.empty; @@ -199,7 +200,7 @@ describe("node api implementation", function () { export function libp2pConnection(peer: PeerId, status: PeerStatus, direction: PeerDirection): Connection { return { - remoteAddr: new Multiaddr(), + remoteAddr: multiaddr(), stat: { status, direction, diff --git a/packages/beacon-node/test/unit/network/nodejs/libp2p.test.ts b/packages/beacon-node/test/unit/network/nodejs/libp2p.test.ts deleted file mode 100644 index 4abe146e7d..0000000000 --- a/packages/beacon-node/test/unit/network/nodejs/libp2p.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import {assert} from "chai"; -import {sleep} from "@lodestar/utils"; -import {NodejsNode} from "../../../../src/network/nodejs/index.js"; -import {createNode} from "../../../utils/network.js"; -import {Libp2pEvent} from "../../../../src/constants/index.js"; - -const multiaddr = "/ip4/127.0.0.1/tcp/0"; - -describe("[network] nodejs libp2p", () => { - it("can start and stop a node", async () => { - const node: NodejsNode = await createNode(multiaddr); - await node.start(); - assert.equal(node.isStarted(), true); - await node.stop(); - assert.equal(node.isStarted(), false); - }); - - it("can connect/disconnect to a peer", async function () { - this.timeout(5000); - // setup - const nodeA: NodejsNode = await createNode(multiaddr); - const nodeB: NodejsNode = await createNode(multiaddr); - - await Promise.all([nodeA.start(), nodeB.start()]); - - await nodeA.peerStore.addressBook.add(nodeB.peerId, nodeB.multiaddrs); - - // connect - await Promise.all([ - new Promise((resolve, reject) => { - const t = setTimeout(reject, 1000, "connection timed out"); - nodeB.connectionManager.once(Libp2pEvent.peerConnect, () => { - clearTimeout(t); - resolve(); - }); - }), - nodeA.dial(nodeB.peerId), - ]); - - // test connection - assert(nodeA.connectionManager.get(nodeB.peerId), "nodeA should have connection to nodeB"); - assert(nodeB.connectionManager.get(nodeA.peerId), "nodeB should have connection to nodeA"); - - // disconnect - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - const p = new Promise((resolve) => nodeB.connectionManager.once(Libp2pEvent.peerDisconnect, resolve)); - await new Promise((resolve) => setTimeout(resolve, 100)); - await nodeA.hangUp(nodeB.peerId); - await p; - - // test disconnection - assert(!nodeA.connectionManager.get(nodeB.peerId), "nodeA should NOT have connection to nodeB"); - await sleep(200); - assert(!nodeB.connectionManager.get(nodeA.peerId), "nodeB should NOT have connection to nodeA"); - - // teardown - await Promise.all([nodeA.stop(), nodeB.stop()]); - }); -}); diff --git a/packages/beacon-node/test/unit/network/peers/datastore.test.ts b/packages/beacon-node/test/unit/network/peers/datastore.test.ts index 2f9a49b80e..7523704a73 100644 --- a/packages/beacon-node/test/unit/network/peers/datastore.test.ts +++ b/packages/beacon-node/test/unit/network/peers/datastore.test.ts @@ -1,5 +1,5 @@ import {expect} from "chai"; -import LevelDatastore from "datastore-level"; +import {LevelDatastore} from "datastore-level"; import {Key} from "interface-datastore"; import sinon from "sinon"; import {Eth2PeerDataStore} from "../../../../src/network/peers/datastore.js"; @@ -44,7 +44,7 @@ describe("Eth2PeerDataStore", () => { // 4th item, should evict 1st item since it's oldest await eth2Datastore.put(new Key("k4"), Buffer.from("4")); expect(await eth2Datastore.get(new Key("k4"))).to.be.deep.equal(Buffer.from("4")); - expect(dbDatastoreStub.put.calledOnceWith(new Key("k1"), Buffer.from("1"))).to.equal(true); + expect(dbDatastoreStub.put.calledOnceWith(new Key("/k1"), Buffer.from("1"))).to.equal(true); // still able to get k1 from datastore expect(dbDatastoreStub.get.calledOnce).to.equal(false); diff --git a/packages/beacon-node/test/unit/network/peers/discover.test.ts b/packages/beacon-node/test/unit/network/peers/discover.test.ts index 1ff6c61b20..eb8a5b4ce5 100644 --- a/packages/beacon-node/test/unit/network/peers/discover.test.ts +++ b/packages/beacon-node/test/unit/network/peers/discover.test.ts @@ -1,12 +1,12 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {peerIdFromString} from "@libp2p/peer-id"; import {getValidPeerId} from "../../../utils/peer.js"; describe("network / peers / discover", () => { it("PeerId API", () => { const peerId = getValidPeerId(); - const peerIdStr = peerId.toB58String(); - const peerFromHex = PeerId.createFromB58String(peerIdStr); - expect(peerFromHex.toB58String()).to.equal(peerIdStr); + const peerIdStr = peerId.toString(); + const peerFromHex = peerIdFromString(peerIdStr); + expect(peerFromHex.toString()).to.equal(peerIdStr); }); }); diff --git a/packages/beacon-node/test/unit/network/peers/priorization.test.ts b/packages/beacon-node/test/unit/network/peers/priorization.test.ts index 9c76fa594c..bed1dbf110 100644 --- a/packages/beacon-node/test/unit/network/peers/priorization.test.ts +++ b/packages/beacon-node/test/unit/network/peers/priorization.test.ts @@ -1,5 +1,6 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {phase0, altair} from "@lodestar/types"; import {BitArray} from "@chainsafe/ssz"; import {ATTESTATION_SUBNET_COUNT} from "@lodestar/params"; @@ -9,11 +10,11 @@ import {RequestedSubnet} from "../../../../src/network/peers/utils/index.js"; type Result = ReturnType; -describe("network / peers / priorization", () => { +describe("network / peers / priorization", async () => { const peers: PeerId[] = []; for (let i = 0; i < 8; i++) { - const peer = new PeerId(Buffer.from(`peer-${i}`)); - peer.toB58String = () => `peer-${i}`; + const peer = await createSecp256k1PeerId(); + peer.toString = () => `peer-${i}`; peers.push(peer); } const none = BitArray.fromBitLen(ATTESTATION_SUBNET_COUNT); @@ -212,7 +213,7 @@ describe("network / peers / priorization", () => { if (peers.length > 0) { result.push(reason); } - result.push(...peers.map((peer) => peer.toB58String())); + result.push(...peers.map((peer) => peer.toString())); } return result; }; diff --git a/packages/beacon-node/test/unit/network/peers/score.test.ts b/packages/beacon-node/test/unit/network/peers/score.test.ts index 1018093de7..d740dd29cc 100644 --- a/packages/beacon-node/test/unit/network/peers/score.test.ts +++ b/packages/beacon-node/test/unit/network/peers/score.test.ts @@ -1,10 +1,10 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {peerIdFromString} from "@libp2p/peer-id"; import sinon from "sinon"; import {PeerAction, ScoreState, PeerRpcScoreStore, updateGossipsubScores} from "../../../../src/network/peers/score.js"; describe("simple block provider score tracking", function () { - const peer = PeerId.createFromB58String("Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi"); + const peer = peerIdFromString("Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi"); const MIN_SCORE = -100; const actionName = "test-action"; @@ -45,7 +45,7 @@ describe("simple block provider score tracking", function () { for (const [minScore, timeToDecay] of decayTimes) it(`Should decay MIN_SCORE to ${minScore} after ${timeToDecay} ms`, () => { const {scoreStore, peerScores} = mockStore(); - const peerScore = peerScores.get(peer.toB58String()); + const peerScore = peerScores.get(peer.toString()); if (peerScore) { peerScore["lastUpdate"] = Date.now() - timeToDecay * factorForJsBadMath; peerScore["lodestarScore"] = MIN_SCORE; diff --git a/packages/beacon-node/test/unit/network/reqresp/encoders/request.test.ts b/packages/beacon-node/test/unit/network/reqresp/encoders/request.test.ts index 801a4bdf2a..9a1f2e37f4 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encoders/request.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encoders/request.test.ts @@ -1,7 +1,8 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; import all from "it-all"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; +import {Uint8ArrayList} from "uint8arraylist"; import {Method, Encoding, RequestBody} from "../../../../../src/network/reqresp/types.js"; import {SszSnappyErrorCode} from "../../../../../src/network/reqresp/encodingStrategies/sszSnappy/index.js"; import {requestEncode} from "../../../../../src/network/reqresp/encoders/requestEncode.js"; @@ -16,7 +17,7 @@ describe("network / reqresp / encoders / request - Success and error cases", () id: string; method: Method; encoding: Encoding; - chunks: Buffer[]; + chunks: Uint8ArrayList[]; // decode errorDecode?: string; // encode @@ -27,7 +28,7 @@ describe("network / reqresp / encoders / request - Success and error cases", () method: Method.Status, encoding: Encoding.SSZ_SNAPPY, errorDecode: SszSnappyErrorCode.UNDER_SSZ_MIN_SIZE, - chunks: [Buffer.from("4")], + chunks: [new Uint8ArrayList(Buffer.from("4"))], }, { id: "No body on Metadata - Ok", @@ -65,7 +66,10 @@ describe("network / reqresp / encoders / request - Success and error cases", () if (requestBody !== undefined) { it(`${id} - requestEncode`, async () => { const encodedChunks = await pipe(requestEncode({method, encoding}, requestBody), all); - expectEqualByteChunks(encodedChunks, chunks); + expectEqualByteChunks( + encodedChunks, + chunks.map((c) => c.subarray()) + ); }); } } diff --git a/packages/beacon-node/test/unit/network/reqresp/encoders/requestTypes.test.ts b/packages/beacon-node/test/unit/network/reqresp/encoders/requestTypes.test.ts index 65bb751b28..4e52dfc53a 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encoders/requestTypes.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encoders/requestTypes.test.ts @@ -1,6 +1,6 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; import {phase0} from "@lodestar/types"; import {Method, Encoding, getRequestSzzTypeByMethod, RequestBody} from "../../../../../src/network/reqresp/types.js"; import {requestEncode} from "../../../../../src/network/reqresp/encoders/requestEncode.js"; diff --git a/packages/beacon-node/test/unit/network/reqresp/encoders/response.test.ts b/packages/beacon-node/test/unit/network/reqresp/encoders/response.test.ts index 622f93a2c8..990b3701cd 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encoders/response.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encoders/response.test.ts @@ -1,7 +1,8 @@ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; import all from "it-all"; +import {Uint8ArrayList} from "uint8arraylist"; import {ForkName, SLOTS_PER_EPOCH} from "@lodestar/params"; import {chainConfig} from "@lodestar/config/default"; import {createIBeaconConfig} from "@lodestar/config"; @@ -63,7 +64,7 @@ describe("network / reqresp / encoders / response - Success and error cases", () method?: Method; version?: Version; encoding?: Encoding; - chunks?: Buffer[]; + chunks?: Uint8ArrayList[]; responseChunks?: ResponseChunk[]; // decode only decodeError?: LodestarError; @@ -83,7 +84,7 @@ describe("network / reqresp / encoders / response - Success and error cases", () method: Method.Ping, encoding: Encoding.SSZ_SNAPPY, decodeError: new SszSnappyError({code: SszSnappyErrorCode.SOURCE_ABORTED}), - chunks: [Buffer.from([RespStatus.SUCCESS])], + chunks: [new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS]))], // Not possible to encode this invalid case }, { @@ -92,7 +93,7 @@ describe("network / reqresp / encoders / response - Success and error cases", () version: Version.V1, encoding: Encoding.SSZ_SNAPPY, responseChunks: [{status: RespStatus.SUCCESS, body: BigInt(1)}], - chunks: [Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks], + chunks: [new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), ...sszSnappyPing.chunks], // decode will throw since Ping's Uint64 is smaller than Status min size decodeError: new SszSnappyError({code: SszSnappyErrorCode.UNDER_SSZ_MIN_SIZE, minSize: 84, sszDataLength: 8}), // encode will throw when trying to serialize a Uint64 @@ -109,7 +110,7 @@ describe("network / reqresp / encoders / response - Success and error cases", () responseChunks: [{status: RespStatus.SUCCESS, body: sszSnappySignedBeaconBlockPhase0.body}], chunks: [ // - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), // | ...sszSnappySignedBeaconBlockPhase0.chunks, ], @@ -122,9 +123,9 @@ describe("network / reqresp / encoders / response - Success and error cases", () responseChunks: [{status: RespStatus.SUCCESS, body: sszSnappySignedBeaconBlockPhase0.body}], chunks: [ // - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), // - config.forkName2ForkDigest(ForkName.phase0) as Buffer, + new Uint8ArrayList(config.forkName2ForkDigest(ForkName.phase0)), // | ...sszSnappySignedBeaconBlockPhase0.chunks, ], @@ -137,9 +138,9 @@ describe("network / reqresp / encoders / response - Success and error cases", () responseChunks: [{status: RespStatus.SUCCESS, body: sszSnappySignedBeaconBlockAltair.body}], chunks: [ // - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), // - config.forkName2ForkDigest(ForkName.altair) as Buffer, + new Uint8ArrayList(config.forkName2ForkDigest(ForkName.altair)), // | ...sszSnappySignedBeaconBlockAltair.chunks, ], @@ -155,10 +156,10 @@ describe("network / reqresp / encoders / response - Success and error cases", () ], chunks: [ // Chunk 0 - success - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), ...sszSnappyPing.chunks, // Chunk 1 - success - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), ...sszSnappyPing.chunks, ], }, @@ -174,15 +175,32 @@ describe("network / reqresp / encoders / response - Success and error cases", () ], chunks: [ // Chunk 0 - success - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), ...sszSnappyPing.chunks, // Chunk 1 - success - Buffer.from([RespStatus.SUCCESS]), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), ...sszSnappyPing.chunks, // Chunk 2 - error - Buffer.from([RespStatus.SERVER_ERROR]), + new Uint8ArrayList(Buffer.from([RespStatus.SERVER_ERROR])), ], }, + { + id: "Decode successfully response_chunk as a single Uint8ArrayList", + method: Method.Ping, + encoding: Encoding.SSZ_SNAPPY, + responseChunks: [ + {status: RespStatus.SUCCESS, body: BigInt(1)}, + {status: RespStatus.SUCCESS, body: BigInt(1)}, + ], + chunks: [ + // success, Ping payload = BigInt(1) + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks), + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks), + ], + // It's not able to produce a single concatenated chunk with our encoder + skipEncoding: true, + }, + { id: "Decode successfully response_chunk as a single concated chunk", method: Method.Ping, @@ -193,8 +211,12 @@ describe("network / reqresp / encoders / response - Success and error cases", () ], chunks: [ // success, Ping payload = BigInt(1) - Buffer.concat([Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks]), - Buffer.concat([Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks]), + new Uint8ArrayList( + Buffer.concat([Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks.map((c) => c.subarray())]) + ), + new Uint8ArrayList( + Buffer.concat([Buffer.from([RespStatus.SUCCESS]), ...sszSnappyPing.chunks.map((c) => c.subarray())]) + ), ], // It's not able to produce a single concatenated chunk with our encoder skipEncoding: true, @@ -211,12 +233,12 @@ describe("network / reqresp / encoders / response - Success and error cases", () ], chunks: [ // Chunk 0 - success block in phase0 with context bytes - Buffer.from([RespStatus.SUCCESS]), - config.forkName2ForkDigest(ForkName.phase0) as Buffer, + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), + new Uint8ArrayList(config.forkName2ForkDigest(ForkName.phase0)), ...sszSnappySignedBeaconBlockPhase0.chunks, // Chunk 1 - success block in altair with context bytes - Buffer.from([RespStatus.SUCCESS]), - config.forkName2ForkDigest(ForkName.altair) as Buffer, + new Uint8ArrayList(Buffer.from([RespStatus.SUCCESS])), + new Uint8ArrayList(config.forkName2ForkDigest(ForkName.altair)), ...sszSnappySignedBeaconBlockAltair.chunks, ], }, @@ -225,22 +247,22 @@ describe("network / reqresp / encoders / response - Success and error cases", () { id: "INVALID_REQUEST - no error message", decodeError: new ResponseError(RespStatus.INVALID_REQUEST, ""), - chunks: [Buffer.from([RespStatus.INVALID_REQUEST])], + chunks: [new Uint8ArrayList(Buffer.from([RespStatus.INVALID_REQUEST]))], responseChunks: [{status: RespStatus.INVALID_REQUEST, errorMessage: ""}], }, { id: "SERVER_ERROR - no error message", decodeError: new ResponseError(RespStatus.SERVER_ERROR, ""), - chunks: [Buffer.from([RespStatus.SERVER_ERROR])], + chunks: [new Uint8ArrayList(Buffer.from([RespStatus.SERVER_ERROR]))], responseChunks: [{status: RespStatus.SERVER_ERROR, errorMessage: ""}], }, { id: "SERVER_ERROR - with error message", decodeError: new ResponseError(RespStatus.SERVER_ERROR, "sNaPpYIzTEST_ERROR"), chunks: [ - Buffer.from([RespStatus.SERVER_ERROR]), - fromHexBuf("0x0a"), - fromHexBuf("0xff060000734e61507059010e000049b97aaf544553545f4552524f52"), + new Uint8ArrayList(Buffer.from([RespStatus.SERVER_ERROR])), + new Uint8ArrayList(fromHexBuf("0x0a")), + new Uint8ArrayList(fromHexBuf("0xff060000734e61507059010e000049b97aaf544553545f4552524f52")), ], responseChunks: [{status: RespStatus.SERVER_ERROR, errorMessage: "TEST_ERROR"}], }, @@ -248,12 +270,18 @@ describe("network / reqresp / encoders / response - Success and error cases", () { id: "SERVER_ERROR - Slice long error message", decodeError: new ResponseError(RespStatus.SERVER_ERROR, "TEST_ERROR".padEnd(512, "0").slice(0, 256)), - chunks: [Buffer.from([RespStatus.SERVER_ERROR]), Buffer.from("TEST_ERROR".padEnd(512, "0"))], + chunks: [ + new Uint8ArrayList(Buffer.from([RespStatus.SERVER_ERROR])), + new Uint8ArrayList(Buffer.from("TEST_ERROR".padEnd(512, "0"))), + ], }, { id: "SERVER_ERROR - Remove non-ascii characters from error message", decodeError: new ResponseError(RespStatus.SERVER_ERROR, "TEST_ERROR"), - chunks: [Buffer.from([RespStatus.SERVER_ERROR]), Buffer.from("TEST_ERROR\u03A9")], + chunks: [ + new Uint8ArrayList(Buffer.from([RespStatus.SERVER_ERROR])), + new Uint8ArrayList(Buffer.from("TEST_ERROR\u03A9")), + ], }, ]; @@ -320,7 +348,10 @@ describe("network / reqresp / encoders / response - Success and error cases", () await expectRejectedWithLodestarError(resultPromise, encodeError); } else if (chunks) { const encodedChunks = await resultPromise; - expectEqualByteChunks(encodedChunks, chunks); + expectEqualByteChunks( + encodedChunks, + chunks.map((c) => c.subarray()) + ); } else { throw Error("Bad testCase"); } diff --git a/packages/beacon-node/test/unit/network/reqresp/encoders/responseTypes.test.ts b/packages/beacon-node/test/unit/network/reqresp/encoders/responseTypes.test.ts index 0d3c094699..495c495cf8 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encoders/responseTypes.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encoders/responseTypes.test.ts @@ -1,6 +1,6 @@ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; import all from "it-all"; import {allForks} from "@lodestar/types"; import {ForkName} from "@lodestar/params"; diff --git a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts index 090d03bc2e..6bd0aad8b3 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/decode.test.ts @@ -1,6 +1,7 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; import varint from "varint"; +import {Uint8ArrayList} from "uint8arraylist"; import {ssz} from "@lodestar/types"; import {RequestOrResponseType} from "../../../../../../src/network/reqresp/types.js"; import {BufferedSource} from "../../../../../../src/network/reqresp/utils/index.js"; @@ -63,7 +64,7 @@ describe("network / reqresp / sszSnappy / decode", () => { for (const {id, type, error, chunks} of testCases) { it(id, async () => { - const bufferedSource = new BufferedSource(arrToSource(chunks)); + const bufferedSource = new BufferedSource(arrToSource([new Uint8ArrayList(...chunks)])); await expect(readSszSnappyPayload(bufferedSource, type)).to.be.rejectedWith(error); }); } diff --git a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts index 32b26eff9b..fc364b526c 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/encode.test.ts @@ -1,5 +1,5 @@ import all from "it-all"; -import pipe from "it-pipe"; +import {pipe} from "it-pipe"; import {allForks, ssz} from "@lodestar/types"; import {LodestarError} from "@lodestar/utils"; import { @@ -36,7 +36,10 @@ describe("network / reqresp / sszSnappy / encode", () => { ), all ); - expectEqualByteChunks(encodedChunks, chunks); + expectEqualByteChunks( + encodedChunks, + chunks.map((c) => c.subarray()) + ); }); } }); diff --git a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/snappy-frames/uncompress.test.ts b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/snappy-frames/uncompress.test.ts index 3ed196e26e..889065043b 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/snappy-frames/uncompress.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/snappy-frames/uncompress.test.ts @@ -1,4 +1,5 @@ import {expect} from "chai"; +import {Uint8ArrayList} from "uint8arraylist"; import snappy from "@chainsafe/snappy-stream"; import {SnappyFramesUncompress} from "../../../../../../../src/network/reqresp/encodingStrategies/sszSnappy/snappyFrames/uncompress.js"; @@ -13,7 +14,7 @@ describe("snappy frames uncompress", function () { compressStream.on("data", function (data) { const result = decompress.uncompress(data); if (result) { - expect(result.toString()).to.be.equal(testData); + expect(result.subarray().toString()).to.be.equal(testData); done(); } }); @@ -31,7 +32,7 @@ describe("snappy frames uncompress", function () { compressStream.on("data", function (data) { // testData will come compressed as two or more chunks - result = Buffer.concat([result, decompress.uncompress(data) ?? Buffer.alloc(0)]); + result = Buffer.concat([result, decompress.uncompress(data)?.subarray() ?? Buffer.alloc(0)]); if (result.length === testData.length) { expect(result.toString()).to.be.equal(testData); done(); @@ -44,12 +45,12 @@ describe("snappy frames uncompress", function () { it("should detect malformed input", function () { const decompress = new SnappyFramesUncompress(); - expect(() => decompress.uncompress(Buffer.alloc(32, 5))).to.throw(); + expect(() => decompress.uncompress(new Uint8ArrayList(Buffer.alloc(32, 5)))).to.throw(); }); it("should return null if not enough data", function () { const decompress = new SnappyFramesUncompress(); - expect(decompress.uncompress(Buffer.alloc(3, 1))).to.equal(null); + expect(decompress.uncompress(new Uint8ArrayList(Buffer.alloc(3, 1)))).to.equal(null); }); }); diff --git a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/testData.ts b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/testData.ts index 39f0cb41d6..cb42db4d61 100644 --- a/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/testData.ts +++ b/packages/beacon-node/test/unit/network/reqresp/encodingStrategies/sszSnappy/testData.ts @@ -1,3 +1,4 @@ +import {Uint8ArrayList} from "uint8arraylist"; import {fromHexString} from "@chainsafe/ssz"; import {altair, phase0, ssz} from "@lodestar/types"; import {RequestOrIncomingResponseBody, RequestOrResponseType} from "../../../../../../src/network/reqresp/types.js"; @@ -12,7 +13,7 @@ export interface ISszSnappyTestData { /** chunks expected in an async compress version of snappy stream */ asyncChunks: Buffer[]; /** chunks expected in a sync compress version of snappy stream */ - chunks: Buffer[]; + chunks: Uint8ArrayList[]; } export const sszSnappyPing: ISszSnappyTestData = { @@ -24,7 +25,9 @@ export const sszSnappyPing: ISszSnappyTestData = { "0xff060000734e61507059", // snappy frames header "0x010c00000175de410100000000000000", // snappy frames content ].map(fromHexString) as Buffer[], - chunks: ["0x08", "0xff060000734e61507059010c00000175de410100000000000000"].map(fromHexString) as Buffer[], + chunks: ["0x08", "0xff060000734e61507059010c00000175de410100000000000000"].map( + (s) => new Uint8ArrayList(fromHexString(s)) + ), }; export const sszSnappyStatus: ISszSnappyTestData = { @@ -43,8 +46,8 @@ export const sszSnappyStatus: ISszSnappyTestData = { "0x001b0000097802c15400da8a010004090009017e2b001c0900000000000000", ].map(fromHexString) as Buffer[], chunks: ["0x54", "0xff060000734e61507059001b0000097802c15400da8a010004090009017e2b001c0900000000000000"].map( - fromHexString - ) as Buffer[], + (s) => new Uint8ArrayList(fromHexString(s)) + ), }; export const sszSnappySignedBeaconBlockPhase0: ISszSnappyTestData = { @@ -81,7 +84,7 @@ export const sszSnappySignedBeaconBlockPhase0: ISszSnappyTestData new Uint8ArrayList(fromHexString(s))), }; export const sszSnappySignedBeaconBlockAltair: ISszSnappyTestData = { @@ -106,5 +109,5 @@ export const sszSnappySignedBeaconBlockAltair: ISszSnappyTestData new Uint8ArrayList(fromHexString(s))), }; diff --git a/packages/beacon-node/test/unit/network/reqresp/request/responseTimeoutsHandler.test.ts b/packages/beacon-node/test/unit/network/reqresp/request/responseTimeoutsHandler.test.ts index 88059d092e..e2e5053f7d 100644 --- a/packages/beacon-node/test/unit/network/reqresp/request/responseTimeoutsHandler.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/request/responseTimeoutsHandler.test.ts @@ -1,5 +1,5 @@ -import {Libp2p} from "libp2p/src/connection-manager"; -import {MuxedStream} from "libp2p"; +import {Libp2p} from "libp2p"; +import {Stream} from "@libp2p/interface-connection"; import {LodestarError, sleep as _sleep} from "@lodestar/utils"; import {phase0} from "@lodestar/types"; import {config} from "@lodestar/config/default"; @@ -37,16 +37,19 @@ describe("network / reqresp / request / responseTimeoutsHandler", () => { const version = Version.V1; const requestBody: phase0.BeaconBlocksByRangeRequest = {startSlot: 0, count: 9, step: 1}; const maxResponses = requestBody.count; // Random high number - const responseChunk = Buffer.concat([Buffer.from([RespStatus.SUCCESS]), ...sszSnappySignedBeaconBlockPhase0.chunks]); + const responseChunk = Buffer.concat([ + Buffer.from([RespStatus.SUCCESS]), + ...sszSnappySignedBeaconBlockPhase0.chunks.map((chunk) => chunk.subarray()), + ]); const protocol = formatProtocolId(method, version, encoding); const peerId = getValidPeerId(); - const metadata: IRequestErrorMetadata = {method, encoding, peer: peerId.toB58String()}; + const metadata: IRequestErrorMetadata = {method, encoding, peer: peerId.toString()}; /* eslint-disable @typescript-eslint/naming-convention */ const testCases: { id: string; opts?: Partial; - source: () => AsyncGenerator; + source: () => AsyncGenerator; error?: LodestarError; }[] = [ { @@ -102,15 +105,15 @@ describe("network / reqresp / request / responseTimeoutsHandler", () => { it(id, async () => { const libp2p = ({ async dialProtocol() { - return { - stream: ({ - async sink(): Promise {}, - source: source(), - close() {}, - abort() {}, - } as Partial) as MuxedStream, - protocol, - }; + return ({ + async sink(): Promise {}, + source: source(), + close() {}, + closeRead() {}, + closeWrite() {}, + abort() {}, + stat: {direction: "outbound", timeline: {open: Date.now()}, protocol}, + } as Partial) as Stream; }, } as Partial) as Libp2p; diff --git a/packages/beacon-node/test/unit/network/reqresp/response/index.test.ts b/packages/beacon-node/test/unit/network/reqresp/response/index.test.ts index 2effcef749..4d38bbb3b4 100644 --- a/packages/beacon-node/test/unit/network/reqresp/response/index.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/response/index.test.ts @@ -1,5 +1,6 @@ import chai, {expect} from "chai"; import chaiAsPromised from "chai-as-promised"; +import {Uint8ArrayList} from "uint8arraylist"; import {LodestarError, fromHex} from "@lodestar/utils"; import {RespStatus} from "../../../../../src/constants/index.js"; import {Method, Encoding, Version} from "../../../../../src/network/reqresp/types.js"; @@ -27,9 +28,9 @@ describe("network / reqresp / response / handleRequest", async () => { id: string; method: Method; encoding: Encoding; - requestChunks: Buffer[]; + requestChunks: Uint8ArrayList[]; performRequestHandler: PerformRequestHandler; - expectedResponseChunks: Buffer[]; + expectedResponseChunks: Uint8Array[]; expectedError?: LodestarError; }[] = [ { @@ -46,10 +47,10 @@ describe("network / reqresp / response / handleRequest", async () => { expectedResponseChunks: [ // Chunk 0 - success, Ping, BigInt(1) Buffer.from([RespStatus.SUCCESS]), - ...sszSnappyPing.chunks, + ...sszSnappyPing.chunks.map((c) => c.subarray()), // Chunk 1 - success, Ping, BigInt(1) Buffer.from([RespStatus.SUCCESS]), - ...sszSnappyPing.chunks, + ...sszSnappyPing.chunks.map((c) => c.subarray()), // Chunk 2 - error, with errorMessage Buffer.from([RespStatus.SERVER_ERROR]), Buffer.from(fromHex("0x0a")), diff --git a/packages/beacon-node/test/unit/network/reqresp/response/rateLimiter.test.ts b/packages/beacon-node/test/unit/network/reqresp/response/rateLimiter.test.ts index b313854b37..c70dbbfbb9 100644 --- a/packages/beacon-node/test/unit/network/reqresp/response/rateLimiter.test.ts +++ b/packages/beacon-node/test/unit/network/reqresp/response/rateLimiter.test.ts @@ -1,6 +1,7 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; import sinon, {SinonStubbedInstance} from "sinon"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {IPeerRpcScoreStore, PeerAction, PeerRpcScoreStore} from "../../../../../src/network/index.js"; import {defaultNetworkOptions} from "../../../../../src/network/options.js"; import {InboundRateLimiter} from "../../../../../src/network/reqresp/response/rateLimiter.js"; @@ -37,12 +38,12 @@ describe("ResponseRateLimiter", () => { * - Peer1 requests again => ok */ it("requestCountPeerLimit", async () => { - const peerId = await PeerId.create(); + const peerId = await createSecp256k1PeerId(); const requestTyped = {method: Method.Ping, body: BigInt(1)} as RequestTypedContainer; for (let i = 0; i < defaultNetworkOptions.requestCountPeerLimit; i++) { expect(inboundRateLimiter.allowRequest(peerId, requestTyped)).to.equal(true); } - const peerId2 = await PeerId.create(); + const peerId2 = await createSecp256k1PeerId(); // it's ok to request blocks for another peer expect(inboundRateLimiter.allowRequest(peerId2, requestTyped)).to.equal(true); expect(peerRpcScoresStub.applyAction.calledOnce).to.equal(false); @@ -71,16 +72,16 @@ describe("ResponseRateLimiter", () => { const blockCount = Math.floor(defaultNetworkOptions.blockCountTotalLimit / 2); const requestTyped = {method: Method.BeaconBlocksByRange, body: {count: blockCount}} as RequestTypedContainer; for (let i = 0; i < 2; i++) { - expect(inboundRateLimiter.allowRequest(await PeerId.create(), requestTyped)).to.equal(true); + expect(inboundRateLimiter.allowRequest(await createSecp256k1PeerId(), requestTyped)).to.equal(true); } const oneBlockRequestTyped = {method: Method.BeaconBlocksByRoot, body: [Buffer.alloc(32)]} as RequestTypedContainer; - expect(inboundRateLimiter.allowRequest(await PeerId.create(), oneBlockRequestTyped)).to.equal(false); + expect(inboundRateLimiter.allowRequest(await createSecp256k1PeerId(), oneBlockRequestTyped)).to.equal(false); expect(peerRpcScoresStub.applyAction.calledOnce).to.equal(false); sandbox.clock.tick(60 * 1000); // try again after timeout - expect(inboundRateLimiter.allowRequest(await PeerId.create(), oneBlockRequestTyped)).to.equal(true); + expect(inboundRateLimiter.allowRequest(await createSecp256k1PeerId(), oneBlockRequestTyped)).to.equal(true); }); /** @@ -95,11 +96,11 @@ describe("ResponseRateLimiter", () => { it("blockCountPeerLimit", async () => { const blockCount = Math.floor(defaultNetworkOptions.blockCountPeerLimit / 2); const requestTyped = {method: Method.BeaconBlocksByRange, body: {count: blockCount}} as RequestTypedContainer; - const peerId = await PeerId.create(); + const peerId = await createSecp256k1PeerId(); for (let i = 0; i < 2; i++) { expect(inboundRateLimiter.allowRequest(peerId, requestTyped)).to.equal(true); } - const peerId2 = await PeerId.create(); + const peerId2 = await createSecp256k1PeerId(); const oneBlockRequestTyped = {method: Method.BeaconBlocksByRoot, body: [Buffer.alloc(32)]} as RequestTypedContainer; // it's ok to request blocks for another peer expect(inboundRateLimiter.allowRequest(peerId2, oneBlockRequestTyped)).to.equal(true); @@ -117,7 +118,7 @@ describe("ResponseRateLimiter", () => { }); it("should remove rate tracker for disconnected peers", async () => { - const peerId = await PeerId.create(); + const peerId = await createSecp256k1PeerId(); const pruneStub = sandbox.stub(inboundRateLimiter, "pruneByPeerIdStr" as keyof InboundRateLimiter); inboundRateLimiter.start(); const requestTyped = {method: Method.Ping, body: BigInt(1)} as RequestTypedContainer; @@ -135,7 +136,7 @@ describe("ResponseRateLimiter", () => { this.timeout(5000); const peerIds: PeerId[] = []; for (let i = 0; i < 25; i++) { - peerIds.push(await PeerId.create()); + peerIds.push(await createSecp256k1PeerId()); } const startMem = process.memoryUsage().heapUsed; diff --git a/packages/beacon-node/test/unit/network/reqresp/utils.ts b/packages/beacon-node/test/unit/network/reqresp/utils.ts index 92374a02f0..c0a2ec67be 100644 --- a/packages/beacon-node/test/unit/network/reqresp/utils.ts +++ b/packages/beacon-node/test/unit/network/reqresp/utils.ts @@ -1,7 +1,8 @@ import {expect} from "chai"; +import {Stream, StreamStat} from "@libp2p/interface-connection"; +import {Uint8ArrayList} from "uint8arraylist"; import {Root, phase0} from "@lodestar/types"; import {toHexString} from "@chainsafe/ssz"; -import {Libp2pStream} from "../../../../src/network/index.js"; import {generateEmptySignedBlock} from "../../../utils/block.js"; export function createStatus(): phase0.Status { @@ -39,7 +40,7 @@ export function generateEmptySignedBlocks(n = 3): phase0.SignedBeaconBlock[] { /** * Wrapper for type-safety to ensure and array of Buffers is equal with a diff in hex */ -export function expectEqualByteChunks(chunks: Buffer[], expectedChunks: Buffer[], message?: string): void { +export function expectEqualByteChunks(chunks: Uint8Array[], expectedChunks: Uint8Array[], message?: string): void { expect(chunks.map(toHexString)).to.deep.equal(expectedChunks.map(toHexString), message); } @@ -47,21 +48,32 @@ export function expectEqualByteChunks(chunks: Buffer[], expectedChunks: Buffer[] * Useful to simulate a LibP2P stream source emitting prepared bytes * and capture the response with a sink accessible via `this.resultChunks` */ -export class MockLibP2pStream implements Libp2pStream { - source: Libp2pStream["source"]; - resultChunks: Buffer[] = []; +export class MockLibP2pStream implements Stream { + id = "mock"; + stat = { + direction: "inbound", + timeline: { + open: Date.now(), + }, + } as StreamStat; + metadata = {}; + source: Stream["source"]; + resultChunks: Uint8Array[] = []; - constructor(requestChunks: Buffer[]) { + constructor(requestChunks: Uint8ArrayList[]) { this.source = arrToSource(requestChunks); } - - sink: Libp2pStream["sink"] = async (source) => { + sink: Stream["sink"] = async (source) => { for await (const chunk of source) { - this.resultChunks.push(chunk); + this.resultChunks.push(chunk.subarray()); } }; // eslint-disable-next-line @typescript-eslint/no-empty-function - close: Libp2pStream["close"] = () => {}; - reset: Libp2pStream["reset"] = () => this.close(); - abort: Libp2pStream["abort"] = () => this.close(); + close: Stream["close"] = () => {}; + // eslint-disable-next-line @typescript-eslint/no-empty-function + closeRead = (): void => {}; + // eslint-disable-next-line @typescript-eslint/no-empty-function + closeWrite = (): void => {}; + reset: Stream["reset"] = () => this.close(); + abort: Stream["abort"] = () => this.close(); } diff --git a/packages/beacon-node/test/unit/network/util.test.ts b/packages/beacon-node/test/unit/network/util.test.ts index 7e076cc31a..b808e19081 100644 --- a/packages/beacon-node/test/unit/network/util.test.ts +++ b/packages/beacon-node/test/unit/network/util.test.ts @@ -1,6 +1,6 @@ -import {Multiaddr} from "multiaddr"; +import {multiaddr} from "@multiformats/multiaddr"; import {expect} from "chai"; -import PeerId from "peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {config} from "@lodestar/config/default"; import {ForkName} from "@lodestar/params"; import {ENR} from "@chainsafe/discv5"; @@ -10,18 +10,14 @@ import {formatProtocolId, parseProtocolId} from "../../../src/network/reqresp/ut import {createNodeJsLibp2p, isLocalMultiAddr} from "../../../src/network/index.js"; import {getCurrentAndNextFork} from "../../../src/network/forks.js"; -async function createPeerId(): Promise { - return await PeerId.create({keyType: "secp256k1"}); -} - describe("Test isLocalMultiAddr", () => { it("should return true for 127.0.0.1", () => { - const multi0 = new Multiaddr("/ip4/127.0.0.1/udp/30303"); + const multi0 = multiaddr("/ip4/127.0.0.1/udp/30303"); expect(isLocalMultiAddr(multi0)).to.equal(true); }); it("should return false for 0.0.0.0", () => { - const multi0 = new Multiaddr("/ip4/0.0.0.0/udp/30303"); + const multi0 = multiaddr("/ip4/0.0.0.0/udp/30303"); expect(isLocalMultiAddr(multi0)).to.equal(false); }); }); @@ -90,7 +86,7 @@ describe("getCurrentAndNextFork", function () { describe("createNodeJsLibp2p", () => { it("should extract bootMultiaddrs from enr with tcp", async function () { this.timeout(0); - const peerId = await createPeerId(); + const peerId = await createSecp256k1PeerId(); const enrWithTcp = [ "enr:-LK4QDiPGwNomqUqNDaM3iHYvtdX7M5qngson6Qb2xGIg1LwC8-Nic0aQwO0rVbJt5xp32sRE3S1YqvVrWO7OgVNv0kBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpA7CIeVAAAgCf__________gmlkgnY0gmlwhBKNA4qJc2VjcDI1NmsxoQKbBS4ROQ_sldJm5tMgi36qm5I5exKJFb4C8dDVS_otAoN0Y3CCIyiDdWRwgiMo", ]; @@ -120,7 +116,7 @@ describe("createNodeJsLibp2p", () => { it("should not extract bootMultiaddrs from enr without tcp", async function () { this.timeout(0); - const peerId = await createPeerId(); + const peerId = await createSecp256k1PeerId(); const enrWithoutTcp = [ "enr:-Ku4QCFQW96tEDYPjtaueW3WIh1CB0cJnvw_ibx5qIFZGqfLLj-QajMX6XwVs2d4offuspwgH3NkIMpWtCjCytVdlywGh2F0dG5ldHOIEAIAAgABAUyEZXRoMpCi7FS9AQAAAAAiAQAAAAAAgmlkgnY0gmlwhFA4VK6Jc2VjcDI1NmsxoQNGH1sJJS86-0x9T7qQewz9Wn9zlp6bYxqqrR38JQ49yIN1ZHCCIyg", ]; diff --git a/packages/beacon-node/test/unit/sync/range/batch.test.ts b/packages/beacon-node/test/unit/sync/range/batch.test.ts index ef76ad3185..b60b00607b 100644 --- a/packages/beacon-node/test/unit/sync/range/batch.test.ts +++ b/packages/beacon-node/test/unit/sync/range/batch.test.ts @@ -1,5 +1,5 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {config} from "@lodestar/config/default"; import {generateEmptySignedBlock} from "../../../utils/block.js"; @@ -7,10 +7,10 @@ import {expectThrowsLodestarError} from "../../../utils/errors.js"; import {Batch, BatchStatus, BatchErrorCode, BatchError} from "../../../../src/sync/range/batch.js"; import {EPOCHS_PER_BATCH} from "../../../../src/sync/constants.js"; -describe("sync / range / batch", () => { +describe("sync / range / batch", async () => { // Common mock data const startEpoch = 0; - const peer = new PeerId(Buffer.from("lodestar")); + const peer = await createSecp256k1PeerId(); const blocksDownloaded = [generateEmptySignedBlock()]; it("Should return correct blockByRangeRequest", () => { diff --git a/packages/beacon-node/test/unit/sync/range/chain.test.ts b/packages/beacon-node/test/unit/sync/range/chain.test.ts index 74d3f37bd5..7e048fb0ee 100644 --- a/packages/beacon-node/test/unit/sync/range/chain.test.ts +++ b/packages/beacon-node/test/unit/sync/range/chain.test.ts @@ -172,7 +172,7 @@ function logSyncChainFns(logger: ILogger, fns: SyncChainFns): SyncChainFns { return fns.downloadBeaconBlocksByRange(peer, request); }, reportPeer(peer, action, actionName) { - logger.debug("mock reportPeer", {peer: peer.toB58String(), action, actionName}); + logger.debug("mock reportPeer", {peer: peer.toString(), action, actionName}); return fns.reportPeer(peer, action, actionName); }, onEnd(err, target) { diff --git a/packages/beacon-node/test/unit/sync/range/utils/peerBalancer.test.ts b/packages/beacon-node/test/unit/sync/range/utils/peerBalancer.test.ts index b8a0a9921a..1c919c0fb5 100644 --- a/packages/beacon-node/test/unit/sync/range/utils/peerBalancer.test.ts +++ b/packages/beacon-node/test/unit/sync/range/utils/peerBalancer.test.ts @@ -1,16 +1,16 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {config} from "@lodestar/config/default"; import {Batch} from "../../../../../src/sync/range/batch.js"; import {ChainPeersBalancer} from "../../../../../src/sync/range/utils/peerBalancer.js"; describe("sync / range / peerBalancer", () => { - it("bestPeerToRetryBatch", () => { + it("bestPeerToRetryBatch", async () => { // Run N times to make sure results are consistent with different shufflings for (let i = 0; i < 5; i++) { - const peer1 = new PeerId(Buffer.from([0])); // Offset by one, PeerId encodes to B58String 0 as "1" - const peer2 = new PeerId(Buffer.from([1])); - const peer3 = new PeerId(Buffer.from([2])); + const peer1 = await createSecp256k1PeerId(); + const peer2 = await createSecp256k1PeerId(); + const peer3 = await createSecp256k1PeerId(); const batch0 = new Batch(0, config); const batch1 = new Batch(1, config); @@ -37,13 +37,13 @@ describe("sync / range / peerBalancer", () => { } }); - it("idlePeers", () => { + it("idlePeers", async () => { // Run N times to make sure results are consistent with different shufflings for (let i = 0; i < 5; i++) { - const peer1 = new PeerId(Buffer.from([0])); - const peer2 = new PeerId(Buffer.from([1])); - const peer3 = new PeerId(Buffer.from([2])); - const peer4 = new PeerId(Buffer.from([3])); + const peer1 = await createSecp256k1PeerId(); + const peer2 = await createSecp256k1PeerId(); + const peer3 = await createSecp256k1PeerId(); + const peer4 = await createSecp256k1PeerId(); const batch0 = new Batch(0, config); const batch1 = new Batch(1, config); @@ -55,8 +55,8 @@ describe("sync / range / peerBalancer", () => { const idlePeers = peerBalancer.idlePeers(); - const idlePeersIds = idlePeers.map((p) => p.toB58String()).sort(); - const expectedIds = [peer3, peer4].map((p) => p.toB58String()).sort(); + const idlePeersIds = idlePeers.map((p) => p.toString()).sort(); + const expectedIds = [peer3, peer4].map((p) => p.toString()).sort(); expect(idlePeersIds).to.deep.equal(expectedIds, "Wrong idlePeers (encoded as B58String)"); } }); diff --git a/packages/beacon-node/test/unit/sync/unknownBlock.test.ts b/packages/beacon-node/test/unit/sync/unknownBlock.test.ts index 218e8f97d4..42355de3ef 100644 --- a/packages/beacon-node/test/unit/sync/unknownBlock.test.ts +++ b/packages/beacon-node/test/unit/sync/unknownBlock.test.ts @@ -21,7 +21,7 @@ describe("sync / UnknownBlockSync", () => { for (const {id, finalizedSlot, reportPeer} of testCases) { it(id, async () => { const peer = getValidPeerId(); - const peerIdStr = peer.toB58String(); + const peerIdStr = peer.toString(); const blockA = ssz.phase0.SignedBeaconBlock.defaultValue(); const blockB = ssz.phase0.SignedBeaconBlock.defaultValue(); const blockC = ssz.phase0.SignedBeaconBlock.defaultValue(); @@ -82,7 +82,7 @@ describe("sync / UnknownBlockSync", () => { if (reportPeer) { const err = await reportPeerPromise; - expect(err[0].toB58String()).equal(peerIdStr); + expect(err[0].toString()).equal(peerIdStr); expect([err[1], err[2]]).to.be.deep.equal([PeerAction.LowToleranceError, "BadBlockByRoot"]); } else { // happy path diff --git a/packages/beacon-node/test/unit/util/peerId.test.ts b/packages/beacon-node/test/unit/util/peerId.test.ts deleted file mode 100644 index 2252cdb06d..0000000000 --- a/packages/beacon-node/test/unit/util/peerId.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {expect} from "chai"; -import {createFromPrivKey} from "peer-id"; -import {fromHexString, toHexString} from "@chainsafe/ssz"; -import {createPeerId} from "../../../src/network/index.js"; - -describe("PeerId util - for multithread sim test", () => { - it("Should serialize and deserialize privKey", async () => { - const peerId = await createPeerId(); - const privKey = peerId.marshalPrivKey(); - const privKeyHex = toHexString(privKey); - const peerIdRecov = await createFromPrivKey(fromHexString(privKeyHex)); - expect(peerId.toB58String()).to.equal(peerIdRecov.toB58String()); - }); -}); diff --git a/packages/beacon-node/test/unit/util/peerMap.test.ts b/packages/beacon-node/test/unit/util/peerMap.test.ts index d2659d8da7..c28d2b0f26 100644 --- a/packages/beacon-node/test/unit/util/peerMap.test.ts +++ b/packages/beacon-node/test/unit/util/peerMap.test.ts @@ -1,9 +1,9 @@ import {expect} from "chai"; -import PeerId from "peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {PeerMap, PeerSet} from "../../../src/util/peerMap.js"; -describe("util / peerMap", () => { - const peer1 = new PeerId(Buffer.from([0])); // Offset by one, PeerId encodes to B58String 0 as "1" +describe("util / peerMap", async () => { + const peer1 = await createSecp256k1PeerId(); describe("PeerMap", () => { it("Should compute correct size", () => { diff --git a/packages/beacon-node/test/utils/network.ts b/packages/beacon-node/test/utils/network.ts index 7eeea8e372..c8d5c13d5f 100644 --- a/packages/beacon-node/test/utils/network.ts +++ b/packages/beacon-node/test/utils/network.ts @@ -1,15 +1,16 @@ -import PeerId from "peer-id"; -import {Multiaddr} from "multiaddr"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {Multiaddr} from "@multiformats/multiaddr"; +import {Libp2p} from "libp2p"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {ATTESTATION_SUBNET_COUNT, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params"; import {BitArray} from "@chainsafe/ssz"; import {INetwork, Network} from "../../src/network/index.js"; -import {NodejsNode} from "../../src/network/nodejs/index.js"; -import {createPeerId} from "../../src/network/index.js"; +import {createNodejsLibp2p} from "../../src/network/nodejs/index.js"; import {Libp2pEvent} from "../../src/constants/index.js"; -export async function createNode(multiaddr: string, inPeerId?: PeerId): Promise { - const peerId = inPeerId || (await createPeerId()); - return new NodejsNode({ +export async function createNode(multiaddr: string, inPeerId?: PeerId): Promise { + const peerId = inPeerId || (await createSecp256k1PeerId()); + return createNodejsLibp2p({ peerId, addresses: {listen: [multiaddr]}, }); @@ -33,14 +34,14 @@ export async function disconnect(network: INetworkDebug, peer: PeerId): Promise< export function onPeerConnect(network: Network): Promise { return new Promise((resolve) => // eslint-disable-next-line @typescript-eslint/no-unsafe-return - network["libp2p"].connectionManager.on(Libp2pEvent.peerConnect, resolve) + network["libp2p"].connectionManager.addEventListener(Libp2pEvent.peerConnect, () => resolve()) ); } export function onPeerDisconnect(network: Network): Promise { return new Promise((resolve) => // eslint-disable-next-line @typescript-eslint/no-unsafe-return - network["libp2p"].connectionManager.on(Libp2pEvent.peerDisconnect, resolve) + network["libp2p"].connectionManager.addEventListener(Libp2pEvent.peerDisconnect, () => resolve()) ); } diff --git a/packages/beacon-node/test/utils/node/beacon.ts b/packages/beacon-node/test/utils/node/beacon.ts index 68c8b20c2c..b38554163c 100644 --- a/packages/beacon-node/test/utils/node/beacon.ts +++ b/packages/beacon-node/test/utils/node/beacon.ts @@ -1,6 +1,7 @@ import deepmerge from "deepmerge"; import tmp from "tmp"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {config as minimalConfig} from "@lodestar/config/default"; import {createIBeaconConfig, createIChainForkConfig, IChainConfig} from "@lodestar/config"; import {ILogger, RecursivePartial} from "@lodestar/utils"; @@ -12,7 +13,6 @@ import {isPlainObject} from "@lodestar/utils"; import {createKeypairFromPeerId, ENR} from "@chainsafe/discv5"; import {BeaconNode} from "../../../src/index.js"; import {createNodeJsLibp2p} from "../../../src/network/nodejs/index.js"; -import {createPeerId} from "../../../src/network/index.js"; import {defaultNetworkOptions} from "../../../src/network/options.js"; import {initDevState, writeDeposits} from "../../../src/node/utils/state.js"; import {IBeaconNodeOptions} from "../../../src/node/options.js"; @@ -36,7 +36,7 @@ export async function getDevBeaconNode( const {params, validatorCount = 8, peerStoreDir} = opts; let {options = {}, logger, peerId} = opts; - if (!peerId) peerId = await createPeerId(); + if (!peerId) peerId = await createSecp256k1PeerId(); const tmpDir = tmp.dirSync({unsafeCleanup: true}); const config = createIChainForkConfig({...minimalConfig, ...params}); logger = logger ?? testLogger(); diff --git a/packages/beacon-node/test/utils/peer.ts b/packages/beacon-node/test/utils/peer.ts index 467b85d3f5..863551d0ee 100644 --- a/packages/beacon-node/test/utils/peer.ts +++ b/packages/beacon-node/test/utils/peer.ts @@ -1,4 +1,5 @@ -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {peerIdFromBytes} from "@libp2p/peer-id"; /** * Returns a valid PeerId with opts `bits: 256, keyType: "secp256k1"` @@ -6,5 +7,5 @@ import PeerId from "peer-id"; */ export function getValidPeerId(): PeerId { const id = Buffer.from("002508021221039481269fe831799b1a0f1d521c1395b4831514859e4559c44d155eae46f03819", "hex"); - return new PeerId(id); + return peerIdFromBytes(id); } diff --git a/packages/beacon-node/test/utils/validationData/attestation.ts b/packages/beacon-node/test/utils/validationData/attestation.ts index e11b5588e7..3a1f7ddae6 100644 --- a/packages/beacon-node/test/utils/validationData/attestation.ts +++ b/packages/beacon-node/test/utils/validationData/attestation.ts @@ -33,7 +33,12 @@ export type AttestationValidDataOpts = { */ export function getAttestationValidData( opts: AttestationValidDataOpts -): {chain: IBeaconChain; attestation: phase0.Attestation; subnet: number; validatorIndex: number} { +): { + chain: IBeaconChain; + attestation: phase0.Attestation; + subnet: number; + validatorIndex: number; +} { const currentSlot = opts.currentSlot ?? 100; const attSlot = opts.attSlot ?? currentSlot; const attIndex = opts.attIndex ?? 0; diff --git a/packages/cli/package.json b/packages/cli/package.json index 421aaff282..246f791c37 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -55,8 +55,10 @@ "@chainsafe/bls-keygen": "^0.3.0", "@chainsafe/bls-keystore": "^2.0.0", "@chainsafe/blst": "^0.2.4", - "@chainsafe/discv5": "^0.7.1", + "@chainsafe/discv5": "^1.1.2", "@chainsafe/ssz": "^0.9.2", + "@libp2p/peer-id-factory": "^1.0.18", + "@multiformats/multiaddr": "^11.0.0", "@lodestar/api": "^1.1.0", "@lodestar/beacon-node": "^1.1.0", "@lodestar/config": "^1.1.0", @@ -78,11 +80,11 @@ "js-yaml": "^3.14.0", "lockfile": "^1.0.4", "lodash": "^4.17.15", - "multiaddr": "^10.0.1", "peer-id": "^0.15.3", "prom-client": "^14.0.1", "rimraf": "^3.0.0", "source-map-support": "^0.5.19", + "uint8arrays": "^3.1.0", "uuidv4": "^6.1.1", "yargs": "^16.1.0", "winston": "^3.3.3", diff --git a/packages/cli/src/cmds/beacon/handler.ts b/packages/cli/src/cmds/beacon/handler.ts index 945007fb06..c1df4e045f 100644 --- a/packages/cli/src/cmds/beacon/handler.ts +++ b/packages/cli/src/cmds/beacon/handler.ts @@ -1,5 +1,6 @@ import path from "node:path"; import {Registry} from "prom-client"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {createKeypairFromPeerId, ENR} from "@chainsafe/discv5"; import {ErrorAborted} from "@lodestar/utils"; import {LevelDbController} from "@lodestar/db"; @@ -9,8 +10,8 @@ import {ACTIVE_PRESET, PresetName} from "@lodestar/params"; import {ProcessShutdownCallback} from "@lodestar/validator"; import {IGlobalArgs, parseBeaconNodeArgs} from "../../options/index.js"; +import {BeaconNodeOptions, exportToJSON, FileENR, getBeaconConfigFromArgs} from "../../config/index.js"; import {onGracefulShutdown, getCliLogger, mkdir, writeFile600Perm} from "../../util/index.js"; -import {BeaconNodeOptions, createPeerId, FileENR, getBeaconConfigFromArgs} from "../../config/index.js"; import {getNetworkBootnodes, getNetworkData, readBootnodes} from "../../networks/index.js"; import {getVersionData} from "../../util/version.js"; import {IBeaconArgs} from "./options.js"; @@ -72,7 +73,10 @@ export async function beaconHandler(args: IBeaconArgs & IGlobalArgs): Promise { - return await PeerId.create({keyType: "secp256k1"}); +// Peer id to / from JSON taken from peer-id-factory +// See https://github.com/libp2p/js-libp2p-peer-id/pull/9 for more details + +async function createFromParts(multihash: Uint8Array, privKey?: Uint8Array, pubKey?: Uint8Array): Promise { + if (privKey != null) { + const key = await unmarshalPrivateKey(privKey); + + return await createFromPrivKey(key); + } else if (pubKey != null) { + const key = unmarshalPublicKey(pubKey); + + return await createFromPubKey(key); + } + + return peerIdFromBytes(multihash); +} + +export type PeerIdJSON = {id: string; pubKey?: string; privKey?: string}; + +export function exportToJSON(peerId: PeerId, excludePrivateKey?: boolean): PeerIdJSON { + return { + id: uint8ArrayToString(peerId.toBytes(), "base58btc"), + pubKey: peerId.publicKey != null ? uint8ArrayToString(peerId.publicKey, "base64pad") : undefined, + privKey: + excludePrivateKey === true || peerId.privateKey == null + ? undefined + : uint8ArrayToString(peerId.privateKey, "base64pad"), + }; +} + +export async function createFromJSON(obj: PeerIdJSON): Promise { + return await createFromParts( + uint8ArrayFromString(obj.id, "base58btc"), + obj.privKey != null ? uint8ArrayFromString(obj.privKey, "base64pad") : undefined, + obj.pubKey != null ? uint8ArrayFromString(obj.pubKey, "base64pad") : undefined + ); } export function writePeerId(filepath: string, peerId: PeerId): void { - writeFile600Perm(filepath, peerId.toJSON()); + writeFile600Perm(filepath, exportToJSON(peerId)); } export async function readPeerId(filepath: string): Promise { - return await PeerId.createFromJSON(readFile(filepath)); + return await createFromJSON(readFile(filepath)); } diff --git a/packages/cli/test/unit/cmds/beacon.test.ts b/packages/cli/test/unit/cmds/beacon.test.ts index a032f06068..f326b052bb 100644 --- a/packages/cli/test/unit/cmds/beacon.test.ts +++ b/packages/cli/test/unit/cmds/beacon.test.ts @@ -1,14 +1,15 @@ import path from "node:path"; import fs from "node:fs"; import {expect} from "chai"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {chainConfig} from "@lodestar/config/default"; import {chainConfigToJson} from "@lodestar/config"; import {ENR} from "@chainsafe/discv5"; +import {exportToJSON} from "../../../src/config/peerId.js"; import {beaconHandlerInit} from "../../../src/cmds/beacon/handler.js"; import {IBeaconArgs} from "../../../src/cmds/beacon/options.js"; import {IGlobalArgs} from "../../../src/options/globalOptions.js"; import {testFilesDir} from "../../utils.js"; -import {createPeerId} from "../../../src/config/peerId.js"; describe("cmds / beacon / args handler", () => { // Make tests faster skipping a network call @@ -50,20 +51,20 @@ describe("cmds / beacon / args handler", () => { const {peerId: peerId1} = await runBeaconHandlerInit({}); const {peerId: peerId2} = await runBeaconHandlerInit({}); - expect(peerId1.toB58String()).not.equal(peerId2.toB58String(), "peer ids must be different"); + expect(peerId1.toString()).not.equal(peerId2.toString(), "peer ids must be different"); }); it.skip("Re-use existing peer", async () => { - const prevPeerId = await createPeerId(); + const prevPeerId = await createSecp256k1PeerId(); const peerIdFile = path.join(testFilesDir, "prev_peerid.json"); - fs.writeFileSync(peerIdFile, JSON.stringify(prevPeerId.toJSON())); + fs.writeFileSync(peerIdFile, JSON.stringify(exportToJSON(prevPeerId))); const {peerId} = await runBeaconHandlerInit({ // peerIdFile, }); - expect(peerId.toB58String()).equal(prevPeerId.toB58String(), "peer must be equal to persisted"); + expect(peerId.toString()).equal(prevPeerId.toString(), "peer must be equal to persisted"); }); it("Set known deposit contract", async () => { diff --git a/packages/cli/test/unit/config/fileEnr.test.ts b/packages/cli/test/unit/config/fileEnr.test.ts index c20c60de7a..31bb40f5a1 100644 --- a/packages/cli/test/unit/config/fileEnr.test.ts +++ b/packages/cli/test/unit/config/fileEnr.test.ts @@ -3,7 +3,8 @@ import path from "node:path"; import {expect} from "chai"; import {before, after} from "mocha"; import rimraf from "rimraf"; -import PeerId from "peer-id"; +import {PeerId} from "@libp2p/interface-peer-id"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {toHexString} from "@chainsafe/ssz"; import {createKeypairFromPeerId, ENR} from "@chainsafe/discv5"; import {FileENR} from "../../../src/config/index.js"; @@ -21,7 +22,7 @@ describe("fileENR", function () { }); it("create ENR from file", async function () { - const peerId = await PeerId.create({keyType: "secp256k1"}); + const peerId = await createSecp256k1PeerId(); const enrFilePath = path.join(testFilesDir, "enr_file.txt"); initEnr(enrFilePath, peerId); diff --git a/packages/cli/test/unit/config/peerId.test.ts b/packages/cli/test/unit/config/peerId.test.ts index 16641223c7..618c97a990 100644 --- a/packages/cli/test/unit/config/peerId.test.ts +++ b/packages/cli/test/unit/config/peerId.test.ts @@ -1,15 +1,16 @@ import {expect} from "chai"; +import {createSecp256k1PeerId} from "@libp2p/peer-id-factory"; import {getTestdirPath} from "../../utils.js"; -import {createPeerId, writePeerId, readPeerId} from "../../../src/config/index.js"; +import {writePeerId, readPeerId} from "../../../src/config/index.js"; describe("config / peerId", () => { const peerIdFilepath = getTestdirPath("./test-peer-id.json"); it("create, write and read PeerId", async () => { - const peerId = await createPeerId(); + const peerId = await createSecp256k1PeerId(); writePeerId(peerIdFilepath, peerId); const peerIdRead = await readPeerId(peerIdFilepath); - expect(peerIdRead.toB58String()).to.equal(peerId.toB58String()); + expect(peerIdRead.toString()).to.equal(peerId.toString()); }); }); diff --git a/tsconfig.build.json b/tsconfig.build.json index 1432f2311d..0ae5af0c0d 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "es2019", - "lib": ["es2020", "esnext.bigint", "es2020.string", "es2020.symbol.wellknown"], + "lib": ["es2020", "esnext.bigint", "es2020.string", "es2020.symbol.wellknown", "dom"], "module": "esnext", "moduleResolution": "node", diff --git a/types/libp2p-mdns/index.d.ts b/types/libp2p-mdns/index.d.ts deleted file mode 100644 index da205f7b82..0000000000 --- a/types/libp2p-mdns/index.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Type definitions for libp2p-mdns 0.12.0 -// Project: https://github.com/libp2p/js-libp2p-mdns -// Definitions by: Jaco Greeff -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -// import PeerDiscovery from 'libp2p-interfaces/src/peer-discovery/types'; -// import { Multiaddr } from 'multiaddr'; - -// type PeerInfo = { -// id: import("peer-id"); -// multiaddrs: Multiaddr[]; -// }; - -// declare namespace LibP2pMdns { -// type Options = { -// broadcast?: boolean, -// interval?: number, -// peerInfo: PeerInfo, -// port?: number, -// serviceTag?: string -// }; - -// type Events = 'peer'; -// } - -// declare class LibP2pMdns extends PeerDiscovery { -// constructor (options: LibP2pMdns.Options); - -// on (event: LibP2pMdns.Events, cb: (peerInfo: PeerInfo) => any): this; -// } - -// declare module 'libp2p-mdns' { -// export default LibP2pMdns; -// } - -declare module "libp2p-mdns" { - import {PeerDiscoveryFactory} from "libp2p-interfaces/src/peer-discovery/types"; - - const mdns: PeerDiscoveryFactory; - export default mdns; -} diff --git a/types/libp2p-mdns/libp2p-mdns-tests.ts b/types/libp2p-mdns/libp2p-mdns-tests.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/types/libp2p-mdns/tsconfig.json b/types/libp2p-mdns/tsconfig.json deleted file mode 100644 index 3b291d869d..0000000000 --- a/types/libp2p-mdns/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "noImplicitAny": true, - "noImplicitThis": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "baseUrl": "../", - "typeRoots": ["../"], - "types": [], - "noEmit": true, - "forceConsistentCasingInFileNames": true - }, - "files": ["index.d.ts", "bn.js-tests.ts"] -} diff --git a/types/libp2p-mdns/tslint.json b/types/libp2p-mdns/tslint.json deleted file mode 100644 index 4e88071852..0000000000 --- a/types/libp2p-mdns/tslint.json +++ /dev/null @@ -1 +0,0 @@ -{"extends": "dtslint/dt.json"} diff --git a/types/libp2p-mplex/index.d.ts b/types/libp2p-mplex/index.d.ts deleted file mode 100644 index 7834eed804..0000000000 --- a/types/libp2p-mplex/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Type definitions for libp2p-mplex 0.8.0 -// Project: https://github.com/libp2p/js-libp2p-mplex -// Definitions by: Jaco Greeff -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -declare module "libp2p-mplex" { - const mplex: import("libp2p-interfaces/src/stream-muxer/types").MuxerFactory; - export default mplex; -} diff --git a/types/libp2p-mplex/libp2p-mplex-tests.ts b/types/libp2p-mplex/libp2p-mplex-tests.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/types/libp2p-mplex/tsconfig.json b/types/libp2p-mplex/tsconfig.json deleted file mode 100644 index 0af341c236..0000000000 --- a/types/libp2p-mplex/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "noImplicitAny": true, - "noImplicitThis": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "baseUrl": "../", - "typeRoots": ["../"], - "types": [], - "noEmit": true, - "forceConsistentCasingInFileNames": true - }, - "files": ["index.d.ts", "libp2p-mplex-tests.ts"] -} diff --git a/types/libp2p-mplex/tslint.json b/types/libp2p-mplex/tslint.json deleted file mode 100644 index 4e88071852..0000000000 --- a/types/libp2p-mplex/tslint.json +++ /dev/null @@ -1 +0,0 @@ -{"extends": "dtslint/dt.json"} diff --git a/types/libp2p-tcp/index.d.ts b/types/libp2p-tcp/index.d.ts deleted file mode 100644 index a9d61577e7..0000000000 --- a/types/libp2p-tcp/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Type definitions for libp2p-tcp 0.12.0 -// Project: https://github.com/libp2p/js-libp2p-tcp -// Definitions by: Jaco Greeff -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -declare module "libp2p-tcp" { - const tcp: import("libp2p-interfaces/src/transport/types").TransportFactory; - export default tcp; -} diff --git a/types/libp2p-tcp/tsconfig.json b/types/libp2p-tcp/tsconfig.json deleted file mode 100644 index 3b291d869d..0000000000 --- a/types/libp2p-tcp/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "noImplicitAny": true, - "noImplicitThis": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "baseUrl": "../", - "typeRoots": ["../"], - "types": [], - "noEmit": true, - "forceConsistentCasingInFileNames": true - }, - "files": ["index.d.ts", "bn.js-tests.ts"] -} diff --git a/types/libp2p-tcp/tslint.json b/types/libp2p-tcp/tslint.json deleted file mode 100644 index 4e88071852..0000000000 --- a/types/libp2p-tcp/tslint.json +++ /dev/null @@ -1 +0,0 @@ -{"extends": "dtslint/dt.json"} diff --git a/yarn.lock b/yarn.lock index fbc3856ead..3738d057ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,39 @@ # yarn lockfile v1 +"@achingbrain/ip-address@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@achingbrain/ip-address/-/ip-address-8.1.0.tgz#24f2e9cd7289e33f433d771b23bea56cfd0242c9" + integrity sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw== + dependencies: + jsbn "1.1.0" + sprintf-js "1.1.2" + +"@achingbrain/nat-port-mapper@^1.0.3": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.7.tgz#82c414712da38a0f3da0f938982b6dd724d3c677" + integrity sha512-P8Z8iMZBQCsN7q3XoVoJAX3CGPUTbGTh1XBU8JytCW3hBmSk594l8YvdrtY5NVexVHSwLeiXnDsP4d10NJHaeg== + dependencies: + "@achingbrain/ssdp" "^4.0.1" + "@libp2p/logger" "^2.0.0" + default-gateway "^6.0.2" + err-code "^3.0.1" + it-first "^1.0.7" + p-defer "^4.0.0" + p-timeout "^5.0.2" + xml2js "^0.4.23" + +"@achingbrain/ssdp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@achingbrain/ssdp/-/ssdp-4.0.1.tgz#47ccaaa8256cf73b7b2ab86a0ad14128cfaf77b7" + integrity sha512-z/CkfFI0Ksrpo8E+lu2rKahlE1KJHUn8X8ihQj2Jg6CEL+oHYGCNfttOES0+VnV7htuog70c8bYNHYhlmmqxBQ== + dependencies: + event-iterator "^2.0.0" + freeport-promise "^2.0.0" + merge-options "^3.0.4" + uuid "^8.3.2" + xml2js "^0.4.23" + "@actions/cache@^1.0.7": version "1.0.7" resolved "https://registry.npmjs.org/@actions/cache/-/cache-1.0.7.tgz" @@ -371,13 +404,6 @@ resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== -"@chainsafe/abort-controller@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@chainsafe/abort-controller/-/abort-controller-3.0.1.tgz" - integrity sha512-oyq0qgFJDIIgLpyPwTv4j/sHX/MITatFzY3/b42VSldyZfnUC1lYBx5RwFvzBv1Sq4APOj2VCZO23pDRwy5kew== - dependencies: - event-target-shim "^5.0.0" - "@chainsafe/as-sha256@^0.3.1": version "0.3.1" resolved "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" @@ -455,12 +481,18 @@ node-fetch "^2.6.1" node-gyp "^8.4.0" -"@chainsafe/discv5@^0.7.1": - version "0.7.1" - resolved "https://registry.npmjs.org/@chainsafe/discv5/-/discv5-0.7.1.tgz" - integrity sha512-tH8iNm2StTm2VaC7HvammGTr3F7oWFsBJXUMlhOq9rbVaC6gJKKuIjfGMCyxaLH3GslEggq5SASHASIne3H13g== +"@chainsafe/discv5@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@chainsafe/discv5/-/discv5-1.1.2.tgz#d1854344d440e1899502782a7bfb927afaf2cb79" + integrity sha512-vIoQLjAmTO3yVGv2PTOW+GEE6wEZUl2i7LuB/qg5ZUpt6jjawyk5V5+I7Ur7rt+LioUxf1mIAHxHT62NpBhV1w== dependencies: - "@chainsafe/abort-controller" "^3.0.1" + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-peer-discovery" "^1.0.1" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-peer-info" "^1.0.1" + "@libp2p/interfaces" "^3.0.2" + "@libp2p/peer-id" "^1.1.13" + "@multiformats/multiaddr" "^11.0.0" base64url "^3.0.1" bcrypto "^5.4.0" bigint-buffer "^1.1.5" @@ -469,10 +501,6 @@ err-code "^3.0.1" ip6addr "^0.2.3" is-ip "^3.1.0" - libp2p-crypto "^0.19.7" - multiaddr "^10.0.1" - multihashes "^4.0.3" - peer-id "^0.16.0" rlp "^2.2.6" strict-event-emitter-types "^2.0.0" varint "^6.0.0" @@ -497,25 +525,58 @@ optionalDependencies: "@node-rs/crc32" "1.1.0" -"@chainsafe/libp2p-noise@5.0.3": - version "5.0.3" - resolved "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-5.0.3.tgz" - integrity sha512-IT7q9JaEjv4aU3zO8zeomWyw79rLo8hGcmnyWOE1P/dVIT+jqrF08R3rVXonujBbmi6SSgZbB6NModqW+Oa2jw== +"@chainsafe/libp2p-gossipsub@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-4.1.1.tgz#804dbbd262900fd730339c40c46013ff854240af" + integrity sha512-W3z52uTVm48qvwTAcE+tz6ML2CPWA4ErmuL2aCWAW8S7ce6iH8anqo+xI9rcedyIOChWMWLLD4Gtaj4TMrWacw== dependencies: + "@libp2p/components" "^2.0.3" + "@libp2p/crypto" "^1.0.3" + "@libp2p/interface-connection" "^3.0.1" + "@libp2p/interface-keys" "^1.0.3" + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/interface-pubsub" "^2.0.1" + "@libp2p/interface-registrar" "^2.0.3" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.15" + "@libp2p/peer-record" "^4.0.1" + "@libp2p/pubsub" "^3.1.2" + "@libp2p/topology" "^3.0.0" + abortable-iterator "^4.0.2" + denque "^1.5.0" + err-code "^3.0.1" + it-length-prefixed "^8.0.2" + it-pipe "^2.0.4" + it-pushable "^3.1.0" + multiformats "^9.6.4" + protobufjs "^6.11.2" + uint8arraylist "^2.3.2" + uint8arrays "^3.0.0" + +"@chainsafe/libp2p-noise@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-noise/-/libp2p-noise-8.0.0.tgz#93118f6872e09517ef50167f05f12aed6d4cc2f2" + integrity sha512-APAhb+3eZWHFo+oORG/nUhNTLKgbcTOGeJsnEq//KnjiOjfBDCk4gQmpoSTrLAz1cOTyZ3luSSI4Z+lo2Og7gQ== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-connection-encrypter" "^2.0.1" + "@libp2p/interface-keys" "^1.0.2" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.8" "@stablelib/chacha20poly1305" "^1.0.1" "@stablelib/hkdf" "^1.0.1" "@stablelib/sha256" "^1.0.1" "@stablelib/x25519" "^1.0.1" - bl "^5.0.0" - debug "^4.3.1" - it-buffer "^0.1.3" - it-length-prefixed "^5.0.3" - it-pair "^1.0.0" - it-pb-rpc "^0.2.0" - it-pipe "^1.1.0" - peer-id "^0.16.0" - protobufjs "^6.11.2" - uint8arrays "^3.0.0" + it-length-prefixed "^8.0.2" + it-pair "^2.0.2" + it-pb-stream "^2.0.2" + it-pipe "^2.0.3" + it-stream-types "^1.0.4" + protons-runtime "^3.1.0" + uint8arraylist "^2.3.2" + uint8arrays "^3.1.0" "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" @@ -1732,35 +1793,575 @@ npmlog "^4.1.2" write-file-atomic "^3.0.3" -"@multiformats/base-x@^4.0.1": +"@libp2p/bootstrap@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/bootstrap/-/bootstrap-2.0.0.tgz#00ba8bc568ab9037e6979133165dc269b6a6658e" + integrity sha512-95ekDzxfBm8fHHxJY5xJDPcSZQMuwIzJcHogSvw3+REw/LBPmpHUtTDVfx2BcMdXWpXrJUWVZzCB0zS/rCD9dg== + dependencies: + "@libp2p/interface-peer-discovery" "^1.0.0" + "@libp2p/interface-peer-info" "^1.0.1" + "@libp2p/interfaces" "^3.0.2" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.9" + "@multiformats/mafmt" "^11.0.2" + "@multiformats/multiaddr" "^10.1.7" + +"@libp2p/components@^2.0.0", "@libp2p/components@^2.0.3", "@libp2p/components@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@libp2p/components/-/components-2.1.0.tgz#d2f0f2258af8a84d0a6c58dbeb4c339c275f3939" + integrity sha512-9xK1pauZiptaR0eJFn1LcOr/hwosU76IjPOqTkRVZVjSStIWmBl+Njrn4qK05Jizopf0cIUnpt/8A6YWjM4D7g== + dependencies: + "@libp2p/interface-address-manager" "^1.0.2" + "@libp2p/interface-connection" "^3.0.1" + "@libp2p/interface-connection-manager" "^1.1.0" + "@libp2p/interface-content-routing" "^1.0.2" + "@libp2p/interface-dht" "^1.0.1" + "@libp2p/interface-metrics" "^3.0.0" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-peer-routing" "^1.0.1" + "@libp2p/interface-peer-store" "^1.2.1" + "@libp2p/interface-pubsub" "^2.1.0" + "@libp2p/interface-registrar" "^2.0.3" + "@libp2p/interface-transport" "^1.0.3" + "@libp2p/interfaces" "^3.0.3" + err-code "^3.0.1" + interface-datastore "^7.0.0" + +"@libp2p/connection@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/connection/-/connection-4.0.2.tgz#6e4078487f8e75c0326465464d88248b2520d05f" + integrity sha512-l/mvmcA7QkAC/0qRmTpuD5CeMaiy4DuKCsutaY3PpwJbMegTOjxuZh0uzk3z94d0wJBnhquVZ0e4Yqvd+QGlng== + dependencies: + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.1" + "@multiformats/multiaddr" "^11.0.0" + err-code "^3.0.1" + +"@libp2p/crypto@^1.0.0", "@libp2p/crypto@^1.0.3", "@libp2p/crypto@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/crypto/-/crypto-1.0.4.tgz#b7639599db8ad7518c5be1c9c7b70b40dd0fb12f" + integrity sha512-3hHZvqi+vI8YoTHE+0u8nA5SYGPLZRLMvbgXQoAn0IyPjez66Taaxym/3p3Duf9QkFlvJu95nzpNzv0OdHs9Yw== + dependencies: + "@libp2p/interface-keys" "^1.0.2" + "@noble/ed25519" "^1.6.0" + "@noble/secp256k1" "^1.5.4" + err-code "^3.0.1" + multiformats "^9.4.5" + node-forge "^1.1.0" + protons-runtime "^3.1.0" + uint8arrays "^3.0.0" + +"@libp2p/interface-address-manager@^1.0.2", "@libp2p/interface-address-manager@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-address-manager/-/interface-address-manager-1.0.3.tgz#2ccc4312b4996e3f8bd9bdc64fb87e0873c32dd8" + integrity sha512-/DNGUQEXA0Ks+EOp0IVv3TsWq1H+4ZlSnyBozzNGDmufz6wG+EvUDBbwIXieHR898bj4pHfmmogK+Vwz5s5Kdw== + dependencies: + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + +"@libp2p/interface-connection-encrypter@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection-encrypter/-/interface-connection-encrypter-2.0.1.tgz#158d3705fd279db44c5000a8528a52e33457e480" + integrity sha512-GtqsNJuL1q7LWX3z41t9eFFFrlLSmMH92E0rupoXeFx1dJ8Gs/Zy8b6lZro96Ld6rjU1CeZa87SmYeqQQeHRmw== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.1" + +"@libp2p/interface-connection-manager@^1.1.0", "@libp2p/interface-connection-manager@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection-manager/-/interface-connection-manager-1.1.1.tgz#6b1e7116d77bf813f5a4d1aa3c2e39c5e00a3a24" + integrity sha512-sPBHXNLqYCYl/fo4hdseRJm/Z9DWgPulegCKI5JUjaiqrcdmAHDOnIHIKWP0i+N+yNR3y7nUBWp5QT1pqpvK7Q== + dependencies: + "@libp2p/interface-connection" "^3.0.0" + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + +"@libp2p/interface-connection@^3.0.0", "@libp2p/interface-connection@^3.0.1", "@libp2p/interface-connection@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-3.0.2.tgz#3a2c939b44558b41faa605644b50d6122fc8f59a" + integrity sha512-38R2GQ6BCOtwMi5uWU5MLr+xfEpRmVK9gqOp7jNx+6T7TVn8ji4725XLXNfpzprbOrzZkqf2iER84s8+yX4pMA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.1" + +"@libp2p/interface-content-routing@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-content-routing/-/interface-content-routing-1.0.2.tgz#783721ac67463b10fd8b5c0b60f75f886642fbdf" + integrity sha512-Ue1X8XrZ4ymTMQk/GWom/EKfPB5Lu7zy33ohjSix26Da/HbBvkXBdnYGDj485vxSOZGZRqeBhh21nCVjD/yLyg== + dependencies: + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + multiformats "^9.6.3" + +"@libp2p/interface-dht@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-dht/-/interface-dht-1.0.1.tgz#1388c74da1261f2a3212fa8a7d2ca4559688b3cd" + integrity sha512-EToxQznHUnD9frWoHwq8DUaOa7RZ2qoo6beb1aWdQrEJsEdUBi62FHh9qrLkrL+E4W3rkl2+WrhSP6/iHxZZwQ== + dependencies: + "@libp2p/interface-peer-discovery" "^1.0.0" + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + multiformats "^9.6.3" + +"@libp2p/interface-keys@^1.0.2", "@libp2p/interface-keys@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-keys/-/interface-keys-1.0.3.tgz#251abb2f0fe084e35e16ba782d64c7e4dfb24470" + integrity sha512-K8/HlRl/swbVTWuGHNHF28EytszYfUhKgUHfv8CdbMk9ZA/bgO4uU+d9rcrg/Dhw3511U3aRz2bwl2psn6rJfg== + +"@libp2p/interface-metrics@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-metrics/-/interface-metrics-2.0.0.tgz#c762621537b3d9af8ba456d3ea8a9aa302b792e9" + integrity sha512-OUMspbgamrPgTQWA9zjyrcVQtXpWegSzPllDVwySBefv14l6AhpgicvVI8s+FPbzdKSj6AanlYDa7V8Ui/14CQ== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interface-metrics@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-metrics/-/interface-metrics-3.0.0.tgz#7b448782e78f948abe92e2adef838e3e781f2e84" + integrity sha512-TxK63BrDalv0yW544608xfmg3rsbh31ykZzf7I1yjMCZpyIFOqLTH1WN4YQwXKNlMz/XURux99UTpGSRYl3nOA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interface-peer-discovery@^1.0.0", "@libp2p/interface-peer-discovery@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-discovery/-/interface-peer-discovery-1.0.1.tgz#56d14a933a479e9866b1eb41a597717d2e7d954e" + integrity sha512-ZqBhpX7fR3ROYQaGYV47YhyTJJzFDzyyEIsQ7NnDuG3KhcQb2PtocnN0sy1Ozm784M0oYveM/HjfuNxxcOwdYg== + dependencies: + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + +"@libp2p/interface-peer-id@^1.0.0", "@libp2p/interface-peer-id@^1.0.2", "@libp2p/interface-peer-id@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-1.0.4.tgz#f8d8114ad58cb04eb880bdd8f91799e418f92881" + integrity sha512-VRnE0MqmS1kN43hyKCEdkhz0gciuDML7hpL3p8zDm0LnveNMLJsR+/VSUaugCi/muOzLaLk26WffKWbMYfnGfA== + dependencies: + multiformats "^9.6.3" + +"@libp2p/interface-peer-info@^1.0.0", "@libp2p/interface-peer-info@^1.0.1", "@libp2p/interface-peer-info@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-info/-/interface-peer-info-1.0.3.tgz#b2da9487adfa1da779dc6982a6843352d8a4f22b" + integrity sha512-QKybxfp/NmDGDMkgf/CTt4fU03ajZnldHr9TYg5wMkJrnVaaHbhDTYBg5YWt+iOH1mgR89/dpKv/Na0ZE5sPIA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + "@multiformats/multiaddr" "^11.0.0" + +"@libp2p/interface-peer-routing@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-routing/-/interface-peer-routing-1.0.1.tgz#047a3034601e70d0138ffcbd28e3db2b88ced0ee" + integrity sha512-MKx2g0mIUI6qNuLv3xApKXR2ZrO9CUTT9ZPL0gvRlhpFCXovEkdWJ1h8KnmkR7tGPxKHt2bsCCJ8gqUaFeNstA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + +"@libp2p/interface-peer-store@^1.2.1", "@libp2p/interface-peer-store@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-store/-/interface-peer-store-1.2.2.tgz#738c47daacab0bb809f3701fc52a177ed5528f94" + integrity sha512-ZjE9AkDtjz4R+SppCgZ66oko7Z9pDsdFk1lbba0hTPA2i0uuWdTYep7bZ3RvKot0Q2UrWg8ySL/30pW+Wp70sA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interface-record" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + +"@libp2p/interface-pubsub@^2.0.0", "@libp2p/interface-pubsub@^2.0.1", "@libp2p/interface-pubsub@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-2.1.0.tgz#bf98d51c371018cd3d7d165dbc8e95f7cc1537d2" + integrity sha512-X+SIqzfeCO8ZDGrFTzH9EMwMf8ojW5nk20rxv3h1sCXEdfvyJCARZ51r9UlwJcnucnHqvFChfkbubAkrr3R4Cw== + dependencies: + "@libp2p/interface-connection" "^3.0.0" + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + it-pushable "^3.0.0" + uint8arraylist "^2.0.0" + +"@libp2p/interface-record@^2.0.0", "@libp2p/interface-record@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-record/-/interface-record-2.0.1.tgz#2b6de7c3deb3420be80df6a0485dc318d231773d" + integrity sha512-RqF5jKukI8v3Q8MZb4d8/UVjg0OXbl0R8ErWi/LKf+uklA8kTA7rT4FQXFUBycxrkFmEu/tJnW+R1/4fwRwZVg== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + uint8arraylist "^2.0.0" + +"@libp2p/interface-registrar@^2.0.0", "@libp2p/interface-registrar@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-registrar/-/interface-registrar-2.0.3.tgz#71208405caa9c7d36748de75e202aef8535c435e" + integrity sha512-YA/A+o+166/+noXxMFXvZdg9soZSZX2EPOlUwnGXZWR7J5B2sxyP76QxHWXL5npsEMj7suP+Rjb/GJYGz7rDyg== + dependencies: + "@libp2p/interface-connection" "^3.0.0" + "@libp2p/interface-peer-id" "^1.0.0" + +"@libp2p/interface-stream-muxer@^2.0.0", "@libp2p/interface-stream-muxer@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-stream-muxer/-/interface-stream-muxer-2.0.2.tgz#81b561de8dec75f085e5b2ae3c3acac256450dc9" + integrity sha512-BcLsV8ZVr34G32u/w4pgSAgFju9CTuBB9OJwgX6ugasYf6LtJ0a3m5Kwddy79lvvM/gBvVv/McpCr4mPxP4WWg== + dependencies: + "@libp2p/interface-connection" "^3.0.0" + "@libp2p/interfaces" "^3.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interface-transport@^1.0.3", "@libp2p/interface-transport@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/interface-transport/-/interface-transport-1.0.4.tgz#b36206b629878462bc6a1b8034998af02f810c24" + integrity sha512-MOkhtykUrrbgHC1CcAFe/6QTz/BEBbHfu5sf+go6dhBlHXeHI+AcV8Fic5zTZNz71E1SRi2UR+5TVi7ORPL57Q== + dependencies: + "@libp2p/interface-connection" "^3.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interfaces@^3.0.0", "@libp2p/interfaces@^3.0.2", "@libp2p/interfaces@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interfaces/-/interfaces-3.0.3.tgz#b657e73a5ece0e2b18c6db04d7defe66fbd2a735" + integrity sha512-8IIxw7TKpaYTtVfZN3jePLlm/E/VzqPpqerN+jhA+1s86akRSeyxVBYi3W9SWDSf0oIauHJSDE8KNxLceAfeag== + +"@libp2p/logger@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.0.0.tgz#0bc15dc861c9f1aa214f2b7628e777752698f279" + integrity sha512-aC1Yz4bni8Cui1tKCL5PzQSlS3BE/hhvyVnEHhcUz+GCo+MpbmyrZSPAb/m1e7bHrDDKkT1f9DSr7vgmS/NkuQ== + dependencies: + "@libp2p/interface-peer-id" "^1.0.2" + debug "^4.3.3" + interface-datastore "^6.1.0" + multiformats "^9.6.3" + +"@libp2p/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.0.1.tgz#d600967793f7948f8af54dc919c69629b4c1cbe6" + integrity sha512-Mtj7ImjRYbaANuT53QRqc7ooBYpWieLo7KbqYYGas5O2AWQeOu/zyGBMM35WbWIo7sMuhCas9XBPJdFOR7A05w== + dependencies: + "@libp2p/interface-peer-id" "^1.0.2" + debug "^4.3.3" + interface-datastore "^7.0.0" + multiformats "^9.6.3" + +"@libp2p/mdns@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/mdns/-/mdns-3.0.1.tgz#79d48c5d652a527b22da5527c516a44a1c927fb1" + integrity sha512-CNmgZ2YlF3jQeXzePHk2rNookYie2wMiVSSLY+W9FO9yKcYyVxX0/+zHCjY0hxYtycXYzdVm58atx43y7sNTlA== + dependencies: + "@libp2p/components" "^2.1.0" + "@libp2p/interface-peer-discovery" "^1.0.1" + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/interface-peer-info" "^1.0.3" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.1" + "@libp2p/peer-id" "^1.1.15" + "@multiformats/multiaddr" "^11.0.0" + "@types/multicast-dns" "^7.2.1" + multicast-dns "^7.2.0" + multiformats "^9.6.3" + +"@libp2p/mplex@^5.2.4": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@libp2p/mplex/-/mplex-5.2.4.tgz#028c87a11b1dbb6019cf1f29576d22d564c4e02a" + integrity sha512-DyyDaDjSaCNT5eIgtlvyMvDejFhHEoPmICElPVHxFF0Wo7kr2CV8WLlYmwxdO7fKUZQA6NYhX5E1ZrQltCbBqg== + dependencies: + "@libp2p/components" "^2.0.0" + "@libp2p/interface-connection" "^3.0.1" + "@libp2p/interface-stream-muxer" "^2.0.0" + "@libp2p/logger" "^2.0.0" + abortable-iterator "^4.0.2" + any-signal "^3.0.0" + benchmark "^2.1.4" + err-code "^3.0.1" + it-pipe "^2.0.3" + it-pushable "^3.1.0" + it-stream-types "^1.0.4" + rate-limiter-flexible "^2.3.9" + uint8arraylist "^2.1.1" + uint8arrays "^3.0.0" + varint "^6.0.0" + +"@libp2p/multistream-select@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/multistream-select/-/multistream-select-3.0.0.tgz#a6ade52f461fff68d39563b4e8f061270cb27c5b" + integrity sha512-l7NFJfq6J86wyM/F0agf45CX/4BLgm9Ork5pfHuz8E+z0F7s+i+gWZH8Pk1CIrIfOpMVJvEtJCnRcjJnDAcv2A== + dependencies: + "@libp2p/interfaces" "^3.0.2" + "@libp2p/logger" "^2.0.0" + abortable-iterator "^4.0.2" + err-code "^3.0.1" + it-first "^1.0.6" + it-handshake "^4.0.1" + it-length-prefixed "^8.0.2" + it-pipe "^2.0.3" + it-pushable "^3.0.0" + it-reader "^6.0.1" + it-stream-types "^1.0.4" + p-defer "^4.0.0" + uint8arraylist "^2.3.1" + uint8arrays "^3.0.0" + +"@libp2p/peer-collections@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/peer-collections/-/peer-collections-2.0.0.tgz#ae1db935dfbf0e4df2f0644c55b449f34b6dcf0e" + integrity sha512-A074sSs0Kv3g/1gaf3ZvMc05sLmho3c3uJtkep4L3cgHokMW0pF+3YovU5KvdgBCB8GEepXiUvYsdPYzehVl7A== + dependencies: + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/peer-id" "^1.1.0" + +"@libp2p/peer-id-factory@^1.0.18": + version "1.0.18" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id-factory/-/peer-id-factory-1.0.18.tgz#315092c783d04457450c15c8f75c9c316eb12544" + integrity sha512-x7lyPrfF4kkMj6az+h1sq5L6ifTvZt2exKi8yS6/Gi/hT8rfqXROdBDtanMjJivIFlzVKJyZdfW5f5RK9Av3iQ== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-keys" "^1.0.2" + "@libp2p/interface-peer-id" "^1.0.0" + "@libp2p/peer-id" "^1.0.0" + multiformats "^9.6.3" + protons-runtime "^3.1.0" + uint8arraylist "^2.0.0" + uint8arrays "^3.0.0" + +"@libp2p/peer-id@^1.0.0", "@libp2p/peer-id@^1.1.15": + version "1.1.15" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-1.1.15.tgz#5c005ab4cb3f933977d0ec18a7d67071136cbed6" + integrity sha512-Y33JLEfsLmLUjuC2nhQ2lBXP6PIsR892gSsNy4Vd7oILkuRhjPouIojP9BbME0m9bhVbAws+Zh9NBKtp7UH7wA== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + err-code "^3.0.1" + multiformats "^9.6.3" + uint8arrays "^3.0.0" + +"@libp2p/peer-id@^1.1.0", "@libp2p/peer-id@^1.1.13", "@libp2p/peer-id@^1.1.8", "@libp2p/peer-id@^1.1.9": + version "1.1.13" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-1.1.13.tgz#d6ed19dd4e7b2369267141e3e5c5e9479fd1d244" + integrity sha512-yDNjAs7ciNT0APWHaSRUOJKH1JfjKvgABpMhJJvnh3tJXk1nEtimpNdYWZTLNmShWwmz7AO6c5z/dnWtadCDDg== + dependencies: + "@libp2p/interface-peer-id" "^1.0.0" + err-code "^3.0.1" + multiformats "^9.6.3" + uint8arrays "^3.0.0" + +"@libp2p/peer-record@^4.0.1": version "4.0.1" - resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + resolved "https://registry.yarnpkg.com/@libp2p/peer-record/-/peer-record-4.0.1.tgz#a4b5fa560decc2e5b44cd7180dcb04d0bb111550" + integrity sha512-QOREIcvFxvBSZIgIc1Za+EpS911xcGu2Vp1GTloZbp2KSesXnJxc1m06EyUFEwdwKOYN+ILqnuYJEWsTeXPfVw== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-record" "^2.0.1" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.13" + "@libp2p/utils" "^3.0.0" + "@multiformats/multiaddr" "^10.1.5" + err-code "^3.0.1" + interface-datastore "^6.1.0" + it-all "^1.0.6" + it-filter "^1.0.3" + it-foreach "^0.1.1" + it-map "^1.0.6" + it-pipe "^2.0.3" + multiformats "^9.6.3" + protons-runtime "^3.1.0" + uint8-varint "^1.0.2" + uint8arraylist "^2.1.0" + uint8arrays "^3.0.0" + varint "^6.0.0" + +"@libp2p/peer-record@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/peer-record/-/peer-record-4.0.3.tgz#4b5531a1f560773b189232c8613862daf260547d" + integrity sha512-0GqcZ2LU/RfIZk7SA2g9ZI8t+jh5p0lkmrhD4VefqhBkIc2fpAthUo+2O94gz9UpFn0LDJMqmgQgrKImL2VJTQ== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-record" "^2.0.1" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.13" + "@libp2p/utils" "^3.0.0" + "@multiformats/multiaddr" "^11.0.0" + err-code "^3.0.1" + interface-datastore "^7.0.0" + it-all "^1.0.6" + it-filter "^1.0.3" + it-foreach "^0.1.1" + it-map "^1.0.6" + it-pipe "^2.0.3" + multiformats "^9.6.3" + protons-runtime "^3.1.0" + uint8-varint "^1.0.2" + uint8arraylist "^2.1.0" + uint8arrays "^3.0.0" + varint "^6.0.0" + +"@libp2p/peer-store@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@libp2p/peer-store/-/peer-store-3.1.5.tgz#77ba77b7f70d636e82d6a27fc648b20505a3c8ec" + integrity sha512-tChz3TqkQj1t0+yugWroeGhHbX+q7e1goVRJQbli4sZ1j5NEAQlxHpPq2yDOOCB5RVvX0oZ8b32999ILOJXbvA== + dependencies: + "@libp2p/components" "^2.0.0" + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/interface-peer-info" "^1.0.3" + "@libp2p/interface-peer-store" "^1.2.2" + "@libp2p/interface-record" "^2.0.1" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^1.1.15" + "@libp2p/peer-record" "^4.0.3" + "@multiformats/multiaddr" "^11.0.0" + err-code "^3.0.1" + interface-datastore "^7.0.0" + it-all "^1.0.6" + it-filter "^1.0.3" + it-foreach "^0.1.1" + it-map "^1.0.6" + it-pipe "^2.0.3" + mortice "^3.0.0" + multiformats "^9.6.3" + protons-runtime "^3.1.0" + uint8arraylist "^2.1.1" + uint8arrays "^3.1.0" + +"@libp2p/pubsub@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@libp2p/pubsub/-/pubsub-3.1.2.tgz#f3fb6eda0dcda4658b0556c6fec12420c2f05883" + integrity sha512-pCbz6JW9q10Ukw2f+gfMWzvKRdN3K3w04//JRfCOrGwRnkdHWA90k4FGEZ0j2caXK8Z0cnUGVD86UBX5uBAG7Q== + dependencies: + "@libp2p/components" "^2.0.0" + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-connection" "^3.0.1" + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-pubsub" "^2.0.0" + "@libp2p/interface-registrar" "^2.0.0" + "@libp2p/interfaces" "^3.0.2" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-collections" "^2.0.0" + "@libp2p/peer-id" "^1.1.0" + "@libp2p/topology" "^3.0.0" + "@multiformats/multiaddr" "^10.2.0" + abortable-iterator "^4.0.2" + err-code "^3.0.1" + it-length-prefixed "^8.0.2" + it-pipe "^2.0.3" + it-pushable "^3.0.0" + multiformats "^9.6.3" + p-queue "^7.2.0" + uint8arraylist "^2.0.0" + uint8arrays "^3.0.0" + +"@libp2p/tcp@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@libp2p/tcp/-/tcp-3.1.2.tgz#765d1bec5ff03b1e50b5b4cbf520ad87ab34d717" + integrity sha512-b2xrzmAx0ktlgzsSgaqeHjtnVNzZeYPZPtgjbGub9zEWHZFuN4XER9XppdCMbvQw/68RHufuSQu8PEDMv5l4VQ== + dependencies: + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-transport" "^1.0.4" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.0" + "@libp2p/utils" "^3.0.2" + "@multiformats/mafmt" "^11.0.3" + "@multiformats/multiaddr" "^11.0.0" + abortable-iterator "^4.0.2" + err-code "^3.0.1" + stream-to-it "^0.2.2" + +"@libp2p/topology@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/topology/-/topology-3.0.0.tgz#2b5df0ce13ce4c0307f7dd3304280d105fac0a76" + integrity sha512-gQMkO1j7D/7A9MfL2mtLxr0StXzjqK0V554w7hk25E66Ly0wp1K7vPEfhE9rExLSaQqe9ir4nijhbA3rNnxZng== + dependencies: + "@libp2p/interface-peer-id" "^1.0.2" + "@libp2p/interface-registrar" "^2.0.0" + "@libp2p/logger" "^2.0.0" + "@multiformats/multiaddr" "^10.2.0" + err-code "^3.0.1" + it-all "^1.0.6" + +"@libp2p/tracked-map@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/tracked-map/-/tracked-map-2.0.1.tgz#5f23a63020a2c738a989c484e19956404f8eebdb" + integrity sha512-T0/m67VAZuEw+AO9U+rlLFkHUqB1w0Dy9Pqw2+f0XL6uplv2xXKSJeU0yUAjiOGsfrJ4pUPPQbgsz2Xr3WNoIQ== + dependencies: + "@libp2p/interface-metrics" "^2.0.0" + +"@libp2p/utils@^3.0.0", "@libp2p/utils@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/utils/-/utils-3.0.2.tgz#a65b5e5de607875f26214fc00610ac6d31451d18" + integrity sha512-/+mwCEd1o1sko3fYkVfy9pDT3Ks+KszR4Y3fb3M3/UCETDituvqZKHHM4wyTJsFlrFrohbtYlNvWhJ7Pej3X5g== + dependencies: + "@achingbrain/ip-address" "^8.1.0" + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-peer-store" "^1.2.1" + "@libp2p/logger" "^2.0.0" + "@multiformats/multiaddr" "^11.0.0" + abortable-iterator "^4.0.2" + err-code "^3.0.1" + is-loopback-addr "^2.0.1" + it-stream-types "^1.0.4" + private-ip "^2.1.1" + uint8arraylist "^2.3.2" + +"@multiformats/mafmt@^11.0.2": + version "11.0.2" + resolved "https://registry.yarnpkg.com/@multiformats/mafmt/-/mafmt-11.0.2.tgz#22a42ee2caa0f35835ab41d9ae766b61cee6d81b" + integrity sha512-KesMM4fSEpMz1kZPzlvdwYNYrq5iH38S5EDKLu5qsGG4NT94UaruTjase9osaDW+CcDfshK9uZUD9lzpXJGreA== + dependencies: + "@multiformats/multiaddr" "^10.1.1" + +"@multiformats/mafmt@^11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@multiformats/mafmt/-/mafmt-11.0.3.tgz#278bcf23ca7c954a9a04500527c011a6ce14f0cb" + integrity sha512-DvCQeZJgaC4kE3BLqMuW3gQkNAW14Z7I+yMt30Ze+wkfHkWSp+bICcHGihhtgfzYCumHA/vHlJ9n54mrCcmnvQ== + dependencies: + "@multiformats/multiaddr" "^11.0.0" + +"@multiformats/multiaddr@^10.1.1", "@multiformats/multiaddr@^10.1.5", "@multiformats/multiaddr@^10.1.7", "@multiformats/multiaddr@^10.2.0": + version "10.3.3" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-10.3.3.tgz#f0828d5c456427306e33d59ac69e401299d55760" + integrity sha512-+LX9RovG7DJsANb+U6VchV/tApcdJzeafbi5+MPUam90oL91BbEh6ozNZOz4Qf5ZEeilexc12oomatmODJh1/w== + dependencies: + dns-over-http-resolver "^2.1.0" + err-code "^3.0.1" + is-ip "^4.0.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" + +"@multiformats/multiaddr@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.0.0.tgz#a00166476548ab375533c93b997d2912ee14e343" + integrity sha512-NfOx/RF7TmGeCiQ5rmpvU7Ny7VKfmIG2jP2XSebTCv78vGuSRQ1YF+5UEKWft2Kjhtj1Xaq7dvgB9SeLp+BYSw== + dependencies: + dns-over-http-resolver "^2.1.0" + err-code "^3.0.1" + is-ip "^5.0.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" "@napi-rs/triples@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.2.tgz" integrity sha512-EL3SiX43m9poFSnhDx4d4fn9SSaqyO2rHsCNhETi9bWPmjXK3uPJ0QpPFtx39FEdHcz1vJmsiW41kqc0AgvtzQ== -"@noble/ed25519@^1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.3.0.tgz" - integrity sha512-k6ddjHcmfHF5LoZRv2j7WktgY8C8lzAqiu5ukWfGIlPUlpLn1tn1pfILXaXHY1DCG0s3qvGM1SluLtVpckWwMA== - -"@noble/ed25519@^1.5.1": - version "1.5.1" - resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.5.1.tgz" - integrity sha512-VX0TyIhKghm/NoTno/k71oCQO55f36yiSwuNOqEHu9BvxQuzel0tsvcsU2KjX/iN6pCkN53Bvfq1+gWNiwXDGQ== +"@noble/ed25519@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.6.0.tgz#b55f7c9e532b478bf1d7c4f609e1f3a37850b583" + integrity sha512-UKju89WV37IUALIMfKhKW3psO8AqmrE/GvH6QbPKjzolQ98zM7WmGUeY+xdIgSf5tqPFf75ZCYMgym6E9Jsw3Q== "@noble/hashes@^1.0.0", "@noble/hashes@~1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== -"@noble/secp256k1@^1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.3.0.tgz" - integrity sha512-wuFthUc6Ul4xflhY5u1+p1bDILPzVEisekxt5M+iLg4R+gG6+k2jnRR19sC9fMtzlsN5sKloBwprziDS0XlmyQ== +"@noble/secp256k1@^1.5.4": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" + integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== "@node-rs/crc32-android-arm64@^1.1.0": version "1.5.1" @@ -2476,12 +3077,12 @@ dependencies: datastore-level "*" -"@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== +"@types/dns-packet@*": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.2.4.tgz#0de4ee48f900a62b014ce61a3c9ab5d33dc06b0d" + integrity sha512-OAruArypdNxR/tzbmrtoyEuXeNTLaZCpO19BXaNC10T5ACIbvjmvhmV2RDEy2eLc3w8IjK7SY3cvUCcAW+sfoQ== dependencies: - "@types/ms" "*" + "@types/node" "*" "@types/docker-modem@*": version "3.0.2" @@ -2644,11 +3245,6 @@ resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== -"@types/minimatch@^3.0.4": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - "@types/minimist@^1.2.0": version "1.2.1" resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz" @@ -2671,10 +3267,13 @@ resolved "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz" integrity sha1-m6It838H43gP/4Ux0aOOYz+UV6U= -"@types/ms@*": - version "0.7.31" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/multicast-dns@^7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@types/multicast-dns/-/multicast-dns-7.2.1.tgz#6527b28ce62bcdc08a38f6a329a3d23145c99d95" + integrity sha512-A2PmB8MRcNVEkw6wzGT5rtBHqyHOVjiRMkJH+zpJKXipSi+GGkHg6JjNFApDiYK9WefJqkVG0taln1VMl4TGfw== + dependencies: + "@types/dns-packet" "*" + "@types/node" "*" "@types/node-fetch@^2.5.0": version "2.5.10" @@ -2751,7 +3350,7 @@ dependencies: "@types/node" "*" -"@types/retry@*", "@types/retry@^0.12.0": +"@types/retry@*", "@types/retry@0.12.1": version "0.12.1" resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== @@ -2838,10 +3437,10 @@ "@types/cookiejar" "*" "@types/node" "*" -"@types/supertest@^2.0.8": - version "2.0.11" - resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz" - integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== dependencies: "@types/superagent" "*" @@ -2991,11 +3590,6 @@ resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@vascosantos/moving-average@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@vascosantos/moving-average/-/moving-average-1.1.0.tgz" - integrity sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w== - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -3147,14 +3741,15 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abortable-iterator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-3.0.0.tgz" - integrity sha512-7KqcPPnMhfot4GrEjK51zesS4Ye/lUCHBgYt3oRxIlU24HO3mVxBwEo9niNyfHqoWKqWLuZTc3zErNomdHA+ag== +abortable-iterator@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-4.0.2.tgz#aea6a4a6a696badcbad1c9fff5a9ca85f0f286a4" + integrity sha512-SJGELER5yXr9v3kiL6mT5RZ1qlyJ9hV4nm34+vfsdIM1lp3zENQvpsqKgykpFLgRMUn3lzlizLTpiOASW05/+g== dependencies: - get-iterator "^1.0.2" + get-iterator "^2.0.0" + it-stream-types "^1.0.3" -abstract-level@^1.0.2: +abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== @@ -3167,15 +3762,16 @@ abstract-level@^1.0.2: module-error "^1.0.1" queue-microtask "^1.2.3" -abstract-leveldown@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.0.0.tgz" - integrity sha512-mFAi5sB/UjpNYglrQ4irzdmr2mbQtE94OJbrAYuK2yRARjH/OACinN1meOAorfnaLPMQdFymSQMlkiDm9AXXKQ== +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== dependencies: buffer "^6.0.3" + catering "^2.0.0" is-buffer "^2.0.5" level-concat-iterator "^3.0.0" - level-supports "^2.0.0" + level-supports "^2.0.1" queue-microtask "^1.2.3" abstract-logging@^2.0.0: @@ -3259,14 +3855,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -aggregate-error@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -3368,7 +3956,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -any-signal@2.1.2, any-signal@^2.1.0: +any-signal@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/any-signal/-/any-signal-2.1.2.tgz" integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== @@ -3598,7 +4186,7 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" -async@^3.1.0, async@^3.2.0, async@^3.2.3, async@~3.2.2: +async@^3.1.0, async@^3.2.3, async@~3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -3727,6 +4315,14 @@ before-after-hook@^2.2.0: resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.1.tgz" integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== +benchmark@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== + dependencies: + lodash "^4.17.4" + platform "^1.3.3" + bigint-buffer@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" @@ -3734,11 +4330,6 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bignumber.js@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" @@ -3783,15 +4374,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bl@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz" - integrity sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - blakejs@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz" @@ -4026,7 +4608,7 @@ buffer@^5.4.3, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.1, buffer@^6.0.3: +buffer@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -4059,6 +4641,13 @@ byline@^5.0.0: resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz" integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= +byte-access@^1.0.0, byte-access@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/byte-access/-/byte-access-1.0.1.tgz#84badd99be3671c03f0dd6a039a9c963983724af" + integrity sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw== + dependencies: + uint8arraylist "^2.0.0" + byte-size@^7.0.0: version "7.0.1" resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz" @@ -4241,12 +4830,7 @@ caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -catering@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/catering/-/catering-2.0.0.tgz" - integrity sha512-aD/WmxhGwUGsVPrj8C80vH7C7GphJilYVSdudoV4u16XdrLF7CVyfBmENsc4tLTVsJJzCRid8GbwJ7mcPLee6Q== - -catering@^2.1.0, catering@^2.1.1: +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== @@ -4428,6 +5012,13 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clone-regexp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-3.0.0.tgz#c6dd5c6b85482306778f3dc4ac2bb967079069c2" + integrity sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw== + dependencies: + is-regexp "^3.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" @@ -4754,6 +5345,11 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" +convert-hrtime@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-5.0.0.tgz#f2131236d4598b95de856926a67100a0a97e9fa3" + integrity sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg== + convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" @@ -4950,67 +5546,37 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -datastore-core@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/datastore-core/-/datastore-core-5.0.2.tgz" - integrity sha512-jEOl/KDmI8mov8ZZEI4RoDOiYBQ8GVWWCK8e8Zu2vJSJqUVKVP128MPLc2fwOaz5h71ZdPA3IYh4ycwOjygYVQ== +datastore-core@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-8.0.1.tgz#13dc8496b1cc756a481fa77031715b8b50b19860" + integrity sha512-FSzrX8fsYUfbA1dq2DvVr9+CYMRAVDKSVe+wGY+Ipiv7ikUDpZZI0htC/o6Fbg0yDxiGDXGOmEIsS5RBb5NchQ== dependencies: - debug "^4.1.1" - interface-datastore "^5.1.1" - it-drain "^1.0.4" - it-filter "^1.0.2" - it-map "^1.0.5" - it-merge "^1.0.1" - it-pipe "^1.1.0" - it-pushable "^1.4.2" - it-take "^1.0.1" - uint8arrays "^3.0.0" - -datastore-core@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.0.tgz" - integrity sha512-FdudjeH+GHjbuU8X1mIKIv8uHAErF6qtjqWFJiVKOdITk6KdiSKis4Hsfu80RWDEFQ9l9s47XIVf5FMKTtoeWA== - dependencies: - debug "^4.1.1" + "@libp2p/logger" "^2.0.0" err-code "^3.0.1" - interface-datastore "^6.0.2" + interface-datastore "^7.0.0" + it-all "^1.0.4" it-drain "^1.0.4" it-filter "^1.0.2" it-map "^1.0.5" it-merge "^1.0.1" - it-pipe "^1.1.0" - it-pushable "^1.4.2" + it-pipe "^2.0.3" + it-pushable "^3.0.0" it-take "^1.0.1" uint8arrays "^3.0.0" -datastore-core@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.1.tgz" - integrity sha512-TrV0PRtwwDo2OfzYpnVQmVgDc4HwtpYkzb6da5GZxKElZN7eDT5mBtrkVbXbyTn+Y2+WPiMBm6/KbJD7p0TBfA== +datastore-level@*, datastore-level@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/datastore-level/-/datastore-level-9.0.1.tgz#fab1748abe20ee3ee8dbbe37c1b0469587a26387" + integrity sha512-U23xpjtItZFCqYUNDYo7++vNI7f5/JUeedJOPxm+hyqR4TneDx9TPpuLGZRrehkaJ5v2kwfYiep0P8wyfI+clg== dependencies: - debug "^4.1.1" - err-code "^3.0.1" - interface-datastore "^6.0.2" - it-drain "^1.0.4" + abstract-level "^1.0.3" + datastore-core "^8.0.1" + interface-datastore "^7.0.0" it-filter "^1.0.2" it-map "^1.0.5" - it-merge "^1.0.1" - it-pipe "^1.1.0" - it-pushable "^1.4.2" + it-sort "^1.0.0" it-take "^1.0.1" - uint8arrays "^3.0.0" - -datastore-level@*, datastore-level@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/datastore-level/-/datastore-level-6.0.2.tgz" - integrity sha512-nVpI3TG4PNs6GszdJxCNF9Gc94tksKpAp6Ci4jrLKTf8EuoIumS1cQ44+1eg3E3ck8bG9Nu/x5AhL/5nxTNTyA== - dependencies: - datastore-core "^5.0.0" - interface-datastore "^5.1.1" - it-filter "^1.0.2" - it-map "^1.0.5" - it-take "^1.0.1" - level "^7.0.0" + level "^8.0.0" date-format@^4.0.11, date-format@^4.0.13: version "4.0.13" @@ -5029,7 +5595,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.0, debug@^4.3.1: +debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -5162,14 +5728,6 @@ defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -deferred-leveldown@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-6.0.0.tgz" - integrity sha512-F6CLAZzNeURojlH4MCigZr54tNz+xDSi06YXsDr5uLSKeF3JKnvnQWTqd+RETh2hbWTJR3qDzGicQOWS5ZQ1BQ== - dependencies: - abstract-leveldown "^7.0.0" - inherits "^2.0.3" - define-properties@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" @@ -5292,13 +5850,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-over-http-resolver@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz" - integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== +dns-over-http-resolver@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-2.1.0.tgz#e3f13182b46b60e0be2473f3fbfc4ec5bbfb9539" + integrity sha512-eb8RGy6k54JdD7Rjw8g65y1MyA4z3m3IIYh7uazkgZuKIdFn8gYt8dydMm3op+2UshDdk9EexrXcDluKNY/CDg== dependencies: debug "^4.3.1" - native-fetch "^3.0.0" + native-fetch "^4.0.2" receptacle "^1.3.2" dns-packet@^4.0.0: @@ -5401,13 +5959,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-fetch@^1.7.2: - version "1.7.3" - resolved "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.7.3.tgz" - integrity sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw== - dependencies: - encoding "^0.1.13" - electron-to-chromium@^1.4.188: version "1.4.200" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.200.tgz#6e4c5266106688965b4ea7caa11f0dd315586854" @@ -5463,16 +6014,6 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding-down@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-7.0.0.tgz" - integrity sha512-hor6z2W/ZrVqDYMawQp7VtfEt6BrvYw+mgjWLauUMZsIBjMt1/k5aa+JreLbtjwJdkjrZ39TU+pV5GpHPGRpog== - dependencies: - abstract-leveldown "^7.0.0" - inherits "^2.0.3" - level-codec "^10.0.0" - level-errors "^3.0.0" - encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" @@ -5536,18 +6077,11 @@ err-code@^2.0.2: resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -err-code@^3.0.0, err-code@^3.0.1: +err-code@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== -errno@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz" - integrity sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ== - dependencies: - prr "~1.0.1" - error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -5637,11 +6171,6 @@ es6-object-assign@^1.1.0: resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= -es6-promisify@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz" - integrity sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -5908,12 +6437,17 @@ ethers@^5.0.2: "@ethersproject/web" "5.1.0" "@ethersproject/wordlists" "5.1.0" +event-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@^4.0.0, eventemitter3@^4.0.4: +eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -6357,6 +6891,11 @@ formidable@^1.2.0: resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz" integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== +freeport-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/freeport-promise/-/freeport-promise-2.0.0.tgz#11e4f81e24d680b88a20c15b2103551f4b6663d8" + integrity sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg== + fromentries@^1.2.0: version "1.3.2" resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" @@ -6424,6 +6963,11 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-timeout@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/function-timeout/-/function-timeout-0.1.1.tgz#6bf71d3d24c894d43b2bec312cabb8c5add2e9da" + integrity sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -6510,6 +7054,11 @@ get-iterator@^1.0.2: resolved "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz" integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== +get-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-2.0.0.tgz#c9ac9f8002e5d8d6b4dc9dae07c30945022a58c1" + integrity sha512-BDJawD5PU2gZv6Vlp8O28H4GnZcsr3h9gZUvnAP5xXP3WOy/QAoOsyMepSkw21jur+4t5Vppde72ChjhTIzxzg== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" @@ -7230,39 +7779,33 @@ inquirer@^8.1.3: strip-ansi "^6.0.0" through "^2.3.6" -interface-datastore@^5.1.1, interface-datastore@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/interface-datastore/-/interface-datastore-5.1.2.tgz" - integrity sha512-nRFl19/IkilNzuPdCUJHejyJCZrVAk4lIRcRXJkekuTdaiagIEnCd9GfmTTQlo2afiVISk8Iy/PxSgnfmrdEIw== +interface-datastore@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-6.1.1.tgz#5150a00de2e7513eaadba58bcafd059cb50004c1" + integrity sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg== dependencies: - err-code "^3.0.1" - interface-store "^0.1.1" - ipfs-utils "^8.1.2" - it-all "^1.0.2" - it-drain "^1.0.1" - it-filter "^1.0.2" - it-take "^1.0.1" + interface-store "^2.0.2" nanoid "^3.0.2" uint8arrays "^3.0.0" -interface-datastore@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/interface-datastore/-/interface-datastore-6.0.3.tgz" - integrity sha512-61eOyzh7zH1ks/56hPudW6pbqsOdoHSYMVjuqlIlZGjyg0svR6DHlCcaeSJfWW8t6dsPl1n7qKBdk8ZqPzXuLA== +interface-datastore@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.0.tgz#d89ff1faf0ae775e2b64fb0ef0c801470ef5b959" + integrity sha512-q9OveOhexQ3Fx8h4YbuR4mZtUHwvlOynKnIwTm6x8oBTWfIyAKtlYtrOYdlHfqQztbYpdzRFcapopNJBMx36NQ== dependencies: - interface-store "^2.0.1" + interface-store "^3.0.0" nanoid "^3.0.2" uint8arrays "^3.0.0" -interface-store@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/interface-store/-/interface-store-0.1.1.tgz" - integrity sha512-ynnjIOybDZc0Brep3HHSa2RVlo/M5g7kuL/leui7o21EusKcLJS170vCJ8rliisc3c4jyd9ao5PthkGlBaX29g== +interface-store@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c" + integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg== -interface-store@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/interface-store/-/interface-store-2.0.1.tgz" - integrity sha512-TfjYMdk4RlaGPA0VGk8fVPM+xhFbjiA2mTv1AqhiFh3N+ZEwoJnmDu/EBdKXzl80nyd0pvKui3RTC3zFgHMjTA== +interface-store@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-3.0.0.tgz#63649bb679397060331fd16ecf305541768783a4" + integrity sha512-IBJn3hE6hYutwdDcStR76mcwfV98vZc49LkEN9ANHHpsxcm6YbGMJxowO2G3FITU4U5ZH4KJPlHOT6Oe2vzTWA== internal-slot@^1.0.3: version "1.0.3" @@ -7278,14 +7821,6 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -ip-address@^8.0.0: - version "8.1.0" - resolved "https://registry.npmjs.org/ip-address/-/ip-address-8.1.0.tgz" - integrity sha512-Wz91gZKpNKoXtqvY8ScarKYwhXoK4r/b5QuT+uywe/azv0/nUCo7Bh0IRRI7F9DHR06kJNWtzMGLIbXavngbKA== - dependencies: - jsbn "1.1.0" - sprintf-js "1.1.2" - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" @@ -7296,6 +7831,11 @@ ip-regex@^4.0.0, ip-regex@^4.3.0: resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== +ip-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" + integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== + ip6addr@^0.2.3: version "0.2.3" resolved "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.3.tgz" @@ -7314,27 +7854,10 @@ ipaddr.js@^2.0.0: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz" integrity sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w== -ipfs-utils@^8.1.2: - version "8.1.4" - resolved "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-8.1.4.tgz" - integrity sha512-QJjyRh4KzlkmtAOn/fOHYyjHGuG+Ows7xJGG8eiM/v325VvJhjJ1tWJobI6zrNDeFKjZcx1uNysE3MR2/dSiXQ== - dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" - buffer "^6.0.1" - electron-fetch "^1.7.2" - err-code "^3.0.1" - is-electron "^2.2.0" - iso-url "^1.1.5" - it-glob "~0.0.11" - it-to-stream "^1.0.0" - merge-options "^3.0.4" - nanoid "^3.1.20" - native-abort-controller "^1.0.3" - native-fetch "^3.0.0" - node-fetch "npm:@achingbrain/node-fetch@^2.6.4" - react-native-fetch-api "^2.0.0" - stream-to-it "^0.2.2" +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== is-arguments@^1.0.4: version "1.1.0" @@ -7488,15 +8011,30 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" +is-ip@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-4.0.0.tgz#8e9eae12056bf46edafad19054dcc3666a324b3a" + integrity sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw== + dependencies: + ip-regex "^5.0.0" + +is-ip@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-5.0.0.tgz#1516ba75f1226550ff9b1ab50a0d47da27bd92a6" + integrity sha512-uhmKwcdWJ1nTmBdoBxdHilfJs4qdLBIvVHKRels2+UCZmfcfefuQWziadaYLpN7t/bUrJOjJHv+R1di1q7Q1HQ== + dependencies: + ip-regex "^5.0.0" + super-regex "^0.2.0" + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= -is-loopback-addr@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-1.0.1.tgz" - integrity sha512-DhWU/kqY7X2F6KrrVTu7mHlbd2Pbo4D1YkAzasBMjQs6lJAoefxaA6m6CpSX0K6pjt9D0b9PNFI5zduy/vzOYw== +is-loopback-addr@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-loopback-addr/-/is-loopback-addr-2.0.1.tgz#0b43534f0b16ff899f1f19f322b59c38bd25fa03" + integrity sha512-SEsepLbdWFb13B6U0tt6dYcUM0iK/U7XOC43N70Z4Qb88WpNtp+ospyNI9ddpqncs7Z7brAEsVBTQpaqSNntIw== is-nan@^1.2.1: version "1.3.2" @@ -7574,6 +8112,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-regexp@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-3.1.0.tgz#0235eab9cda5b83f96ac4a263d8c32c9d5ad7422" + integrity sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -7699,19 +8242,6 @@ iso-random-stream@^2.0.0: events "^3.3.0" readable-stream "^3.4.0" -iso-random-stream@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.2.tgz" - integrity sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ== - dependencies: - events "^3.3.0" - readable-stream "^3.4.0" - -iso-url@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/iso-url/-/iso-url-1.1.5.tgz" - integrity sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ== - isobject@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" @@ -7788,156 +8318,160 @@ it-all@^1.0.2: resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.2.tgz" integrity sha512-3hrCLLcuHS1/VUn1qETPuh9rFTw31SBCUUijjs41VJ+oQGx3H+3Lpxo1bFD3q3570w3o99a+sfRGic5PBBt3Vg== -it-all@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.5.tgz" - integrity sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA== - -it-all@^1.0.6: +it-all@^1.0.4, it-all@^1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz" integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== -it-buffer@^0.1.2, it-buffer@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/it-buffer/-/it-buffer-0.1.3.tgz" - integrity sha512-9a2/9SYVwG7bcn3tpRDR4bXbtuMLXnDK48KVC+GXiQg97ZOOdWz2nIITBsOQ19b+gj01Rw8RNwtiLDLI8P8oiQ== - dependencies: - bl "^5.0.0" - buffer "^6.0.3" - -it-drain@^1.0.1, it-drain@^1.0.3, it-drain@^1.0.4: +it-drain@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/it-drain/-/it-drain-1.0.4.tgz" integrity sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ== -it-filter@^1.0.1, it-filter@^1.0.2: +it-drain@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-1.0.5.tgz#0466d4e286b37bcd32599d4e99b37a87cb8cfdf6" + integrity sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg== + +it-filter@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/it-filter/-/it-filter-1.0.2.tgz" integrity sha512-rxFUyPCrhk7WrNxD8msU10iEPhQmROoqwuyWmQUYY1PtopwUGBYyra9EYG2nRZADYeuT83cohKWmKCWPzpeyiw== -it-first@^1.0.4, it-first@^1.0.6: +it-filter@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-1.0.3.tgz#66ea0cc4bf84af71bebd353c05a9c5735fcba751" + integrity sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w== + +it-first@^1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/it-first/-/it-first-1.0.6.tgz" integrity sha512-wiI02c+G1BVuu0jz30Nsr1/et0cpSRulKUusN8HDZXxuX4MdUzfMp2P4JUk+a49Wr1kHitRLrnnh3+UzJ6neaQ== +it-first@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.7.tgz#a4bef40da8be21667f7d23e44dae652f5ccd7ab1" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + it-foreach@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/it-foreach/-/it-foreach-0.1.1.tgz" integrity sha512-ZLxL651N5w5SL/EIIcrXELgYrrkuEKj/TErG93C4lr6lNZziKsf338ljSG85PjQfu7Frg/1wESl5pLrPSFXI9g== -it-glob@~0.0.11: - version "0.0.13" - resolved "https://registry.npmjs.org/it-glob/-/it-glob-0.0.13.tgz" - integrity sha512-0Hcd5BraJUPzL28NWiFbdNrcdyNxNTKKdU3sjdFiYynNTQpwlG2UKW31X7bp+XhJwux/oPzIquo5ioztVmc2RQ== +it-handshake@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/it-handshake/-/it-handshake-4.0.1.tgz#c133f1e6284c8827c0ab8d44469618a81cabf154" + integrity sha512-80dJPkxA77iTy172OnTWg5pjiOQ7KO0+o2FGCyJn3Vb/NJQKQiWL7LJY50uT5n8EYzv8SV5dDNF234PwMsQAXw== dependencies: - "@types/minimatch" "^3.0.4" - minimatch "^3.0.4" + it-map "^1.0.6" + it-pushable "^3.0.0" + it-reader "^6.0.1" + it-stream-types "^1.0.4" + p-defer "^4.0.0" -it-handshake@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/it-handshake/-/it-handshake-2.0.0.tgz" - integrity sha512-K4q+mz8aLlCK3vTjtgNdHC9c/JbuOATsfogarjMsLcBZC5vYfKbX3Gq3AWcCdjIsIrPqzTlhPKSxl64LJkrt2w== +it-handshake@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/it-handshake/-/it-handshake-4.1.2.tgz#9261f1869ce0162810a530e88bd40d5e7ce8e0a3" + integrity sha512-Q/EvrB4KWIX5+/wO7edBK3l79Vh28+iWPGZvZSSqwAtOJnHZIvywC+JUbiXPRJVXfICBJRqFETtIJcvrqWL2Zw== dependencies: - it-pushable "^1.4.0" - it-reader "^3.0.0" - p-defer "^3.0.0" + it-pushable "^3.1.0" + it-reader "^6.0.1" + it-stream-types "^1.0.4" + p-defer "^4.0.0" + uint8arraylist "^2.0.0" -it-length-prefixed@^5.0.0, it-length-prefixed@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-5.0.2.tgz" - integrity sha512-SqAURaKKsjYbROIdTjW3UtqGrdZo1SHnkbeYYp7JwC5P0IIy7r4C0xNkmK2Va/fBmvXA++hMdDON9+2zesQlUA== +it-length-prefixed@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/it-length-prefixed/-/it-length-prefixed-8.0.2.tgz#03ae750e582661744b6272abe18cd1b17f9ffffc" + integrity sha512-qYCGZ6lTaI6lcuTXUrJmVpE6clq63ULrkq1FGTxHrzexjB2cCrS/CZ5HCRDZ5IRPw33tSDUDK91S7X5S64dPyQ== dependencies: - bl "^5.0.0" - buffer "^6.0.3" - varint "^6.0.0" + err-code "^3.0.1" + it-stream-types "^1.0.4" + uint8-varint "^1.0.1" + uint8arraylist "^2.0.0" + uint8arrays "^3.0.0" -it-length-prefixed@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-5.0.3.tgz" - integrity sha512-b+jDHLcnOnPDQN79ronmzF5jeBjdJsy0ce2O6i6X4J5tnaO8Fd146ZA/tMbzaLlKnTpXa0eKtofpYhumXGENeg== - dependencies: - bl "^5.0.0" - buffer "^6.0.3" - varint "^6.0.0" - -it-map@^1.0.4, it-map@^1.0.5: +it-map@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/it-map/-/it-map-1.0.5.tgz" integrity sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ== -it-merge@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/it-merge/-/it-merge-1.0.2.tgz" - integrity sha512-bp+h4X3tQ83/a2MvaeP4nRi+52z2AO2y8tf2OzDdaSXKMC0n0gVtHrJUDaE+kiIkBiUtTt1hp7vJHMM0VtCfGA== +it-map@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-merge@^1.0.1, it-merge@^1.0.3, it-merge@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-1.0.4.tgz#81c8d427b389b1cd039c25015edb804cd1a60545" + integrity sha512-DcL6GksTD2HQ7+5/q3JznXaLNfwjyG3/bObaF98da+oHfUiPmdo64oJlT9J8R8G5sJRU7thwaY5zxoAKCn7FJw== dependencies: it-pushable "^1.4.0" -it-merge@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/it-merge/-/it-merge-1.0.1.tgz" - integrity sha512-1V1wDlzGaPprEGxwRJUMkoKvjZJCaqRp0o7i5fD3LeY7K2ZL5hmtHJnRTXHqJf9wO2ovzOjqxBUtFK4c3HAF0g== +it-pair@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/it-pair/-/it-pair-2.0.2.tgz#1e6c7f35e8042019942b8996c0c13784d576e2d7" + integrity sha512-QGgUwGtzE4mI8yPZawL+9wq49SBmhQdjKW+ChKBm4PUwRNdkgSoyPlu280iNyS0JscBG3pvytJ8JNVPSEBQNjg== dependencies: - it-pushable "^1.4.0" + it-stream-types "^1.0.3" + p-defer "^4.0.0" -it-pair@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/it-pair/-/it-pair-1.0.0.tgz" - integrity sha512-9raOiDu5OAuDOahtMtapKQDrQTxBfzlzrNcB6o7JARHkt+7Bb1dMkW/TpYdAjBJE77KH3e2zGzwpGUP9tXbLww== +it-pb-stream@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/it-pb-stream/-/it-pb-stream-2.0.2.tgz#e4a51bd1005a467910d01661e632c6d0ca90d102" + integrity sha512-FR1FM9W71wMTZlAij1Pq4PKNcfVb0TGhUTpNQ3tv0LMV/pJ5cDh4g3jW7jhwB+kHtr7PywD1CybBHaT8iAVpKg== dependencies: - get-iterator "^1.0.2" + it-handshake "^4.1.2" + it-length-prefixed "^8.0.2" + it-stream-types "^1.0.4" + uint8arraylist "^2.0.0" -it-pb-rpc@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/it-pb-rpc/-/it-pb-rpc-0.2.0.tgz" - integrity sha512-Rojodsa6yxSTZDqVVF9HXKsISoHtlLNOL0P6b/7oCswiscbjCpt1IB78BxRDHpFL3tg8jFPMNDTP3v6ZjrMf9w== +it-pipe@^2.0.3, it-pipe@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-2.0.4.tgz#fa72c2fdb3c7a467ff21d109e746ebfadfe9c749" + integrity sha512-lK0BV0egwfc64DFJva+0Jh1z8UxwmYBpAHDwq21s0OenRCaEDIntx/iOyWH/jg5efBU6Xa8igzmOqm2CPPNDgg== dependencies: - it-handshake "^2.0.0" - it-length-prefixed "^5.0.3" + it-merge "^1.0.4" + it-pushable "^3.1.0" + it-stream-types "^1.0.3" -it-pipe@^1.0.1, it-pipe@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/it-pipe/-/it-pipe-1.1.0.tgz" - integrity sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg== - -it-pushable@^1.4.0, it-pushable@^1.4.1, it-pushable@^1.4.2: +it-pushable@^1.4.0: version "1.4.2" resolved "https://registry.npmjs.org/it-pushable/-/it-pushable-1.4.2.tgz" integrity sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg== dependencies: fast-fifo "^1.0.0" -it-reader@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/it-reader/-/it-reader-3.0.0.tgz" - integrity sha512-NxR40odATeaBmSefn6Xn43DplYvn2KtEKQzn4jrTRuPYXMky5M4e+KQ7aTJh0k0vkytLyeenGO1I1GXlGm4laQ== - dependencies: - bl "^5.0.0" +it-pushable@^3.0.0, it-pushable@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.1.0.tgz#2fba7aaca189595e64e042ac947c6748ece2eb6b" + integrity sha512-sEAdT86u6aIWvLkH4hlOmgvHpRyUOUG22HD365H+Dh67zYpaPdILmT4Om7Wjdb+m/SjEB81z3nYCoIrgVYpOFA== -it-sort@^1.0.1: +it-reader@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-6.0.1.tgz#ef7bf7b327cd1f418abb9525641c71658eee21c1" + integrity sha512-C+YRk3OTufbKSJMNEonfEw+9F38llmwwZvqhkjb0xIgob7l4L3p01Yt43+bHRI8SSppAOgk5AKLqas7ea0UTAw== + dependencies: + it-stream-types "^1.0.4" + uint8arraylist "^2.0.0" + +it-sort@^1.0.0, it-sort@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/it-sort/-/it-sort-1.0.1.tgz" integrity sha512-c+C48cP7XMMebB9irLrJs2EmpLILId8NYSojqAqN8etE8ienx0azBgaKvZHYH1DkerqIul0Fl2FqISu2BZgTEQ== dependencies: it-all "^1.0.6" -it-take@^1.0.0, it-take@^1.0.1: +it-stream-types@^1.0.3, it-stream-types@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.4.tgz#6e66a11abfd98abab4894c30da15829a0a56bb43" + integrity sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw== + +it-take@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/it-take/-/it-take-1.0.1.tgz" integrity sha512-6H6JAWYcyumKSpcIPLs6tHN4xnibphmyU79WQaYVCBtaBOzf4fn75wzvSH8fH8fcMlPBTWY1RlmOWleQxBt2Ug== -it-to-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz" - integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== - dependencies: - buffer "^6.0.3" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -8270,55 +8804,17 @@ lerna@^4.0.0: import-local "^3.0.2" npmlog "^4.1.2" -level-codec@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/level-codec/-/level-codec-10.0.0.tgz" - integrity sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g== - dependencies: - buffer "^6.0.3" - level-concat-iterator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.0.0.tgz" - integrity sha512-UHGiIdj+uiFQorOrURRvJF3Ei0uHc89ciM/aRi0qsWDV2f0HXypeXUPhJKL6DsONgSR76Pc0AI4sKYEYYRn2Dg== - -level-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/level-errors/-/level-errors-3.0.0.tgz" - integrity sha512-MZXOQT061uEjxxxq4C/Jf+M3RdEKK9e3NbxlN7yOp1LDYoLVAhE2i1j0b7XqXfl8FjFtUL7phwr3Sn0wXXoMqA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== dependencies: - errno "^1.0.0" + catering "^2.1.0" -level-iterator-stream@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz" - integrity sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - -level-js@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/level-js/-/level-js-6.0.0.tgz" - integrity sha512-7dp7JuaoQoqKW4ZGvrV1RB5f51/ktLdEo9fSDsh3Ofmg7sKCMu3X0CIngbY/IUz/YyskhN7LRvEVIkZHCY3LKQ== - dependencies: - abstract-leveldown "^7.0.0" - buffer "^6.0.3" - inherits "^2.0.3" - ltgt "^2.1.2" - -level-packager@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/level-packager/-/level-packager-6.0.0.tgz" - integrity sha512-me656XRWfOVqs9wc+mWckZ6Rb1GuP33ndN4ZntDXwXFspX8cGA++Y+YqJsdE/mjTiipTuxXf047Z4rV62nOVuw== - dependencies: - encoding-down "^7.0.0" - levelup "^5.0.0" - -level-supports@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/level-supports/-/level-supports-2.0.0.tgz" - integrity sha512-8UJgzo1pvWP1wq80ZlkL19fPeK7tlyy0sBY90+2pj0x/kvzHCoLDWyuFJJMrsTn33oc7hbMkS3SkjCxMRPHWaw== +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== level-supports@^4.0.0: version "4.0.1" @@ -8333,15 +8829,6 @@ level-transcoder@^1.0.1: buffer "^6.0.3" module-error "^1.0.1" -level@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/level/-/level-7.0.0.tgz" - integrity sha512-QrBnjcWywalh86ms9hfizvxT5aBHrgWEu6rLChS9tFE2wwFU3aI1r0v+2SSZIyeUr4O4PFo8+sCc1kebahdhlw== - dependencies: - level-js "^6.0.0" - level-packager "^6.0.0" - leveldown "^6.0.0" - level@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" @@ -8350,26 +8837,14 @@ level@^8.0.0: browser-level "^1.0.1" classic-level "^1.2.0" -leveldown@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/leveldown/-/leveldown-6.0.0.tgz" - integrity sha512-NEsyqpfdDhpFO49Zm9htNSsWixMa9Q9sUXgrBTaQNPyPo2Kx1wRctgIXMzc7tduXJqNff8QAwulv2eZDboghxQ== +leveldown@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.1.tgz#0f0e480fa88fd807abf94c33cb7e40966ea4b5ce" + integrity sha512-88c+E+Eizn4CkQOBHwqlCJaTNEjGpaEIikn1S+cINc5E9HEvJ77bqY4JY/HxT5u0caWqsc3P3DcFIKBI1vHt+A== dependencies: - abstract-leveldown "^7.0.0" + abstract-leveldown "^7.2.0" napi-macros "~2.0.0" - node-gyp-build "~4.2.1" - -levelup@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/levelup/-/levelup-5.0.0.tgz" - integrity sha512-P4IKS4J17b6dzm8iI8Irv5gvOlrqJv04Lrpq1rAgZvjR2IsVSjbXQQo1LoK/PJuouxepLE8CTIiKGmHQYZnneA== - dependencies: - catering "^2.0.0" - deferred-leveldown "^6.0.0" - level-errors "^3.0.0" - level-iterator-stream "^5.0.0" - level-supports "^2.0.0" - queue-microtask "^1.2.3" + node-gyp-build "^4.3.0" levn@^0.4.1: version "0.4.1" @@ -8400,17 +8875,7 @@ libnpmpublish@4.0.0, libnpmpublish@^4.0.0: semver "^7.1.3" ssri "^8.0.0" -libp2p-bootstrap@^0.14.0: - version "0.14.0" - resolved "https://registry.npmjs.org/libp2p-bootstrap/-/libp2p-bootstrap-0.14.0.tgz" - integrity sha512-j3slZo5nOdA8wVlav8dRZeAXutZ7psz/f10DLoIEX/EFif7uU5oZfIYvjbVGo3ZDl+VQLo2tR0m1lV0westQ3g== - dependencies: - debug "^4.3.1" - mafmt "^10.0.0" - multiaddr "^10.0.0" - peer-id "^0.16.0" - -libp2p-crypto@^0.19.0, libp2p-crypto@^0.19.7: +libp2p-crypto@^0.19.0: version "0.19.7" resolved "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.19.7.tgz" integrity sha512-Qb5o/3WFKF2j6mYSt4UBPyi2kbKl3jYV0podBJoJCw70DlpM5Xc+oh3fFY9ToSunu8aSQQ5GY8nutjXgX/uGRA== @@ -8427,200 +8892,79 @@ libp2p-crypto@^0.19.0, libp2p-crypto@^0.19.7: uint8arrays "^3.0.0" ursa-optional "^0.10.1" -libp2p-crypto@^0.21.0: - version "0.21.0" - resolved "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.0.tgz" - integrity sha512-fBBzK4v1xwDt8xktWpDPCTeoBhKzxc9JMv4EyPJpoqAcuoS06+0/OLODhYod5LFiSu3lsWW+JnxblLRs5O+mjA== +libp2p@0.39.2: + version "0.39.2" + resolved "https://registry.yarnpkg.com/libp2p/-/libp2p-0.39.2.tgz#958f8e609d89a77b3901d87fb6c868f942608293" + integrity sha512-2C6WyljqwSlO2sGXgM4m6vFCT1TEspQ4UuVlOFq3/kGoI8ctC12z6gGiIDpzWslNGGMq6bop/Id8dAVmDOneMg== dependencies: - "@noble/ed25519" "^1.3.0" - "@noble/secp256k1" "^1.3.0" - err-code "^3.0.1" - iso-random-stream "^2.0.0" - multiformats "^9.4.5" - node-forge "^0.10.0" - protobufjs "^6.11.2" - uint8arrays "^3.0.0" - -libp2p-crypto@^0.21.2: - version "0.21.2" - resolved "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz" - integrity sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g== - dependencies: - "@noble/ed25519" "^1.5.1" - "@noble/secp256k1" "^1.3.0" - err-code "^3.0.1" - iso-random-stream "^2.0.0" - multiformats "^9.4.5" - node-forge "^1.2.1" - protobufjs "^6.11.2" - uint8arrays "^3.0.0" - -libp2p-gossipsub@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/libp2p-gossipsub/-/libp2p-gossipsub-0.14.1.tgz#d60127574889adf5a40c4b1c0965ccf409faa24c" - integrity sha512-z1IzD6MUeJpxAKdvgJuofpPolYxuiEkhO1XcUASfixyl10O+tUPjDrDYwDmmOV+75femnqIOxq62VR1UhUvNdA== - dependencies: - "@types/debug" "^4.1.7" - debug "^4.3.1" - denque "^1.5.0" - err-code "^3.0.1" - iso-random-stream "^2.0.2" - it-pipe "^1.1.0" - libp2p-crypto "^0.21.2" - libp2p-interfaces "4.0.4" - multiformats "^9.6.4" - peer-id "^0.16.0" - protobufjs "^6.11.2" - uint8arrays "^3.0.0" - -libp2p-interfaces@4.0.4: - version "4.0.4" - resolved "https://registry.npmjs.org/libp2p-interfaces/-/libp2p-interfaces-4.0.4.tgz" - integrity sha512-pD46BpdZBM4OEs/LdYJ74BT582OyL+MLOawZr+YRdQTt3s0UZBInc0SF/AhhL2je9bcfkMe4Z1ko+/nninTNvw== - dependencies: - abort-controller "^3.0.0" - abortable-iterator "^3.0.0" - debug "^4.3.1" - err-code "^3.0.1" - it-length-prefixed "^5.0.2" - it-pipe "^1.1.0" - it-pushable "^1.4.2" - libp2p-crypto "^0.21.0" - multiaddr "^10.0.0" - multiformats "^9.1.2" - p-queue "^6.6.2" - peer-id "^0.16.0" - protobufjs "^6.10.2" - uint8arrays "^3.0.0" - -libp2p-interfaces@^4.0.0: - version "4.0.6" - resolved "https://registry.npmjs.org/libp2p-interfaces/-/libp2p-interfaces-4.0.6.tgz" - integrity sha512-3KjzNEIWhi+VoOamLvgKKUE/xqwxSw/JYqsBnfMhAWVRvRtosROtVT03wci2XbuuowCYw+/hEX1xKJIR1w5n0A== - dependencies: - abortable-iterator "^3.0.0" - debug "^4.3.1" - err-code "^3.0.1" - it-length-prefixed "^5.0.2" - it-pipe "^1.1.0" - it-pushable "^1.4.2" - libp2p-crypto "^0.21.0" - multiaddr "^10.0.0" - multiformats "^9.1.2" - p-queue "^6.6.2" - peer-id "^0.16.0" - protobufjs "^6.10.2" - uint8arrays "^3.0.0" - -libp2p-mdns@^0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/libp2p-mdns/-/libp2p-mdns-0.18.0.tgz" - integrity sha512-IBCKRuNc5USlli9QF/gOq2loCssE4ZKkVRhUNuAVBRXJ8ueqFEquc5R5C1sWy7AOgbycTgeNcxzSa1kuNb6nbg== - dependencies: - debug "^4.3.1" - multiaddr "^10.0.0" - multicast-dns "^7.2.0" - peer-id "^0.16.0" - -libp2p-mplex@^0.10.5: - version "0.10.5" - resolved "https://registry.npmjs.org/libp2p-mplex/-/libp2p-mplex-0.10.5.tgz" - integrity sha512-INgYgHVR1Dl8NDRmlrRVJUWyykeQa+tda892+fB1R3igKMXKP7pstJE72WS6cznzqnltCfbxOMghyx/fJImUHA== - dependencies: - abort-controller "^3.0.0" - abortable-iterator "^3.0.0" - bl "^5.0.0" - debug "^4.3.1" - err-code "^3.0.1" - it-pipe "^1.1.0" - it-pushable "^1.4.1" - varint "^6.0.0" - -libp2p-tcp@^0.17.2: - version "0.17.2" - resolved "https://registry.npmjs.org/libp2p-tcp/-/libp2p-tcp-0.17.2.tgz" - integrity sha512-SAdgDB4Rm0olPbyvanKP5JBaiRwbIOo0Nt++WYe1U2B6akg2uatsDOtulfpnc1gsL1B5vamnOpOzKaDj4kkt8g== - dependencies: - abortable-iterator "^3.0.0" - class-is "^1.1.0" - debug "^4.3.1" - err-code "^3.0.1" - libp2p-utils "^0.4.0" - mafmt "^10.0.0" - multiaddr "^10.0.0" - stream-to-it "^0.2.2" - -libp2p-utils@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/libp2p-utils/-/libp2p-utils-0.4.1.tgz" - integrity sha512-kq/US2unamiyY+YwP47dO1uqpAdcbdYI2Fzi9JIEhjfPBaD1MR/uyQ/YP7ABthl3EaxAjIQYd1TVp85d6QKAtQ== - dependencies: - abortable-iterator "^3.0.0" - debug "^4.3.0" - err-code "^3.0.1" - ip-address "^8.0.0" - is-loopback-addr "^1.0.0" - multiaddr "^10.0.0" - private-ip "^2.1.1" - -libp2p@^0.36.2: - version "0.36.2" - resolved "https://registry.npmjs.org/libp2p/-/libp2p-0.36.2.tgz" - integrity sha512-UpNYBMQVivMu56zoibdGitopv39uBBAybIBOEGWmFy/I2NnTVGUutLPrxo47AuN2kntYgo/TNJfW+PpswUgSaw== - dependencies: - "@vascosantos/moving-average" "^1.1.0" - abortable-iterator "^3.0.0" - aggregate-error "^3.1.0" + "@achingbrain/nat-port-mapper" "^1.0.3" + "@libp2p/components" "^2.1.0" + "@libp2p/connection" "^4.0.2" + "@libp2p/crypto" "^1.0.4" + "@libp2p/interface-address-manager" "^1.0.3" + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-connection-encrypter" "^2.0.1" + "@libp2p/interface-connection-manager" "^1.1.1" + "@libp2p/interface-content-routing" "^1.0.2" + "@libp2p/interface-dht" "^1.0.1" + "@libp2p/interface-metrics" "^3.0.0" + "@libp2p/interface-peer-discovery" "^1.0.1" + "@libp2p/interface-peer-id" "^1.0.4" + "@libp2p/interface-peer-info" "^1.0.3" + "@libp2p/interface-peer-routing" "^1.0.1" + "@libp2p/interface-peer-store" "^1.2.2" + "@libp2p/interface-pubsub" "^2.1.0" + "@libp2p/interface-registrar" "^2.0.3" + "@libp2p/interface-stream-muxer" "^2.0.2" + "@libp2p/interface-transport" "^1.0.4" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.1" + "@libp2p/multistream-select" "^3.0.0" + "@libp2p/peer-collections" "^2.0.0" + "@libp2p/peer-id" "^1.1.15" + "@libp2p/peer-id-factory" "^1.0.18" + "@libp2p/peer-record" "^4.0.3" + "@libp2p/peer-store" "^3.1.5" + "@libp2p/tracked-map" "^2.0.1" + "@libp2p/utils" "^3.0.2" + "@multiformats/mafmt" "^11.0.2" + "@multiformats/multiaddr" "^11.0.0" + abortable-iterator "^4.0.2" any-signal "^3.0.0" - bignumber.js "^9.0.1" - class-is "^1.1.0" - datastore-core "^7.0.0" - debug "^4.3.1" - err-code "^3.0.0" - es6-promisify "^7.0.0" + datastore-core "^8.0.1" + err-code "^3.0.1" events "^3.3.0" hashlru "^2.3.0" - interface-datastore "^6.0.2" - it-all "^1.0.4" - it-buffer "^0.1.2" - it-drain "^1.0.3" - it-filter "^1.0.1" - it-first "^1.0.4" + interface-datastore "^7.0.0" + it-all "^1.0.6" + it-drain "^1.0.5" + it-filter "^1.0.3" + it-first "^1.0.6" it-foreach "^0.1.1" - it-handshake "^2.0.0" - it-length-prefixed "^5.0.2" - it-map "^1.0.4" - it-merge "^1.0.0" - it-pipe "^1.1.0" + it-handshake "^4.1.2" + it-length-prefixed "^8.0.2" + it-map "^1.0.6" + it-merge "^1.0.3" + it-pair "^2.0.2" + it-pipe "^2.0.3" it-sort "^1.0.1" - it-take "^1.0.0" - libp2p-crypto "^0.21.2" - libp2p-interfaces "^4.0.0" - libp2p-utils "^0.4.0" - mafmt "^10.0.0" + it-stream-types "^1.0.4" merge-options "^3.0.4" - mortice "^2.0.1" - multiaddr "^10.0.0" - multiformats "^9.0.0" - multistream-select "^3.0.0" + multiformats "^9.6.3" mutable-proxy "^1.0.0" - nat-api "^0.3.1" - node-forge "^1.2.1" - p-any "^3.0.0" + node-forge "^1.3.1" p-fifo "^1.0.0" - p-retry "^4.4.0" - p-settle "^4.1.1" - peer-id "^0.16.0" - private-ip "^2.1.0" - protobufjs "^6.10.2" + p-retry "^5.0.0" + p-settle "^5.0.0" + private-ip "^2.3.3" + protons-runtime "^3.0.1" retimer "^3.0.0" sanitize-filename "^1.6.3" set-delayed-interval "^1.0.0" - streaming-iterables "^6.0.0" timeout-abort-controller "^3.0.0" + uint8arraylist "^2.3.2" uint8arrays "^3.0.0" - varint "^6.0.0" - wherearewe "^1.0.0" + wherearewe "^2.0.0" xsalsa20 "^1.1.0" light-my-request@^4.2.0: @@ -8784,7 +9128,7 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== -lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8831,6 +9175,19 @@ long@^4.0.0: resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" + integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== + +longbits@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/longbits/-/longbits-1.1.0.tgz#d6a7b2411dead1cf4b79ee4586816e65c7356ab9" + integrity sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ== + dependencies: + byte-access "^1.0.1" + uint8arraylist "^2.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" @@ -8866,18 +9223,6 @@ lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== -ltgt@^2.1.2: - version "2.2.1" - resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= - -mafmt@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/mafmt/-/mafmt-10.0.0.tgz" - integrity sha512-K1bziJOXcnepfztu+2Xy9FLKVLaFMDuspmiyJIYRxnO0WOxFSV7XKSdMxMrVZxcvg1+YjlTIvSGTImUHU2k4Aw== - dependencies: - multiaddr "^10.0.0" - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -9398,15 +9743,15 @@ moment@^2.11.2: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -mortice@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/mortice/-/mortice-2.0.1.tgz" - integrity sha512-9gsXmjq+5LZmXDIoyC/crf2i/7CUwDGSBEwSEsr1i/WfKmJ6DVt38B5kg6BE/WF/1/yfGJYiB1Wyiu423iI3nQ== +mortice@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mortice/-/mortice-3.0.0.tgz#41a31dd00c799c1d456223d1ca211557316383d4" + integrity sha512-g4rgq//2PWn4m52G6TpCSGmtWabJM8LKCZTQY4W7z0foiaQkqw+FG9a6pwIqUcTkCgBQoet8G/24V6adVMpnHw== dependencies: nanoid "^3.1.20" - observable-webworkers "^1.0.0" - p-queue "^6.0.0" - promise-timeout "^1.3.0" + observable-webworkers "^2.0.1" + p-queue "^7.2.0" + p-timeout "^5.0.2" ms@2.0.0: version "2.0.0" @@ -9423,25 +9768,6 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiaddr@^10.0.0, multiaddr@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/multiaddr/-/multiaddr-10.0.1.tgz" - integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== - dependencies: - dns-over-http-resolver "^1.2.3" - err-code "^3.0.1" - is-ip "^3.1.0" - multiformats "^9.4.5" - uint8arrays "^3.0.0" - varint "^6.0.0" - -multibase@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz" - integrity sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg== - dependencies: - "@multiformats/base-x" "^4.0.1" - multicast-dns@^7.2.0: version "7.2.2" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz" @@ -9450,30 +9776,21 @@ multicast-dns@^7.2.0: dns-packet "^4.0.0" thunky "^1.0.2" -multiformats@^9.0.0, multiformats@^9.1.2: - version "9.4.6" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.4.6.tgz" - integrity sha512-ngZRO82P7mPvw/3gu5NQ2QiUJGYTS0LAxvQnEAlWCJakvn7YpK2VAd9JWM5oosYUeqoVbkylH/FsqRc4fc2+ag== - multiformats@^9.4.2, multiformats@^9.4.5: version "9.4.5" resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.4.5.tgz" integrity sha512-zQxukxsHM34EJi3yT3MkUlycY9wEouyrAz0PSN+CyCj6cYchJZ4LrTH74YtlsxVyAK6waz/gnVLmJwi3P0knKg== +multiformats@^9.6.3: + version "9.7.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.0.tgz#845799e8df70fbb6b15922500e45cb87cf12f7e5" + integrity sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q== + multiformats@^9.6.4: version "9.6.4" resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.6.4.tgz" integrity sha512-fCCB6XMrr6CqJiHNjfFNGT0v//dxOBMrOMqUIzpPc/mmITweLEyhvMpY9bF+jZ9z3vaMAau5E8B68DW77QMXkg== -multihashes@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - multimatch@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" @@ -9485,23 +9802,6 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -multistream-select@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/multistream-select/-/multistream-select-3.0.2.tgz" - integrity sha512-ICGA8DAviZj6Xo1NkaRV3J38M+tFDoWiGtO1ksluyMnskAsdGjAzocg806OzpQPivNGWWboX3CrFT2Tk4UdYXA== - dependencies: - abortable-iterator "^3.0.0" - bl "^5.0.0" - debug "^4.1.1" - err-code "^3.0.1" - it-first "^1.0.6" - it-handshake "^2.0.0" - it-length-prefixed "^5.0.0" - it-pipe "^1.0.1" - it-reader "^3.0.0" - p-defer "^3.0.0" - uint8arrays "^3.0.0" - mutable-proxy@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/mutable-proxy/-/mutable-proxy-1.0.0.tgz" @@ -9552,27 +9852,15 @@ napi-macros@~2.0.0: resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -nat-api@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/nat-api/-/nat-api-0.3.1.tgz" - integrity sha512-5cyLugEkXnKSKSvVjKjxxPMLDnkwY3boZLbATWwiGJ4T/3UvIpiQmzb2RqtxxEFcVo/7PwsHPGN0MosopONO8Q== - dependencies: - async "^3.2.0" - debug "^4.2.0" - default-gateway "^6.0.2" - request "^2.88.2" - unordered-array-remove "^1.0.2" - xml2js "^0.1.0" - native-abort-controller@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/native-abort-controller/-/native-abort-controller-1.0.3.tgz" integrity sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA== -native-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz" - integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== +native-fetch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-4.0.2.tgz#75c8a44c5f3bb021713e5e24f2846750883e49af" + integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg== natural-compare@^1.4.0: version "1.4.0" @@ -9636,7 +9924,7 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, "node-fetch@npm:@achingbrain/node-fetch@^2.6.4": +node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g== @@ -9646,12 +9934,12 @@ node-forge@^0.10.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-forge@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz" - integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== +node-forge@^1.1.0, node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build@^4.2.0, node-gyp-build@~4.2.1: +node-gyp-build@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz" integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== @@ -10100,10 +10388,10 @@ observable-fns@^0.6.1: resolved "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz" integrity sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg== -observable-webworkers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-1.0.0.tgz" - integrity sha512-+cECwCR8IEh8UY5nefQVLO9Cydqpk1izO+o7BABmKjXfJZyEOzBWY3ss5jbOPM6KmEa9aQExvAtTW6tVTOsNAQ== +observable-webworkers@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/observable-webworkers/-/observable-webworkers-2.0.1.tgz#7d9086ebc567bd318b46ba0506b10cedf3813878" + integrity sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw== on-finished@2.4.1: version "2.4.1" @@ -10195,24 +10483,11 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-any@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-any/-/p-any-3.0.0.tgz" - integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== - dependencies: - p-cancelable "^2.0.0" - p-some "^5.0.0" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-cancelable@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.0.tgz" - integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ== - p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -10223,6 +10498,11 @@ p-defer@^3.0.0: resolved "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz" integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== +p-defer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.0.tgz#8082770aeeb10eb6b408abe91866738741ddd5d2" + integrity sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ== + p-fifo@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz" @@ -10243,7 +10523,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.2.0, p-limit@^2.2.2: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -10257,6 +10537,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" @@ -10302,7 +10589,7 @@ p-pipe@^3.1.0: resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz" integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== -p-queue@^6.0.0, p-queue@^6.6.2: +p-queue@^6.6.2: version "6.6.2" resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== @@ -10310,39 +10597,39 @@ p-queue@^6.0.0, p-queue@^6.6.2: eventemitter3 "^4.0.4" p-timeout "^3.2.0" +p-queue@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-7.2.0.tgz#e1430e4432f09b43aa8b4913d4c2ff7fdd685479" + integrity sha512-Kvv7p13M46lTYLQ/PsZdaj/1Vj6u/8oiIJgyQyx4oVkOfHdd7M2EZvXigDvcsSzRwanCzQirV5bJPQFoSQt5MA== + dependencies: + eventemitter3 "^4.0.7" + p-timeout "^5.0.2" + p-reduce@^2.0.0, p-reduce@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-reflect@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz" - integrity sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg== +p-reflect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-3.0.0.tgz#2473a6f9ee0376a27723b18efd24911db8e92573" + integrity sha512-rOgYyrvUxnJdSYKGSK7UnO7RxFSnT/IJYFPiosuQ2/AtRWIryIrv8lecWqJXWbKnMcUjJvxiHDMp80m0Yj4eLA== -p-retry@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.5.0.tgz" - integrity sha512-5Hwh4aVQSu6BEP+w2zKlVXtFAaYQe1qWuVADSgoeVlLjwe/Q/AMSoRR4MDeaAfu8llT+YNbEijWu/YF3m6avkg== +p-retry@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-5.1.1.tgz#1950b9be441474a67f852811c1d4ec955885d2c8" + integrity sha512-i69WkEU5ZAL8mrmdmVviWwU+DN+IUF8f4sSJThoJ3z5A7Nn5iuO5ROX3Boye0u+uYQLOSfgFl7SuFZCjlAVbQA== dependencies: - "@types/retry" "^0.12.0" - retry "^0.12.0" + "@types/retry" "0.12.1" + retry "^0.13.1" -p-settle@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz" - integrity sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ== - dependencies: - p-limit "^2.2.2" - p-reflect "^2.1.0" - -p-some@^5.0.0: +p-settle@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-some/-/p-some-5.0.0.tgz" - integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== + resolved "https://registry.yarnpkg.com/p-settle/-/p-settle-5.0.0.tgz#b7008de2f225ed9132317d995ead4c007684024e" + integrity sha512-P+cL1wECSDqI49JAiHlgG0HlqqL0CBsMP3f8vrVx6Yy8pMngmJqn8UjzAHr5CPkcDIzeBxugDLDMWTK8fqrFGw== dependencies: - aggregate-error "^3.0.0" - p-cancelable "^2.0.0" + p-limit "^4.0.0" + p-reflect "^3.0.0" p-timeout@^3.2.0: version "3.2.0" @@ -10351,6 +10638,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" @@ -10589,17 +10881,6 @@ peer-id@^0.15.3: protobufjs "^6.10.2" uint8arrays "^3.0.0" -peer-id@^0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz" - integrity sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ== - dependencies: - class-is "^1.1.0" - libp2p-crypto "^0.21.0" - multiformats "^9.4.5" - protobufjs "^6.10.2" - uint8arrays "^3.0.0" - pem-jwk@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/pem-jwk/-/pem-jwk-2.0.0.tgz" @@ -10693,6 +10974,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +platform@^1.3.3: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + prebuild-install@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz" @@ -10737,14 +11023,6 @@ prettier@^2.0.5: resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -private-ip@^2.1.0: - version "2.2.1" - resolved "https://registry.npmjs.org/private-ip/-/private-ip-2.2.1.tgz" - integrity sha512-jN1WT/br/VNW9xEcwHr6DjtOKxQ5qOIqmh7o+co2TWgq56pZJw99iO3UT1tWdfgsQiyK9FqG4ji3ykwpjFqITA== - dependencies: - ip-regex "^4.3.0" - netmask "^2.0.2" - private-ip@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/private-ip/-/private-ip-2.1.1.tgz" @@ -10753,6 +11031,16 @@ private-ip@^2.1.1: is-ip "^3.1.0" netmask "^1.0.6" +private-ip@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-2.3.3.tgz#1e80ff8443e5ac78f555631aec3ea6ff027fa6aa" + integrity sha512-5zyFfekIVUOTVbL92hc8LJOtE/gyGHeREHkJ2yTyByP8Q2YZVoBqLg3EfYLeF0oVvGqtaEX2t2Qovja0/gStXw== + dependencies: + ip-regex "^4.3.0" + ipaddr.js "^2.0.1" + is-ip "^3.1.0" + netmask "^2.0.2" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -10811,11 +11099,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promise-timeout@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz" - integrity sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg== - promzard@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz" @@ -10854,15 +11137,37 @@ protobufjs@^6.10.2, protobufjs@^6.11.2: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.0.0.tgz#8c678e1351fd926178fce5a4213913e8d990974f" + integrity sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^5.0.0" + protocols@^1.1.0, protocols@^1.4.0: version "1.4.8" resolved "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +protons-runtime@^3.0.1, protons-runtime@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-3.1.0.tgz#500918da4a2d97aa28007f30c3f2f7021e05c0b2" + integrity sha512-S1iSPQC0McdHKJRi0XcATBkWgwWPx46UDfrnshYDXBvGHSYqkFtn4MQ8Gatf67w7FzFtHivA+Hb0ZPq56upG8w== + dependencies: + protobufjs "^7.0.0" + uint8arraylist "^2.3.2" psl@^1.1.28, psl@^1.1.33: version "1.8.0" @@ -11009,6 +11314,11 @@ range-parser@^1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +rate-limiter-flexible@^2.3.9: + version "2.3.11" + resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-2.3.11.tgz#558cf388a3785f286ae7e1c345d719c04c43b8ca" + integrity sha512-MFLtfs1llUNBkJxeTkSZD7oAxVg1nZ79bevE2TmqQMbmKGoi8DBua3VAZFz5bsjEr0A6Mbr9AJuf5lvYSCok2Q== + raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" @@ -11029,13 +11339,6 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-native-fetch-api@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz" - integrity sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw== - dependencies: - p-defer "^3.0.0" - read-cmd-shim@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz" @@ -11399,7 +11702,7 @@ retimer@^3.0.0: resolved "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz" integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== -retry@0.13.1: +retry@0.13.1, retry@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== @@ -11546,7 +11849,7 @@ sax@1.2.1: resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= -sax@>=0.1.1, sax@>=0.6.0, sax@^1.2.4: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -12106,11 +12409,6 @@ stream-to-it@^0.2.0, stream-to-it@^0.2.2: dependencies: get-iterator "^1.0.2" -streaming-iterables@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/streaming-iterables/-/streaming-iterables-6.0.0.tgz" - integrity sha512-GYbJh0ife8PvryWSyFifY1m1uj6zO12d9duuP6xltiOolUz44eKasp5gbFhRbFbLy50ik6hcKn4Pbxl9AkxB+Q== - streamroller@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.2.tgz#abd444560768b340f696307cf84d3f46e86c0e63" @@ -12322,6 +12620,15 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" +super-regex@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/super-regex/-/super-regex-0.2.0.tgz#dc1e071e55cdcf56930eb6271f73653a655b2642" + integrity sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw== + dependencies: + clone-regexp "^3.0.0" + function-timeout "^0.1.0" + time-span "^5.1.0" + superagent@^3.8.3: version "3.8.3" resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz" @@ -12591,6 +12898,13 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +time-span@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/time-span/-/time-span-5.1.0.tgz#80c76cf5a0ca28e0842d3f10a4e99034ce94b90d" + integrity sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA== + dependencies: + convert-hrtime "^5.0.0" + timeout-abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz" @@ -12926,10 +13240,26 @@ uid-number@0.0.6: resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -uint8arrays@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz" - integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== +uint8-varint@^1.0.1, uint8-varint@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-1.0.2.tgz#89fd4142284b672c63416f43a0f647d8fbce17e1" + integrity sha512-IubsiyUyX2snBV+XmTa+Q9hjGejhDznwIzXMyl3ZjVWog3h/mDijB8s/s/9ujQpJ2Yskj51hWAvbeS7B7Em61g== + dependencies: + byte-access "^1.0.0" + longbits "^1.1.0" + uint8arraylist "^2.0.0" + +uint8arraylist@^2.0.0, uint8arraylist@^2.1.0, uint8arraylist@^2.1.1, uint8arraylist@^2.3.1, uint8arraylist@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.3.2.tgz#d301f6cb570828b456ef09655c0a4d3b0929ef06" + integrity sha512-4ybc/jixmtGhUrebJ0bzB95TjEbskWxBKBRrAozw7P6WcAcZdPMYSLdDuNoEEGo/Cwe+0TNic9CXzWUWzy1quw== + dependencies: + uint8arrays "^3.1.0" + +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2" + integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== dependencies: multiformats "^9.4.2" @@ -12987,11 +13317,6 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unordered-array-remove@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz" - integrity sha1-xUbo+I4xegzyZEyX7LV9umbSUO8= - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -13108,7 +13433,7 @@ uuid@3.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.0: +uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -13151,11 +13476,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - varint@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" @@ -13256,10 +13576,10 @@ whatwg-url@^8.4.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" -wherearewe@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.0.tgz" - integrity sha512-oQnRsAfMCqNAC7U4JrBdmFXAhBRLOkPGOfU5+nw9fs2D3g8O6EV7hn7BhpXtt0yno4pxFiRD55rMyt0fsLMqlw== +wherearewe@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wherearewe/-/wherearewe-2.0.1.tgz#37c97a7bf112dca8db34bfefb2f6c997af312bb8" + integrity sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw== dependencies: is-electron "^2.2.0" @@ -13483,14 +13803,7 @@ xml2js@0.4.19: sax ">=0.6.0" xmlbuilder "~9.0.1" -xml2js@^0.1.0: - version "0.1.14" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz" - integrity sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw= - dependencies: - sax ">=0.1.1" - -xml2js@^0.4.19: +xml2js@^0.4.19, xml2js@^0.4.23: version "0.4.23" resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== @@ -13650,6 +13963,11 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zip-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"