From 6988cdd4aa7518c279a3cc084810890390ed19c9 Mon Sep 17 00:00:00 2001 From: air1one <36802613+air1one@users.noreply.github.com> Date: Wed, 23 Sep 2020 14:00:48 +0200 Subject: [PATCH] fix(core-p2p): rate limit and peer broadcast (#4054) --- .../core-p2p/peer-communicator.test.ts | 5 ++++- packages/core-interfaces/src/core-p2p/peer.ts | 4 ---- packages/core-p2p/src/peer-connector.ts | 21 ++++++++----------- packages/core-p2p/src/peer.ts | 8 +------ .../src/socket-server/versions/peer.ts | 4 ++-- 5 files changed, 16 insertions(+), 26 deletions(-) diff --git a/__tests__/integration/core-p2p/peer-communicator.test.ts b/__tests__/integration/core-p2p/peer-communicator.test.ts index 9a8769c211..92466b18c6 100644 --- a/__tests__/integration/core-p2p/peer-communicator.test.ts +++ b/__tests__/integration/core-p2p/peer-communicator.test.ts @@ -4,6 +4,7 @@ import { eventEmitter } from "./mocks/core-container"; import { P2P } from "@arkecosystem/core-interfaces"; import { Blocks, Transactions } from "@arkecosystem/crypto"; +import delay from "delay"; import { getPeerConfig } from "../../../packages/core-p2p/src/socket-server/utils/get-peer-config"; import { createPeerService, createStubPeer } from "../../helpers/peers"; import { TransactionFactory } from "../../helpers/transaction-factory"; @@ -41,11 +42,13 @@ afterAll(async () => { socketManager.stopServer(); }); -beforeEach(() => { +beforeEach(async () => { ({ communicator, storage } = createPeerService()); stubPeer = createStubPeer({ ip: "127.0.0.1", port: 4009 }); storage.setPeer(stubPeer); + + await delay(2000); }); afterEach(() => socketManager.resetAllMocks()); diff --git a/packages/core-interfaces/src/core-p2p/peer.ts b/packages/core-interfaces/src/core-p2p/peer.ts index b469e35df1..710a1fe76b 100644 --- a/packages/core-interfaces/src/core-p2p/peer.ts +++ b/packages/core-interfaces/src/core-p2p/peer.ts @@ -33,10 +33,6 @@ export interface IPeer { export interface IPeerBroadcast { ip: string; - ports: IPeerPorts; - version: string; - height: number; - latency: number; } export interface IPeerState { diff --git a/packages/core-p2p/src/peer-connector.ts b/packages/core-p2p/src/peer-connector.ts index cdb6d60d78..4f109a74b3 100644 --- a/packages/core-p2p/src/peer-connector.ts +++ b/packages/core-p2p/src/peer-connector.ts @@ -85,18 +85,15 @@ export class PeerConnector implements P2P.IPeerConnector { socket.on("ping", () => this.terminate(peer)); socket.on("pong", () => this.terminate(peer)); socket.on("message", data => { - if (data === "#1") { - // this is to establish some rate limit on #1 messages - // a simple rate limit of 1 per second doesnt seem to be enough, so decided to give some margin - // and allow up to 10 per second which should be more than enough - const timeNow: number = new Date().getTime(); - socket._last10Pings = socket._last10Pings || []; - socket._last10Pings.push(timeNow); - if (socket._last10Pings.length >= 10) { - socket._last10Pings = socket._last10Pings.slice(socket._last10Pings.length - 10); - if (timeNow - socket._last10Pings[0] < 1000) { - this.terminate(peer); - } + // this is to establish some rate limit on socket messages + // 30 messages per second is enough for socketcluster's + our own messages + const timeNow: number = new Date().getTime(); + socket._last30Messages = socket._last30Messages || []; + socket._last30Messages.push(timeNow); + if (socket._last30Messages.length >= 30) { + socket._last30Messages = socket._last30Messages.slice(socket._last30Messages.length - 30); + if (timeNow - socket._last30Messages[0] < 1000) { + this.terminate(peer); } } }); diff --git a/packages/core-p2p/src/peer.ts b/packages/core-p2p/src/peer.ts index 29070d4d45..dd5cacc326 100644 --- a/packages/core-p2p/src/peer.ts +++ b/packages/core-p2p/src/peer.ts @@ -40,12 +40,6 @@ export class Peer implements P2P.IPeer { } public toBroadcast(): P2P.IPeerBroadcast { - return { - ip: this.ip, - ports: this.ports, - version: this.version, - height: this.state.height, - latency: this.latency, - }; + return { ip: this.ip }; } } diff --git a/packages/core-p2p/src/socket-server/versions/peer.ts b/packages/core-p2p/src/socket-server/versions/peer.ts index 91fd15dd0e..2f1e270ec2 100644 --- a/packages/core-p2p/src/socket-server/versions/peer.ts +++ b/packages/core-p2p/src/socket-server/versions/peer.ts @@ -14,8 +14,8 @@ export const getPeers = ({ service }: { service: P2P.IPeerService }): P2P.IPeerB return service .getStorage() .getPeers() - .map(peer => peer.toBroadcast()) - .sort((a, b) => a.latency - b.latency); + .sort((a, b) => a.latency - b.latency) + .map(peer => peer.toBroadcast()); }; export const getCommonBlocks = async ({