Merge bitcoin/bitcoin#34192: [30.x] Backports

f22122bc27 doc: update release notes for v30.x (fanquake)
7568bc3ab0 test: Avoid hard time.sleep(1) in feature_init.py (MarcoFalke)
c065bcd2d7 init: Signal m_tip_block_cv on Ctrl-C (Ryan Ofsky)
6983c7d769 test: Test SIGTERM handling during waitforblockheight call (Ryan Ofsky)
8769c718f4 doc: Update OpenBSD Build Guide (Hennadii Stepanov)
ed0774bd08 doc: update copyright year (fanquake)
f620dde411 fuzz: doc: remove any mention to address_deserialize_v2 (brunoerg)
b734c4026b guix: reduce allowed exported symbols (fanquake)
7ea855fd55 build: Update minimum required Boost version (Hennadii Stepanov)

Pull request description:

  Backports:
  * #33511
  * #33950
  * #34091
  * #34107
  * #34137
  * #34174
  * #34182

ACKs for top commit:
  willcl-ark:
    ACK f22122bc27
  marcofleon:
    ACK f22122bc27

Tree-SHA512: a4486d331ce8fef07e611188098a965348cdfb081b81e5a2c700e119b1cf3c28cddbeca883ab512a510f6aaa5fc14bf896f70823fa63afcdd0762d9fbda0118b
This commit is contained in:
merge-script
2026-01-05 17:27:19 +00:00
13 changed files with 83 additions and 64 deletions

View File

@@ -32,7 +32,7 @@ set(CLIENT_VERSION_MINOR 1)
set(CLIENT_VERSION_BUILD 0)
set(CLIENT_VERSION_RC 0)
set(CLIENT_VERSION_IS_RELEASE "true")
set(COPYRIGHT_YEAR "2025")
set(COPYRIGHT_YEAR "2026")
# During the enabling of the CXX and CXXOBJ languages, we modify
# CMake's compiler/linker invocation strings by appending the content

View File

@@ -1,7 +1,7 @@
The MIT License (MIT)
Copyright (c) 2009-2025 The Bitcoin Core developers
Copyright (c) 2009-2025 Bitcoin Developers
Copyright (c) 2009-2026 The Bitcoin Core developers
Copyright (c) 2009-2026 Bitcoin Developers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -29,7 +29,7 @@ function(add_boost_if_needed)
endif()
endif()
find_package(Boost 1.73.0 REQUIRED CONFIG)
find_package(Boost 1.74.0 REQUIRED CONFIG)
mark_as_advanced(Boost_INCLUDE_DIR boost_headers_DIR)
# Workaround for a bug in NetBSD pkgsrc.
# See: https://github.com/NetBSD/pkgsrc/issues/167.

View File

@@ -5,7 +5,7 @@ Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
Source: https://github.com/bitcoin/bitcoin
Files: *
Copyright: 2009-2025, Bitcoin Core Developers
Copyright: 2009-2026, Bitcoin Core Developers
License: Expat
Comment: The Bitcoin Core Developers encompasses all contributors to the
project, listed in the release notes or the git log.

View File

