From 841230e35cf632615a6fef5e6b084108d9eb1ee3 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Wed, 16 Sep 2020 11:45:57 -0500 Subject: [PATCH] Handle the case where our block headers are synced already (#2021) --- .../chain/blockchain/ChainHandlerTest.scala | 14 ++++++++++++++ .../chain/blockchain/ChainHandler.scala | 19 ++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/chain-test/src/test/scala/org/bitcoins/chain/blockchain/ChainHandlerTest.scala b/chain-test/src/test/scala/org/bitcoins/chain/blockchain/ChainHandlerTest.scala index 35c2a41068..8eeedba96c 100644 --- a/chain-test/src/test/scala/org/bitcoins/chain/blockchain/ChainHandlerTest.scala +++ b/chain-test/src/test/scala/org/bitcoins/chain/blockchain/ChainHandlerTest.scala @@ -392,6 +392,20 @@ class ChainHandlerTest extends ChainDbUnitTest { } + it must "return None for ChainHandler.nextBlockHeaderBatchRange if we are synced" in { + chainHandler: ChainHandler => + val genesisHeader = + chainHandler.chainConfig.chain.genesisBlock.blockHeader + val assert1F = for { + rangeOpt <- + chainHandler.nextBlockHeaderBatchRange(genesisHeader.hashBE, 1) + count <- chainHandler.getBlockCount() + } yield { + assert(rangeOpt.isEmpty) + } + assert1F + } + it must "generate a range for a block filter header query" in { chainHandler: ChainHandler => for { diff --git a/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandler.scala b/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandler.scala index b67a10a90c..3669e7ec39 100644 --- a/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandler.scala +++ b/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandler.scala @@ -199,9 +199,22 @@ case class ChainHandler( for { chains <- chainsF - } yield getBestChainAtHeight(startHeight = startHeight, - batchSize = batchSize, - blockchains = chains) + } yield { + val nextBlockHeaderOpt = getBestChainAtHeight(startHeight = startHeight, + batchSize = batchSize, + blockchains = chains) + (nextBlockHeaderOpt, prevBlockHeaderOpt) match { + case (Some(next), Some(prev)) => + //this means we are synced, so return None + if (next.stopBlockHash == prev.hash) { + None + } else { + nextBlockHeaderOpt + } + case (Some(_), None) | (None, Some(_)) | (None, None) => + nextBlockHeaderOpt + } + } } /** Given a vector of blockchains, this method finds the chain with the most chain work