From a0104c03ec5ea239b9d1dfd004557fe144219801 Mon Sep 17 00:00:00 2001 From: sqrrm Date: Fri, 12 Jul 2019 00:37:00 +0200 Subject: [PATCH] Limit number of blocks sent in GetBlocksResponse --- .../dao/node/full/network/GetBlocksRequestHandler.java | 3 ++- .../bisq/core/dao/node/messages/GetBlocksResponse.java | 10 +++++++--- .../main/java/bisq/core/dao/state/DaoStateService.java | 6 +++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java b/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java index e741afabcca..1cab318a2bd 100644 --- a/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java +++ b/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java @@ -89,7 +89,8 @@ public GetBlocksRequestHandler(NetworkNode networkNode, DaoStateService daoState /////////////////////////////////////////////////////////////////////////////////////////// public void onGetBlocksRequest(GetBlocksRequest getBlocksRequest, final Connection connection) { - List blocks = new LinkedList<>(daoStateService.getBlocksFromBlockHeight(getBlocksRequest.getFromBlockHeight())); + // We limit number of blocks to 6000 which is about 1.5 month. + List blocks = new LinkedList<>(daoStateService.getBlocksFromBlockHeight(getBlocksRequest.getFromBlockHeight(), 6000)); List rawBlocks = blocks.stream().map(RawBlock::fromBlock).collect(Collectors.toList()); GetBlocksResponse getBlocksResponse = new GetBlocksResponse(rawBlocks, getBlocksRequest.getNonce()); log.info("Received GetBlocksRequest from {} for blocks from height {}", diff --git a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java index 74d1923f155..12454a2bdaa 100644 --- a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java +++ b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java @@ -33,9 +33,11 @@ import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; @EqualsAndHashCode(callSuper = true) @Getter +@Slf4j public final class GetBlocksResponse extends NetworkEnvelope implements DirectMessage, ExtendedDataSizePermission { private final List blocks; private final int requestNonce; @@ -67,11 +69,13 @@ public PB.NetworkEnvelope toProtoNetworkEnvelope() { } public static NetworkEnvelope fromProto(PB.GetBlocksResponse proto, int messageVersion) { + List list = proto.getRawBlocksList().stream() + .map(RawBlock::fromProto) + .collect(Collectors.toList()); + log.info("Received a GetBlocksResponse with {} blocks and {} kB size", list.size(), proto.getSerializedSize() / 1000d); return new GetBlocksResponse(proto.getRawBlocksList().isEmpty() ? new ArrayList<>() : - proto.getRawBlocksList().stream() - .map(RawBlock::fromProto) - .collect(Collectors.toList()), + list, proto.getRequestNonce(), messageVersion); } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index 05c6f3d9018..96559828f19 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -306,9 +306,13 @@ public long getBlockTime(int height) { return getBlockAtHeight(height).map(Block::getTime).orElse(0L); } - public List getBlocksFromBlockHeight(int fromBlockHeight) { + public List getBlocksFromBlockHeight(int fromBlockHeight, int numMaxBlocks) { + // We limit requests to numMaxBlocks blocks, to avoid performance issues and too + // large network data in case a node requests too far back in history. return getBlocks().stream() .filter(block -> block.getHeight() >= fromBlockHeight) + .sorted(Comparator.comparing(Block::getHeight)) + .limit(numMaxBlocks) .collect(Collectors.toList()); }