From fa815f8473c56df66302340c5961d18226a60e6f Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Tue, 30 Nov 2021 14:49:43 +0100 Subject: [PATCH 1/2] Replace addrman.h include with forward decl in net.h Also, add missing addrman.h includes --- src/net.cpp | 1 + src/net.h | 6 +++--- src/rpc/net.cpp | 1 + src/test/fuzz/connman.cpp | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index db496c21856..b112b8d2336 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include diff --git a/src/net.h b/src/net.h index dd5cc66a048..e9baa57a9b7 100644 --- a/src/net.h +++ b/src/net.h @@ -6,7 +6,6 @@ #ifndef BITCOIN_NET_H #define BITCOIN_NET_H -#include #include #include #include @@ -37,9 +36,10 @@ #include #include -class CScheduler; -class CNode; +class AddrMan; class BanMan; +class CNode; +class CScheduler; struct bilingual_str; /** Default for -whitelistrelay. */ diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index e33f1ce4a34..f4456bebc53 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -4,6 +4,7 @@ #include +#include #include #include #include diff --git a/src/test/fuzz/connman.cpp b/src/test/fuzz/connman.cpp index 9e4718e6032..fc5cd664dc3 100644 --- a/src/test/fuzz/connman.cpp +++ b/src/test/fuzz/connman.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include #include #include #include From fa551b3bdd380bcaa8fa929b378b3b6c81a6f65c Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Tue, 30 Nov 2021 16:03:55 +0100 Subject: [PATCH 2/2] Remove GetAdjustedTime from init.cpp --- src/init.cpp | 2 +- test/functional/p2p_invalid_block.py | 3 +-- test/functional/rpc_blockchain.py | 18 +++++++++++++++++- test/functional/test_framework/blocktools.py | 2 ++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index d5c3acbaad4..22c0d928b5a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1561,7 +1561,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const CBlockIndex* tip = chainstate->m_chain.Tip(); RPCNotifyBlockChange(tip); - if (tip && tip->nTime > GetAdjustedTime() + 2 * 60 * 60) { + if (tip && tip->nTime > GetTime() + MAX_FUTURE_BLOCK_TIME) { strLoadError = _("The block database contains a block which appears to be from the future. " "This may be due to your computer's date and time being set incorrectly. " "Only rebuild the block database if you are sure that your computer's date and time are correct"); diff --git a/test/functional/p2p_invalid_block.py b/test/functional/p2p_invalid_block.py index 0dfa25174bf..710f3d93e11 100755 --- a/test/functional/p2p_invalid_block.py +++ b/test/functional/p2p_invalid_block.py @@ -16,6 +16,7 @@ import copy import time from test_framework.blocktools import ( + MAX_FUTURE_BLOCK_TIME, create_block, create_coinbase, create_tx_with_script, @@ -26,8 +27,6 @@ from test_framework.script import OP_TRUE from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal -MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60 - class InvalidBlockRequestTest(BitcoinTestFramework): def set_test_params(self): diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py index 4be96163459..8f7d5114fad 100755 --- a/test/functional/rpc_blockchain.py +++ b/test/functional/rpc_blockchain.py @@ -26,9 +26,10 @@ import os import subprocess from test_framework.blocktools import ( + MAX_FUTURE_BLOCK_TIME, + TIME_GENESIS_BLOCK, create_block, create_coinbase, - TIME_GENESIS_BLOCK, ) from test_framework.messages import ( CBlockHeader, @@ -53,6 +54,7 @@ from test_framework.wallet import MiniWallet HEIGHT = 200 # blocks mined TIME_RANGE_STEP = 600 # ten-minute steps TIME_RANGE_MTP = TIME_GENESIS_BLOCK + (HEIGHT - 6) * TIME_RANGE_STEP +TIME_RANGE_TIP = TIME_GENESIS_BLOCK + (HEIGHT - 1) * TIME_RANGE_STEP TIME_RANGE_END = TIME_GENESIS_BLOCK + HEIGHT * TIME_RANGE_STEP @@ -65,6 +67,7 @@ class BlockchainTest(BitcoinTestFramework): def run_test(self): self.wallet = MiniWallet(self.nodes[0]) self.mine_chain() + self._test_max_future_block_time() self.restart_node(0, extra_args=['-stopatheight=207', '-prune=1']) # Set extra args with pruning after rescan is complete self._test_getblockchaininfo() @@ -85,6 +88,19 @@ class BlockchainTest(BitcoinTestFramework): self.generate(self.wallet, 1) assert_equal(self.nodes[0].getblockchaininfo()['blocks'], HEIGHT) + def _test_max_future_block_time(self): + self.stop_node(0) + self.log.info("A block tip of more than MAX_FUTURE_BLOCK_TIME in the future raises an error") + self.nodes[0].assert_start_raises_init_error( + extra_args=[f"-mocktime={TIME_RANGE_TIP - MAX_FUTURE_BLOCK_TIME - 1}"], + expected_msg=": The block database contains a block which appears to be from the future." + " This may be due to your computer's date and time being set incorrectly." + f" Only rebuild the block database if you are sure that your computer's date and time are correct.{os.linesep}" + "Please restart with -reindex or -reindex-chainstate to recover.", + ) + self.log.info("A block tip of MAX_FUTURE_BLOCK_TIME in the future is fine") + self.start_node(0, extra_args=[f"-mocktime={TIME_RANGE_TIP - MAX_FUTURE_BLOCK_TIME}"]) + def _test_getblockchaininfo(self): self.log.info("Test getblockchaininfo") diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py index eaa193e357e..caa9b869696 100644 --- a/test/functional/test_framework/blocktools.py +++ b/test/functional/test_framework/blocktools.py @@ -50,6 +50,8 @@ MAX_BLOCK_SIGOPS_WEIGHT = MAX_BLOCK_SIGOPS * WITNESS_SCALE_FACTOR # Genesis block time (regtest) TIME_GENESIS_BLOCK = 1296688602 +MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60 + # Coinbase transaction outputs can only be spent after this number of new blocks (network rule) COINBASE_MATURITY = 100