Commit Graph

50318 Commits

Author SHA1 Message Date
Daniel Pfeifer
654a4cf5e6 cmake: Use builtin support for .manifest files
CMake ignores .rc and .manifest files when not building for WIN32.
2026-08-10 16:16:07 +02:00
Daniel Pfeifer
8f695379f3 cmake: Unconditionally set WIN32_EXECUTABLE target property
The property only has an effect when building for WIN32.
Checking for WIN32 before setting the property is redundant.
2026-08-10 16:16:06 +02:00
Matthew Zipkin
507e528e84 http: reuse HTTPHeaders to parse chunked trailer
Chunked transfer trailers are just headers that are included
at the end of the request. We can parse and validate them with code
we already use to read headers. In a future commit we will also
be able to use one MAX_HEADERS_SIZE limit to cover both sections.

Even though we parse and validate, we ignore these data.
2026-08-10 10:14:58 -04:00
Matthew Zipkin
902d8908c9 http: only read one HTTPRequest at a time per client 2026-08-10 10:14:58 -04:00
cyb3ralbert
a7b0b5084a doc: fix dead link in txrequest.h 2026-08-10 16:02:20 +03:00
Hennadii Stepanov
1d386c250f Merge bitcoin/bitcoin#35941: doc: remove mention of ::wsystem
57246934e7 doc: remove mention of wsystem (fanquake)

Pull request description:

  Followup to #35704.

ACKs for top commit:
  hebasto:
    ACK 57246934e7.

Tree-SHA512: a9aa6474d69323375e99c5780bb635b3d92b8dd02fb399329ae14aca4eff6fc160215d1b64deea23642de9aacaefe47970696120f4cdf931605bef9c4b5bcd89
2026-08-10 11:56:44 +01:00
fanquake
57246934e7 doc: remove mention of wsystem
Followup to #35704.
2026-08-10 11:28:14 +01:00
merge-script
5973e07588 Merge bitcoin/bitcoin#35937: test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt
fad9ab714b test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt (MarcoFalke)

Pull request description:

  (see commit msg for rationale and background).

  To test, one should be able to use the cmake options such as `-DCMAKE_C_COMPILER='clang' -DCMAKE_CXX_COMPILER='clang++' --preset=dev-mode -DBUILD_GUI=ON  -DSANITIZERS=address` on e.g. Fedora. Then see that the current suppressions file is insufficient, and also confirm that `print_suppressions=0` is required.

ACKs for top commit:
  fanquake:
    ACK fad9ab714b

Tree-SHA512: 1830b4aeb072fa18b76522a124a268073675da14255e469a6d86ee5de52cd08d5613d0c3bd8a66465b0c4636345c9e967923cd1fb516906a58b614fe0e700033
2026-08-10 10:22:24 +01:00
merge-script
b6bd573eb9 Merge bitcoin/bitcoin#34794: rest: add Cache-Control headers to REST responses
75f5851927 doc: add release note for REST cache-control headers (w0xlt)
bbe21ac29f doc: document REST cache-control defaults (w0xlt)
862a179556 http: add no-store to dispatcher-generated error responses (w0xlt)
acf45c44c0 rest: add Cache-Control headers to REST responses (w0xlt)

Pull request description:

  This PR adds explicit Cache-Control headers to REST responses.

  The policy is:

  - Immutable data gets: `Cache-Control: public, immutable, max-age=86400`
  - Mutable, node-local, and error responses get: `Cache-Control: no-store`

  Important details:

  - `/block` and `/block/notxdetails` bin/hex, `/blockpart`, `/blockfilter`, `/spenttxouts`, and `/deploymentinfo/<blockhash>.json` are treated as immutable.
  - `/block` and `/block/notxdetails` JSON, all `/tx` formats, `/headers`, `/blockfilterheaders`, `/blockhashbyheight`, `/chaininfo`, `/mempool`, `/getutxos`, and `/deploymentinfo.json` are no-store.
  - REST errors and HTTP dispatcher-generated errors are no-store.
  - Unmatched `/rest` 404s also return no-store, including paths like `/rest/tx`, `/rest/does-not-exist`, and `/rest?x=1`.

  Tests were added in `interface_rest.py` to cover successful responses, behavior across a newly mined block, REST errors, and unmatched REST 404s.

  Docs were added to `REST-interface.md`, including guidance for overriding the defaults in a reverse proxy or CDN.

  Closes #33809

ACKs for top commit:
  stickies-v:
    re-ACK 75f5851927
  pinheadmz:
    ACK 75f5851927
  sedited:
    ACK 75f5851927

Tree-SHA512: 292ccd06ddfc9272c17fa720ce1ea8bb05462337af6460488f70003d3daf31fcf262e68c264522a911bba65ae2b25fc88a1fd422e5664583daf64070231cb062
2026-08-10 10:21:55 +01:00
winterrdog
d055a3ab10 test: verify disallowed RPC clients are rejected upon accept()
it adds a unit test verifying that clients not permitted by
`-rpcallowip` are rejected immediately after `accept()`, before any of
their request bytes are read from the socket.

