48013 Commits

Author SHA1 Message Date
Ava Chow
c352d3c51c
Merge bitcoin/bitcoin#34168: qa: Require --exclude for each excluded test
c5825d4b7fe9ae202ea3c74798f58cd3a920821d qa: Require `--exclude` for each excluded test (Hennadii Stepanov)

Pull request description:

  This PR allows a long `--exclude ...` argument in the `test/functional/test_runner.py` invocation to be split across multiple lines, with optional per-line explanatory comments. I found this useful for the CI scripts in https://github.com/hebasto/bitcoin-core-nightly.

ACKs for top commit:
  l0rinc:
    tested ACK c5825d4b7fe9ae202ea3c74798f58cd3a920821d
  maflcko:
    review ACK c5825d4b7fe9ae202ea3c74798f58cd3a920821d 🛄
  achow101:
    ACK c5825d4b7fe9ae202ea3c74798f58cd3a920821d
  rkrux:
    ACK c5825d4b7fe9ae202ea3c74798f58cd3a920821d

Tree-SHA512: bcf42848516197978b65df8a8bc68e036a62c9afc6158274eac74a325dc01991eb063a042f940c53ea15a7feb18d4bdfc45d8c71f0ef20c76140b12e07ba3ac5
2026-01-13 14:40:43 -08:00
Ava Chow
d30ad4a912 wallet, rpc: Use HandleWalletError in createwallet
Use the utility function HandleWalletError to deal with wallet creation
errors in createwallet.
2026-01-13 13:12:50 -08:00
ismaelsadeeq
7fc465ece8
doc: fix incorrect description of PackageMempoolChecks
- We no longer enforce ancestor/descendant count limit
  in both PreChecks and PackageMempoolChecks.

- This commit fixes the incorrect comment by just renaming
  `PackageMempoolChecks` to `PackageRBFChecks`

- The method name is self explanatory now; hence no need
  for a description comment.
2026-01-13 18:52:44 +00:00
MarcoFalke
fa0195499c
refactor: [gui] Use lambdas over std::bind
This refactor makes the code easier to read and maintain.
2026-01-13 18:08:35 +01:00
MarcoFalke
eeee1e341f
refactor: Remove trailing semicolon after ADD_SIGNALS_DECL_WRAPPER
This is redundant and inconsistent, because call-sites are expected to
add the semicolon, which they all do.
2026-01-13 16:21:55 +01:00
Ryan Ofsky
62557c9529
Merge bitcoin/bitcoin#33819: mining: getCoinbase() returns struct instead of raw tx
48f57bb35bbdbce509b8ef195de69e2a61a2511e mining: add new getCoinbaseTx() returning a struct (Sjors Provoost)
d59b4cdb5772917ee13e48552d51662160104b62 mining: rename getCoinbaseTx() to ..RawTx() (Sjors Provoost)

Pull request description:

  The first commit renames `getCoinbaseTx()` to `getCoinbaseRawTx()` to reflect that it returns a serialised transaction. This does not impact IPC clients, because they do not use the function name.

  The second commit then introduces a replacement `getCoinbase()` that provides a struct with everything clients need to construct a coinbase. This avoids clients having to parse and manipulate our dummy transaction.

  Deprecate but don't remove `getCoinbaseRawTx()`, `getCoinbaseCommitment()` and `getWitnessCommitmentIndex()`.

  After this change we can drop these deprecated methods, which in turn would allow us to clear the dummy transaction from the `getBlock()` result. But that is left for a followup to keep this PR focussed. See https://github.com/Sjors/bitcoin/pull/106 for an approach.

  Expand the `interface_ipc.py` functional test to document its usage.

  Can be tested using:
  - https://github.com/stratum-mining/sv2-tp/pull/59

ACKs for top commit:
  ryanofsky:
    Code review ACK 48f57bb35bbdbce509b8ef195de69e2a61a2511e. Just rebased and addressed comments and dropped coinbase tx "template" suffix, which is a nice change
  ismaelsadeeq:
    code review ACK 48f57bb35bbdbce509b8ef195de69e2a61a2511e
  vasild:
    ACK 48f57bb35bbdbce509b8ef195de69e2a61a2511e

