Commit Graph

48426 Commits

Author SHA1 Message Date
merge-script
4f8bd396f8 Merge bitcoin/bitcoin#34913: fuzz: Use time helpers in node_eviction
fa1ebde1ad fuzz: Use time helpers in node_eviction (MarcoFalke)

Pull request description:

  The `node_eviction` fuzz test has many issues:

  * It uses the full `int64_t` range (in seconds) as input, which is absurdly large (millions of years) and also violates https://en.cppreference.com/w/cpp/chrono/duration.html:

  > Each of the predefined duration types up to hours covers a range of at least ±292 years.

  * It does not use the existing `ConsumeDuration` and `ConsumeTime` helpers, which makes specifying a proper range difficult.

  So fix all issues by using `ConsumeTime` for time points with default arguments, and `ConsumeDuration` with the same precision, as well as possibly negative values.

ACKs for top commit:
  marcofleon:
    crACK fa1ebde1ad
  brunoerg:
    reACK fa1ebde1ad
  w0xlt:
    ACK fa1ebde1ad

Tree-SHA512: 22045e6c563a9169327737895ea2f3a7b1dcb4fd24fce56d91caa1e132d03a85cbaaa5f78218d23cfa203fe2ee4b147894c02870eb20ae1c232ad55ccdb6f7f7
2026-03-27 08:40:54 +08:00
Ava Chow
21da421b42 Merge bitcoin/bitcoin#34439: qa: Drop recursive deletes from test code, add lint checks.
0d1301b47a test: functional: drop rmtree usage and add lint check (David Gumberg)
8bfb422de8 test: functional: drop unused --keepcache argument (David Gumberg)
a7e4a59d6d qa: Remove all instances of `remove_all` except test cleanup (David Gumberg)

Pull request description:

  Both `fs::remove_all` and `shutil::rmtree()` are a bit dangerous, and most of their uses are not necessary, this PR removes most instances of both.

  `remove_all()` is still used in in `src/test/util/setup_common.cpp` as part of `BasicTestingSetup::BasicTestingSetup`'s constructor and destructor, and it is used in the kernel test code's [`TestDirectory`](4ae00e9a71/src/test/kernel/test_kernel.cpp (L100-L112)):

  734899a4c4/src/test/kernel/test_kernel.cpp (L100-L112)

  In both cases, `remove_all` is likely necessary, but the kernel's test code is RAII, ideally `BasicTestingSetup` could be made similar in a follow-up or in this PR if reviewers think it is important.

  Similarly in the python code, most usage was unnecessary, but there are a few places where `rmtree()` was necessary, I have added sanity checks to make sure these are inside of the `tmpdir` before doing recursive delete there.

ACKs for top commit:
  achow101:
    ACK 0d1301b47a
  hodlinator:
    ACK 0d1301b47a
  sedited:
    ACK 0d1301b47a

Tree-SHA512: da8ca23846b73eff0eaff61a5f80ba1decf63db783dcd86b25f88f4862ae28816fc9e2e9ee71283ec800d73097b1cfae64e3c5ba0e991be69c200c6098f24d6e
2026-03-26 13:05:01 -07:00
Ava Chow
8a8edc8d88 Merge bitcoin/bitcoin#34741: refactor: Return std::optional from GetNameProxy/GetProxy
fa73ed467c refactor: Fix redundant conversion to std::string and then to std::string_view [performance-string-view-conversions] (MarcoFalke)
fa270fdacf refactor: Return std::optional from GetProxy (MarcoFalke)
faeac1a931 refactor: Return std::optional from GetNameProxy (MarcoFalke)

Pull request description:

  Currently the getters have a mutable reference as inout param and return a bool to indicate success. This is confusing, because the success bool is redundant with the `IsValid()` state on the proxy object.

  So in theory, the functions could reset the mutable proxy object to an invalid state and return `void`.

  However, this would also be confusing, because devs can forget to check `IsValid()`.

  Fix all issues by using `std::optional<Proxy>`, where devs no longer have to check `IsValid()` manually, or a separate bool. Note that new code in the repo is already using `std::optional<Proxy>`, see `git grep 'std::optional<Proxy>' bitcoin-core/master`. Also, `std::optional<Proxy>` will enforce checking at compile time, whereas calling `Proxy::IsValid` is not enforced.

ACKs for top commit:
  achow101:
    ACK fa73ed467c
  sedited:
    ACK fa73ed467c
  ViniciusCestarii:
    ACK fa73ed467c
  frankomosh:
    Code Review ACK fa73ed467c. Good refactor, correctly replaces the bool + mutable reference output parameter pattern with `std::optional<Proxy>` across `GetProxy` and `GetNameProxy`. Semantics are preserved.

Tree-SHA512: c6a1e1d1691958d2e6507e32e3484f96703fba03ccc710145ae2fb84b1254fb0e6e1d8d78e9b572daf5ea485247b73568704881762379b50bcf939a35494dd13
2026-03-26 11:38:14 -07:00
Ava Chow
a5609fc249 Merge bitcoin/bitcoin#34458: net: Don't log own ips during discover
a49f97ff4a net: Don't log own ips during discover (sedited)

Pull request description:

  The -logips option seems to imply that ip addresses are only logged when it is set. This seems like an obvious case for not logging these by default. There might be prior discussion around this, but I was unable to find why these might be exempt. There are also a few issues (both open and closed) where printing these lines was useful.

ACKs for top commit:
  l0rinc:
    tested ACK a49f97ff4a
  achow101:
    ACK a49f97ff4a
  willcl-ark:
    tACK a49f97ff4a
  danielabrozzoni:
    tACK a49f97ff4a

Tree-SHA512: 177911c5607b794965facf568fec71eb22fc8e9d16f4fee5088745e8aba51cb4ce839876c456470dc52839ebc36976dc6b81a50f546941aebb8db538d8fd4554
2026-03-26 11:27:06 -07:00
merge-script
99f99c989e Merge bitcoin/bitcoin#34918: fuzz: [refactor] Remove unused g_setup pointers
fabbfec3b0 fuzz: Remove unused g_setup pointers (MarcoFalke)