Co-authored-by: w0xlt <94266259+w0xlt@users.noreply.github.com>
Co-authored-by: pinheadmz <pinheadmz@pm.me>
2026-08-09 11:30:04 +03:00
merge-script
128456b62d Merge bitcoin/bitcoin#35260: doc: clarify test placement guidance
db74d3390a doc: clarify test placement guidance (Lőrinc)

Pull request description:

  **Problem:** `doc/developer-notes.md` does not explain where test coverage belongs in a commit stack, especially when existing behavior is uncovered or a refactor depends on uncovered behavior.
  This has led to review questions about whether tests should record current behavior before a change or be added with the final behavior, for example in [#35251](https://github.com/bitcoin/bitcoin/pull/35251#discussion_r3217842286) and [#31212](https://github.com/bitcoin/bitcoin/pull/31212#discussion_r1854105033).

  **Fix:** Add a `General Testing` section under the development guidelines explaining when to use automated tests or a manual testing guide and when behavior-preserving work is easy to validate without new tests.
  Add a `Commit Structure for Tests` subsection distinguishing existing coverage, simple uncovered changes, non-trivial changes to uncovered behavior, and non-trivial refactors whose preserved behavior is not covered.
  Replace the blanket `CONTRIBUTING.md` rule with a link to the detailed guidance.

ACKs for top commit:
  maflcko:
    lgtm ACK db74d3390a
  pablomartin4btc:
    ACK db74d3390a
  LarryRuane:
    ACK db74d3390a
  w0xlt:
    ACK db74d3390a
  sedited:
    ACK db74d3390a

Tree-SHA512: a8f3629b9bd59d20b1bc597d1b43fbb1d3cca9f500a8d79a7b62b417cd6b91c7b92cf6e32946171c76eb54e882a58eac94045753d8bb5899acdb48a7d1ccb2bd
2026-08-08 15:00:53 +02:00
MarcoFalke
fad9ab714b test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt
The print_suppressions=0 is required to avoid a CI failure when the
suppressions were used. E.g:

```
$ LSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/lsan:print_suppressions=1" ./bld-cmake/test/functional/interface_gui.py
2026-08-08T10:53:45.864160Z TestFramework (INFO): PRNG seed is: 8358096631255493262
2026-08-08T10:53:45.914748Z TestFramework (INFO): Initializing test directory /tmp/bitcoin_func_test_5zx5343v
2026-08-08T10:53:47.029997Z TestFramework (INFO): Test that bitcoin-gui starts up and can be stopped via RPC
2026-08-08T10:53:47.431761Z TestFramework (ERROR): Unexpected exception:
  File "./test/functional/test_framework/test_node.py", line 534, in is_node_stopped
    raise AssertionError("Unexpected stderr {} != {}".format(stderr, expected_stderr))
AssertionError: Unexpected stderr -----------------------------------------------------
Suppressions used:
  count      bytes template
      2        181 bitcoin-qt
----------------------------------------------------- !=
```

The general suppression of the qt executables is required to avoid CI
failures for i386 builds. E.g:

```
 test  2026-08-05T08:54:08.370427Z TestFramework (ERROR): Unexpected exception:
      Traceback (most recent call last):
        File "/ci_container_base/ci/scratch_ ₿🧪_/build-i686-pc-linux-gnu/test/functional/interface_gui.py", line 34, in run_test
          self.stop_node(0)
          ~~~~~~~~~~~~~~^^^
        File "/ci_container_base/test/functional/test_framework/test_node.py", line 525, in is_node_stopped
          assert return_code in expected_ret_code, self._node_msg(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      AssertionError: [node 0] Node returned unexpected exit code (1) vs ((0,)) when stopping

 node0 stderr =================================================================
==73449==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 386 byte(s) in 17 object(s) allocated from:
    #0 0x5df28a2d in malloc (/ci_container_base/ci/scratch_ ₿🧪_/build-i686-pc-linux-gnu/bin/bitcoin-qt+0x1d0da2d) (BuildId: 496a5df531df278fe395724ae917f266331b3f81)
    #1 0xee03c1d1  (<unknown module>)

Indirect leak of 12 byte(s) in 1 object(s) allocated from:
    #0 0x5df28a2d in malloc (/ci_container_base/ci/scratch_ ₿🧪_/build-i686-pc-linux-gnu/bin/bitcoin-qt+0x1d0da2d) (BuildId: 496a5df531df278fe395724ae917f266331b3f81)
    #1 0xee03c1d1  (<unknown module>)

SUMMARY: AddressSanitizer: 398 byte(s) leaked in 18 allocation(s).
```
2026-08-08 12:58:16 +02:00
merge-script
05a7c470d2 Merge bitcoin/bitcoin#35822: fuzz: reset SOCKS5 interrupt between inputs
77440814bf fuzz: reset SOCKS5 interrupt between inputs (Hao Xu)

Pull request description:

  Reset `g_socks5_interrupt` before each `socks5` fuzz input.

  `CThreadInterrupt` remains interrupted until explicitly reset. Previously,
  inputs executed after the first input setting the interrupt flag inherited its
  state. As corpus inputs are shuffled between all-input coverage runs, the
  number of affected inputs and the resulting coverage counts could differ.

  Tested with the complete 91-input `socks5` corpus. The all-input deterministic
  coverage check passes.

ACKs for top commit:
  nervana21:
    tACK 77440814bf
  maflcko:
    lgtm ACK 77440814bf
  sedited:
    ACK 77440814bf

Tree-SHA512: d1b2b33661f9796628fd7eb1f4ddb212b07110ebbfa7516e305f8aa21bde7898b4bf8fc6f6570df22f8cf6380f1287cb9b6135683ad49b2bdbe83ad9a1af23b9
2026-08-08 12:45:57 +02:00
Lőrinc
73a94b4545 psbt: avoid aborting on invalid MuSig2 derivations
`SignMuSig2()` derives MuSig2 aggregate keys from metadata supplied by a PSBT.
A hardened child cannot be publicly derived, and a path that produces another key does not identify the aggregate being signed.

Check each child index as `uint32_t` immediately before deriving that child, preserving the hardened bit without an implementation-defined conversion to `int`.
Return failure if a child index is hardened, and skip a path if it derives to a different key so another aggregate can still be tried.
The descriptor parser enforces the same requirement for MuSig2 aggregate derivations.

Co-authored-by: Anthropic Security <security-cvd@anthropic.com>
Co-authored-by: Evan Sultanik <evan.sultanik@trailofbits.com>
Co-authored-by: Ava Chow <github@achow101.com>
2026-08-07 17:35:41 -07:00
Lőrinc
e3d1e75a51 test: characterize MuSig2 derivation aborts
Exercise `analyzepsbt` and `finalizepsbt` with mismatched and hardened MuSig2 aggregate derivation paths, restarting the node after each abort so the current behavior remains executable.
2026-08-07 12:43:19 -07:00
merge-script
1be0b46297 Merge bitcoin/bitcoin#35898: rpc: fix mempool entry vsize docs
a3ebf8ab60 rpc: fix mempool entry vsize docs (Musa Haruna)

Pull request description:

  Follow-up to [#32800](https://github.com/bitcoin/bitcoin/pull/32800#discussion_r3672286132).

  This fixes the RPC help text for `MempoolEntryDescription()`. These docs are used by mempool-entry RPCs such as `getmempoolentry`, verbose `getrawmempool`, `getmempoolancestors`, and `getmempooldescendants`.

  The vsize fields in those results describe transactions already in the mempool, so they are always returned and there is no `allowed` field. This removes the incorrect optional markers and the `testmempoolaccept`-specific “only present when allowed is true” wording.

  No behavior change.

ACKs for top commit:
  sedited:
    ACK a3ebf8ab60

Tree-SHA512: 60574d120d8b85944cde00ebb151c0e847c25000d5ea822ee4d624c723626a1c4db187fa8d09f2fe4405cccb58492c8ac7f754f3176f5adf85008dfb4dd96f14
2026-08-07 16:18:04 +01:00
merge-script
5f4d5626e7 Merge bitcoin/bitcoin#35908: doc: Update NetBSD Build Guide
f32685315c doc: Install `pkgconf` to find `capnproto` on NetBSD (Hennadii Stepanov)
5964c7229f doc: Switch `pkg-config` package to modern `pkgconf` on NetBSD (Hennadii Stepanov)
9b85c9814d doc: Drop GCC upgrade instructions for NetBSD (Hennadii Stepanov)

Pull request description:

  This PR updates the "NetBSD Build Guide" following the latest release 11.0. See commit messages for more details.

ACKs for top commit:
  fanquake:
    ACK f32685315c

Tree-SHA512: 1138038715957951d79c838a1f06dfe5d641684901f451a0937a5df16c03c01f76443cc4761b6258cb93dc4ba496fe99129deb45dd9ea3d3a56c9762813a3d76
2026-08-07 16:13:11 +01:00
merge-script
8397e09e6b Merge bitcoin/bitcoin#35928: doc: mention -DWITH_ZMQ=ON in macOS build guide
222855ed11 doc: mention -DWITH_ZMQ=ON in macOS build guide (cyb3ralbert)

Pull request description:

  `doc/build-osx.md` currently says:

  > Support for ZMQ notifications requires the following dependency.

  The `zeromq` dependency is covered, but the `-DWITH_ZMQ=ON` CMake option is not
  mentioned anywhere in that section. `WITH_ZMQ` defaults to `OFF`, so following the
  guide as written results in a build with ZMQ disabled, even though the user completed
  the ZMQ section. I verified this at the configure step on macOS: with `zeromq`
  installed and no flag, CMake reports `ZeroMQ ... OFF`; with `-DWITH_ZMQ=ON` it
  reports `ON`.

  The same wording was added to the BSD build guides in #35283, but `doc/build-osx.md`
  was not included.

  Docs-only change. No tests run.

ACKs for top commit:
  hebasto:
    ACK 222855ed11.

Tree-SHA512: b7e7114e18ef10216780f6b549516c79bff67d7a909c5167f9c48cc8d2ef0b10f1524c7656452308914e5cd86425588f9f2dac07d4eeb2fe1e624f5478453d73
2026-08-07 16:03:31 +01:00
merge-script
4b4e63f282 Merge bitcoin/bitcoin#35704: windows: remove deprecated codecvt via UTF-8 narrow APIs
6b6d77cc84 windows: remove deprecated codecvt via UTF-8 narrow APIs (kevkevinpal)

Pull request description:

  Since #32380 the Windows process code page is UTF-8, so narrow
  APIs accept UTF-8 directly. Drop wstring_convert/codecvt and the
  related wide process calls (`_wsystem`, `_wexecvp`, `CreateProcessW`)
  in favor of `::system`, `_execvp`, and `CreateProcess`.

  This should be fine to remove since Bitcoin Core is now on C++20

ACKs for top commit:
  hebasto:
    re-ACK 6b6d77cc84, only rebased since my [recent](https://github.com/bitcoin/bitcoin/pull/35704#pullrequestreview-4845891494) review.
  hodlinator:
    ACK 6b6d77cc84

Tree-SHA512: dd8039e4d2ccf5d04e52d845ceed2b9ce6b2c53ee23680e502eae6b4f07228e42ae602ca5079c42615ec7be61741fd77781e61567adcc6f03e960ce5b55b1d9a
2026-08-07 15:54:18 +01:00
Hennadii Stepanov
67fee5bf44 ci: Check DLL imports of cross-built bitcoind.exe
Run `dumpbin.exe /imports` on the cross-built `bitcoind.exe` in the
"Windows, test cross-built" jobs to list the imported DLLs and to
ensure the executable is linked against the expected C runtime.
2026-08-07 15:37:49 +01:00
pablomartin4btc
089c883c55 test: Add coverage for listreceivedby* excluding "send" addresses
Regression test for #16159: an address labeled via setlabel by a
wallet that doesn't own it is assigned a "send" purpose and must not
appear in listreceivedbyaddress/listreceivedbylabel results, even
with include_empty=true.

Co-authored-by: Andreas Kouloumos <kouloumosa@gmail.com>
2026-08-07 10:06:56 -03:00
pablomartin4btc
873c054805 wallet: Exclude non-owned addresses from listreceivedby*
listreceivedbyaddress/listreceivedbylabel with include_empty=true
walked the full address book and returned every entry with no
matching mapTally record, including addresses with a "send" purpose
(foreign addresses labeled via setlabel, the GUI, or
addmultisigaddress) that the wallet never received funds to and does
not own.

Filter these out via IsMine() rather than the address book's
"purpose" field, since purpose is set inconsistently across several
code paths and IsMine() is the same check mapTally itself is already
built from.

Fixes #16159.

Co-authored-by: Brandon Odiwuor <brandon.odiwuor@gmail.com>
2026-08-07 10:06:56 -03:00
Sjors Provoost
c3945bfd2b doc: use derivehdkey in multisig tutorial
Use derivehdkey instead of extracting each participant xpub
from  the listdescriptors output.

Additionally use the new <0;1> descriptor syntax.
2026-08-07 15:02:18 +02:00
Sjors Provoost
3662e33669 test: use derivehdkey in M-of-N multisig demo
Use derivehdkey instead of extracting each participant xpub (and
derivation info) from  the listdescriptors output.

Additionally use the new <0;1> descriptor syntax.

Finally this commits adds a few debug log lines, and expand the
explanation for why we use m/44h/1h/0h.
2026-08-07 15:02:18 +02:00
Sjors Provoost
d9570f0838 rpc: add derivehdkey
Add an UnusedKey filter to GetHDPubKeys() so the new RPC can prefer
unused(KEY) descriptors before falling back to active descriptors.

Co-authored-by: w0xlt <94266259+w0xlt@users.noreply.github.com>
2026-08-07 15:02:18 +02:00
Sjors Provoost
62da9f9614 wallet: add GetExtKey helper
Reconstruct a descriptor's extended private key from its xpub by looking
up the corresponding private key. This is the extended-key analog of
GetKey() and is used by the derivehdkey RPC in the following commit.
2026-08-07 15:02:18 +02:00
cyb3ralbert
222855ed11 doc: mention -DWITH_ZMQ=ON in macOS build guide
WITH_ZMQ defaults to OFF in CMakeLists.txt with no macOS exception.
2026-08-07 15:54:07 +03:00
Sjors Provoost
aaf1548475 wallet: generalize GetActiveHDPubKeys helper
GetHDPubKeys() centralizes the descriptor xpub lookup used by gethdkeys and
createwalletdescriptor, and by the derivehdkey RPC added in a later commit.
The HDKeyFilter argument serves gethdkeys' active_only mode (Active vs All)
and createwalletdescriptor's active descriptor selection.

No behavior change, except the dynamic_cast now uses Assert() instead of
gethdkeys' CHECK_NONFATAL, since it is not a recoverable input.
2026-08-07 14:44:17 +02:00
Sjors Provoost
3821452c4a refactor: add hardened derivation helper 2026-08-07 14:44:17 +02:00
Sjors Provoost
0ab61caafd rpc: ParsePathBIP32 helper 2026-08-07 14:44:17 +02:00
Sjors Provoost
e36c4b76e1 util: reject out-of-range BIP32 keypath indices
ParseHDKeypath() parsed each path element with ToIntegral<uint32_t>, so
a bare decimal >= 2^31 (e.g. "m/2147483648" == 0x80000000) was silently
treated as "m/0h".

This commit rejects such overflow instead.
2026-08-07 14:44:17 +02:00
Sjors Provoost
ba78c31a00 fuzz: check ParseHDKeypath/WriteHDKeypath round-trip 2026-08-07 14:44:17 +02:00
Sjors Provoost
8cce969085 Have ParseHDKeypath handle h derivation marker 2026-08-07 14:44:17 +02:00
Sjors Provoost
fc53077762 test: move parse_hd_keypath test to bip32_tests
ParseHDKeypath() lives in util/bip32, so its unit test belongs in
bip32_tests rather than psbt_wallet_tests. Pure move, no changes to the
test itself; subsequent commits extend it in its new home.
2026-08-07 14:44:17 +02:00
Sjors Provoost
dab525eb77 key: add DeriveExtKey() helper
Co-authored-by: w0xlt <94266259+w0xlt@users.noreply.github.com>
2026-08-07 14:44:16 +02:00
merge-script
71c06c5cbc Merge bitcoin/bitcoin#35830: fees: Return false for incompatible fee estimates
b9d573e4a9 fees: Return false for incompatible fee estimates (Hao Xu)

Pull request description:

  policy_estimator_io deliberately reuses a CBlockPolicyEstimator because
  constructing one for every fuzz input severely reduces throughput.
  However, Read() returns true for an incompatible old fee estimates file
  without replacing the estimator state. The target then calls Write()
  with state loaded by a previous input, making coverage depend on corpus
  order.

  Return false for incompatible files so the target skips Write() when no
  state was loaded. This keeps the estimator reuse optimization instead of
  resetting the expensive object before every fuzz input.

  For the in-tree production caller, incompatible files remain non-fatal
  and the estimator still starts from its default state. Read() now
  reports failure, so startup emits one additional non-fatal warning.
  Node startup and estimator state are unchanged, as is RPC behavior.

ACKs for top commit:
  maflcko:
    review ACK b9d573e4a9 📩
  sedited:
    ACK b9d573e4a9

Tree-SHA512: d6ec5986122716ad2c6fb5305626aec71b4b416242791547a12f86fb210d768c87fcb9615fd50259908656766bbe085d55ae90e1d72eaee24d438eecfd9c6dd4
2026-08-07 14:27:00 +02:00
merge-script
55dfc24414 Merge bitcoin/bitcoin#35915: Release: Prepare "Open Transifex translations for v32.0" step
97abf95f48 qt: Update the `src/qt/locale/bitcoin_en.ts` translation source file (Hennadii Stepanov)

Pull request description:

  This PR follows our [Release Process](4df077d7cd/doc/release-process.md).

  This step is required to open Transifex translations for v32.0, as scheduled in https://github.com/bitcoin/bitcoin/issues/35122.

  For reference, see a previous similar PR in https://github.com/bitcoin/bitcoin/pull/34525.

  **Note for reviewers:**

  The Transifex slug was already updated in https://github.com/bitcoin/bitcoin/pull/34808.

ACKs for top commit:
  fanquake:
    ACK 97abf95f48

Tree-SHA512: 0ddddf7ccd89efeb419c59e0189527b52ee68c31bf108c432674a747d2a6e21f84a2bb372c212a1057083202e56a6a3dba04a632174aea5eaca84f019a6c81d7
2026-08-07 11:15:11 +01:00
merge-script
f11dc6170e Merge bitcoin/bitcoin#35482: fuzz: exercise the transaction-handling path in process_message(s)
87b080fe2b fuzz: reset the reused mempool in process_message(s) (Hao Xu)
d522fd3196 fuzz: prepare deterministic mempool rebuilds (Hao Xu)
b11456386b fuzz: let the test input toggle IBD in the p2p fuzz targets (Hao Xu)
2a29cee684 test: add helper to reset chainman and mempool (Hao Xu)
2a4ef42d34 fuzz: share a single FakeNodeClock in the chainman-resetting fuzz targets (Hao Xu)

Pull request description:

  ## Problem

  `process_message` and `process_messages` keep the node in IBD (`ResetIbd()`) and
  mine their coinbases with the default bare-`OP_TRUE` output script. As a result
  `net_processing` returns early at the `IsInitialBlockDownload()` check and never
  reaches the transaction-handling path; and even if it did, a tx spending a
  bare-`OP_TRUE` coinbase is rejected as `NONSTANDARD` by
  `ValidateInputsStandardness`. The reused mempool therefore always stays empty and
  that path is never exercised.

  ## Changes

  Both targets now get the same treatment:

  1. **Toggle IBD from the test input** — a `bool` decides whether to also
     `JumpOutOfIbd()`, exercising both the IBD and non-IBD paths. In
     `process_message` it is consumed last, so existing corpus entries read `false`
     and are unchanged. In `process_messages` the messages run in a loop, so the
     bool must be consumed *first* (see the corpus note below).
  2. **Use a spendable `P2WSH_OP_TRUE` coinbase** — both anyone-can-spend (an
     `OP_TRUE` witness, no signature) and a standard witness output, so a fuzz-built
     tx spending a mature coinbase can actually be accepted into the mempool.
  3. **Reset the rng before rebuilding (preparation)** — rebuilding the chainman
     (and, in the next commit, the mempool) consumes the global PRNG. Reset it with
     `MakeRandDeterministicDANGEROUS()` first so the rebuild is deterministic across
     iterations. Mirrors the `cmpctblock` harness.
  4. **Reset the reused mempool** — now that the mempool can become non-empty,
     rebuild it together with the chainman in `ResetChainmanAndMempool()` when the
     block index grew or the mempool changed. A dirty mempool is detected by its
     sequence number rather than its size, since a tx can be added and removed
     within one iteration (leaving the size unchanged).

  ## Corpus note

  ~~In `process_messages` the IBD bool is consumed before the message loop (first
  integral read), which shifts the `FuzzedDataProvider` layout. Existing
  `process_messages` corpus entries can be migrated by appending a single `0x00`
  byte at the end (read as `false`, keeping the IBD path); every other consumed
  value stays the same. This is a qa-assets change accompanying this PR.~~

    This note no longer applies because the IBD toggle is now consumed inside the
    message loop. Appending a single `0x00` byte would not reliably target that bool
    or preserve the rest of the input layout.

    The accompanying `qa-assets` update should migrate or regenerate the affected
    `process_messages` corpus entries for the current layout.

ACKs for top commit:
  Crypt-iQ:
    crACK 87b080fe2b
  maflcko:
    review ACK 87b080fe2b 🏁
  frankomosh:
    Review ACK 87b080fe2b

Tree-SHA512: e557b2ca3329767a45fe8315c63df9c3191a3a46a17c5e75ea3e4ad0c25e0e500a687fa650297a386b0a2ebb95503d069089ca5ae3d0a34caab98367aeb28683
2026-08-07 10:01:37 +01:00
merge-script
6f906106d7 Merge bitcoin/bitcoin#35879: ci: Fix $BASE_ROOT_DIR installation
fae7ba9aba ci: Fix $BASE_ROOT_DIR installation (MarcoFalke)

Pull request description:

  In the ci system, `BASE_ROOT_DIR` has a default value that can be changed. This has problems:

  * The docs do not mention that changing the value requires re-building the image, as the value is embedded.
  * Many places hard-code the default value, which is confusing and brittle.

  Fix all issues by adding docs and replacing the hard-coded default values with `$BASE_ROOT_DIR`.

ACKs for top commit:
  willcl-ark:
    ACK fae7ba9aba

Tree-SHA512: 6bdfc7acf46962f83664b9a4996b65bddad2f3046c19654a83b89c63a7ac8ac3ab3396f03240d42b091f3eda00b9da50bb49a2d19ded37b0de840a20a7c7e1d9
2026-08-07 09:44:13 +01:00
merge-script
d36bf709f7 Merge bitcoin/bitcoin#35914: test, fuzz: Remove unused variables
3175d57628 test, refactor: Remove unused `error` in `wallet_tests.cpp` (Hennadii Stepanov)
422f1bd92f test, refactor: Remove unused `utxo_pool` in `coinselector_tests.cpp` (Hennadii Stepanov)
e550945a39 test, refactor: Remove unused `removed_refs` in `txgraph_tests.cpp` (Hennadii Stepanov)
e50f422d25 test, refactor: Remove unused variables in `test/rbf_tests.cpp` (Hennadii Stepanov)
b7ae50e2e2 fuzz, refactor: Remove unused `header` in `p2p_transport_serialization.cpp` (Hennadii Stepanov)
3df0d067ad fuzz, refactor: Remove unused `random_string` in `locale.cpp` (Hennadii Stepanov)
fc28914de4 fuzz, refactor: Remove unused `linearization` in `cluster_linearize.cpp` (Hennadii Stepanov)
da58e55986 test, refactor: Remove unused `warnings` in `wallet/test/util.cpp` (Hennadii Stepanov)

Pull request description:

  Noted in https://my.cdash.org/builds/3868446/build.

  See commit messages for more details.

  Here is a related upstream change: https://github.com/llvm/llvm-project/pull/203084.

ACKs for top commit:
  maflcko:
    review ACK 3175d57628 🐕

Tree-SHA512: 49334f79aa0effa9bbc94c7bce69bd1869ded87926229e575ba3721108d08ad5b7451222959310773e8e6009125d98016d095ac1a915e2dfa22712c51d8903aa
2026-08-07 09:40:09 +01:00
merge-script
ed2c59ab65 Merge bitcoin/bitcoin#35896: refactor: Default uint256::operator==, add operator<=>
fa2e76d397 bench: Add base_blob compare bench via uint256 (MarcoFalke)
fa588e9e0f refactor: Mark assertion_fail as [[noreturn]] (MarcoFalke)
faec059dfe refactor: Add uint256::operator<=>() (MarcoFalke)
fa6df14c23 refactor: uint256::operator==() = default (MarcoFalke)

Pull request description:

  Some refactors with rationale:

  * Default the `uint256` base blob equals operator, because this is standard C++20 practise.
  * Add the `uint256` base blob `<=>` operator, because this is standard C++20 practise. Also, `transaction_identifier` already offers such an operator. This allows to remove the non-standard `Compare()` function.
  * Add a `[[noreturn]]` to the assertion failure helper that does not return. This is standard C++11 practise.

ACKs for top commit:
  optout21:
    ACK fa2e76d397
  Sjors:
    ACK fa2e76d397
  purpleKarrot:
    ACK fa2e76d397
  hebasto:
    re-ACK fa2e76d397.
  w0xlt:
    ACK fa2e76d397 as a simplification/refactor, not as a performance optimization.

Tree-SHA512: 2e64e09fabe71d84c05ed943664417dd1bc1cf6fe6bf31006a58dd9180c458f69915ba7770501537678f1ad51cce16018f79bdf6780e072b73b692ea44b60185
2026-08-07 09:37:24 +01:00
MarcoFalke
fae7ba9aba ci: Fix $BASE_ROOT_DIR installation 2026-08-07 08:38:32 +02:00
MarcoFalke
fabe100c2b test: Use throwing config parser getters without fallback 2026-08-07 08:34:30 +02:00
MarcoFalke
fa8acd57cd test: Write true/false values in config.ini
Omitting values is brittle, because a name mismatch can not be
distinguished from a falsy (omitted) value.
2026-08-07 08:34:12 +02:00
vicjuma
6304789a18 Wallet, refactor: Remove orphaned EraseWatchOnly function
Removed a function whose caller was removed in a previous merged PR
2026-08-07 03:05:49 +03:00
kevkevinpal
6b6d77cc84 windows: remove deprecated codecvt via UTF-8 narrow APIs
Drop wstring_convert/codecvt and the
related wide process calls (_wsystem, _wexecvp, CreateProcessW)
in favor of ::system, _execvp, and CreateProcess.
2026-08-06 19:20:51 -04:00
Ava Chow
b388674acf Merge bitcoin/bitcoin#35872: rpc: avoid descriptor range counter overflow
264555af3c rpc: avoid descriptor range counter overflow (Lőrinc)
143a13fb2b test: characterize descriptor range endpoint (Lőrinc)

Pull request description:

  **Problem:** The authenticated `scantxoutset`, `scanblocks`, `getdescriptoractivity`, `utxoupdatepsbt`, and `descriptorprocesspsbt` RPCs share a descriptor expansion helper that iterates inclusive `int64_t` ranges with an `int` counter.
  A ranged descriptor with an explicit `[begin, end]` range ending at `2^31 - 1` expands that valid position, then overflows when advancing the counter to exit the loop.
  Trap-enabled builds terminate, while other builds invoke undefined behavior.

  **Fix:** Use `int64_t` for loop control so the one-past-the-end value is representable and every position passed to `Descriptor::Expand()` remains within its existing `int` range.

  Related: [#26275](https://github.com/bitcoin/bitcoin/pull/26275) fixed the same endpoint overflow in `deriveaddresses`.

ACKs for top commit:
  achow101:
    ACK 264555af3c
  polespinasa:
    ACK 264555af3c
  sedited:
    ACK 264555af3c

Tree-SHA512: 4326182b5897b6f6672e5f7c7296eafdbb6e3b5ed901d61e8fa2cff9b19d372bb8adb88902368dc520ed400e12dd5264ea68677d9ce0feec76fa2ef55fa0d2f4
2026-08-06 13:07:06 -07:00
merge-script
c36ffd870e Merge bitcoin/bitcoin#35842: rpc: Properly make RPCResult::Type::ANY non-test-only
fac4b06e99 refactor: Use CLIENT_NAME in buildOpenRPCDoc (MarcoFalke)
fa3aadbc32 refactor: Use self.Arg<bool> in getopenrpcinfo (MarcoFalke)
fa1871a528 refactor: Remove stale NOLINTNEXTLINE above GetAddressInfoBaseFields (MarcoFalke)
fa22647914 rpc: Properly make RPCResult::Type::ANY non-test-only (MarcoFalke)
fa1242dcc0 refactor: Use std::visit in ApplyArgFallback (MarcoFalke)

Pull request description:

  Commit 6a1a66c180 attempted to properly render RPC results of the type `ANY`.

  However, the commit is incomplete.

  Fix it, by properly rendering all `ANY` types.

  Moreover, a few trivial refactors after https://github.com/bitcoin/bitcoin/pull/34683 are included here.

ACKs for top commit:
  sedited:
    ACK fac4b06e99
  willcl-ark:
    ACK fac4b06e99

Tree-SHA512: b77f1956e4feb9afb93d38245491eec190c4538aec7ac57c327fb2efd86c7da6ee8a1406f81fc18fac06bae77a7d38845a537ca0b8f4ae2d94c38eefd8e88dc1
2026-08-06 16:14:28 +01:00
merge-script
7cb9aaaee8 Merge bitcoin/bitcoin#35759: fuzz: check http_request body matches framing
7502b9ddba fuzz: check http_request body matches framing (ameen-alam)

Pull request description:

  The http_request target asserted that ReadBody() returns an empty string. That held for the libevent-based http_libevent::HTTPRequest, where the harness only parsed the request line and headers and never populated a body. Commit 9c20859b5f (PR #35182) replaced libevent with http_bitcoin::HTTPRequest, and the target was switched over in e427c227fa; its LoadBody() now decodes Content-Length and chunked bodies per RFC 9112, so any fully-parsed request carrying a body trips the stale assertion (e.g. "POST / HTTP/1.1\r\nContent-Length: 3\r\n\r\nabc").

  Replace the emptiness check with a framing-consistency check that mirrors LoadBody()'s own branch logic: a chunked body is bounded by MAX_BODY_SIZE, a Content-Length body is exactly that many bytes, and a request with neither framing header has no body. This strengthens the target instead of dropping the assertion.

  **Steps to reproduce (old assertion):**
  Build the fuzz binary and pass this input as a file to the `http_request` target:
  `POST / HTTP/1.1\r\nContent-Length: 3\r\n\r\nabc`
  → `test/fuzz/http_request.cpp:49: Assertion 'body.empty()' failed`

  **Testing the fix:**
  Ran the updated target ~16 min under libFuzzer with ASAN/UBSAN
  (14.2M execs, no crashes), plus targeted inputs for each branch:
  Content-Length body, chunked, `Transfer-Encoding: identity` + Content-Length,
  no framing headers, and `Content-Length: 0`. Happy to contribute the repro
  input to qa-assets as a follow-up.

ACKs for top commit:
  pinheadmz:
    ACK 7502b9ddba
  marcofleon:
    tACK 7502b9ddba

Tree-SHA512: 4f2eb6bdb3a4556866a84fe0f1d0d8cf506e2efd1b1c7493a99f67ca452b31a140034d418c4064142b1a66c3a6c34b97df0e2b12c21ea86cd4019ffc7cff3b27
2026-08-06 15:18:54 +01:00
merge-script
5b008514db Merge bitcoin/bitcoin#35878: net_processing: process unique tx INVs only
1278a5970d net_processing: process unique tx INVs only (Gregory Sanders)

Pull request description:

  There is no reason we should process conflicting
  advertisements for transactions, as they cannot be both accepted into our mempool.

  Avoid processing these and doing spurious work.

  Should be no change in observable behavior.

ACKs for top commit:
  ajtowns:
    ACK 1278a5970d
  fjahr:
    ACK 1278a5970d
  l0rinc:
    ACK 1278a5970d

Tree-SHA512: c62ceed2cc634c8c99509a8495e5f9bb6d4d8d050942f709a6539ae4dfe1ec628ce7ab0ec1392656809e0d827d1fecf2e8fb9bb4600d13a5bf9a34c9e9e3ad6e
2026-08-06 14:33:10 +01:00