From 3a7da9f13bfd0279474806c0f2e2ab46dc13c1a6 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 15 Dec 2021 16:33:08 +0000 Subject: [PATCH] Don't return online accounts signatures from GET /blocks/byheight/{height} unless requested using the includesignatures=true query string parameter. This should fix issue where it would take up to 30 seconds to return for a recent block, and would consume masses of CPU due to having to base58 encode the online accounts signatures. Base58 is very slow and made this API endpoint almost unusable for recent blocks, due to them having untrimmed online accounts signatures. --- .../java/org/qortal/api/resource/BlocksResource.java | 9 ++++++++- src/main/java/org/qortal/data/block/BlockData.java | 4 ++++ src/test/java/org/qortal/test/api/BlockApiTests.java | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/BlocksResource.java b/src/main/java/org/qortal/api/resource/BlocksResource.java index b8163c7d..1ba5ab3c 100644 --- a/src/main/java/org/qortal/api/resource/BlocksResource.java +++ b/src/main/java/org/qortal/api/resource/BlocksResource.java @@ -423,17 +423,24 @@ public class BlocksResource { @ApiErrors({ ApiError.BLOCK_UNKNOWN, ApiError.REPOSITORY_ISSUE }) - public BlockData getByHeight(@PathParam("height") int height) { + public BlockData getByHeight(@PathParam("height") int height, + @QueryParam("includesignatures") Boolean includeSignatures) { try (final Repository repository = RepositoryManager.getRepository()) { // Firstly check the database BlockData blockData = repository.getBlockRepository().fromHeight(height); if (blockData != null) { + if (includeSignatures == null || includeSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } // Not found, so try the archive blockData = repository.getBlockArchiveRepository().fromHeight(height); if (blockData != null) { + if (includeSignatures == null || includeSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } diff --git a/src/main/java/org/qortal/data/block/BlockData.java b/src/main/java/org/qortal/data/block/BlockData.java index 3567d0f8..481d3691 100644 --- a/src/main/java/org/qortal/data/block/BlockData.java +++ b/src/main/java/org/qortal/data/block/BlockData.java @@ -204,6 +204,10 @@ public class BlockData implements Serializable { return this.onlineAccountsSignatures; } + public void setOnlineAccountsSignatures(byte[] onlineAccountsSignatures) { + this.onlineAccountsSignatures = onlineAccountsSignatures; + } + // JAXB special @XmlElement(name = "minterAddress") diff --git a/src/test/java/org/qortal/test/api/BlockApiTests.java b/src/test/java/org/qortal/test/api/BlockApiTests.java index 5b8721af..79d87a1d 100644 --- a/src/test/java/org/qortal/test/api/BlockApiTests.java +++ b/src/test/java/org/qortal/test/api/BlockApiTests.java @@ -72,7 +72,7 @@ public class BlockApiTests extends ApiCommon { @Test public void testGetBlockByHeight() { - assertNotNull(this.blocksResource.getByHeight(1)); + assertNotNull(this.blocksResource.getByHeight(1, true)); } @Test