Skip to content
This repository has been archived by the owner on Jun 11, 2024. It is now read-only.

Implement peer banning mechanism - Closes #3343 #3664 #3665

Merged
merged 17 commits into from
May 29, 2019
67 changes: 40 additions & 27 deletions elements/lisk-p2p/test/integration/p2p.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ describe('Integration tests for P2P library', () => {
ackTimeout: 5000,
// Set a different discoveryInterval for each node; that way they don't keep trying to discover each other at the same time.
discoveryInterval: DISCOVERY_INTERVAL + index * 11,
peerBanTime: 5000,
mitsuaki-u marked this conversation as resolved.
Show resolved Hide resolved
nodeInfo: {
wsPort: nodePort,
nethash:
Expand Down Expand Up @@ -168,33 +169,6 @@ describe('Integration tests for P2P library', () => {
});
});

describe('Peer banning mechanism', () => {
it('should ban a bad peer', async () => {
const firstP2PNode = p2pNodeList[0];
const { connectedPeers } = firstP2PNode.getNetworkStatus();
const badPeer = connectedPeers[2];
const peerPenalty = {
peerId: `${badPeer.ipAddress}:${badPeer.wsPort}`,
penalty: 100,
};
firstP2PNode.applyPenalty(peerPenalty);
const {
newPeers,
triedPeers,
connectedPeers: updatedConnectedPeers,
} = firstP2PNode.getNetworkStatus();
expect(newPeers.map(peer => peer.wsPort)).to.not.include(
badPeer.wsPort,
);
expect(triedPeers.map(peer => peer.wsPort)).to.not.include(
badPeer.wsPort,
);
expect(updatedConnectedPeers.map(peer => peer.wsPort)).to.not.include(
badPeer.wsPort,
);
});
});

describe('P2P.send', () => {
describe('P2P.send when peers are at same height', () => {
let collectedMessages: Array<any> = [];
Expand Down Expand Up @@ -460,6 +434,45 @@ describe('Integration tests for P2P library', () => {
});
});

describe('Peer banning mechanism', () => {
it('should not ban a bad peer for a 10 point penalty', async () => {
const firstP2PNode = p2pNodeList[0];
await wait(200);
const { connectedPeers } = firstP2PNode.getNetworkStatus();
const badPeer = connectedPeers[1];
const peerPenalty = {
peerId: `${badPeer.ipAddress}:${badPeer.wsPort}`,
penalty: 10,
};
firstP2PNode.applyPenalty(peerPenalty);
const {
connectedPeers: updatedConnectedPeers,
} = firstP2PNode.getNetworkStatus();

expect(updatedConnectedPeers.map(peer => peer.wsPort)).to.include(
badPeer.wsPort,
);
});

it('should ban a bad peer for a 100 point penalty', async () => {
const firstP2PNode = p2pNodeList[0];
const { connectedPeers } = firstP2PNode.getNetworkStatus();
const badPeer = connectedPeers[2];
const peerPenalty = {
peerId: `${badPeer.ipAddress}:${badPeer.wsPort}`,
penalty: 100,
};
firstP2PNode.applyPenalty(peerPenalty);
const {
connectedPeers: updatedConnectedPeers,
} = firstP2PNode.getNetworkStatus();

expect(updatedConnectedPeers.map(peer => peer.wsPort)).to.not.include(
badPeer.wsPort,
);
});
});

describe('P2P.request', () => {
beforeEach(async () => {
p2pNodeList.forEach(p2p => {
Expand Down