Pull request description:

  This is unused and avoids a clang warning.

  Can be tested via: `git grep --count  '\<g_setup' | grep ':2'`

  Before: Prints files names.
  After: No output.

ACKs for top commit:
  hebasto:
    ACK fabbfec3b0.
  hodlinator:
    ACK fabbfec3b0

Tree-SHA512: 21a3459574316617aa98bb04e5b27173c4bb1e89d71ce1fb3fb3066f8d6e2b3bf1d1fd516a74f7ae3f9052b492edeec00d3365cb5781c5f79ebb828da7af520e
2026-03-26 08:55:16 +08:00
Ava Chow
fde37778ba Merge bitcoin/bitcoin#34915: doc: archive release notes for v28.4
3e089038aa doc: archive release notes for v28.4 (fanquake)

Pull request description:

ACKs for top commit:
  achow101:
    ACK 3e089038aa
  stickies-v:
    ACK 3e089038aa

Tree-SHA512: ee12fc46282d62f7adf7f18ce9256b6cec846d1e8e2ba0edbc91f0c275107ec87e96e048728cde0b8b2e993c8121cf0a6376565c7e4eea408ce3177af5d7f2d0
2026-03-25 13:49:14 -07:00
merge-script
6d54365c3e Merge bitcoin/bitcoin#34920: wallet: drop stale TODOs
1438165b1f wallet: drop stale TODOs (Sjors Provoost)

Pull request description:

  I don't remember why I added them. There's also no test that demonstrates the problem, or an open issue requesting a fix.

  It's also unclear if this even _should_ be changed: https://github.com/bitcoin/bitcoin/pull/34912#issuecomment-4121780033

ACKs for top commit:
  polespinasa:
    ACK 1438165b1f
  kevkevinpal:
    ACK [1438165](1438165b1f)
  w0xlt:
    ACK 1438165b1f

Tree-SHA512: 5b6024f38222444488ea3892d1b32277a4091d9c17bc4e8d54efda4d8b8ec567fe639b07fe5bfb26fc9cb8a783bac455dd143f1d731ce111449c9a3aec13368d
2026-03-25 21:39:36 +01:00
MarcoFalke
fa1ebde1ad fuzz: Use time helpers in node_eviction 2026-03-25 16:55:18 +01:00
Sjors Provoost
1438165b1f wallet: drop stale TODOs 2026-03-25 14:06:19 +01:00
MarcoFalke
fabbfec3b0 fuzz: Remove unused g_setup pointers
These are unused and removing them avoids clang warnings like:

src/test/fuzz/deserialize.cpp:42:26: error: variable g_setup set but not used [-Werror,-Wunused-but-set-variable]
2026-03-25 13:51:01 +01:00
fanquake
3e089038aa doc: archive release notes for v28.4 2026-03-25 10:52:48 +08:00
merge-script
2fe76ed832 Merge bitcoin/bitcoin#34896: ci: Upgrade IWYU to 0.26 compatible with Clang 22
3129d4a693 ci: Rename `TIDY_LLVM_V` to `IWYU_LLVM_V` in IWYU-specific code (Hennadii Stepanov)
0b489886f8 ci: Upgrade IWYU to 0.26 compatible with Clang 22 (Hennadii Stepanov)