Tree-SHA512: c4f1d752777fb3086a1a0b7b8b06e4205dbe2f3adb41f218855ad1dee952adccc263cf82acd3bf9300cc83c2c64cebd2b27f66a69beee32d325b9a85e3643b0d
2026-01-13 08:01:57 -05:00
Ryan Ofsky
73d0fe62d3 Merge commit '7562e2aeed95b0dc627e8e3a849941992f0189bb' into pr/subtree-7 2026-01-13 07:24:18 -05:00
Ryan Ofsky
7562e2aeed Squashed 'src/ipc/libmultiprocess/' changes from a4f92969649..1fc65008f7d
1fc65008f7d Merge bitcoin-core/libmultiprocess#237: Made SpawnProcess() behavior safe post fork()
5205a87cd90 test: check SpawnProcess post-fork safety
69652f0edfa Precompute argv before fork in SpawnProcess
30a8681de62 SpawnProcess: avoid fd leak on close failure
d0fc1081d09 Merge bitcoin-core/libmultiprocess#196: ci: Add NetBSD job
7b171f45bfc Merge bitcoin-core/libmultiprocess#234: doc: Fix typos and grammar in documentation and comments
861da39cae9 ci: Add NetBSD job
458745e3940 Fix various typos, spelling mistakes, and grammatical errors in design.md and source code comments.
585decc8561 Merge bitcoin-core/libmultiprocess#236: ci: Install binary package `capnproto` on OpenBSD instead of building it
14e926a3ff3 refactor: extract MakeArgv helper
1ee909393f4 ci: Install binary package `capnproto` on OpenBSD instead of building it
470fc518d4b Merge bitcoin-core/libmultiprocess#230: cmake: add ONLY_CAPNP target_capnp_sources option
2d8886f26c4 Merge bitcoin-core/libmultiprocess#228: Add versions.md and version.h files describing version branches and tags
c1838be565d Merge bitcoin-core/libmultiprocess#225: Improve and document act support
a173f1704ce Merge bitcoin-core/libmultiprocess#223: ci: Replace nix-shell with equivalent nix develop command
625eaca42fb Merge bitcoin-core/libmultiprocess#229: Design Documentation Update
cc234be73a6 Design doc update
81c652687b8 cmake: add ONLY_CAPNP target_capnp_sources option
6e01d2d766e Add versions.md and version.h files describing version branches and tags
4e3f8fa0d2c doc: add instructions for using act
81712ff6bbf ci: disable KVM and sandbox inside act containers
18a2237a8ef ci: Replace nix-shell with equivalent nix develop command

git-subtree-dir: src/ipc/libmultiprocess
git-subtree-split: 1fc65008f7d64161e84c08cbd93109a23dd6a1e9
2026-01-13 07:24:18 -05:00
Lőrinc
2f5b1c5f80
psbt: Fix PSBTInputSignedAndVerified bounds assert
The previous `assert` used `>=`, allowing `input_index == psbt.inputs.size()` and out-of-bounds access in `psbt.inputs[input_index]`.

Found during review: https://github.com/bitcoin/bitcoin/pull/31650#discussion_r2685892867
2026-01-13 12:58:53 +01:00
MarcoFalke
fa3df52712
bench: Require semicolon after BENCHMARK(foo)
This makes the code more consistent.

Also, use "using BenchFunction = ..." while touching the header.

Also, fixup the whitespace after and earlier scripted-diff.
2026-01-13 08:40:39 +01:00
MarcoFalke
fa8938f08c
bench: Remove incorrect __LINE__ in BENCHMARK macro
Duplicate benchmarks with the same name are not supported. Expanding the
name with __LINE__ is confusing and brittle, because it makes duplication
bugs silent.

Fix this twofold:

* By enforcing unique benchmarks at compile-time and link-time. For
  example, a link failure may now look like:
  "mold: error: duplicate symbol: bench_runner_AddrManAdd"
* By enforcing unique benchmarks at run-time. This should never happen,
  due to the build-failure, but a failure may look like:
  "Assertion `benchmarks().try_emplace(std::move(name), std::move(func)).second' failed."
2026-01-13 08:33:40 +01:00
MarcoFalke
fa51a28a94
scripted-diff: Remove priority_level from BENCHMARK macro
-BEGIN VERIFY SCRIPT-

 sed --in-place --regexp-extended 's/BENCHMARK\(([^,]+), benchmark::PriorityLevel::(HIGH|LOW)\)/BENCHMARK(\1)/g' $( git grep -l PriorityLevel )
 sed --in-place                   's/#define BENCHMARK(n, priority_level)/#define BENCHMARK(n)/g'                ./src/bench/bench.h

-END VERIFY SCRIPT-
2026-01-13 08:33:37 +01:00
MarcoFalke
fa790c3eea
bench: Remove -priority-level= option 2026-01-13 08:33:30 +01:00
Ava Chow
dd904298c1 gui: Show an error message if the restored wallet name is empty
The Restore Wallet dialog rejects wallet names that are empty, but was
doing so silently. This is confusing, we should be presenting an error
message to the user.
2026-01-12 15:40:01 -08:00
merge-script
3c8d389a84
Merge bitcoin/bitcoin#34249: doc: archive v30.2 release notes
f664860e52e1fd685a5c264f01f6f956875db591 doc: archive v30.2 release notes (fanquake)

Pull request description:

  Archive v30.2 release notes.

ACKs for top commit:
  furszy:
    ACK f664860e52e1fd685a5c264f01f6f956875db591
  stickies-v:
    ACK f664860e52e1fd685a5c264f01f6f956875db591

Tree-SHA512: 0c300f5185d672f8e5d9f65f34506172958954b7afbfe38f0d558ea91eafa44ac0cea55ef60f28d2d8120f4bd2618dbcd8f88796a89beda59f5c2a8ae227c9ac
2026-01-12 15:36:47 -08:00
merge-script
5e98a6a470
Merge bitcoin/bitcoin#34266: release note: cpfp carveout removed in 31.0
61726483e1c226c87212d0e12a3dd640fc393791 release note: cpfp carveout removed in 31.0 (Greg Sanders)

