From 2835158be0410fe82a56752d9ffe60e2a77dc0cd Mon Sep 17 00:00:00 2001 From: fanquake Date: Mon, 9 Dec 2024 17:01:10 +0000 Subject: [PATCH 01/10] fuzz: add cstdlib to FuzzedDataProvider Same as https://github.com/llvm/llvm-project/pull/113951. Avoids compile failures under clang-20 & `D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES`: ```bash In file included from /bitcoin/src/test/fuzz/addition_overflow.cpp:5: /bitcoin/src/test/fuzz/FuzzedDataProvider.h:209:5: error: use of undeclared identifier 'abort' 209 | abort(); | ^ /bitcoin/src/test/fuzz/FuzzedDataProvider.h:250:5: error: use of undeclared identifier 'abort' 250 | abort(); ``` Github-Pull: bitcoin/bitcoin#31448 Rebased-From: bb7e686341e437b2e7aae887827710918c00ae0f --- src/test/fuzz/FuzzedDataProvider.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/fuzz/FuzzedDataProvider.h b/src/test/fuzz/FuzzedDataProvider.h index 5903ed8379..e57b95b630 100644 --- a/src/test/fuzz/FuzzedDataProvider.h +++ b/src/test/fuzz/FuzzedDataProvider.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include From b8112cf4226265a5b43e2b556ce9fa97caf3c28a Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Thu, 5 Dec 2024 16:55:36 +0100 Subject: [PATCH 02/10] util: use explicit cast in MultiIntBitSet::Fill() The current code does not have a bug, but is implicitly casting -1 to 65535 and the sanitizer has no way to know whether we intend that or not. ``` FUZZ=bitset src/test/fuzz/fuzz /tmp/fuz error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'value_type' (aka 'unsigned short') changed the value to 65535 (16-bit, unsigned) Base64: Qv7bX/8= ``` Github-Pull: bitcoin/bitcoin#31431 Rebased-From: edb41e4814ccc2c06a5694b2d2632dbbd22bc0cf --- src/util/bitset.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/bitset.h b/src/util/bitset.h index 6f9e808c37..17ebc709eb 100644 --- a/src/util/bitset.h +++ b/src/util/bitset.h @@ -366,7 +366,7 @@ public: if (count) { unsigned i = 0; while (count > LIMB_BITS) { - ret.m_val[i++] = ~I{0}; + ret.m_val[i++] = I(~I{0}); count -= LIMB_BITS; } ret.m_val[i] = I(~I{0}) >> (LIMB_BITS - count); From 227642d5afeb9918269192500d1a41bcb64b51c5 Mon Sep 17 00:00:00 2001 From: 0xb10c Date: Wed, 4 Dec 2024 15:51:17 +0100 Subject: [PATCH 03/10] test: fix MIN macro-redefinition Renames the `MIN` macro to `_TRACEPOINT_TEST_MIN`. From #31418: ``` stderr: /virtual/main.c:70:9: warning: 'MIN' macro redefined [-Wmacro-redefined] 70 | #define MIN(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) | ^ include/linux/minmax.h:329:9: note: previous definition is here 329 | #define MIN(a,b) __cmp(min,a,b) | ^ 1 warning generated. ``` fixes: https://github.com/bitcoin/bitcoin/issues/31418 Github-Pull: bitcoin/bitcoin#31419 Rebased-From: 00c1dbd26ddb816e5541c5724397015a92a3d06b --- test/functional/interface_usdt_net.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/functional/interface_usdt_net.py b/test/functional/interface_usdt_net.py index 7b55259b63..5468ddf858 100755 --- a/test/functional/interface_usdt_net.py +++ b/test/functional/interface_usdt_net.py @@ -40,7 +40,8 @@ net_tracepoints_program = """ MAX_MSG_TYPE_LENGTH, MAX_MSG_DATA_LENGTH ) + """ -#define MIN(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) +// A min() macro. Prefixed with _TRACEPOINT_TEST to avoid collision with other MIN macros. +#define _TRACEPOINT_TEST_MIN(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) struct p2p_message { @@ -60,7 +61,7 @@ int trace_inbound_message(struct pt_regs *ctx) { bpf_usdt_readarg_p(3, ctx, &msg.peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); bpf_usdt_readarg_p(4, ctx, &msg.msg_type, MAX_MSG_TYPE_LENGTH); bpf_usdt_readarg(5, ctx, &msg.msg_size); - bpf_usdt_readarg_p(6, ctx, &msg.msg, MIN(msg.msg_size, MAX_MSG_DATA_LENGTH)); + bpf_usdt_readarg_p(6, ctx, &msg.msg, _TRACEPOINT_TEST_MIN(msg.msg_size, MAX_MSG_DATA_LENGTH)); inbound_messages.perf_submit(ctx, &msg, sizeof(msg)); return 0; } @@ -73,7 +74,7 @@ int trace_outbound_message(struct pt_regs *ctx) { bpf_usdt_readarg_p(3, ctx, &msg.peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); bpf_usdt_readarg_p(4, ctx, &msg.msg_type, MAX_MSG_TYPE_LENGTH); bpf_usdt_readarg(5, ctx, &msg.msg_size); - bpf_usdt_readarg_p(6, ctx, &msg.msg, MIN(msg.msg_size, MAX_MSG_DATA_LENGTH)); + bpf_usdt_readarg_p(6, ctx, &msg.msg, _TRACEPOINT_TEST_MIN(msg.msg_size, MAX_MSG_DATA_LENGTH)); outbound_messages.perf_submit(ctx, &msg, sizeof(msg)); return 0; }; From bbde830b97000b8bbfbaefc54504f659a34f651c Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Mon, 4 Nov 2024 18:24:45 -0500 Subject: [PATCH 04/10] net, init: derive default onion port if a user specified a -port After port collisions are no longer tolerated but lead to a startup failure in v28.0, local setups of multiple nodes, each with a different -port value would not be possible anymore due to collision of the onion default port - even if the nodes were using tor or not interested in receiving onion inbound connections. Fix this by deriving the onion listening port to be -port + 1. (idea by vasild / laanwj) Co-authored-by: Vasil Dimov Github-Pull: bitcoin/bitcoin#31223 Rebased-From: 0e2b12b92a28a2949e75bf50f31563f52e647d6e --- src/chainparamsbase.cpp | 10 +++++----- src/chainparamsbase.h | 6 ++---- src/init.cpp | 10 ++++++---- src/torcontrol.cpp | 4 ++-- src/torcontrol.h | 2 +- test/functional/test_framework/test_node.py | 5 ++--- 6 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index aadd04e509..060d519d92 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -41,15 +41,15 @@ std::unique_ptr CreateBaseChainParams(const ChainType chain) { switch (chain) { case ChainType::MAIN: - return std::make_unique("", 8332, 8334); + return std::make_unique("", 8332); case ChainType::TESTNET: - return std::make_unique("testnet3", 18332, 18334); + return std::make_unique("testnet3", 18332); case ChainType::TESTNET4: - return std::make_unique("testnet4", 48332, 48334); + return std::make_unique("testnet4", 48332); case ChainType::SIGNET: - return std::make_unique("signet", 38332, 38334); + return std::make_unique("signet", 38332); case ChainType::REGTEST: - return std::make_unique("regtest", 18443, 18445); + return std::make_unique("regtest", 18443); } assert(false); } diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index c75a70cb96..adbd6a5174 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -22,15 +22,13 @@ class CBaseChainParams public: const std::string& DataDir() const { return strDataDir; } uint16_t RPCPort() const { return m_rpc_port; } - uint16_t OnionServiceTargetPort() const { return m_onion_service_target_port; } CBaseChainParams() = delete; - CBaseChainParams(const std::string& data_dir, uint16_t rpc_port, uint16_t onion_service_target_port) - : m_rpc_port(rpc_port), m_onion_service_target_port(onion_service_target_port), strDataDir(data_dir) {} + CBaseChainParams(const std::string& data_dir, uint16_t rpc_port) + : m_rpc_port(rpc_port), strDataDir(data_dir) {} private: const uint16_t m_rpc_port; - const uint16_t m_onion_service_target_port; std::string strDataDir; }; diff --git a/src/init.cpp b/src/init.cpp index 2572f9d78c..541b75ce95 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -524,7 +524,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-addnode=", strprintf("Add a node to connect to and attempt to keep the connection open (see the addnode RPC help for more info). This option can be specified multiple times to add multiple nodes; connections are limited to %u at a time and are counted separately from the -maxconnections limit.", MAX_ADDNODE_CONNECTIONS), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-asmap=", strprintf("Specify asn mapping used for bucketing of the peers (default: %s). Relative paths will be prefixed by the net-specific datadir location.", DEFAULT_ASMAP_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-bantime=", strprintf("Default duration (in seconds) of manually configured bans (default: %u)", DEFAULT_MISBEHAVING_BANTIME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-bind=[:][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultBaseParams->OnionServiceTargetPort(), testnetBaseParams->OnionServiceTargetPort(), testnet4BaseParams->OnionServiceTargetPort(), signetBaseParams->OnionServiceTargetPort(), regtestBaseParams->OnionServiceTargetPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); + argsman.AddArg("-bind=[:][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultChainParams->GetDefaultPort() + 1, testnetChainParams->GetDefaultPort() + 1, testnet4ChainParams->GetDefaultPort() + 1, signetChainParams->GetDefaultPort() + 1, regtestChainParams->GetDefaultPort() + 1), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-cjdnsreachable", "If set, then this host is configured for CJDNS (connecting to fc00::/8 addresses would lead us to the CJDNS network, see doc/cjdns.md) (default: 0)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-connect=", "Connect only to the specified node; -noconnect disables automatic connections (the rules for this peer are the same as for -addnode). This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-discover", "Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); @@ -551,7 +551,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-peerbloomfilters", strprintf("Support filtering of blocks and transaction with bloom filters (default: %u)", DEFAULT_PEERBLOOMFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-peerblockfilters", strprintf("Serve compact block filters to peers per BIP 157 (default: %u)", DEFAULT_PEERBLOCKFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-txreconciliation", strprintf("Enable transaction reconciliations per BIP 330 (default: %d)", DEFAULT_TXRECONCILIATION_ENABLE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION); - argsman.AddArg("-port=", strprintf("Listen for connections on (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); + argsman.AddArg("-port=", strprintf("Listen for connections on (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md). If set to a value x, the default onion listening port will be set to x+1.", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); #ifdef HAVE_SOCKADDR_UN argsman.AddArg("-proxy=", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled). May be a local file path prefixed with 'unix:' if the proxy supports it.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION); #else @@ -1852,6 +1852,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const uint16_t default_bind_port = static_cast(args.GetIntArg("-port", Params().GetDefaultPort())); + const uint16_t default_bind_port_onion = default_bind_port + 1; + const auto BadPortWarning = [](const char* prefix, uint16_t port) { return strprintf(_("%s request to listen on port %u. This port is considered \"bad\" and " "thus it is unlikely that any peer will connect to it. See " @@ -1876,7 +1878,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const std::string network_type = bind_arg.substr(index + 1); if (network_type == "onion") { const std::string truncated_bind_arg = bind_arg.substr(0, index); - bind_addr = Lookup(truncated_bind_arg, BaseParams().OnionServiceTargetPort(), false); + bind_addr = Lookup(truncated_bind_arg, default_bind_port_onion, false); if (bind_addr.has_value()) { connOptions.onion_binds.push_back(bind_addr.value()); continue; @@ -1912,7 +1914,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } else if (!connOptions.vBinds.empty()) { onion_service_target = connOptions.vBinds.front(); } else { - onion_service_target = DefaultOnionServiceTarget(); + onion_service_target = DefaultOnionServiceTarget(default_bind_port_onion); connOptions.onion_binds.push_back(onion_service_target); } diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 4f79644c8d..42ba51e9c0 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -711,9 +711,9 @@ void StopTorControl() } } -CService DefaultOnionServiceTarget() +CService DefaultOnionServiceTarget(uint16_t port) { struct in_addr onion_service_target; onion_service_target.s_addr = htonl(INADDR_LOOPBACK); - return {onion_service_target, BaseParams().OnionServiceTargetPort()}; + return {onion_service_target, port}; } diff --git a/src/torcontrol.h b/src/torcontrol.h index 4a0eef223e..0b66201cf1 100644 --- a/src/torcontrol.h +++ b/src/torcontrol.h @@ -27,7 +27,7 @@ void StartTorControl(CService onion_service_target); void InterruptTorControl(); void StopTorControl(); -CService DefaultOnionServiceTarget(); +CService DefaultOnionServiceTarget(uint16_t port); /** Reply from Tor, can be single or multi-line */ class TorControlReply diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index 60ca9269a5..32a266586a 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -220,10 +220,9 @@ class TestNode(): extra_args = self.extra_args # If listening and no -bind is given, then bitcoind would bind P2P ports on - # 0.0.0.0:P and 127.0.0.1:18445 (for incoming Tor connections), where P is + # 0.0.0.0:P and 127.0.0.1:P+1 (for incoming Tor connections), where P is # a unique port chosen by the test framework and configured as port=P in - # bitcoin.conf. To avoid collisions on 127.0.0.1:18445, change it to - # 127.0.0.1:tor_port(). + # bitcoin.conf. To avoid collisions, change it to 127.0.0.1:tor_port(). will_listen = all(e != "-nolisten" and e != "-listen=0" for e in extra_args) has_explicit_bind = self.has_explicit_bind or any(e.startswith("-bind=") for e in extra_args) if will_listen and not has_explicit_bind: From a0585b6087ac2f3e54efa50795cba83caeac5ab0 Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Fri, 15 Nov 2024 16:05:12 -0500 Subject: [PATCH 05/10] test: add functional test for -port behavior Github-Pull: bitcoin/bitcoin#31223 Rebased-From: 997757dd2b4d7b20b17299fbd21970b2efb8bbc8 --- test/functional/feature_port.py | 60 +++++++++++++++++++++++++++++++++ test/functional/test_runner.py | 1 + 2 files changed, 61 insertions(+) create mode 100755 test/functional/feature_port.py diff --git a/test/functional/feature_port.py b/test/functional/feature_port.py new file mode 100755 index 0000000000..2746d7d79c --- /dev/null +++ b/test/functional/feature_port.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +# Copyright (c) 2024-present The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +""" +Test the -port option and its interactions with +-bind. +""" + +from test_framework.test_framework import ( + BitcoinTestFramework, +) +from test_framework.util import ( + p2p_port, +) + + +class PortTest(BitcoinTestFramework): + def set_test_params(self): + self.setup_clean_chain = True + # Avoid any -bind= on the command line. + self.bind_to_localhost_only = False + self.num_nodes = 1 + + def run_test(self): + node = self.nodes[0] + node.has_explicit_bind = True + port1 = p2p_port(self.num_nodes) + port2 = p2p_port(self.num_nodes + 5) + + self.log.info("When starting with -port, bitcoind binds to it and uses port + 1 for an onion bind") + with node.assert_debug_log(expected_msgs=[f'Bound to 0.0.0.0:{port1}', f'Bound to 127.0.0.1:{port1 + 1}']): + self.restart_node(0, extra_args=["-listen", f"-port={port1}"]) + + self.log.info("When specifying -port multiple times, only the last one is taken") + with node.assert_debug_log(expected_msgs=[f'Bound to 0.0.0.0:{port2}', f'Bound to 127.0.0.1:{port2 + 1}'], unexpected_msgs=[f'Bound to 0.0.0.0:{port1}']): + self.restart_node(0, extra_args=["-listen", f"-port={port1}", f"-port={port2}"]) + + self.log.info("When specifying ports with both -port and -bind, the one from -port is ignored") + with node.assert_debug_log(expected_msgs=[f'Bound to 0.0.0.0:{port2}'], unexpected_msgs=[f'Bound to 0.0.0.0:{port1}']): + self.restart_node(0, extra_args=["-listen", f"-port={port1}", f"-bind=0.0.0.0:{port2}"]) + + self.log.info("When -bind specifies no port, the values from -port and -bind are combined") + with self.nodes[0].assert_debug_log(expected_msgs=[f'Bound to 0.0.0.0:{port1}']): + self.restart_node(0, extra_args=["-listen", f"-port={port1}", "-bind=0.0.0.0"]) + + self.log.info("When an onion bind specifies no port, the value from -port, incremented by 1, is taken") + with self.nodes[0].assert_debug_log(expected_msgs=[f'Bound to 127.0.0.1:{port1 + 1}']): + self.restart_node(0, extra_args=["-listen", f"-port={port1}", "-bind=127.0.0.1=onion"]) + + self.log.info("Invalid values for -port raise errors") + self.stop_node(0) + node.extra_args = ["-listen", "-port=65536"] + node.assert_start_raises_init_error(expected_msg="Error: Invalid port specified in -port: '65536'") + node.extra_args = ["-listen", "-port=0"] + node.assert_start_raises_init_error(expected_msg="Error: Invalid port specified in -port: '0'") + + +if __name__ == '__main__': + PortTest(__file__).main() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index b85bf1c668..842328e2cf 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -335,6 +335,7 @@ BASE_SCRIPTS = [ 'feature_minchainwork.py', 'rpc_estimatefee.py', 'rpc_getblockstats.py', + 'feature_port.py', 'feature_bind_port_externalip.py', 'wallet_create_tx.py --legacy-wallet', 'wallet_send.py --legacy-wallet', From bdc6b3e531a107c52d73f72ddf788114381e241c Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Tue, 5 Nov 2024 13:04:20 -0500 Subject: [PATCH 06/10] Add release note for #31223 Co-authored-by: Vasil Dimov Github-Pull: bitcoin/bitcoin#31223 Rebased-From: 1dd3af8fbc350c6f1efa8ae6449e67e1b42ccff4 --- doc/release-notes-31223.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 doc/release-notes-31223.md diff --git a/doc/release-notes-31223.md b/doc/release-notes-31223.md new file mode 100644 index 0000000000..44f0552fd9 --- /dev/null +++ b/doc/release-notes-31223.md @@ -0,0 +1,15 @@ +P2P and network changes +----------------------- +When the `-port` configuration option is used, the default onion listening port will now +be derived to be that port + 1 instead of being set to a fixed value (8334 on mainnet). +This re-allows setups with multiple local nodes using different `-port` and not using `-bind`, +which would lead to a startup failure in v28.0 due to a port collision. + +Note that a `HiddenServicePort` manually configured in `torrc` may need adjustment if used in +connection with the `-port` option. +For example, if you are using `-port=5555` with a non-standard value and not using `-bind=...=onion`, +previously Bitcoin Core would listen for incoming Tor connections on `127.0.0.1:8334`. +Now it would listen on `127.0.0.1:5556` (`-port` plus one). If you configured the hidden service manually +in torrc now you have to change it from `HiddenServicePort 8333 127.0.0.1:8334` to `HiddenServicePort 8333 +127.0.0.1:5556`, or configure bitcoind with `-bind=127.0.0.1:8334=onion` to get the previous behavior. +(#31223) From e0b27b234cb31f53ddd51a923d8f5d0a30f92375 Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Fri, 13 Dec 2024 21:16:24 -0500 Subject: [PATCH 07/10] build: Bump to 28.1rc2 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 9bc3f7047f..057f8c8cdd 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 28) define(_CLIENT_VERSION_MINOR, 1) define(_CLIENT_VERSION_BUILD, 0) -define(_CLIENT_VERSION_RC, 1) +define(_CLIENT_VERSION_RC, 2) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2024) define(_COPYRIGHT_HOLDERS,[The %s developers]) From 7ddfcf32da7a0bfb40bc3b4f5d28ac078fd1c5d7 Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Fri, 13 Dec 2024 21:19:41 -0500 Subject: [PATCH 08/10] doc: Generate manpages --- doc/man/bitcoin-cli.1 | 6 +++--- doc/man/bitcoin-qt.1 | 9 +++++---- doc/man/bitcoin-tx.1 | 6 +++--- doc/man/bitcoin-util.1 | 6 +++--- doc/man/bitcoin-wallet.1 | 6 +++--- doc/man/bitcoind.1 | 9 +++++---- 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/doc/man/bitcoin-cli.1 b/doc/man/bitcoin-cli.1 index d89abfcefa..52f6e123fc 100644 --- a/doc/man/bitcoin-cli.1 +++ b/doc/man/bitcoin-cli.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-CLI "1" "December 2024" "bitcoin-cli v28.1.0rc1" "User Commands" +.TH BITCOIN-CLI "1" "December 2024" "bitcoin-cli v28.1.0rc2" "User Commands" .SH NAME -bitcoin-cli \- manual page for bitcoin-cli v28.1.0rc1 +bitcoin-cli \- manual page for bitcoin-cli v28.1.0rc2 .SH SYNOPSIS .B bitcoin-cli [\fI\,options\/\fR] \fI\, \/\fR[\fI\,params\/\fR] \fI\,Send command to Bitcoin Core\/\fR @@ -15,7 +15,7 @@ bitcoin-cli \- manual page for bitcoin-cli v28.1.0rc1 .B bitcoin-cli [\fI\,options\/\fR] \fI\,help Get help for a command\/\fR .SH DESCRIPTION -Bitcoin Core RPC client version v28.1.0rc1 +Bitcoin Core RPC client version v28.1.0rc2 .SH OPTIONS .HP \-? diff --git a/doc/man/bitcoin-qt.1 b/doc/man/bitcoin-qt.1 index 8e15e96b01..c8f1f5ae5d 100644 --- a/doc/man/bitcoin-qt.1 +++ b/doc/man/bitcoin-qt.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-QT "1" "December 2024" "bitcoin-qt v28.1.0rc1" "User Commands" +.TH BITCOIN-QT "1" "December 2024" "bitcoin-qt v28.1.0rc2" "User Commands" .SH NAME -bitcoin-qt \- manual page for bitcoin-qt v28.1.0rc1 +bitcoin-qt \- manual page for bitcoin-qt v28.1.0rc2 .SH SYNOPSIS .B bitcoin-qt [\fI\,command-line options\/\fR] [\fI\,URI\/\fR] .SH DESCRIPTION -Bitcoin Core version v28.1.0rc1 +Bitcoin Core version v28.1.0rc2 .PP Optional URI is a Bitcoin address in BIP21 URI format. .SH OPTIONS @@ -352,7 +352,8 @@ Support filtering of blocks and transaction with bloom filters (default: .IP Listen for connections on (default: 8333, testnet3: 18333, testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for -I2P (see doc/i2p.md). +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. .HP \fB\-proxy=\fR .IP diff --git a/doc/man/bitcoin-tx.1 b/doc/man/bitcoin-tx.1 index ee14f42a2a..81fc86c871 100644 --- a/doc/man/bitcoin-tx.1 +++ b/doc/man/bitcoin-tx.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-TX "1" "December 2024" "bitcoin-tx v28.1.0rc1" "User Commands" +.TH BITCOIN-TX "1" "December 2024" "bitcoin-tx v28.1.0rc2" "User Commands" .SH NAME -bitcoin-tx \- manual page for bitcoin-tx v28.1.0rc1 +bitcoin-tx \- manual page for bitcoin-tx v28.1.0rc2 .SH SYNOPSIS .B bitcoin-tx [\fI\,options\/\fR] \fI\, \/\fR[\fI\,commands\/\fR] \fI\,Update hex-encoded bitcoin transaction\/\fR @@ -9,7 +9,7 @@ bitcoin-tx \- manual page for bitcoin-tx v28.1.0rc1 .B bitcoin-tx [\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] \fI\,Create hex-encoded bitcoin transaction\/\fR .SH DESCRIPTION -Bitcoin Core bitcoin\-tx utility version v28.1.0rc1 +Bitcoin Core bitcoin\-tx utility version v28.1.0rc2 .SH OPTIONS .HP \-? diff --git a/doc/man/bitcoin-util.1 b/doc/man/bitcoin-util.1 index 6bd083830a..a88d610931 100644 --- a/doc/man/bitcoin-util.1 +++ b/doc/man/bitcoin-util.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-UTIL "1" "December 2024" "bitcoin-util v28.1.0rc1" "User Commands" +.TH BITCOIN-UTIL "1" "December 2024" "bitcoin-util v28.1.0rc2" "User Commands" .SH NAME -bitcoin-util \- manual page for bitcoin-util v28.1.0rc1 +bitcoin-util \- manual page for bitcoin-util v28.1.0rc2 .SH SYNOPSIS .B bitcoin-util [\fI\,options\/\fR] [\fI\,commands\/\fR] \fI\,Do stuff\/\fR .SH DESCRIPTION -Bitcoin Core bitcoin\-util utility version v28.1.0rc1 +Bitcoin Core bitcoin\-util utility version v28.1.0rc2 .SH OPTIONS .HP \-? diff --git a/doc/man/bitcoin-wallet.1 b/doc/man/bitcoin-wallet.1 index 252bfddb0b..94d9049441 100644 --- a/doc/man/bitcoin-wallet.1 +++ b/doc/man/bitcoin-wallet.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-WALLET "1" "December 2024" "bitcoin-wallet v28.1.0rc1" "User Commands" +.TH BITCOIN-WALLET "1" "December 2024" "bitcoin-wallet v28.1.0rc2" "User Commands" .SH NAME -bitcoin-wallet \- manual page for bitcoin-wallet v28.1.0rc1 +bitcoin-wallet \- manual page for bitcoin-wallet v28.1.0rc2 .SH DESCRIPTION -Bitcoin Core bitcoin\-wallet version v28.1.0rc1 +Bitcoin Core bitcoin\-wallet version v28.1.0rc2 .PP bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files. By default bitcoin\-wallet will act on wallets in the default mainnet wallet directory in the datadir. diff --git a/doc/man/bitcoind.1 b/doc/man/bitcoind.1 index 75eb70bf1c..34bc48acd8 100644 --- a/doc/man/bitcoind.1 +++ b/doc/man/bitcoind.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIND "1" "December 2024" "bitcoind v28.1.0rc1" "User Commands" +.TH BITCOIND "1" "December 2024" "bitcoind v28.1.0rc2" "User Commands" .SH NAME -bitcoind \- manual page for bitcoind v28.1.0rc1 +bitcoind \- manual page for bitcoind v28.1.0rc2 .SH SYNOPSIS .B bitcoind [\fI\,options\/\fR] \fI\,Start Bitcoin Core\/\fR .SH DESCRIPTION -Bitcoin Core version v28.1.0rc1 +Bitcoin Core version v28.1.0rc2 .SH OPTIONS .HP \-? @@ -350,7 +350,8 @@ Support filtering of blocks and transaction with bloom filters (default: .IP Listen for connections on (default: 8333, testnet3: 18333, testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for -I2P (see doc/i2p.md). +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. .HP \fB\-proxy=\fR .IP From 01fe07a2cea07b6e72a33a5d230ec16118b9a26b Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Fri, 13 Dec 2024 21:20:23 -0500 Subject: [PATCH 09/10] examples: Generate example bitcoin.conf --- share/examples/bitcoin.conf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/share/examples/bitcoin.conf b/share/examples/bitcoin.conf index 1b768924ed..a8dfc2735d 100644 --- a/share/examples/bitcoin.conf +++ b/share/examples/bitcoin.conf @@ -290,7 +290,8 @@ # Listen for connections on (default: 8333, testnet3: 18333, # testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for -# I2P (see doc/i2p.md). +# I2P (see doc/i2p.md). If set to a value x, the default onion +# listening port will be set to x+1. #port= # Connect through SOCKS5 proxy, set -noproxy to disable (default: @@ -697,9 +698,12 @@ # Options for mainnet [main] -# Options for testnet +# Options for testnet3 [test] +# Options for testnet4 +[testnet4] + # Options for signet [signet] From 5576618152aff0358aeb1c5189422882b419de2d Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Fri, 13 Dec 2024 21:27:57 -0500 Subject: [PATCH 10/10] doc: update release notes for 28.1rc2 --- doc/release-notes-31223.md | 15 --------------- doc/release-notes.md | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) delete mode 100644 doc/release-notes-31223.md diff --git a/doc/release-notes-31223.md b/doc/release-notes-31223.md deleted file mode 100644 index 44f0552fd9..0000000000 --- a/doc/release-notes-31223.md +++ /dev/null @@ -1,15 +0,0 @@ -P2P and network changes ------------------------ -When the `-port` configuration option is used, the default onion listening port will now -be derived to be that port + 1 instead of being set to a fixed value (8334 on mainnet). -This re-allows setups with multiple local nodes using different `-port` and not using `-bind`, -which would lead to a startup failure in v28.0 due to a port collision. - -Note that a `HiddenServicePort` manually configured in `torrc` may need adjustment if used in -connection with the `-port` option. -For example, if you are using `-port=5555` with a non-standard value and not using `-bind=...=onion`, -previously Bitcoin Core would listen for incoming Tor connections on `127.0.0.1:8334`. -Now it would listen on `127.0.0.1:5556` (`-port` plus one). If you configured the hidden service manually -in torrc now you have to change it from `HiddenServicePort 8333 127.0.0.1:8334` to `HiddenServicePort 8333 -127.0.0.1:5556`, or configure bitcoind with `-bind=127.0.0.1:8334=onion` to get the previous behavior. -(#31223) diff --git a/doc/release-notes.md b/doc/release-notes.md index 21221a83a0..cdddade43a 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -46,6 +46,19 @@ Notable changes ### P2P +- When the `-port` configuration option is used, the default onion listening port will now + be derived to be that port + 1 instead of being set to a fixed value (8334 on mainnet). + This re-allows setups with multiple local nodes using different `-port` and not using `-bind`, + which would lead to a startup failure in v28.0 due to a port collision. + + Note that a `HiddenServicePort` manually configured in `torrc` may need adjustment if used in + connection with the `-port` option. + For example, if you are using `-port=5555` with a non-standard value and not using `-bind=...=onion`, + previously Bitcoin Core would listen for incoming Tor connections on `127.0.0.1:8334`. + Now it would listen on `127.0.0.1:5556` (`-port` plus one). If you configured the hidden service manually + in torrc now you have to change it from `HiddenServicePort 8333 127.0.0.1:8334` to `HiddenServicePort 8333 + 127.0.0.1:5556`, or configure bitcoind with `-bind=127.0.0.1:8334=onion` to get the previous behavior. + (#31223) - #30568 addrman: change internal id counting to int64_t ### Key @@ -59,6 +72,8 @@ Notable changes ### Test - #31016 test: add missing sync to feature_fee_estimation.py +- #31448 fuzz: add cstdlib to FuzzedDataProvider +- #31419 test: fix MIN macro redefinition ### Doc @@ -71,6 +86,7 @@ Notable changes ### Misc - #31267 refactor: Drop deprecated space in `operator""_mst` +- #31431 util: use explicit cast in MultiIntBitSet::Fill() Credits =======