diff --git a/qa/rpc-tests/abc-cmdline.py b/qa/rpc-tests/abc-cmdline.py --- a/qa/rpc-tests/abc-cmdline.py +++ b/qa/rpc-tests/abc-cmdline.py @@ -56,18 +56,17 @@ self.check_subversion("/Bitcoin ABC:.*\(EB2\.0\)/") print(" Attempt to set below legacy limit of 1MB - try %d bytes" % - (LEGACY_MAX_BLOCK_SIZE - 1)) + LEGACY_MAX_BLOCK_SIZE) outputchecker = OutputChecker() stop_node(self.nodes[0], 0) try: - self.extra_args = [["-excessiveblocksize=%d" % - (LEGACY_MAX_BLOCK_SIZE - 1)]] + self.extra_args = [["-excessiveblocksize=%d" % LEGACY_MAX_BLOCK_SIZE]] self.nodes[0] = start_node(0, self.options.tmpdir, self.extra_args[0], stderr_checker=outputchecker) except Exception as e: assert(outputchecker.contains( - 'Error: Excessive block size must be >= 1,000,000 bytes (1MB)')) + 'Error: Excessive block size must be > 1,000,000 bytes (1MB)')) assert_equal('bitcoind exited with status 1 during initialization', str(e)) else: raise AssertionError("Must not accept excessiveblocksize" @@ -83,13 +82,14 @@ stderr_checker=outputchecker) except Exception as e: assert(outputchecker.contains( - 'Error: Max generated block size (blockmaxsize) cannot ' - 'exceed the excessive block size (excessiveblocksize)')) + 'Error: Max generated block size (blockmaxsize) cannot be ' + 'lower than 1MB or exceed the excessive block size (excessiveblocksize)')) assert_equal('bitcoind exited with status 1 during initialization', str(e)) else: raise AssertionError('Must not accept excessiveblocksize' ' below blockmaxsize') + def run_test(self): # Run tests on -excessiveblocksize option diff --git a/qa/rpc-tests/abc-rpc.py b/qa/rpc-tests/abc-rpc.py --- a/qa/rpc-tests/abc-rpc.py +++ b/qa/rpc-tests/abc-rpc.py @@ -38,22 +38,22 @@ assert_equal(ebs, DEFAULT_MAX_BLOCK_SIZE) # Check that setting to legacy size is ok - self.nodes[0].setexcessiveblock(LEGACY_MAX_BLOCK_SIZE) + self.nodes[0].setexcessiveblock(LEGACY_MAX_BLOCK_SIZE + 1) getsize = self.nodes[0].getexcessiveblock() ebs = getsize['excessiveBlockSize'] - assert_equal(ebs, LEGACY_MAX_BLOCK_SIZE) + assert_equal(ebs, LEGACY_MAX_BLOCK_SIZE + 1) # Check that going below legacy size is not accepted try: - self.nodes[0].setexcessiveblock(LEGACY_MAX_BLOCK_SIZE - 1) + self.nodes[0].setexcessiveblock(LEGACY_MAX_BLOCK_SIZE) except JSONRPCException as e: assert("Invalid parameter, excessiveblock must be larger than %d" % LEGACY_MAX_BLOCK_SIZE in e.error['message']) else: - raise AssertionError("Must not accept excessiveblock values < %d bytes" % LEGACY_MAX_BLOCK_SIZE) + raise AssertionError("Must not accept excessiveblock values <= %d bytes" % LEGACY_MAX_BLOCK_SIZE) getsize = self.nodes[0].getexcessiveblock() ebs = getsize['excessiveBlockSize'] - assert_equal(ebs, LEGACY_MAX_BLOCK_SIZE) + assert_equal(ebs, LEGACY_MAX_BLOCK_SIZE + 1) # Check setting to 2MB self.nodes[0].setexcessiveblock(2 * ONE_MEGABYTE) diff --git a/qa/rpc-tests/p2p-fullblocktest.py b/qa/rpc-tests/p2p-fullblocktest.py --- a/qa/rpc-tests/p2p-fullblocktest.py +++ b/qa/rpc-tests/p2p-fullblocktest.py @@ -74,8 +74,6 @@ self.test.add_all_connections(self.nodes) # Start up network handling in another thread NetworkThread().start() - # Set the blocksize to legacy cap (1MB) as initial condition - self.nodes[0].setexcessiveblock(LEGACY_MAX_BLOCK_SIZE) self.test.run() def add_transactions_to_block(self, block, tx_list): diff --git a/src/config.cpp b/src/config.cpp --- a/src/config.cpp +++ b/src/config.cpp @@ -9,7 +9,8 @@ bool GlobalConfig::SetMaxBlockSize(uint64_t maxBlockSize) { // Do not allow maxBlockSize to be set below historic 1MB limit - if (maxBlockSize < LEGACY_MAX_BLOCK_SIZE) { + // It cannot be equal either because of the "must be big" UAHF rule. + if (maxBlockSize <= LEGACY_MAX_BLOCK_SIZE) { return false; } diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -751,7 +751,7 @@ HelpMessageOpt("-excessiveblocksize=", strprintf(_("Do not accept blocks larger than this " "limit, in bytes (default: %d)"), - DEFAULT_MAX_BLOCK_SIZE)); + LEGACY_MAX_BLOCK_SIZE)); strUsage += HelpMessageOpt( "-incrementalrelayfee=", strprintf( @@ -1386,25 +1386,21 @@ // Configure excessive block size. const uint64_t nProposedExcessiveBlockSize = GetArg("-excessiveblocksize", DEFAULT_MAX_BLOCK_SIZE); - if (nProposedExcessiveBlockSize < ONE_MEGABYTE) { + if (!config.SetMaxBlockSize(nProposedExcessiveBlockSize)) { return InitError( - _("Excessive block size must be >= 1,000,000 bytes (1MB)")); - } else { - if (!config.SetMaxBlockSize(nProposedExcessiveBlockSize)) { - return InitError(strprintf( - _("Unable to validate excessive block size value (%d)"), - nProposedExcessiveBlockSize)); - } - assert(nProposedExcessiveBlockSize == config.GetMaxBlockSize()); + _("Excessive block size must be > 1,000,000 bytes (1MB)")); } // Check blockmaxsize does not exceed maximum accepted block size. + // Also checks that it isn't smaller than 1MB, as to make sure we can + // satisfy the "must be big" UAHF rule. const uint64_t nProposedMaxGeneratedBlockSize = GetArg("-blockmaxsize", DEFAULT_MAX_GENERATED_BLOCK_SIZE); - if (nProposedMaxGeneratedBlockSize > config.GetMaxBlockSize()) { + if (nProposedMaxGeneratedBlockSize <= LEGACY_MAX_BLOCK_SIZE || + nProposedMaxGeneratedBlockSize > config.GetMaxBlockSize()) { return InitError( - _("Max generated block size (blockmaxsize) cannot exceed the " - "excessive block size (excessiveblocksize)")); + _("Max generated block size (blockmaxsize) cannot be lower than " + "1MB or exceed the excessive block size (excessiveblocksize)")); } const int64_t nProposedUAHFStartTime = diff --git a/src/rpc/abc.cpp b/src/rpc/abc.cpp --- a/src/rpc/abc.cpp +++ b/src/rpc/abc.cpp @@ -54,7 +54,7 @@ } // Do not allow maxBlockSize to be set below historic 1MB limit - if (ebs < LEGACY_MAX_BLOCK_SIZE) + if (ebs <= LEGACY_MAX_BLOCK_SIZE) throw JSONRPCError( RPC_INVALID_PARAMETER, std::string( diff --git a/src/test/config_tests.cpp b/src/test/config_tests.cpp --- a/src/test/config_tests.cpp +++ b/src/test/config_tests.cpp @@ -18,10 +18,11 @@ BOOST_CHECK(!config.SetMaxBlockSize(0)); BOOST_CHECK(!config.SetMaxBlockSize(12345)); BOOST_CHECK(!config.SetMaxBlockSize(LEGACY_MAX_BLOCK_SIZE - 1)); + BOOST_CHECK(!config.SetMaxBlockSize(LEGACY_MAX_BLOCK_SIZE)); - // LEGACY_MAX_BLOCK_SIZE - BOOST_CHECK(config.SetMaxBlockSize(LEGACY_MAX_BLOCK_SIZE)); - BOOST_CHECK_EQUAL(config.GetMaxBlockSize(), LEGACY_MAX_BLOCK_SIZE); + // LEGACY_MAX_BLOCK_SIZE + 1 + BOOST_CHECK(config.SetMaxBlockSize(LEGACY_MAX_BLOCK_SIZE + 1)); + BOOST_CHECK_EQUAL(config.GetMaxBlockSize(), LEGACY_MAX_BLOCK_SIZE + 1); // 2MB BOOST_CHECK(config.SetMaxBlockSize(2 * ONE_MEGABYTE)); @@ -38,8 +39,8 @@ // Setting it back down BOOST_CHECK(config.SetMaxBlockSize(7 * ONE_MEGABYTE)); BOOST_CHECK_EQUAL(config.GetMaxBlockSize(), 7 * ONE_MEGABYTE); - BOOST_CHECK(config.SetMaxBlockSize(ONE_MEGABYTE)); - BOOST_CHECK_EQUAL(config.GetMaxBlockSize(), ONE_MEGABYTE); + BOOST_CHECK(config.SetMaxBlockSize(ONE_MEGABYTE + 1)); + BOOST_CHECK_EQUAL(config.GetMaxBlockSize(), ONE_MEGABYTE + 1); } BOOST_AUTO_TEST_CASE(chain_params) { diff --git a/src/test/excessiveblock_tests.cpp b/src/test/excessiveblock_tests.cpp --- a/src/test/excessiveblock_tests.cpp +++ b/src/test/excessiveblock_tests.cpp @@ -34,11 +34,14 @@ BOOST_CHECK_THROW(CallRPC(std::string("setexcessiveblock ") + std::to_string(ONE_MEGABYTE - 1)), std::runtime_error); + BOOST_CHECK_THROW(CallRPC(std::string("setexcessiveblock ") + + std::to_string(ONE_MEGABYTE)), + std::runtime_error); BOOST_CHECK_NO_THROW(CallRPC(std::string("setexcessiveblock ") + - std::to_string(ONE_MEGABYTE))); - BOOST_CHECK_NO_THROW(CallRPC(std::string("setexcessiveblock ") + std::to_string(ONE_MEGABYTE + 1))); + BOOST_CHECK_NO_THROW(CallRPC(std::string("setexcessiveblock ") + + std::to_string(ONE_MEGABYTE + 10))); // Default can be higher than 1MB in future - test it too BOOST_CHECK_NO_THROW(CallRPC(std::string("setexcessiveblock ") + diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -731,8 +731,8 @@ BOOST_CHECK(IsUAHFenabledForCurrentBlock(config)); - // Test around historical 1MB - config.SetMaxBlockSize(ONE_MEGABYTE); + // Test around historical 1MB (plus one byte because that's mandatory) + config.SetMaxBlockSize(ONE_MEGABYTE + 1); CheckBlockMaxSize(chainparams, 0, 1000); CheckBlockMaxSize(chainparams, 1000, 1000); CheckBlockMaxSize(chainparams, 1001, 1001); @@ -740,8 +740,8 @@ CheckBlockMaxSize(chainparams, ONE_MEGABYTE - 1001, ONE_MEGABYTE - 1001); CheckBlockMaxSize(chainparams, ONE_MEGABYTE - 1000, ONE_MEGABYTE - 1000); - CheckBlockMaxSize(chainparams, ONE_MEGABYTE - 999, ONE_MEGABYTE - 1000); - CheckBlockMaxSize(chainparams, ONE_MEGABYTE, ONE_MEGABYTE - 1000); + CheckBlockMaxSize(chainparams, ONE_MEGABYTE - 999, ONE_MEGABYTE - 999); + CheckBlockMaxSize(chainparams, ONE_MEGABYTE, ONE_MEGABYTE - 999); // Test around higher limit such as 8MB config.SetMaxBlockSize(EIGHT_MEGABYTES);