Pull request description:

  Seems it was overlooked for release notes, so let's add something

ACKs for top commit:
  l0rinc:
    ACK 61726483e1c226c87212d0e12a3dd640fc393791
  glozow:
    ACK 61726483e1c226c87212d0e12a3dd640fc393791

Tree-SHA512: 6d01a07977f530c1e3cc2a21a0ed27283e76813f1013af824a3690b47d7a2233244ede88c75d5f138c6965f94ebd6f3503741844522be5a0d1fdc188dee24d75
2026-01-12 15:11:42 -08:00
Greg Sanders
61726483e1 release note: cpfp carveout removed in 31.0 2026-01-12 18:04:45 -05:00
Pieter Wuille
da56ef239b clusterlin: minimize chunks (feature)
After the normal optimization process finishes, and finds an optimal
spanning forest, run a second process (while computation budget remains)
to split chunks into minimal equal-feerate chunks.
2026-01-12 17:38:30 -05:00
Greg Sanders
d09a19fd41 test: add coverage for issue 34206 2026-01-12 15:46:04 -05:00
Matthew Zipkin
a0ca851d26
Make GetBindAddress() callable from outside net.cpp
The function logic is moved-only from net.cpp to netbase.cpp
and redeclared (as non-static) in netbase.h
2026-01-12 15:31:55 -05:00
Ryan Ofsky
796f18e559
Merge bitcoin/bitcoin#29415: Broadcast own transactions only via short-lived Tor or I2P connections
89372213048adf37a47427112a1ff836ee84c50e doc: add release notes for 29415 (Vasil Dimov)
582016fa5f013817db650bbba0a40d9195c18e2e test: add unit test for the private broadcast storage (Vasil Dimov)
e74d54e04896a86cad4e4b1bd9641afcc3a026c2 test: add functional test for private broadcast (Vasil Dimov)
818b780a05db126dcfe7efe12c46c84b5cfc3de6 rpc: use private broadcast from sendrawtransaction RPC if -privatebroadcast is ON (Vasil Dimov)
eab595f9cf13f7cb1d25a0db51409535cfe053b1 net_processing: retry private broadcast (Vasil Dimov)
37b79f9c39db5a4a61d360a6a29c8853bb5c7ac0 net_processing: stop private broadcast of a transaction after round-trip (Vasil Dimov)
2de53eee742da11b0e3f6fc44c39f2b5b5929da1 net_processing: handle ConnectionType::PRIVATE_BROADCAST connections (Vasil Dimov)
30a9853ad35365af8545e8e766d75cf398968480 net_processing: move a debug check in VERACK processing earlier (Vasil Dimov)
d1092e5d48ce67bd517068550c78bfcab062a554 net_processing: modernize PushNodeVersion() (Vasil Dimov)
9937a12a2fd5a0033f37f4dda5d75bfc5f15c3b6 net_processing: move the debug log about receiving VERSION earlier (Vasil Dimov)
a098f37b9e240291077a7f440e9f57e61f30e158 net_processing: reorder the code that handles the VERSION message (Vasil Dimov)
679ce3a0b8df6e8cab07965301382d2036ef2368 net_processing: store transactions for private broadcast in PeerManager (Vasil Dimov)
a3faa6f944a672faccac5dd201c8d33a638d9091 node: extend node::TxBroadcast with a 3rd option (Vasil Dimov)
95c051e21051bd469fda659fe7c495d5e264d221 net_processing: rename RelayTransaction() to better describe what it does (Vasil Dimov)
bb49d26032c57714c62a4b31ff1fdd969751683f net: implement opening PRIVATE_BROADCAST connections (Vasil Dimov)
01dad4efe2b38b7a71c96b6222147f395e0c11d9 net: introduce a new connection type for private broadcast (Vasil Dimov)
94aaa5d31b6ff1d0122319fc70e70a7e27e1a0ba init: introduce a new option to enable/disable private broadcast (Vasil Dimov)
d6ee490e0a9a81b69a4751087918303163ba8869 log: introduce a new category for private broadcast (Vasil Dimov)