Pull request description:

  This PR upgrades IWYU to [0.26](https://github.com/include-what-you-use/include-what-you-use/releases/tag/0.26) and removes mapping workarounds for issues that have been fixed upstream.

ACKs for top commit:
  fanquake:
    ACK 3129d4a693

Tree-SHA512: 9a926e489573d040423461c039ecda7636beb70e8214a02c1c594cbd5b89d26331455a9872c38993fa5ee6d27fdfefc2375dedc369721b2933411542a57a3884
2026-03-25 09:06:19 +08:00
merge-script
c61c504f27 Merge bitcoin/bitcoin#34883: ci: vcpkg-specific cleanups
2d5cedfe12 ci: Switch to VS-vendored vcpkg instance (Hennadii Stepanov)
9aa5b3c3a3 ci: Switch to `x64-windows-release` triplet (Hennadii Stepanov)
65882fa68f ci: Remove upstreamed vcpkg workaround (Hennadii Stepanov)

Pull request description:

  This PR removes three vcpkg-specific workarounds. See the commit messages for more details.

ACKs for top commit:
  janb84:
    Concept ACK 2d5cedfe12
  hodlinator:
    utACK 2d5cedfe12

Tree-SHA512: 72155eea5210ff001df8fd05ec82687ab5cef65e0e89e7ab79a59ff90da51e5c7c790a41c6c755463b3dba0fdc5561ea9eb410fd69d4a6682f645d72028b3c48
2026-03-25 08:46:00 +08:00
David Gumberg
0d1301b47a test: functional: drop rmtree usage and add lint check
`shutil.rmtree` is dangerous because it recursively deletes. There are
not likely to be any issues with it's current uses, but it is possible
that some of the assumptions being made now won't always be true, e.g.
about what some of the variables being passed to `rmtree` represent.

For some remaining uses of rmtree that can't be avoided for now, use
`cleanup_dir` which asserts that the recursively deleted folder is a
child of the the `tmpdir` of the test run. Otherwise,
`tempfile.TemporaryDirectory` should be used which does it's own
deleting on being garbage collected, or old fashioned unlinking and
rmdir in the case of directories with known contents.
2026-03-24 16:06:35 -07:00
David Gumberg
8bfb422de8 test: functional: drop unused --keepcache argument
At the time this was added in  #10197, building the test cache took 21
seconds, as described in that PR, but this is no longer true, as
demonstrated by running the functional test framework with and without
the --keepcache arguments on master prior to this commit:

```
hyperfine   --warmup 1  --export-markdown results.md --runs 3 \
    -n 'without --keepcache'    './build/test/functional/test_runner.py -j $(nproc)' \
    -n 'with --keepcache'       './build/test/functional/test_runner.py -j $(nproc) --keepcache'
```

| Command               | Mean [s]       | Min [s] | Max [s] | Relative |
|:----------------------|---------------:|--------:|---:|---:|
| `without --keepcache` | 76.373 ± 3.058 | 74.083  | 79.846  | 1.00 |
| `with --keepcache`    | 77.384 ± 1.836 | 75.952  | 79.454  | 1.01 ± 0.05 |

As a consequence, this argument can be removed from the test runner and
this also has the benefit of being able to use an RAII-like
`tempfile.TemporaryDirectory` instead of having to clean up the cache
manually at the end of test runs.

bitcoin/bitcoin#10197: https://github.com/bitcoin/bitcoin/pull/10197
2026-03-24 16:03:02 -07:00
David Gumberg
a7e4a59d6d qa: Remove all instances of remove_all except test cleanup
Adds a lint check for `remove_all()`

`fs::remove_all()`/`std::filesystem::remove_all()` is extremely
dangerous, all user-facing instances of it have been removed, and it
also deserves to be removed from the places in our test code where it is
being used unnecessarily.
2026-03-24 16:03:02 -07:00
Ava Chow
38886a6710 Merge bitcoin/bitcoin#34786: validation: do not add the snapshot to candidates set of the background chainstate
69baddc910 validation: do not add the snapshot block to candidates of bg chainstate (Martin Zumsande)

Pull request description:

  The snapshot block needs to be added to the candidates set of the assumed-valid chain because it will be the tip of that chainstate right after snapshot activation.

  However, adding it also to the background chainstate is not necessary for anything. Before, the index would be in the set without being connectable. It will be eventually added to the set as part of the normal block download - no extra logic is necessary here.

  This simplifies a unit test which had a comment that having the block in the set is "not intended".
  This was suggested [here](https://github.com/bitcoin/bitcoin/pull/34521#discussion_r2849281299) and [here](https://github.com/bitcoin/bitcoin/pull/34521#discussion_r2883024248) in #34521

  Note that adding the snapshot block was harmless, since `FindMostWorkChain()` lazily removes blocks without data from the set, so this does not fix a bug but just simplifies some code.

ACKs for top commit:
  achow101:
    ACK 69baddc910
  Bortlesboat:
    Concept ACK 69baddc910. Removing `TargetBlock()` correctly limits the snapshot-block special-case to cs2 where it's actually needed — the test's own "not intended" comment was the tell.
  sedited:
    ACK 69baddc910
  fjahr:
    ACK 69baddc910
  stratospher:
    ACK 69baddc.

Tree-SHA512: 8942fc422f1898369dd486e37da11758f2ebd4a488d092aa1637ef5bfb85766c4be9ad0718797fb2080f5e8d61383b2ee932bf2bc2f7abc2fb07fe3d72e070c3
2026-03-24 14:58:05 -07:00
Ava Chow
bfc84eb2ea Merge bitcoin/bitcoin#33259: rpc, logging: add backgroundvalidation to getblockchaininfo
25f69d970a release note (Pol Espinasa)
af629821cf test: add background validation test for getblockchaininfo (Pol Espinasa)
a3d6f32a39 rpc, log: add backgroundvalidation to getblockchaininfo (Pol Espinasa)
5b2e4c4a88 log: update progress calculations for background validation (Pol Espinasa)

Pull request description:

  `getblockchaininfo` returns `verificationprogress=1` and `initialblockdownload=false` even if there's background validation.
  This PR adds information about background validation to rpc `getblockchaininfo` in a similar way to `validationprogress` does.

  If assume utxo was used the output of a "sync" node performing background validation:
  ```
  $ ./build/bin/bitcoin-cli getblockchaininfo
  ...
    "mediantime": 1756933740,
    "verificationprogress": 1,
    "initialblockdownload": false,
    "backgroundvalidation": {
      "snapshotheight": 880000,
      "blocks": 527589,
      "bestblockhash": "0000000000000000002326308420fa5ccd28a9155217f4d1896ab443d84148fa",
      "mediantime": 1529076654,
      "chainwork": "0000000000000000000000000000000000000000020c92fab9e5e1d8ed2d8dbc",
      "verificationprogress": 0.2815790617966284
    },
    "chainwork": "0000000000000000000000000000000000000000df97866c410b0302954919d2",
    "size_on_disk": 61198817285,

  ...
  ```

  If assume utxo was not used the progress is hidden:
  ```
  $ ./build/bin/bitcoin-cli getblockchaininfo
  ...
    "mediantime": 1756245700,
    "verificationprogress": 1,
    "initialblockdownload": false,
    "chainwork": "00000000000000000000000000000000000000000000000000000656d6bb052b",
    "size_on_disk": 3964972194,
  ...
  ```

  The PR also updates the way we estimate the verification progress returning a 100% on the snapshot block and not on the tip as we will stop doing background validation when reaching it.

ACKs for top commit:
  fjahr:
    ACK 25f69d970a
  danielabrozzoni:
    ACK 25f69d970a
  achow101:
    ACK 25f69d970a
  sedited:
    ACK 25f69d970a

Tree-SHA512: 5e5e08fd39af5f764962b862bc6d8257b0d2175fe920d4b79dc5105578fd4ebe08aee2fe9bfa5c9cad5d7610197a435ebaac0de23e7a5efa740dfea031a8a9d4
2026-03-24 14:36:09 -07:00
merge-script
1ef7166029 Merge bitcoin/bitcoin#34891: doc: Note that generateblock does not collect transaction fees
3136559923 doc: Note that generateblock does not collect transaction fees (HouseOfHufflepuff)

Pull request description:

  ## Summary

  - Add a note to the `generateblock` RPC help text clarifying that transaction fees are not collected in the block reward
  - This was suggested by maflcko in #31684 as a minimal doc fix

  refs #31684

  ## Test plan

  - [x] `./build/bin/test_bitcoin --run_test=rpc_tests` passes
  - [x] `cmake --build build --target bitcoind` compiles cleanly

ACKs for top commit:
  maflcko:
    lgtm ACK 3136559923
  sedited:
    ACK 3136559923

Tree-SHA512: 173e6ac2a08c5101794a21bf29ec01af834fe2ef177b46be9f46b0c545b8888a9deb816caed868ff917105cbd97e57152682dcd4d4fe47dd92ac14a83bbf5d03
2026-03-24 21:41:03 +01:00
Ava Chow
4ecf473c36 Merge bitcoin/bitcoin#34727: test: Add IPC wake-up test and reuse mining context
ad75b147b5 test: scale IPC mining wait timeouts by timeout_factor (Enoch Azariah)
e7a918b69a test: verify IPC error handling for invalid coinbase (Enoch Azariah)
63684d6922 test: move make_mining_ctx to ipc_util.py (Enoch Azariah)
4ada575d6c test: verify createNewBlock wakes promptly when tip advances (Enoch Azariah)

Pull request description:

  This is a follow-up to implement a couple of test improvements discussed in recent IPC PRs and issues.

  - adds a test to `interface_ipc_mining.py` to verify that `createNewBlock` wakes up immediately when the tip advances, rather than waiting for the cooldown timer to expire (https://github.com/bitcoin/bitcoin/pull/34184#discussion_r2842239399).
  - moves `make_mining_ctx` into `ipc_util.py` so it can be reused across the IPC tests instead of duplicating the setup code (https://github.com/bitcoin/bitcoin/pull/34422#discussion_r2852445430).
  - adds a test case to verify that providing an invalid coinbase to `submitSolution` returns a remote exception instead of crashing the node, closing the loop on the issue reported in #33341.
  - scales IPC wait timeouts using the test suite's `timeout_factor` to prevent spurious failures in heavily loaded CI environments, capping extended waits to avoid test runner hangs (bitcoin-core/libmultiprocess#253 (comment)).

  Closes #33341.

ACKs for top commit:
  Sjors:
    ACK ad75b147b5
  achow101:
    ACK ad75b147b5
  sedited:
    ACK ad75b147b5

Tree-SHA512: 812aa64c03657761f06707e6a15b8b435ab7c75717a6748a919fcbcae317128e18403b0c1bddd4cdad877d286e69db52389633e4012faaa656acc01939091719
2026-03-24 13:34:30 -07:00
Hennadii Stepanov
3129d4a693 ci: Rename TIDY_LLVM_V to IWYU_LLVM_V in IWYU-specific code 2026-03-24 20:23:35 +00:00
merge-script
667e081a2a Merge bitcoin/bitcoin#34598: bench: use larger payload in HexStrBench
353c660be5 bench: use deterministic `HexStr` payload (Lőrinc)

Pull request description:

  ### Context
  Split out of https://github.com/bitcoin/bitcoin/pull/32554
  Inspired by https://github.com/bitcoin/bitcoin/pull/32457#discussion_r2081323234

  ### Problem
  `HexStrBench` uses the bytes from the embedded block fixture as a random source of bytes to measure `HexStr` performance against.
  This coupling makes block benchmark migrations in #32554 slightly more work than necessary.

  ### Fix
  We can use deterministic pseudo-random bytes instead so this benchmark keeps stable input without fixture coupling.
  Use `MAX_BLOCK_WEIGHT` so the benchmark stays in the same size range and keeps measured work above harness overhead.
  This changes the benchmark baseline because input size moves from about 1 MB to 4 MB.

ACKs for top commit:
  maflcko:
    lgtm ACK 353c660be5
  sedited:
    ACK 353c660be5
  hodlinator:
    ACK 353c660be5

Tree-SHA512: 5144b9b71761c581ff13c8f1163efed5e97f247f3c760dd7e513209c84d50f13253aa0d2ab3a431aaa51c204fea51bece41ac128b3d0e3a9ef02d1be11d6a6db
2026-03-24 16:35:25 +01:00
Pol Espinasa
25f69d970a release note 2026-03-24 15:51:24 +01:00
Pol Espinasa
af629821cf test: add background validation test for getblockchaininfo 2026-03-24 15:51:24 +01:00
Pol Espinasa
a3d6f32a39 rpc, log: add backgroundvalidation to getblockchaininfo 2026-03-24 15:51:24 +01:00
Pol Espinasa
5b2e4c4a88 log: update progress calculations for background validation
updates estimations to the block snapshot instead of the main chain tip as it will stop validation after reaching that height
2026-03-24 15:51:23 +01:00
merge-script
400aa68b4a Merge bitcoin/bitcoin#34809: threadsafety: Add STDLOCK() macro for StdMutex
8d2f06853a sync: Use StdMutex for thread safety annotations (Anthony Towns)
cbc231ed8e scripted-diff: logging: Switch from StdLockGuard to STDLOCK (Anthony Towns)
f808786f48 logging: Add missing thread safety annotations (Anthony Towns)
e196cf26e0 util/stdmutex.h: Add STDLOCK() and improve annotation checking for StdMutex (Anthony Towns)

Pull request description:

  Using `STDLOCK(mutex)` instead of `StdLockGuard guard(mutex)` allows clang to propagate missing lock annotations backwards (for global locks or locks in the same class, anyway), and also avoids declaring a dummy name. Use this in logging.h, and also use it in sync.cpp, adding annotations around the internal structure.

ACKs for top commit:
  theuni:
    ACK 8d2f06853a
  sedited:
    ACK 8d2f06853a

Tree-SHA512: ee23f6a7bcc62cc6d9ea88afa863a9018e53a0932272bb14241441fb69066c6633c4e19aadd3dd7599848d4742099d63756be4eff1969775293b728f3dd187aa
2026-03-24 10:26:43 +01:00
MarcoFalke
fa73ed467c refactor: Fix redundant conversion to std::string and then to std::string_view [performance-string-view-conversions] 2026-03-24 06:49:59 +01:00
merge-script
16613c9de9 Merge bitcoin/bitcoin#34857: test: Remove confusing assert_debug_log in wallet_reindex.py
fa30951af5 test: Remove confusing assert_debug_log in wallet_reindex.py (MarcoFalke)

Pull request description:

  The `wallet_reindex.py` test has many issues:

  * It uses a `assert_debug_log` to ensure the reindex happened via `initload thread exit`. However, no other test uses this pattern, because `restart_node` already achieves the same internally (via `getmempoolinfo.loaded`).
  * The `assert_debug_log` may intermittently fail, because the `initload thread exit` log may happen at any time after the inner thread function (lambda) is fully done.
  * The test uses an `node.syncwithvalidationinterfacequeue()` without any explanation. No other test uses this pattern, because all wallet RPCs, in particular the next one (`gettransaction`) call it internally (via `BlockUntilSyncedToCurrentChain`).

  Fix all issues by removing all confusing, useless, and brittle calls.

  Example failure: https://github.com/bitcoin/bitcoin/actions/runs/22671604602/job/65716917459?pr=34419#step:11:22339

  ```
  ...
   node0 2026-03-04T13:55:23.784715Z (mocktime: 2026-03-04T22:15:17Z) [scheduler] [validationinterface.cpp:185] [operator()] [validation] UpdatedBlockTip: new block hash=24b5cc4c1352bc8841ecbe67a43827acd1adc609bd26b2691e80e89b97eff135 fork block hash=24a4dc8be9c157ac31913397d8bb1653900e12b55539c234039559fdeb6dd2fb (in IBD=true)
   node0 2026-03-04T13:55:23.784851Z (mocktime: 2026-03-04T22:15:17Z) [initload] [util/thread.cpp:22] [TraceThread] initload thread exit
   test  2026-03-04T13:55:23.813824Z TestFramework (ERROR): Unexpected exception:
                                     Traceback (most recent call last):
                                       File "/home/admin/actions-runner/_work/_temp/test/functional/test_framework/test_framework.py", line 142, in main
                                         self.run_test()
                                       File "/home/admin/actions-runner/_work/_temp/build/test/functional/wallet_reindex.py", line 90, in run_test
                                         self.birthtime_test(node, miner_wallet)
                                       File "/home/admin/actions-runner/_work/_temp/build/test/functional/wallet_reindex.py", line 64, in birthtime_test
                                         with node.assert_debug_log(expected_msgs=["initload thread exit"]):
                                       File "/usr/lib/python3.12/contextlib.py", line 144, in __exit__
                                         next(self.gen)
                                       File "/home/admin/actions-runner/_work/_temp/test/functional/test_framework/test_node.py", line 607, in assert_debug_log
                                         self._raise_assertion_error(f'Expected message(s) {remaining_expected!s} '
                                       File "/home/admin/actions-runner/_work/_temp/test/functional/test_framework/test_node.py", line 241, in _raise_assertion_error
                                         raise AssertionError(self._node_msg(msg))
                                     AssertionError: [node 0] Expected message(s) ['initload thread exit'] not found in log:
  ```

  Diff to reproduce failure:

  ```diff
  diff --git a/src/util/thread.cpp b/src/util/thread.cpp
  index 0fde73c4e2..de4c05e752 100644
  --- a/src/util/thread.cpp
  +++ b/src/util/thread.cpp
  @@ -8,2 +8,3 @@
   #include <util/log.h>
  +#include <util/time.h>
   #include <util/threadnames.h>
  @@ -21,2 +22,3 @@ void util::TraceThread(std::string_view thread_name, std::function<void()> threa
           thread_func();
  +    UninterruptibleSleep(999ms);
           LogInfo("%s thread exit", thread_name);
  diff --git a/test/functional/wallet_reindex.py b/test/functional/wallet_reindex.py
  index 71ab69e01b..649df4301a 100755
  --- a/test/functional/wallet_reindex.py
  +++ b/test/functional/wallet_reindex.py
  @@ -62,2 +62,3 @@ class WalletReindexTest(BitcoinTestFramework):

  +        import time; time.sleep(1) # Wait for previous initload thread to exit fully
           # Reindex and wait for it to finish
  ```

  Before on master: Test fails
  After on this pull: Test passes

ACKs for top commit:
  rkrux:
    ACK fa30951af5 if this PR needs to be backported.

Tree-SHA512: 1e6599511e09b5b9ac4aed96a6b1b8239d5dc63b164fc0c163b6f9f5bc72c1c61f72ad8256a01875208d825af46d057c4d9de61758002f256388ddb324006bb5
2026-03-24 12:06:25 +08:00
Ava Chow
fbabe86190 Merge bitcoin/bitcoin#34870: wallet: feebumper, fix crash when combined bump fee is unavailable
6072a2a6a1 wallet: feebumper, fix crash when combined bump fee is unavailable (furszy)

Pull request description:

  When a large cluster of unconfirmed transactions exceeds the limit,
  `calculateCombinedBumpFee()` returns `std::nullopt`.

  Previously, we continued executing and the optional value was
  accessed unconditionally, leading to a `std::bad_optional_access`
  exception (https://en.cppreference.com/w/cpp/utility/optional/value.html).

  Fix this by returning early when the bumped fee is null.

  Note:
  This is a crash for the GUI, and an uncaught exception for the RPC
  `bumpfee` and `psbtbumpfee`.

ACKs for top commit:
  achow101:
    ACK 6072a2a6a1
  luke-jr:
    utACK 6072a2a6a1
  rkrux:
    crACK 6072a2a6a1 based on returning before accessing the null optional.

Tree-SHA512: f863ace1426b2e743e2281e5c624b523de7317c1f305f88f369e77d60005460e4af58b424bc784304fd1ac30a3bfa575137537ec334fa6e449c827daeb262a99
2026-03-23 17:51:23 -07:00
Ava Chow
696b5457c5 Merge bitcoin/bitcoin#34667: test: ensure FastWalletRescanFilter is correctly updated during scanning
92287ae753 test/wallet: ensure FastWalletRescanFilter is updated during scanning (Novo)

Pull request description:

  Part of https://github.com/bitcoin/bitcoin/pull/34400

  On master, the `wallet_fast_rescan.py` test will pass even if the fast rescan filters are not updated during wallet rescan. This PR improves the `wallet_fast_rescan.py` test so that this no longer happens. Testers can verify by applying this diff
  ```diff
  diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
  index 63dab29972..f7d6c5f84a 100644
  --- a/src/wallet/wallet.cpp
  +++ b/src/wallet/wallet.cpp
  @@ -1898,7 +1898,7 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc

           bool fetch_block{true};
           if (fast_rescan_filter) {
  -            fast_rescan_filter->UpdateIfNeeded();
  +            // fast_rescan_filter->UpdateIfNeeded();
               auto matches_block{fast_rescan_filter->MatchesBlock(block_hash)};
               if (matches_block.has_value()) {
                   if (*matches_block) {

  ```
  and running the `wallet_fast_rescan.py` test. The test will pass on master but fail on this PR.

ACKs for top commit:
  achow101:
    ACK 92287ae753
  Bortlesboat:
    re-ACK 92287ae753
  rkrux:
    tACK 92287ae
  ismaelsadeeq:
    Tested ACK 92287ae753

Tree-SHA512: bcd66db0be6604b084230fa3d3aa8d99f5a1a679a7a92592a5e8962abbcf35a14fb6883f25c9e8e6c4799893b774b1c6766876587417f35c4190562ef5ad39fb
2026-03-23 17:34:47 -07:00
Ava Chow
9a03ba1e3a Merge bitcoin/bitcoin#34888: wallet: fix amount computed as boolean in coin selection
0026b330c4 wallet: fix amount computed as boolean in coin selection (furszy)

Pull request description:

  Stumbled upon this tiny bug. This has been working by accident.

  The comparison is evaluated first, so `total_amount` ends up holding a boolean instead of the actual amount.
  It can be verified by adding the value to the returned error message and running the `wallet_create_tx.py`
  test.

  Note:
  I assume something like `-Wparentheses` in CI (or similar) should help us catching similar issues elsewhere.

ACKs for top commit:
  fjahr:
    utACK 0026b330c4
  achow101:
    ACK 0026b330c4
  andrewtoth:
    utACK 0026b330c4
  luke-jr:
    utACK 0026b330c4

Tree-SHA512: 289c1eb34e59caae0a9e6814a14e4a7ba72f26e3b26717bb3f9e60335c9c5efcebe7e5997f799752096cf91df416a82b8677a9900e5ec54b6d13921d4299be96
2026-03-23 17:05:30 -07:00
merge-script
1a1f584360 Merge bitcoin/bitcoin#29963: depends: Do not consider CC environment variable for detecting system
b149a28f6b depends: Do not consider `CC` environment variable when detecting system (Hennadii Stepanov)

Pull request description:

  On the master branch @ 3c88eac28e, consider the following commands in the `depends` subdirectory:
  ```sh
  $ make print-build HOST=i686-pc-linux-gnu CC="clang -m32"
  build=x86_64-pc-linux-gnu
  $ make print-host HOST=i686-pc-linux-gnu CC="clang -m32"
  host=i686-pc-linux-gnu
  ```
  The printed variable values are expected.

  However, switching the `CC` variable context from Makefile to the shell environment breaks expectations:
  ```sh
  $ CC="clang -m32" make print-build HOST=i686-pc-linux-gnu
  build=i686-pc-linux-gnu
  $ CC="clang -m32" make print-host HOST=i686-pc-linux-gnu
  host=i686-pc-linux-gnu
  ```

  This PR fixes this issue.

  #### UPDATE 2026-01-20

  On the master branch @ 7f5ebef56a:
  ```
  $ gmake print-build HOST=i686-pc-linux-gnu CC="clang -m32"
  build=i686-pc-linux-gnu
  $ gmake print-host HOST=i686-pc-linux-gnu CC="clang -m32"
  host=i686-pc-linux-gnu
  ```

ACKs for top commit:
  sedited:
    Re-ACK b149a28f6b
  ryanofsky:
    Code review ACK b149a28f6b. `env --unset` was replaced with `unset &&` since last review. I still think it could be better to write `CC=$(build_CC)` here even if `build_CC` may not be defined at this point (https://github.com/bitcoin/bitcoin/pull/29963#issuecomment-3774229317) because it makes intent of the code more obvious, but current PR is already an improvement

Tree-SHA512: bd498706ad46aab93192e21b7cc30c34a714c5f31601122752fc94416dc51846b8d4eaf5d1c3250ba64d4eadf3fd43c9f7f5d9e178a47ee2165474ac6833fa31
2026-03-23 14:57:19 +08:00
merge-script
28b93af19d Merge bitcoin/bitcoin#33414: tor: enable PoW defenses for automatically created hidden services
c68e3d2c57 doc: add release notes for Tor PoW defenses (Vasil Dimov)
4bae84c94a doc: add a hint to enable PoW defenses to manual hidden services (Vasil Dimov)
4c6798a3d3 tor: enable PoW defenses for automatically created hidden services (Vasil Dimov)
fb993f7604 tor, fuzz: reuse constants instead of duplicating (Vasil Dimov)

Pull request description:

  Enable [PoW defenses](https://tpo.pages.torproject.net/onion-services/ecosystem/technology/security/pow/) for hidden services that we create via Tor Control using the [`ADD_ONION` command](https://spec.torproject.org/control-spec/commands.html#add_onion).

  The ability to do that has been added in [tor-0.4.9.2-alpha](02c1804446). Previous versions return a syntax error to the `ADD_ONION` command with `PoWDefensesEnabled=1`, so the approach here is to try with PoW and if we get syntax error, then retry without PoW.

  Also update `doc/tor.md` with a hint on enabling PoW on manually configured Tor hidden services.

ACKs for top commit:
  willcl-ark:
    ACK c68e3d2c57
  fjahr:
    tACK c68e3d2c57
  sedited:
    ACK c68e3d2c57

Tree-SHA512: 56f57bc770b89389c35a4c0bc2a28804d17b1479ecd4d9b764695d6c9d2994425aee759e71658d7b57088bbe43ce90b94fb972f66d79ef903e0c1a4d6c4562f3
2026-03-23 14:54:47 +08:00
Anthony Towns
8d2f06853a sync: Use StdMutex for thread safety annotations 2026-03-23 15:13:45 +10:00
Anthony Towns
cbc231ed8e scripted-diff: logging: Switch from StdLockGuard to STDLOCK
-BEGIN VERIFY SCRIPT-
sed -i 's/StdLockGuard scoped_lock(\(.*\));/STDLOCK(\1);/' src/logging.h src/logging.cpp
-END VERIFY SCRIPT-
2026-03-23 15:08:05 +10:00
Anthony Towns
f808786f48 logging: Add missing thread safety annotations 2026-03-23 15:05:06 +10:00
Anthony Towns
e196cf26e0 util/stdmutex.h: Add STDLOCK() and improve annotation checking for StdMutex
StdLockGuard and clang's thread safety annotations did not ensure that
the lock it was taking was not already held. Add a STDLOCK() macro which
uses an annotated StdMutex::CheckNotHeld() function to correct that.
2026-03-23 15:01:57 +10:00
merge-script
a703c70bb8 Merge bitcoin/bitcoin#34589: ci: Temporarily use clang in valgrind tasks
fa70b9ebaa ci: Temporarily use clang in valgrind tasks (MarcoFalke)
faf3ef4ee7 ci: Clarify why valgrind task has gui disabled (MarcoFalke)
fadb77169b test: Scale feature_dbcrash.py timeout with factor (MarcoFalke)

Pull request description:

  valgrind currently does not work on GCC compiled executables, due to an upstream bug. https://bugs.kde.org/show_bug.cgi?id=472329

  So temporarily switch to clang, so that a long term solution can be figured out in the meantime.

ACKs for top commit:
  l0rinc:
    ACK fa70b9ebaa
  fanquake:
    ACK fa70b9ebaa - also checked that it doesn't currently work under aarch64.

Tree-SHA512: 2e7c7a709311efa7bf29c3f9b1db60886b189b2d2bfebb516062163d65f0d7e8de3b6fc21c94cd62f6bd7e786e9c36fba55c4bae956b849851eb8b08e772c03e
2026-03-23 12:35:14 +08:00
merge-script
cdaf2f20ae Merge bitcoin/bitcoin#34850: depends: Remove no longer necessary dsymutil
578525d31d depends: Remove no longer necessary `dsymutil` (Hennadii Stepanov)

Pull request description:

  I can't see where `dsymutil` is used. For example, a shared library under LTO builds fine:
  ```
  cmake -B build --toolchain depends/arm64-apple-darwin/toolchain.cmake -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DBUILD_KERNEL_LIB=ON -DBUILD_SHARED_LIBS=ON
  cmake --build build -t libbitcoinkernel
  ```

ACKs for top commit:
  fanquake:
    ACK 578525d31d

Tree-SHA512: 41e7601e26f639383bfa78ceb97e45d03e6cf098cf636bc4f3274360516bb78753aacfd89c8541b38ee4f39cbbf7c7b7a6eb8dc9a653f4438392cd61678e80ce
2026-03-23 11:26:01 +08:00
merge-script
3d1b7d0f6a Merge bitcoin/bitcoin#34639: iwyu: Document or remove some pragma: export and other improvements
0fe6fccec2 doc: Document rationale for using `IWYU pragma: export` (Hennadii Stepanov)
cfa3b10d50 iwyu, doc: Document `IWYU pragma: export` for `<logging/categories.h>` (Hennadii Stepanov)
015bea05e6 iwyu, doc: Document `IWYU pragma: export` for `<chrono>` (Hennadii Stepanov)
48bfcfedec iwyu, doc: Document `IWYU pragma: export` for `<threadsafety.h>` (Hennadii Stepanov)
179abb387f refactor: Move `StdMutex` to its own header (Hennadii Stepanov)
6d2952c3c3 serialize: Add missing `<span>` header (Hennadii Stepanov)

Pull request description:

  This PR is a prerequisite for https://github.com/bitcoin/bitcoin/pull/34448. It was split into a separate PR to limit the scope and minimize potential merge conflicts.

  The first commit improves the accuracy of IWYU suggestions within our heavily templated code. Note that, for now, the `serialize.h` header itself is excluded from IWYU inspection because it lacks a corresponding source file.

  The remaining commits follow the Developer Notes [guidance](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#using-iwyu):
  > Use `IWYU pragma: export` very sparingly, as this enforces transitive inclusion of headers and undermines the specific purpose of IWYU.

ACKs for top commit:
  maflcko:
    review ACK 0fe6fccec2 👤
  ajtowns:
    utACK 0fe6fccec2

Tree-SHA512: dc2d4e3ff78b9707a1a26cb9b1c0a456de0d33c59e773bbf692344c2fceaff8936317479c5e898038f29134bc0e5d9d1ef7350e53512dd8e262f46ede578c4f9
2026-03-23 11:17:13 +08:00
merge-script
559df68240 Merge bitcoin/bitcoin#34878: depends: Fix cross-compiling on macOS for Windows
7a9304f887 depends: Fix cross-compiling on macOS for Windows (Hennadii Stepanov)

Pull request description:

  1. Use `build_os` instead of `host_os` for native packages.

  2. `XCODE_VERSION` is available only for `darwin` hosts. Therefore, simply disable the Xcode version check for `native_qt`.

  Fixes https://github.com/bitcoin/bitcoin/issues/34874.

ACKs for top commit:
  fanquake:
    ACK 7a9304f887

Tree-SHA512: ef3349de19f3cdb6f445d44f8650815ded5dbe359faafc02941b2f2f0296905aaaac67a4916372b17de58bebabcbcdcbc21af6fe255ebb8f4cdfab00ff257602
2026-03-23 07:45:38 +08:00
Hennadii Stepanov
999c42484f Merge bitcoin-core/gui#815: Bugfix on TransactionsView - Disable if privacy mode is set during wallet selection
0dc337f73d gui: Fix TransactionsView on setCurrentWallet (pablomartin4btc)

Pull request description:

  <details>
  <summary>Currenlty on <code>master</code>, when the "mask values" checkbox is ticked if the user selects a different wallet, the history action is enable and if the user clicks on it can see all the transactions in the transaction view.</summary>

  ![Peek 2024-04-09 17-37](https://github.com/bitcoin-core/gui/assets/110166421/d8e2fdd1-aaa6-4506-acde-51fa45a74910)

  </details>
  <details>
  <summary>This PR fixes it.</summary>

  ![Peek 2024-04-09 17-45](https://github.com/bitcoin-core/gui/assets/110166421/78c30dc5-42a6-4829-981d-6b9aaa03f014)

  </details>

  Note for maintainers: this needs to be backported to 25.x and 26.x.

ACKs for top commit:
  hebasto:
    ACK 0dc337f73d, tested on Fedora 43.

Tree-SHA512: 54581546917f87b4c1db0ff1eaa1962ee6eb078285dbb205b4c8d027c3e350f3dc46409b376948c10e668f9487b7a5a70bab0dff5faf510deab1a54452f7f0e5
2026-03-22 19:41:04 +00:00
Hennadii Stepanov
0b489886f8 ci: Upgrade IWYU to 0.26 compatible with Clang 22
Additionally, removes mapping workarounds for issues that have been
fixed upstream.
2026-03-22 17:12:08 +00:00
furszy
0026b330c4 wallet: fix amount computed as boolean in coin selection
The comparison is evaluated before the assignment, so total_amount
ends up holding a boolean instead of the actual amount:
total_amount = (a - b < c)
which is not what we want here. This has been working by accident.
2026-03-21 21:13:01 -04:00
HouseOfHufflepuff
3136559923 doc: Note that generateblock does not collect transaction fees
The generateblock RPC creates blocks where the coinbase only includes
the block subsidy, omitting transaction fees. Document this behavior
in the RPC help text to avoid confusion.

refs #31684
2026-03-21 17:03:44 -07:00
Ava Chow
483769c046 Merge bitcoin/bitcoin#26201: Remove Taproot BIP 9 deployment
74f71c5054 Remove Taproot activation height (Sjors Provoost)

Pull request description:

  Drop `DEPLOYMENT_TAPROOT` from `consensus.vDeployments`.

  Now that the commit (7c08d81e11) which changes taproot to be enforced for all blocks is included in v24.0, it seems a good time to remove no longer needed non-consensus code.

  Clarify what is considered a `BuriedDeployment`.

  We drop taproot from `getdeploymentinfo` RPC, rather than mark it as `buried`, because this is not a buried deployment in the sense of [BIP 90](https://github.com/bitcoin/bips/blob/master/bip-0090.mediawiki). This is because the activation height has been completely removed from the code, unlike the hardcoded `DEPLOYMENT_SEGWIT` height which is still relied on.[^1]

  See discussion in #24737 and #26162.

  [^1]: `DEPLOYMENT_SEGWIT` is used in `IsBlockMutated` to determine if witness data is allowed, it's used for [BIP147](https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki), to trigger `NeedsRedownload()` for users who upgraded after a decade, and for a few other things.

ACKs for top commit:
  ajtowns:
    reACK 74f71c5054
  achow101:
    ACK 74f71c5054
  sedited:
    Re-ACK 74f71c5054
  darosior:
    utACK 74f71c5054

Tree-SHA512: 217e0ee2e144ccfb04cf012f45b75d08f8541287a5531bd18aa81e38bad2f38d28b772137f471c46b63875840ec044cb61a2a832e3a9e89a6183e8ab36b1b9c9
2026-03-20 15:22:24 -07:00
Hennadii Stepanov
2d5cedfe12 ci: Switch to VS-vendored vcpkg instance
The GHA Windows image contains two vcpkg installations: one vendored by
VS (`VCPKG_ROOT`) and an independent one (`VCPKG_INSTALLATION_ROOT`).
Our build documentation recommends using the VS-vendored instance to
minimize user effort. While this option previously failed to build in
the CI, forcing us to use the independent installation, it is now
working correctly.

This change removes the no-longer-needed workaround.
2026-03-20 20:44:15 +00:00
Enoch Azariah
ad75b147b5 test: scale IPC mining wait timeouts by timeout_factor
The IPC mining tests (interface_ipc_mining.py) currently use
hardcoded timeouts (e.g., 1000ms, 60000ms) for operations like
waitTipChanged and waiting for block templates. In heavily
loaded CI environments, such as those running sanitizers with
high parallelism, these hardcoded timeouts can be too short,
leading to spurious test failures and brittleness.

This commit multiplies these timeout variables by the test
suite's global `self.options.timeout_factor`. This ensures that
the IPC wait conditions scale appropriately when the test suite
is run with a higher timeout factor, making the tests robust
against slow execution environments.

Addresses CI brittleness observed in bitcoin-core/libmultiprocess#253.
2026-03-20 19:55:28 +01:00
Enoch Azariah
e7a918b69a test: verify IPC error handling for invalid coinbase
Add a test case to interface_ipc_mining.py to verify that the IPC
server correctly handles and reports serialization errors rather than
crashing the node.

This covers the scenario where submitSolution is called with data
that cannot be deserialized, as discussed in #33341

Also introduces the assert_capnp_failed helper in ipc_util.py to
cleanly handle macOS-specific Cap'n Proto exception strings, and
refactors an existing block weight test to use it.
2026-03-20 19:55:28 +01:00