From 1fc0246f63932a3bc3add3e1dfaa7c8def88a664 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Fri, 8 Oct 2021 14:46:23 +0300 Subject: [PATCH 1/2] Add connectToDiscv5Bootnodes option --- .../src/options/beaconNodeOptions/network.ts | 8 +++++ .../unit/options/beaconNodeOptions.test.ts | 2 ++ packages/lodestar/src/network/nodejs/util.ts | 30 ++++++++++++++----- packages/lodestar/src/network/options.ts | 3 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/options/beaconNodeOptions/network.ts b/packages/cli/src/options/beaconNodeOptions/network.ts index 4488666b71fc..79b88d87a007 100644 --- a/packages/cli/src/options/beaconNodeOptions/network.ts +++ b/packages/cli/src/options/beaconNodeOptions/network.ts @@ -10,6 +10,7 @@ export interface INetworkArgs { "network.bootMultiaddrs": string[]; "network.localMultiaddrs": string[]; "network.subscribeAllSubnets": boolean; + "network.connectToDiscv5Bootnodes": boolean; } export function parseArgs(args: INetworkArgs): IBeaconNodeOptions["network"] { @@ -86,4 +87,11 @@ export const options: ICliCommandOptions = { defaultDescription: String(defaultOptions.network.subscribeAllSubnets === true), group: "network", }, + + "network.connectToDiscv5Bootnodes": { + type: "boolean", + description: "Attempt direct connection to discv5 bootnodes from network.discv5.bootEnrs option", + defaultDescription: String(defaultOptions.network.connectToDiscv5Bootnodes === true), + group: "network", + }, }; diff --git a/packages/cli/test/unit/options/beaconNodeOptions.test.ts b/packages/cli/test/unit/options/beaconNodeOptions.test.ts index aa9fa22d0ba0..3f72d17c0c69 100644 --- a/packages/cli/test/unit/options/beaconNodeOptions.test.ts +++ b/packages/cli/test/unit/options/beaconNodeOptions.test.ts @@ -44,6 +44,7 @@ describe("options / beaconNodeOptions", () => { "network.bootMultiaddrs": [], "network.localMultiaddrs": [], "network.subscribeAllSubnets": true, + "network.connectToDiscv5Bootnodes": true, "sync.isSingleNode": true, "sync.disableProcessAsChainSegment": true, @@ -98,6 +99,7 @@ describe("options / beaconNodeOptions", () => { bootMultiaddrs: [], localMultiaddrs: [], subscribeAllSubnets: true, + connectToDiscv5Bootnodes: true, }, sync: { isSingleNode: true, diff --git a/packages/lodestar/src/network/nodejs/util.ts b/packages/lodestar/src/network/nodejs/util.ts index e9cc6294a7ef..75396236c259 100644 --- a/packages/lodestar/src/network/nodejs/util.ts +++ b/packages/lodestar/src/network/nodejs/util.ts @@ -18,18 +18,18 @@ export type NodeJsLibp2pOpts = { /** * * @param peerIdOrPromise Create an instance of NodejsNode asynchronously - * @param network + * @param networkOpts * @param peerStoreDir */ export async function createNodeJsLibp2p( peerIdOrPromise: PeerId | Promise, - network: Partial = {}, + networkOpts: Partial = {}, nodeJsLibp2pOpts: NodeJsLibp2pOpts = {} ): Promise { const peerId = await Promise.resolve(peerIdOrPromise); - const localMultiaddrs = network.localMultiaddrs || defaultNetworkOptions.localMultiaddrs; - const bootMultiaddrs = network.bootMultiaddrs || defaultNetworkOptions.bootMultiaddrs; - const enr = network.discv5?.enr; + const localMultiaddrs = networkOpts.localMultiaddrs || defaultNetworkOptions.localMultiaddrs; + const bootMultiaddrs = networkOpts.bootMultiaddrs || defaultNetworkOptions.bootMultiaddrs; + const enr = networkOpts.discv5?.enr; const {peerStoreDir, disablePeerDiscovery} = nodeJsLibp2pOpts; if (enr && typeof enr !== "string") { @@ -48,14 +48,28 @@ export async function createNodeJsLibp2p( await datastore.open(); } + // Append discv5.bootEnrs to bootMultiaddrs if requested + if (networkOpts.connectToDiscv5Bootnodes) { + if (!networkOpts.bootMultiaddrs) networkOpts.bootMultiaddrs = []; + if (!networkOpts.discv5) networkOpts.discv5 = defaultDiscv5Options; + + for (const enrOrStr of networkOpts.discv5.bootEnrs) { + const enr = typeof enrOrStr === "string" ? ENR.decodeTxt(enrOrStr) : enrOrStr; + const multiaddrTCP = enr.getLocationMultiaddr("tcp"); + const peerId = await enr.peerId(); + const multiaddrWithPeerId = `${multiaddrTCP}/p2p/${peerId.toB58String()}`; + networkOpts.bootMultiaddrs.push(multiaddrWithPeerId); + } + } + return new NodejsNode({ peerId, addresses: {listen: localMultiaddrs}, datastore, bootMultiaddrs: bootMultiaddrs, - discv5: network.discv5 || defaultDiscv5Options, - maxConnections: network.maxPeers, - minConnections: network.targetPeers, + discv5: networkOpts.discv5 || defaultDiscv5Options, + maxConnections: networkOpts.maxPeers, + minConnections: networkOpts.targetPeers, // If peer discovery is enabled let the default in NodejsNode peerDiscovery: disablePeerDiscovery ? [] : undefined, }); diff --git a/packages/lodestar/src/network/options.ts b/packages/lodestar/src/network/options.ts index 891d4c680f9e..6c4d95a77023 100644 --- a/packages/lodestar/src/network/options.ts +++ b/packages/lodestar/src/network/options.ts @@ -3,9 +3,10 @@ import {PeerManagerOpts} from "./peers"; export interface INetworkOptions extends PeerManagerOpts { localMultiaddrs: string[]; - bootMultiaddrs: string[]; + bootMultiaddrs?: string[]; discv5?: IDiscv5DiscoveryInputOptions; subscribeAllSubnets?: boolean; + connectToDiscv5Bootnodes?: boolean; } export const defaultDiscv5Options: IDiscv5DiscoveryInputOptions = { From 40dbc92880fd6c55f30fffed95903b29340db47f Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Fri, 8 Oct 2021 14:58:47 +0300 Subject: [PATCH 2/2] Parse new arg --- packages/cli/src/options/beaconNodeOptions/network.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/options/beaconNodeOptions/network.ts b/packages/cli/src/options/beaconNodeOptions/network.ts index 79b88d87a007..9d9d9d56ace3 100644 --- a/packages/cli/src/options/beaconNodeOptions/network.ts +++ b/packages/cli/src/options/beaconNodeOptions/network.ts @@ -27,6 +27,7 @@ export function parseArgs(args: INetworkArgs): IBeaconNodeOptions["network"] { bootMultiaddrs: args["network.bootMultiaddrs"], localMultiaddrs: args["network.localMultiaddrs"], subscribeAllSubnets: args["network.subscribeAllSubnets"], + connectToDiscv5Bootnodes: args["network.connectToDiscv5Bootnodes"], }; }