private static Packet mockPingPacket(final Peer from, final Peer to) { final Packet packet = mock(Packet.class); final PingPacketData pingPacketData = PingPacketData.create(from.getEndpoint(), to.getEndpoint()); when(packet.getPacketData(any())).thenReturn(Optional.of(pingPacketData)); final BytesValue id = from.getId(); when(packet.getNodeId()).thenReturn(id); when(packet.getType()).thenReturn(PacketType.PING); when(packet.getHash()).thenReturn(Bytes32.ZERO); return packet; }
public static void areAllBootnodesAreInWhitelist( final EthNetworkConfig ethNetworkConfig, final PermissioningConfiguration permissioningConfiguration) throws Exception { List<Peer> bootnodesNotInWhitelist = new ArrayList<>(); final List<Peer> bootnodes = DiscoveryConfiguration.getBootstrapPeersFromGenericCollection( ethNetworkConfig.getBootNodes()); if (permissioningConfiguration.isNodeWhitelistSet() && bootnodes != null) { bootnodesNotInWhitelist = bootnodes .stream() .filter( node -> !permissioningConfiguration .getNodeWhitelist() .contains(URI.create(node.getEnodeURI()))) .collect(Collectors.toList()); } if (!bootnodesNotInWhitelist.isEmpty()) { throw new Exception( "Bootnode(s) not in nodes-whitelist " + nodeToURI(bootnodesNotInWhitelist)); } }
private List<DiscoveryPeer> createPeersInLastBucket(final Peer host, final int n) { final List<DiscoveryPeer> newPeers = new ArrayList<DiscoveryPeer>(n); // Flipping the most significant bit of the keccak256 will place the peer // in the last bucket for the corresponding host peer. final Bytes32 keccak256 = host.keccak256(); final MutableBytesValue template = MutableBytesValue.create(keccak256.size()); byte msb = keccak256.get(0); msb ^= MOST_SIGNFICANT_BIT_MASK; template.set(0, msb); for (int i = 0; i < n; i++) { template.setInt(template.size() - 4, i); final Bytes32 newKeccak256 = Bytes32.leftPad(template.copy()); final DiscoveryPeer newPeer = mock(DiscoveryPeer.class); when(newPeer.keccak256()).thenReturn(newKeccak256); final MutableBytesValue newId = MutableBytesValue.create(64); UInt256.of(i).getBytes().copyTo(newId, newId.size() - UInt256Value.SIZE); when(newPeer.getId()).thenReturn(newId); when(newPeer.getEndpoint()) .thenReturn( new Endpoint( host.getEndpoint().getHost(), 100 + counter.incrementAndGet(), OptionalInt.empty())); newPeers.add(newPeer); } return newPeers; }
@Override public String toString() { return shortId() + "@" + selfPeer.getEndpoint().getHost() + ':' + selfPeer.getEndpoint().getTcpPort(); }
@Test public void addPeer() { final PeerTable table = new PeerTable(Peer.randomId(), 16); final List<DiscoveryPeer> peers = helper.createDiscoveryPeers(5); for (final DiscoveryPeer peer : peers) { final PeerTable.AddResult result = table.tryAdd(peer); assertThat(result.getOutcome()).isEqualTo(Outcome.ADDED); } assertThat(table.getAllPeers()).hasSize(5); }
public static Packet mockFindNeighborsPacket(final Peer from) { final Packet packet = mock(Packet.class); final BytesValue target = BytesValue.fromHexString( "0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40"); final FindNeighborsPacketData packetData = FindNeighborsPacketData.create(target); when(packet.getPacketData(any())).thenReturn(Optional.of(packetData)); final BytesValue id = from.getId(); when(packet.getNodeId()).thenReturn(id); when(packet.getType()).thenReturn(PacketType.FIND_NEIGHBORS); when(packet.getHash()).thenReturn(Bytes32.ZERO); return packet; } }
@Test public void peerExists() { final PeerTable table = new PeerTable(Peer.randomId(), 16); final DiscoveryPeer peer = helper.createDiscoveryPeer(); assertThat(table.tryAdd(peer).getOutcome()).isEqualTo(Outcome.ADDED); assertThat(table.tryAdd(peer)) .satisfies( result -> { assertThat(result.getOutcome()).isEqualTo(Outcome.ALREADY_EXISTED); assertThat(result.getEvictionCandidate()).isNull(); }); } }
public static Packet mockPongPacket(final Peer from, final BytesValue pingHash) { final Packet packet = mock(Packet.class); final PongPacketData pongPacketData = PongPacketData.create(from.getEndpoint(), pingHash); when(packet.getPacketData(any())).thenReturn(Optional.of(pongPacketData)); final BytesValue id = from.getId(); when(packet.getNodeId()).thenReturn(id); when(packet.getType()).thenReturn(PacketType.PONG); when(packet.getHash()).thenReturn(Bytes32.ZERO); return packet; }
@Test public void directlyAddingPeerByPeerIdWorks() { final PeerBlacklist blacklist = new PeerBlacklist(); final Peer peer = generatePeer(); assertThat(blacklist.contains(peer)).isFalse(); blacklist.add(peer.getId()); assertThat(blacklist.contains(peer)).isTrue(); }
@Test public void addSelf() { final DiscoveryPeer localPeer = new DiscoveryPeer(Peer.randomId(), "127.0.0.1", 12345, 12345); final PeerTable table = new PeerTable(localPeer.getId(), 16); final PeerTable.AddResult result = table.tryAdd(localPeer); assertThat(result.getOutcome()).isEqualTo(Outcome.SELF); assertThat(table.getAllPeers()).hasSize(0); }
private Peer mockPeer() { final Peer peer = mock(Peer.class); final BytesValue id = SECP256K1.KeyPair.generate().getPublicKey().getEncodedBytes(); when(peer.getId()).thenReturn(id); when(peer.getEndpoint()).thenReturn(new Endpoint("127.0.0.1", 30303, OptionalInt.of(30303))); return peer; } }
@Test public void checkMaintainedConnectionPeersDoesntReconnectConnectedPeers() { final NettyP2PNetwork network = spy(mockNettyP2PNetwork()); final Peer peer = mockPeer(); verify(network, never()).connect(peer); assertThat(network.addMaintainConnectionPeer(peer)).isTrue(); verify(network, times(1)).connect(peer); { final CompletableFuture<PeerConnection> connection; connection = network.pendingConnections.remove(peer); assertThat(connection).isNotNull(); assertThat(connection.cancel(true)).isTrue(); } { final PeerConnection peerConnection = mockPeerConnection(peer.getId()); network.connections.registerConnection(peerConnection); network.checkMaintainedConnectionPeers(); verify(network, times(1)).connect(peer); } }
@Test public void getStatus() { final DiscoveryPeer peer = new DiscoveryPeer(Peer.randomId(), "127.0.0.1", 5000); assertEquals(PeerDiscoveryStatus.KNOWN, peer.getStatus()); }
@Test public void createFromURI() { final Peer peer = DefaultPeer.fromURI( "enode://c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b@172.20.0.4:30403"); assertEquals( fromHexString( "c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b"), peer.getId()); assertEquals("172.20.0.4", peer.getEndpoint().getHost()); assertEquals(30403, peer.getEndpoint().getUdpPort()); assertEquals(30403, peer.getEndpoint().getTcpPort().getAsInt()); }
@Test public void bannedNodesDoNotRollover() { final Peer bannedPeer = generatePeer(); final Peer peer1 = generatePeer(); final Peer peer2 = generatePeer(); final Peer peer3 = generatePeer(); final PeerBlacklist blacklist = new PeerBlacklist(2, Collections.singleton(bannedPeer.getId())); assertThat(blacklist.contains(bannedPeer)).isTrue(); assertThat(blacklist.contains(peer1)).isFalse(); assertThat(blacklist.contains(peer2)).isFalse(); assertThat(blacklist.contains(peer3)).isFalse(); // fill to the limit blacklist.add(peer1.getId()); blacklist.add(peer2.getId()); assertThat(blacklist.contains(bannedPeer)).isTrue(); assertThat(blacklist.contains(peer1)).isTrue(); assertThat(blacklist.contains(peer2)).isTrue(); assertThat(blacklist.contains(peer3)).isFalse(); // trigger rollover blacklist.add(peer3.getId()); assertThat(blacklist.contains(bannedPeer)).isTrue(); assertThat(blacklist.contains(peer1)).isFalse(); assertThat(blacklist.contains(peer2)).isTrue(); assertThat(blacklist.contains(peer3)).isTrue(); }
@Test public void createPeerFromURIWithDifferentUdpAndTcpPorts() { final Peer peer = DefaultPeer.fromURI( "enode://c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b@172.20.0.4:12345?discport=22222"); assertEquals( fromHexString( "c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b"), peer.getId()); assertEquals("172.20.0.4", peer.getEndpoint().getHost()); assertEquals(22222, peer.getEndpoint().getUdpPort()); assertEquals(12345, peer.getEndpoint().getTcpPort().getAsInt()); }
network1.subscribe(cap, messageFuture::complete); final Predicate<PeerConnection> isPeerOne = peerConnection -> peerConnection.getPeer().getNodeId().equals(one.getId()); final Predicate<PeerConnection> isPeerTwo = peerConnection -> peerConnection.getPeer().getNodeId().equals(two.getId()); Assertions.assertThat(network1.getPeers().stream().filter(isPeerTwo).findFirst()) .isNotPresent(); network2.subscribeConnect(peer1Future::complete); network1.connect(two).get(); Assertions.assertThat(peer1Future.get().getPeer().getNodeId()).isEqualTo(one.getId()); Assertions.assertThat(peer2Future.get().getPeer().getNodeId()).isEqualTo(two.getId()); Assertions.assertThat(network1.getPeers().stream().filter(isPeerTwo).findFirst()).isPresent(); final Optional<PeerConnection> optionalConnection = .isEqualTo(0); Assertions.assertThat(receivedMessage.getConnection().getPeer().getNodeId()) .isEqualTo(two.getId()); Assertions.assertThat(receivedMessageData.getSize()).isEqualTo(size); Assertions.assertThat(receivedMessageData.getCode()).isEqualTo(code);
@Test public void createFromURIWithoutPortUsesDefault() { final Peer peer = DefaultPeer.fromURI( "enode://c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b@172.20.0.4"); assertEquals( fromHexString( "c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b"), peer.getId()); assertEquals("172.20.0.4", peer.getEndpoint().getHost()); assertEquals(30303, peer.getEndpoint().getUdpPort()); assertEquals(30303, peer.getEndpoint().getTcpPort().getAsInt()); }
@Test public void createFromIpv6URI() { final Peer peer = DefaultPeer.fromURI( "enode://c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b@[2001:0DB8:85A3:0000::8A2E:370:7334]:30403"); assertEquals( fromHexString( "c7849b663d12a2b5bf05b1ebf5810364f4870d5f1053fbd7500d38bc54c705b453d7511ca8a4a86003d34d4c8ee0bbfcd387aa724f5b240b3ab4bbb994a1e09b"), peer.getId()); // We expect bracket unwrapping, zero group removal via double colon, and leading zeros // trimmed, and lowercase hex digits. assertEquals("2001:db8:85a3::8a2e:370:7334", peer.getEndpoint().getHost()); assertEquals(30403, peer.getEndpoint().getUdpPort()); assertEquals(30403, peer.getEndpoint().getTcpPort().getAsInt()); }