👉 Bitcoin Core 24.01 released

  • P2P and network changes
  • Updated RPCs
  • New RPCs
  • Updated REST APIs
  • Build System
  • New settings
  • GUI changes
24.01 change log

A detailed list of changes in this version follows. To keep the list to a manageable
length, small refactors and typo fixes are not included, and similar changes are
sometimes condensed into one line.

Notable changes

P2P and network changes

- To address a potential denial-of-service, the logic to download headers
from peers has been reworked.  This is particularly relevant for nodes starting up
for the first time (or for nodes which are starting up after being offline for a
long time).

Whenever headers are received from a peer that have a total chainwork
that is either less than the node's `-minimumchainwork` value or is sufficiently
below the work at the node's tip, a "presync" phase will begin, in which the node will
download the peer's headers and verify the cumulative work on the peer's chain, prior
to storing those headers permanently. Once that cumulative work is verified to be
sufficiently high, the headers will be redownloaded from that peer and fully
validated and stored.

This may result in initial headers sync taking longer for new nodes
starting up for the first time, both because the headers will be downloaded twice,
and because the effect of a peer disconnecting during the presync phase (or while
the node's best headers chain has less than `-minimumchainwork`), will result in
the node needing to use the headers presync mechanism with the next peer as well
(downloading the headers twice, again). (#25717)

- With I2P connections, a new, transient address is used for each outbound
   connection if `-i2pacceptincoming=0`. (#25355)

Updated RPCs

- The `-deprecatedrpc=softforks` configuration option has been removed.
The RPC `getblockchaininfo` no longer returns the `softforks` field, which was
previously deprecated in 23.0. (#23508) Information on soft fork status is now
only available via the `getdeploymentinfo` RPC.

- The `deprecatedrpc=exclude_coinbase` configuration option has been removed.
The `receivedby` RPCs (`listreceivedbyaddress`, `listreceivedbylabel`,
`getreceivedbyaddress` and `getreceivedbylabel`) now always return results
accounting for received coins from coinbase outputs, without an option to change
that behaviour. Excluding coinbases was previously deprecated in 23.0. (#25171)

- The `deprecatedrpc=fees` configuration option has been removed. The top-level
fee fields `fee`, `modifiedfee`, `ancestorfees` and `descendantfees` are no
longer returned by RPCs `getmempoolentry`, `getrawmempool(verbose=true)`,
`getmempoolancestors(verbose=true)` and `getmempooldescendants(verbose=true)`.
The same fee fields can be accessed through the `fees` object in the result.
The top-level fee fields were previously deprecated in 23.0. (#25204)

- The `getpeerinfo` RPC has been updated with a new `presynced_headers` field,
indicating the progress on the presync phase mentioned in the "P2P and network
changes" section above.

Changes to wallet related RPCs can be found in the Wallet section below.

New RPCs

- The `sendall` RPC spends specific UTXOs to one or more recipients without
creating change. By default, the `sendall` RPC will spend every UTXO in the wallet.
`sendall` is useful to empty wallets or to create a changeless payment from select UTXOs.
When creating a payment from a specific amount for which the recipient incurs the
transaction fee, continue to use the `subtractfeefromamount` option via the `send`,
`sendtoaddress`, or `sendmany` RPCs. (#24118)

- A new `gettxspendingprevout` RPC has been added, which scans the mempool to find
transactions spending any of the given outpoints. (#24408)

- The `simulaterawtransaction` RPC iterates over the inputs and outputs of the given
transactions, and tallies up the balance change for the given wallet. This can be
useful e.g. when verifying that a coin join like transaction doesn't contain unexpected
inputs that the wallet will then sign for unintentionally. (#22751)

Updated REST APIs

- The `/headers/` and `/blockfilterheaders/` endpoints have been updated to use
a query parameter instead of path parameter to specify the result count.
The count parameter is now optional, and defaults to 5 for both endpoints.
The old endpoints are still functional, and have no documented behaviour change.

For `/headers`, use
 `GET /rest/headers/<BLOCK-HASH>.<bin|hex|json>?count=<COUNT=5>`
instead of
`GET /rest/headers/<COUNT>/<BLOCK-HASH>.<bin|hex|json>` (deprecated)

For `/blockfilterheaders/`, use
`GET /rest/blockfilterheaders/<FILTERTYPE>/<BLOCK-HASH>.<bin|hex|json>?count=<COUNT=5>`
instead of
`GET /rest/blockfilterheaders/<FILTERTYPE>/<COUNT>/<BLOCK-HASH>.<bin|hex|json>`
(deprecated) (#24098)

Build System

- Guix builds are now reproducible across architectures (x86_64 & aarch64). (#21194)

New settings

- A new `mempoolfullrbf` option has been added, which enables the mempool to
accept transaction replacement without enforcing BIP125 replaceability signaling. (#25353)


- The `-walletrbf` startup option will now default to `true`. The wallet will now
default to opt-in RBF on transactions that it creates. (#25610)

- The `replaceable` option for the `createrawtransaction` and `createpsbt` RPCs
will now default to `true`. Transactions created with these RPCs will default to
having opt-in RBF enabled. (#25610)

- The `wsh()` output descriptor was extended with Miniscript support. You can
import Miniscript descriptors for P2WSH in a watchonly wallet to track coins,
but you can't spend from them using the Bitcoin Core wallet yet.
You can find more about Miniscript on the [reference website](
https://bitcoin.sipa.be/miniscript/). (#24148)

- The `tr()` output descriptor now supports multisig scripts through the
`multi_a()` and `sortedmulti_a()` functions. (#24043)

- To help prevent fingerprinting transactions created by the Bitcoin Core wallet,
change output amounts are now randomized. (#24494)

- The `listtransactions`, `gettransaction`, and `listsinceblock`
RPC methods now include a wtxid field (hash of serialized transaction, including
  witness data) for each transaction. (#24198)

- The `listsinceblock`, `listtransactions` and `gettransaction` output now contain
a new `parent_descs` field for every "receive" entry. (#25504)

- A new optional `include_change` parameter was added to the `listsinceblock` command.

- RPC `getreceivedbylabel` now returns an error, "Label not found in wallet" (-4),
if the label is not in the address book. (#25122)

Migrating Legacy Wallets to Descriptor Wallets

An experimental RPC `migratewallet` has been added to migrate Legacy (non-descriptor) wallets to
Descriptor wallets. More information about the migration process is available in the

GUI changes

- A new menu item to restore a wallet from a backup file has been added

- Configuration changes made in the bitcoin GUI (such as the pruning setting,
proxy settings, UPNP preferences) are now saved to `<datadir>/settings.json`
file rather than to the Qt settings backend (windows registry or unix desktop
config files), so these settings will now apply to bitcoind, instead of being
ignored. (#15936, gui#602)

- Also, the interaction between GUI settings and `bitcoin.conf` settings is simplified.
Settings from `bitcoin.conf` are now displayed normally in the GUI settings dialog,
instead of in a separate warning message ("Options set in this dialog are overridden
by the configuration file: -setting=value"). And these
settings can now be edited because `settings.json` values take precedence over
`bitcoin.conf` values. (#15936)

Low-level changes


- The `deriveaddresses`, `getdescriptorinfo`, `importdescriptors` and
`scantxoutset` commands now accept Miniscript expression within a `wsh()` descriptor. (#24148)

- The `getaddressinfo`, `decodescript`, `listdescriptors` and `listunspent`
commands may now output a Miniscript descriptor inside a `wsh()` where a `wsh(raw())`
descriptor was previously returned. (#24148)