diff --git a/src/chain.h b/src/chain.h --- a/src/chain.h +++ b/src/chain.h @@ -130,11 +130,7 @@ nVersion = block.nVersion; hashMerkleRoot = block.hashMerkleRoot; nTime = block.nTime; - // Default to block time if nTimeReceived is never set, which - // in effect assumes that this block is honestly mined. - // Note that nTimeReceived isn't written to disk, so blocks read from - // disk will be assumed to be honestly mined. - nTimeReceived = block.nTime; + nTimeReceived = 0; nBits = block.nBits; nNonce = block.nNonce; } @@ -176,7 +172,12 @@ int64_t GetBlockTimeMax() const { return int64_t(nTimeMax); } - int64_t GetHeaderReceivedTime() const { return nTimeReceived; } + int64_t GetHeaderReceivedTime(bool guessUnknownTime = true) const { + if (guessUnknownTime && nTimeReceived == 0) { + return GetBlockTime(); + } + return nTimeReceived; + } int64_t GetReceivedTimeDiff() const { return GetHeaderReceivedTime() - GetBlockTime(); diff --git a/src/test/blockindex_tests.cpp b/src/test/blockindex_tests.cpp --- a/src/test/blockindex_tests.cpp +++ b/src/test/blockindex_tests.cpp @@ -117,8 +117,14 @@ CBlockIndex index = CBlockIndex(header); - // nTimeReceived defaults to block time - BOOST_CHECK(index.nTimeReceived == expectedBlockTime); + // nTimeReceived defaults to 0 + BOOST_CHECK_EQUAL(index.nTimeReceived, 0); + + // If guessUnkwnowTime is true/unset and nTimeReceived is 0, + // GetHeaderReceivedTime() returns nTime as an approximation + BOOST_CHECK_EQUAL(index.GetHeaderReceivedTime(), index.nTime); + // If guessUnkwnowTime is false it always returns nTimeReceived + BOOST_CHECK_EQUAL(index.GetHeaderReceivedTime(false), index.nTimeReceived); // nTimeReceived can be updated to the actual received time, which may // be before or after the miner's time. @@ -126,10 +132,10 @@ // Make sure that receivedTime is tested beyond 32-bit values. receivedTime <= expectedBlockTime + 10; receivedTime++) { index.nTimeReceived = receivedTime; - BOOST_CHECK(index.GetBlockTime() == expectedBlockTime); - BOOST_CHECK(index.GetHeaderReceivedTime() == receivedTime); - BOOST_CHECK(index.GetReceivedTimeDiff() == - receivedTime - expectedBlockTime); + BOOST_CHECK_EQUAL(index.GetBlockTime(), expectedBlockTime); + BOOST_CHECK_EQUAL(index.GetHeaderReceivedTime(), receivedTime); + BOOST_CHECK_EQUAL(index.GetReceivedTimeDiff(), + receivedTime - expectedBlockTime); } }