Pull request description:

  _Parts of this PR are isolated in independent smaller PRs to ease review:_

  * [x] _https://github.com/bitcoin/bitcoin/pull/29420_
  * [x] _https://github.com/bitcoin/bitcoin/pull/33454_
  * [x] _https://github.com/bitcoin/bitcoin/pull/33567_
  * [x] _https://github.com/bitcoin/bitcoin/pull/33793_

  ---

  To improve privacy, broadcast locally submitted transactions (from the `sendrawtransaction` RPC) to the P2P network only via Tor or I2P short-lived connections, or to IPv4/IPv6 peers but through the Tor network.

  * Introduce a new connection type for private broadcast of transactions with the following properties:
    * started whenever there are local transactions to be sent
    * opened to Tor or I2P peers or IPv4/IPv6 via the Tor proxy
    * opened regardless of max connections limits
    * after handshake is completed one local transaction is pushed to the peer, `PING` is sent and after receiving `PONG` the connection is closed
    * ignore all incoming messages after handshake is completed (except `PONG`)

  * Broadcast transactions submitted via `sendrawtransaction` using this new mechanism, to a few peers. Keep doing this until we receive back this transaction from one of our ordinary peers (this takes about 1 second on mainnet).

  * The transaction is stored in peerman and does not enter the mempool.

  * Once we get an `INV` from one of our ordinary peers, then the normal flow executes: we request the transaction with `GETDATA`, receive it with a `TX` message, put it in our mempool and broadcast it to all our existent connections (as if we see it for the first time).

  * After we receive the full transaction as a `TX` message, in reply to our `GETDATA` request, only then consider the transaction has propagated through the network and remove it from the storage in peerman, ending the private broadcast attempts.

  The messages exchange should look like this:

  ```
  tx-sender >--- connect -------> tx-recipient
  tx-sender >--- VERSION -------> tx-recipient (dummy VERSION with no revealing data)
  tx-sender <--- VERSION -------< tx-recipient
  tx-sender <--- WTXIDRELAY ----< tx-recipient (maybe)
  tx-sender <--- SENDADDRV2 ----< tx-recipient (maybe)
  tx-sender <--- SENDTXRCNCL ---< tx-recipient (maybe)
  tx-sender <--- VERACK --------< tx-recipient
  tx-sender >--- VERACK --------> tx-recipient
  tx-sender >--- INV/TX --------> tx-recipient
  tx-sender <--- GETDATA/TX ----< tx-recipient
  tx-sender >--- TX ------------> tx-recipient
  tx-sender >--- PING ----------> tx-recipient
  tx-sender <--- PONG ----------< tx-recipient
  tx-sender disconnects
  ```

  Whenever a new transaction is received from `sendrawtransaction` RPC, the node will send it to a few (`NUM_PRIVATE_BROADCAST_PER_TX`) recipients right away. If after some time we still have not heard anything about the transaction from the network, then it will be sent to 1 more peer (see `PeerManagerImpl::ReattemptPrivateBroadcast()`).

  A few considerations:
  * The short-lived private broadcast connections are very cheap and fast wrt network traffic. It is expected that some of those peers could blackhole the transaction. Just one honest/proper peer is enough for successful propagation.
  * The peers that receive the transaction could deduce that this is initial transaction broadcast from the transaction originator. This is ok, they can't identify the sender.

  ---

  <details>
  <summary>How to test this?</summary>

  Thank you, @stratospher and @andrewtoth!

  Start `bitcoind` with `-privatebroadcast=1 -debug=privatebroadcast`.

  Create a wallet and get a new address, go to the Signet faucet and request some coins to that address:
  ```bash
  build/bin/bitcoin-cli -chain="signet" createwallet test
  build/bin/bitcoin-cli -chain="signet" getnewaddress
  ```

  Get a new address for the test transaction recipient:
  ```bash
  build/bin/bitcoin-cli -chain="signet" loadwallet test
  new_address=$(build/bin/bitcoin-cli -chain="signet" getnewaddress)
  ```

  Create the transaction:
  ```bash
  # Option 1: `createrawtransaction` and `signrawtransactionwithwallet`:

  txid=$(build/bin/bitcoin-cli -chain="signet" listunspent | jq -r '.[0] | .txid')
  vout=$(build/bin/bitcoin-cli -chain="signet" listunspent | jq -r '.[0] | .vout')
  echo "txid: $txid"
  echo "vout: $vout"

  tx=$(build/bin/bitcoin-cli -chain="signet" createrawtransaction "[{\"txid\": \"$txid\", \"vout\": $vout}]" "[{\"$new_address\": 0.00001000}]" 0 false)
  echo "tx: $tx"

  signed_tx=$(build/bin/bitcoin-cli -chain="signet" signrawtransactionwithwallet "$tx" | jq -r '.hex')
  echo "signed_tx: $signed_tx"

  # OR Option 2: `walletcreatefundedpsbt` and `walletprocesspsbt`:
  # This makes it not have to worry about inputs and also automatically sends back change to the wallet.
  # Start `bitcoind` with `-fallbackfee=0.00003000` for instance for 3 sat/vbyte fee.

  psbt=$(build/bin/bitcoin-cli -chain="signet" walletcreatefundedpsbt "[]" "[{\"$new_address\": 0.00001000}]" | jq -r '.psbt')
  echo "psbt: $psbt"

  signed_tx=$(build/bin/bitcoin-cli -chain="signet" walletprocesspsbt "$psbt" | jq -r '.hex')
  echo "signed_tx: $signed_tx"
  ```

  Finally, send the transaction:
  ```bash
  raw_tx=$(build/bin/bitcoin-cli -chain="signet" sendrawtransaction "$signed_tx")
  echo "raw_tx: $raw_tx"
  ```

  </details>

  ---

  <details>
  <summary>High-level explanation of the commits</summary>

  * New logging category and config option to enable private broadcast
    * `log: introduce a new category for private broadcast`
    * `init: introduce a new option to enable/disable private broadcast`

  * Implement the private broadcast connection handling on the `CConnman` side:
    * `net: introduce a new connection type for private broadcast`
    * `net: implement opening PRIVATE_BROADCAST connections`

  * Prepare `BroadcastTransaction()` for private broadcast requests:
    * `net_processing: rename RelayTransaction to better describe what it does`
    * `node: extend node::TxBroadcast with a 3rd option`
    * `net_processing: store transactions for private broadcast in PeerManager`

  * Implement the private broadcast connection handling on the `PeerManager` side:
    * `net_processing: reorder the code that handles the VERSION message`
    * `net_processing: move the debug log about receiving VERSION earlier`
    * `net_processing: modernize PushNodeVersion()`
    * `net_processing: move a debug check in VERACK processing earlier`
    * `net_processing: handle ConnectionType::PRIVATE_BROADCAST connections`
    * `net_processing: stop private broadcast of a transaction after round-trip`
    * `net_processing: retry private broadcast`

  * Engage the new functionality from `sendrawtransaction`:
    * `rpc: use private broadcast from sendrawtransaction RPC if -privatebroadcast is ON`

  * New tests:
    * `test: add functional test for private broadcast`
    * `test: add unit test for the private broadcast storage`

  </details>

  ---

  **This PR would resolve the following issues:**
  https://github.com/bitcoin/bitcoin/issues/3828 Clients leak IPs if they are recipients of a transaction
  https://github.com/bitcoin/bitcoin/issues/14692 Can't configure bitocoind to only send tx via Tor but receive clearnet transactions
  https://github.com/bitcoin/bitcoin/issues/19042 Tor-only transaction broadcast onlynet=onion alternative
  https://github.com/bitcoin/bitcoin/issues/24557 Option for receive events with all networks, but send transactions and/or blocks only with anonymous network[s]?
  https://github.com/bitcoin/bitcoin/issues/25450 Ability to broadcast wallet transactions only via dedicated oneshot Tor connections
  https://github.com/bitcoin/bitcoin/issues/32235 Tor: TX circuit isolation

  **Issues that are related, but (maybe?) not to be resolved by this PR:**
  https://github.com/bitcoin/bitcoin/issues/21876 Broadcast a transaction to specific nodes
  https://github.com/bitcoin/bitcoin/issues/28636 new RPC: sendrawtransactiontopeer

  ---

  Further extensions:
  * Have the wallet do the private broadcast as well, https://github.com/bitcoin/bitcoin/issues/11887 would have to be resolved.
  * Have the `submitpackage` RPC do the private broadcast as well, [draft diff in the comment below](https://github.com/bitcoin/bitcoin/pull/29415#pullrequestreview-2972293733), thanks ismaelsadeeq!
  * Add some stats via RPC, so that the user can better monitor what is going on during and after the broadcast. Currently this can be done via the debug log, but that is not convenient.
  * Make the private broadcast storage, currently in peerman, persistent over node restarts.
  * Add (optional) random delay before starting to broadcast the transaction in order to avoid correlating unrelated transactions based on the time when they were broadcast. Suggested independently of this PR [here](https://github.com/bitcoin/bitcoin/issues/30471).
  * Consider periodically sending transactions that did not originate from the node as decoy, discussed [here](https://github.com/bitcoin/bitcoin/pull/29415#discussion_r2035414972).
  * Consider waiting for peer's FEEFILTER message and if the transaction that was sent to the peer is below that threshold, then assume the peer is going to drop it. Then use this knowledge to retry more aggressively with another peer, instead of the current 10 min. See [comment below](https://github.com/bitcoin/bitcoin/pull/29415#issuecomment-3258611648).
  * It may make sense to be able to override the default policy -- eg so submitrawtransaction can go straight to the mempool and relay, even if txs are normally privately relayed. See [comment below](https://github.com/bitcoin/bitcoin/pull/29415#issuecomment-3427086681).
  * As a side effect we have a new metric available - the time it takes for a transaction to reach a random node in the network (from the point of view of the private broadcast recipient the tx originator is a random node somewhere in the network). This can be useful for monitoring, unrelated to privacy characteristics of this feature.

  ---

  _A previous incarnation of this can be found at https://github.com/bitcoin/bitcoin/pull/27509. It puts the transaction in the mempool and (tries to) hide it from the outside observers. This turned out to be too error prone or maybe even impossible._

ACKs for top commit:
  l0rinc:
    code review diff ACK 89372213048adf37a47427112a1ff836ee84c50e
  andrewtoth:
    ACK 89372213048adf37a47427112a1ff836ee84c50e
  pinheadmz:
    ACK 89372213048adf37a47427112a1ff836ee84c50e
  w0xlt:
    ACK 8937221304 with nit https://github.com/bitcoin/bitcoin/pull/29415#discussion_r2654849875
  mzumsande:
    re-ACK 89372213048adf37a47427112a1ff836ee84c50e

Tree-SHA512: d51dadc865c2eb080c903cbe2f669e69a967e5f9fc64e9a20a68f39a67bf0db6ac2ad682af7fa24ef9f0942a41c89959341a16ba7b616475e1c5ab8e563b9b96
2026-01-12 15:02:14 -05:00
Lőrinc
557b41a38c
validation: make IsInitialBlockDownload() lock-free
`ChainstateManager::IsInitialBlockDownload()` is queried on hot paths and previously acquired `cs_main` internally, contributing to lock contention.

Cache the IBD status in `m_cached_is_ibd`, and introduce `ChainstateManager::UpdateIBDStatus()` to latch it once block loading has finished and the current chain tip has enough work and is recent.
Call the updater after tip updates and after `ImportBlocks()` completes.

Since `IsInitialBlockDownload()` no longer updates the cache, drop `mutable` from `m_cached_is_ibd` and only update it from `UpdateIBDStatus()` under `cs_main`.

Update the new unit test to showcase the new `UpdateIBDStatus()`.

Co-authored-by: Patrick Strateman <patrick.strateman@gmail.com>
Co-authored-by: Martin Zumsande <mzumsande@gmail.com>
2026-01-12 16:57:20 +01:00
Lőrinc
b9c0ab3b75
chain: add CChain::IsTipRecent helper
Factor the chain tip work/recency check out of `ChainstateManager::IsInitialBlockDownload()` into a reusable `CChain::IsTipRecent()` helper, and annotate it as requiring `cs_main` since it's reading mutable state.

Also introduce a local `chainman_ref` in the kernel import-blocks wrapper to reduce repetition and keep follow-up diffs small.

`IsInitialBlockDownload` returns were also unified to make the followup move clean.

Co-authored-by: Patrick Strateman <patrick.strateman@gmail.com>
Co-authored-by: Martin Zumsande <mzumsande@gmail.com>
2026-01-12 16:56:01 +01:00
Lőrinc
8d531c6210
validation: invert m_cached_finished_ibd to m_cached_is_ibd
Rename and invert the internal IBD latch so the cached value directly matches `IsInitialBlockDownload()` (true while in IBD, then latched to false).

This is a behavior-preserving refactor to avoid double negatives.
2026-01-12 16:54:11 +01:00
Lőrinc
8be54e3b19
test: cover IBD exit conditions
Add a unit test that exercises the `IsInitialBlockDownload()` decision matrix by varying the cached latch, `BlockManager::LoadingBlocks()`, and tip work/recency inputs.

This documents the current latching behavior and provides a baseline for later refactors.
2026-01-12 16:48:09 +01:00
MarcoFalke
facaf56214
contrib: Remove unused functions 2026-01-12 09:13:58 +01:00
merge-script
abc6a3a4eb
Merge bitcoin/bitcoin#34252: doc: add 433 (Pay to Anchor) to bips.md
44b12cdb11f0fd3264f24f537a5d6989e4fe96a9 doc: add 433 (Pay to Anchor) to bips.md (Sebastian Falbesoner)

Pull request description:

  See PR https://github.com/bitcoin/bips/pull/1982 (merged recently) and #30352 (first released in v28.0).

ACKs for top commit:
  instagibbs:
    ACK 44b12cdb11f0fd3264f24f537a5d6989e4fe96a9
  glozow:
    ACK 44b12cdb11f0fd3264f24f537a5d6989e4fe96a9

Tree-SHA512: 0389bfd9b57a354ef15eff726783c83969586a73de52d27b6d3b042dba14c1361af29303b6ce42330a841310811a81c5e45b5c7d25e307787f1cfbfd75ab3e62
2026-01-11 14:44:15 -08:00
Andrew Toth
2ee7f9b259
coins: assume GetCoin only returns unspent coins
`CCoinsViewCache::FetchCoin()` had special handling for a spent `Coin` returned by the parent view.
Production parents (`CCoinsViewCache` and `CCoinsViewDB`) do not return spent coins, so this path is unreachable.

Replace it with an `Assume(!coin.IsSpent())`, drop outdated documentation about spent+FRESH cache entries, and simplify `SanityCheck()` to assert the remaining possible state invariants.
This is safe because it does not change behavior for valid backends and will fail fast if the `GetCoin()` contract is violated.

Co-authored-by: Lőrinc <pap.lorinc@gmail.com>
2026-01-11 21:32:52 +01:00
Sebastian Falbesoner
44b12cdb11 doc: add 433 (Pay to Anchor) to bips.md 2026-01-11 19:04:00 +01:00
fanquake
f664860e52
doc: archive v30.2 release notes 2026-01-10 16:14:57 +00:00
woltx
ce63d37ebe test: use dynamic port allocation to avoid test conflicts
Use port=0 for dynamic port allocation in test framework components
to avoid "address already in use" errors from concurrent tests or
ports stuck in TIME_WAIT state from previous test runs.

Changes:
- socks5.py: Update conf.addr after bind() to reflect actual port
- p2p.py: Retrieve actual port after create_server() when port=0
- feature_proxy.py: Use port=0 for all SOCKS5 proxy servers
- feature_anchors.py: Use port=0 for onion proxy server
2026-01-09 18:43:44 -08:00
Ava Chow
8ac134be5e contrib: verify-commits sha1 exceptions
Allow some commits to not require the sha1 check.
2026-01-09 16:08:26 -08:00
Fabian Jahr
ab41492c6b
test: Prevent loop from running out of utxos in bip68 test 2026-01-09 23:57:35 +01:00
merge-script
aeaa67a9ea
Merge bitcoin/bitcoin#33428: depends: Boost 1.90.0
ca4a844eed481afa0ca7eab8b972ccbda8dfe168 depends: Boost 1.90.0 (fanquake)

Pull request description:

  Update [Boost to 1.90.0](https://www.boost.org/releases/1.90.0.beta1/) in depends.

ACKs for top commit:
  hebasto:
    ACK ca4a844eed481afa0ca7eab8b972ccbda8dfe168.
  sedited:
    ACK ca4a844eed481afa0ca7eab8b972ccbda8dfe168

Tree-SHA512: d9fbef9f8f8b14b12281a252b17c79abb8bf5bcd5cbbccac0e509c010adca909f66d3f4739f6663741c5ff2829ec58e88185e67ed5815d2588b0980bba9b1b63
2026-01-09 23:19:45 +01:00
ismaelsadeeq
1412b779ad
refactor: execute PackageMempoolChecks during package rbf only
- No need to jump into the next subroutine when there is no conflict.

- This makes it clear why it is necessary to have two calls of
  CheckMempoolPolicyLimts in both PackageMempoolChecks and after in
  AcceptMultipleTransactionsInternal, there is a possibilty that we
  we want to accept multiple transaction but they are not conflicting
  with any in-mempool transaction, in that case also we want to check
  that they do not bust the cluster limits.
2026-01-09 19:23:13 +00:00
Greg Sanders
4c7cfd37ad wallet: remove erroneous-on-reorg Assume() 2026-01-09 08:41:37 -05:00
brunoerg
8fb5e5f41d test: check wallet rescan properly in feature_pruning 2026-01-09 09:27:19 -03:00
merge-script
595504a432
Merge bitcoin/bitcoin#34236: Add sedited to trusted-keys
d1b227f3ad19e1364c74fcb3b34717bb2b9b9243 Add sedited to trusted-keys (sedited)

Pull request description:

  As discussed on irc: https://www.erisian.com.au/bitcoin-core-dev/log-2026-01-08.html#l-286

ACKs for top commit:
  l0rinc:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243, well deserved.
  achow101:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243
  fjahr:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243
  darosior:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243
  theStack:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243 🍾
  willcl-ark:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243
  glozow:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243
  mzumsande:
    ACK d1b227f3ad19e1364c74fcb3b34717bb2b9b9243

Tree-SHA512: 865507213459013d88c3bd74797efd5bf2ad81cafb184520fc62a471b3c01786194ef842a046a34085c8ef65a8e02e634cd9b6c2c75ca40298cfb5d0ea38d1dd
2026-01-09 11:35:39 +00:00
merge-script
5c724f3b04
Merge bitcoin/bitcoin#34235: miniminer: stop assuming ancestor fees >= self fees
2cade5d5d17010cd89855b26da350d6e54683805 [miniminer] stop assuming ancestor fees >= self fees (glozow)

Pull request description:

  These assertions exist to detect double-deducting values when we update descendants. However, negative fees are possible with `prioritisetransaction` so it doesn't make sense to check this.

  Leave the check for sizes because those are never negative.

  Fixes #34234

ACKs for top commit:
  instagibbs:
    ACK 2cade5d5d17010cd89855b26da350d6e54683805
  dergoegge:
    utACK 2cade5d5d17010cd89855b26da350d6e54683805

Tree-SHA512: 935bbc8bd9a0d508eea43bb49aa43c22735e3f2c1012598f6843e229c13b76e44f9fd3eb8b61c437fa0b32353b4e7b15afa3e31002bdfa382d3d711d16419fde
2026-01-09 11:24:03 +00:00
merge-script
2d87afcf7d
Merge bitcoin/bitcoin#34227: guix: Fix osslsigncode tests
194114daf385a5db50e1507fda79a1a93240d494 guix: Fix `osslsigncode` tests (Hennadii Stepanov)

Pull request description:

  This PR aims to improve the experience for Guix builders when creating new Guix profiles after 2025. In particular, it should be helpful for those who are new to building with Guix.

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

  Other possible alternatives to consider include:
  1. Applying a workaround as suggested [here](https://github.com/bitcoin/bitcoin/issues/34220#issuecomment-3718991398).

  2. Updating the package as suggested [here](https://github.com/bitcoin/bitcoin/issues/34220#issuecomment-3719022287).

  3. Disabling tests as suggested [here](https://github.com/bitcoin/bitcoin/issues/34220#issuecomment-3719538660).

ACKs for top commit:
  fanquake:
    ACK 194114daf385a5db50e1507fda79a1a93240d494 as a short-term, backportable workaround.
  janb84:
    ACK 194114daf385a5db50e1507fda79a1a93240d494

Tree-SHA512: b263604297adfc54fccab8fe3c3126939b729aebda5b7e15f6f453a17260fd4ea754523a694bbc4268693513d071c4362325b0511696af2e81f00f1a461bcfa9
2026-01-09 11:11:42 +00:00
merge-script
7b17fb78fa
Merge bitcoin/bitcoin#34226: wallet: test: Relative wallet failed migration cleanup
eeaf28dbe0e09819ab0e95bb7762b29536bdeef6 wallet: test: Failed migration cleanup (David Gumberg)

Pull request description:

  Prior to https://github.com/bitcoin/bitcoin/pull/34156, an issue existed where if migration of a wallet with a relative pathname failed, the relatively specified path where the legacy wallet is would be deleted. This issue predates #32273, because the relative pathnames get stacked together, e.g. "../../", the copy conflict bug that caused migration to abort early instead of getting far enough to attempt clean-up that was fixed in #32273 is avoided.

  This is a functional test demonstrating that we handle failed migration clean-up correctly for relatively-named wallets. To see the issue, you can backport this test onto 29.x: https://github.com/davidgumberg/bitcoin/tree/2026-01-07-rel-migration-test-backport

  I've also added an absolute path failed migration cleanup test. WRT this and #34156, absolute paths exhibit similar behavior to unnamed wallets. Because of the name-conflict bug prior to #32273 an absolute-path migration would fail no matter what because migration would attempt to copy a file to a destination that already exists. But after #32273, absolute-path migration gets past there, and if it fails for some other reason, the same behavior that's fixed in #34156 occurs where the directory containing the wallet file is deleted.

ACKs for top commit:
  achow101:
    ACK eeaf28dbe0e09819ab0e95bb7762b29536bdeef6
  furszy:
    ACK eeaf28dbe0e09819ab0e95bb7762b29536bdeef6
  rkrux:
    lgtm ACK eeaf28dbe0e09819ab0e95bb7762b29536bdeef6

Tree-SHA512: ee366fe526d0328654a86c2e9e6f228ca81554c8f8a78c259fa7aab90f024f9e5694ecf3f1d188938355f4e6d351c5a6a8ad236701bdd0ce63005e5d42c15e15
2026-01-09 10:02:21 +00:00
David Gumberg
eeaf28dbe0 wallet: test: Failed migration cleanup
Refactor a common way to perform the failed migration test that exists
for default wallets, and add relative-path wallets and absolute-path
wallets.
2026-01-08 14:00:46 -08:00
sedited
997e7b4d7c
init: Fix non-zero code on interrupt
An interrupt does not create a failure exit code during normal
operation. This should also be the case when interrupt is triggered
during initialization. However a failure exit code is currently returned
if an interrupt occurs during init. Fix this by making `AppInitMain` return
true instead of false, which further up the call stack sets the
`EXIT_FAILURE` code. Also add a check for the interrupt condition during
GUI startup.
2026-01-08 20:08:21 +01:00
sedited
d1b227f3ad
Add sedited to trusted-keys 2026-01-08 19:59:15 +01:00
Hennadii Stepanov
6c3fb719d1
Merge bitcoin-core/gui#921: Remove deprecated "Starting Block" from Peer Detail
301d9eea66cadffe2872776b8a0e9b72ec90b9a2 qt: Remove "Starting Block" from Peer Detail. Following Deprecation in `bitcoin#34197` (WakeTrainDev)

Pull request description:

  the `startingheight` rpc field got deprecated in https://github.com/bitcoin/bitcoin/pull/34197
  this pr removes it from peer detail

ACKs for top commit:
  maflcko:
    review lgtm ACK 301d9eea66cadffe2872776b8a0e9b72ec90b9a2
  theStack:
    ACK 301d9eea66cadffe2872776b8a0e9b72ec90b9a2
  hebasto:
    ACK 301d9eea66cadffe2872776b8a0e9b72ec90b9a2, I verified `forms/debugwindow.ui` using Qt Designer.

Tree-SHA512: b870b4cff8ead073a17d171c01c46fc7e750c0343b4578ffb63abc8f40b33abdf08beb6733fead5307ef5d48b078b60d29ac0e0e41190a98f50f92154f0878cf
2026-01-08 17:51:29 +00:00
glozow
2cade5d5d1 [miniminer] stop assuming ancestor fees >= self fees
Negative fees are possible with prioritisetransaction.
2026-01-08 07:55:27 -08:00
MarcoFalke
fa8d56f9f0
fuzz: Reject too large descriptor leaf sizes in scriptpubkeyman target 2026-01-08 14:26:29 +01:00
MarcoFalke
fabac1b395
fuzz: Reject some more "expensive" descriptors in the scriptpubkeyman target
The same are rejected in the descriptor_parse target, so it makes sense
to reject them here as well.
2026-01-08 14:26:23 +01:00
Hennadii Stepanov
194114daf3
guix: Fix osslsigncode tests 2026-01-08 12:45:14 +00:00
MarcoFalke
333333356f
fuzz: [refactor] Use std::span over FuzzBufferType in descriptor utils
They are exactly the same, but the descriptor utils should not prescribe
to use the FuzzBufferType. Using a dedicated type for them clarifies
that the utils are not tied to FuzzBufferType.

Also, while touching the lines, use `const` only where it is meaningful.
2026-01-08 12:18:01 +01:00