@@ -46,8 +46,7 @@ MAX_VERSIONS = {
# Ignore symbols that are exported as part of every executable
IGNORE_EXPORTS = {
'environ', '_environ', '__environ', '_fini', '_init', 'stdin',
'stdout', 'stderr',
'stdin', 'stdout', 'stderr',
}
# Expected linker-loader names can be found here:

View File

@@ -1,6 +1,6 @@
# OpenBSD Build Guide
**Updated for OpenBSD [7.6](https://www.openbsd.org/76.html)**
**Updated for OpenBSD [7.8](https://www.openbsd.org/78.html)**
This guide describes how to build bitcoind, command-line utilities, and GUI on OpenBSD.
@@ -21,8 +21,11 @@ pkg_add sqlite3
To build Bitcoin Core without the wallet, use `-DENABLE_WALLET=OFF`.
Cap'n Proto is needed for IPC functionality (see [multiprocess.md](multiprocess.md))
and can be built from source: https://capnproto.org/install.html
Cap'n Proto is needed for IPC functionality (see [multiprocess.md](multiprocess.md)):
```bash
pkg_add capnproto
```
Compile with `-DENABLE_IPC=OFF` if you do not need IPC functionality.

View File

@@ -19,7 +19,7 @@ Bitcoin Core requires one of the following compilers.
| Dependency | Releases | Minimum required |
| --- | --- | --- |
| [Boost](../depends/packages/boost.mk) | [link](https://www.boost.org/users/download/) | [1.73.0](https://github.com/bitcoin/bitcoin/pull/29066) |
| [Boost](../depends/packages/boost.mk) | [link](https://www.boost.org/users/download/) | [1.74.0](https://github.com/bitcoin/bitcoin/pull/34107) |
| CMake | [link](https://cmake.org/) | [3.22](https://github.com/bitcoin/bitcoin/pull/30454) |
| [libevent](../depends/packages/libevent.mk) | [link](https://github.com/libevent/libevent/releases) | [2.1.8](https://github.com/bitcoin/bitcoin/pull/24681) |

View File

@@ -79,7 +79,7 @@ of the test. Just make sure to use double-dash to distinguish them from the
fuzzer's own arguments:
```sh
$ FUZZ=address_deserialize_v2 build_fuzz/bin/fuzz -runs=1 fuzz_corpora/address_deserialize_v2 --checkaddrman=5 --printtoconsole=1
$ FUZZ=address_deserialize build_fuzz/bin/fuzz -runs=1 fuzz_corpora/address_deserialize --checkaddrman=5 --printtoconsole=1
```
## Fuzzing corpora

View File

@@ -1,9 +1,9 @@
v30.x Release Notes
===================
Bitcoin Core version v30.1 is now available from:
Bitcoin Core version v30.x is now available from:
<https://bitcoincore.org/bin/bitcoin-core-30.1/>
<https://bitcoincore.org/bin/bitcoin-core-30.x/>
This release includes new features, various bug fixes and performance
improvements, as well as updated translations.
@@ -40,69 +40,41 @@ unsupported systems.
Notable changes
===============
### Wallet
### IPC
- #33528 wallet: don't consider unconfirmed TRUC coins with ancestors
- #33511 init: Fix Ctrl-C shutdown hangs during wait calls
### Build
- #33580 depends: Use `$(package)_file_name` when downloading from the fallback
- #33906 depends: Add patch for Windows11Style plugin
- #32009 contrib: turn off compression of macOS SDK to fix determinism
### IPC
- #33229 multiprocess: Don't require bitcoin -m argument when IPC options are used
- #33517 multiprocess: Fix high overhead from message logging
- #33519 Update libmultiprocess subtree in 30.x branch
- #33566 miner: fix empty mempool case for waitNext()
- #33676 interfaces: enable cancelling running waitNext calls
### P2P
- #33723 chainparams: remove dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us
### GUI
- gui#899 qt: Modernize custom filtering
- gui#901 Add createwallet, createwalletdescriptor, and migratewallet to history filter
- #33950 guix: reduce allowed exported symbols
- #34107 build: Update minimum required Boost version
### Test
- #33612 test: change log rate limit version gate
- #34137 test: Avoid hard time.sleep(1) in feature_init.py
### Fuzz
- #34091 fuzz: doc: remove any mention to address_deserialize_v2
### Doc
- #33630 doc: correct topology requirements in submitpackage helptext
- #33826 scripted-diff: Remove obsolete comment
- #33827 doc: Correct pkgin command usage on NetBSD
- #34182 doc: Update OpenBSD Build Guide
### Misc
- #33508 ci: fix buildx gha cache authentication on forks
- #33558 ci: Use native platform for win-cross task
- #33581 ci: Properly include $FILE_ENV in DEPENDS_HASH
- #33744 ci: Fix lint runner selection (and docker cache)
- #33996 contrib: fix manpage generation
- #34174 doc: update copyright year to 2026
Credits
=======
Thanks to everyone who directly contributed to this release:
- Ava Chow
- Cory Fields
- Eugene Siegel
- brunoerg
- fanquake
- glozow
- Hennadii Stepanov
- ismaelsadeeq
- MarcoFalke
- Ryan Ofsky
- SatsAndSports
- Sjors Provoost
- WakeTrainDev
- willcl-ark
As well as to everyone that helped with translations on
[Transifex](https://explore.transifex.com/bitcoin/bitcoin/).

View File

@@ -215,8 +215,6 @@ void InitContext(NodeContext& node)
node.shutdown_request = [&node] {
assert(node.shutdown_signal);
if (!(*node.shutdown_signal)()) return false;
// Wake any threads that may be waiting for the tip to change.
if (node.notifications) WITH_LOCK(node.notifications->m_tip_block_mutex, node.notifications->m_tip_block_cv.notify_all());
return true;
};
}
@@ -267,6 +265,8 @@ void Interrupt(NodeContext& node)
#if HAVE_SYSTEM
ShutdownNotify(*node.args);
#endif
// Wake any threads that may be waiting for the tip to change.
if (node.notifications) WITH_LOCK(node.notifications->m_tip_block_mutex, node.notifications->m_tip_block_cv.notify_all());
InterruptHTTPServer();
InterruptHTTPRPC();
InterruptRPC();

View File

@@ -132,7 +132,6 @@ public:
}
void appShutdown() override
{
Interrupt(*m_context);
Shutdown(*m_context);
}
void startShutdown() override
@@ -141,12 +140,7 @@ public:
if (!(Assert(ctx.shutdown_request))()) {
LogError("Failed to send shutdown signal\n");
}
// Stop RPC for clean shutdown if any of waitfor* commands is executed.
if (args().GetBoolArg("-server", false)) {
InterruptRPC();
StopRPC();
}
Interrupt(*m_context);
}
bool shutdownRequested() override { return ShutdownRequested(*Assert(m_context)); };
bool isSettingIgnored(const std::string& name) override

View File

@@ -51,7 +51,7 @@ static std::vector<const char*> g_args;
static void SetArgs(int argc, char** argv) {
for (int i = 1; i < argc; ++i) {
// Only take into account arguments that start with `--`. The others are for the fuzz engine:
// `fuzz -runs=1 fuzz_corpora/address_deserialize_v2 --checkaddrman=5`
// `fuzz -runs=1 fuzz_corpora/address_deserialize --checkaddrman=5`
if (strlen(argv[i]) > 2 && argv[i][0] == '-' && argv[i][1] == '-') {
g_args.push_back(argv[i]);
}

View File

@@ -3,6 +3,7 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Tests related to node initialization."""
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
import os
import platform
@@ -240,9 +241,59 @@ class InitTest(BitcoinTestFramework):
self.stop_node(0)
assert not custom_pidfile_absolute.exists()
def break_wait_test(self):
"""Test what happens when a break signal is sent during a
waitforblockheight RPC call with a long timeout. Ctrl-Break is sent on
Windows and SIGTERM is sent on other platforms, to trigger the same node
shutdown sequence that would happen if Ctrl-C were pressed in a
terminal. (This can be different than the node shutdown sequence that
happens when the stop RPC is sent.)
The waitforblockheight call should be interrupted and return right away,
and not time out."""
self.log.info("Testing waitforblockheight RPC call followed by break signal")
node = self.nodes[0]
if platform.system() == 'Windows':
# CREATE_NEW_PROCESS_GROUP prevents python test from exiting
# with STATUS_CONTROL_C_EXIT (-1073741510) when break is sent.
self.start_node(node.index, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
else:
self.start_node(node.index)
current_height = node.getblock(node.getbestblockhash())['height']
with ThreadPoolExecutor(max_workers=1) as ex:
# Call waitforblockheight with wait timeout longer than RPC timeout,
# so it is possible to distinguish whether it times out or returns
# early. If it times out it will throw an exception, and if it
# returns early it will return the current block height.
self.log.debug(f"Calling waitforblockheight with {self.rpc_timeout} sec RPC timeout")
fut = ex.submit(node.waitforblockheight, height=current_height+1, timeout=self.rpc_timeout*1000*2)
self.wait_until(lambda: any(c["method"] == "waitforblockheight" for c in node.cli.getrpcinfo()["active_commands"]))
self.log.debug(f"Sending break signal to pid {node.process.pid}")
if platform.system() == 'Windows':
# Note: CTRL_C_EVENT should not be sent here because unlike
# CTRL_BREAK_EVENT it can not be targeted at a specific process
# group and may behave unpredictably.
node.process.send_signal(signal.CTRL_BREAK_EVENT)
else:
# Note: signal.SIGINT would work here as well
node.process.send_signal(signal.SIGTERM)
node.process.wait()
result = fut.result()
self.log.debug(f"waitforblockheight returned {result!r}")
assert_equal(result["height"], current_height)
node.wait_until_stopped()
def run_test(self):
self.init_pid_test()
self.init_stress_test()
self.break_wait_test()
if __name__ == '__main__':