Bitcoin Core v26.0: P2P/Network Improvements, Pruning Updates, New RPCs & More
Bitcoin Core version 26.0 is now available for download. It includes experimental support for the version 2 transport protocol, support for taproot in miniscript, enhanced connection strategies against eclipse attacks and many other improvements and bug fixes.
- "This release includes new features, various bug fixes and performance improvements, as well as updated translations."
- "Please report bugs using the issue tracker at GitHub."
What's new
P2P and network changes
- Experimental support for the v2 transport protocol defined in
BIP324 was added.- It is off by default, but when enabled using
-v2transport
- it will
be negotiated on a per-connection basis with other peers that support it too. The existing v1 transport protocol remains fully supported.
- It is off by default, but when enabled using
- Nodes with multiple reachable networks will actively try to have at least one outbound connection to each network. This improves individual resistance to eclipse attacks and network level resistance to partition attacks. Users no longer need to perform active measures to ensure being connected to multiple enabled networks.
Pruning
- When using assumeutxo with
-prune
, the prune budget may be
exceeded if it is set lower than 1100MB (i.e.MIN_DISK_SPACE_FOR_BLOCK_FILES * 2
). Prune
budget is normally split evenly across each chainstate, unless the resulting prune budget per chainstate is beneathMIN_DISK_SPACE_FOR_BLOCK_FILES
in which case that value will be used.
Updated RPCs
- Setting
-rpcserialversion=0
is deprecated and will be removed in a future release. It can currently still be used by also adding the-deprecatedrpc=serialversion
option. - The
hash_serialized_2
value has been removed fromgettxoutsetinfo
since the value it calculated contained a bug and did not take all data into account. It is superseded byhash_serialized_3
which provides the same functionality but serves the correctly calculated hash. - New fields
transport_protocol_type
andsession_id
were added to
thegetpeerinfo
RPC to indicate whether the v2 transport protocol is in use, and if so, what the session id is. - A new argument
v2transport
was added to theaddnode
RPC to
indicate whether a v2 transaction connection is to be attempted with the peer. - Miniscript expressions can now be used in Taproot descriptors for all RPCs working with descriptors.
finalizepsbt
is now able to finalize a PSBT with inputs spending Miniscript-compatible Taproot leaves.
New RPCs
loadtxoutset
has been added, which allows loading a UTXO snapshot
of the format generated bydumptxoutset
. Once this snapshot is loaded, its contents will be deserialized into a second chainstate data structure, which is then used to sync to the network's tip.- Meanwhile, the original chainstate will complete the initial block
download process in the background, eventually validating up to the block that the snapshot is based upon. - The result is a usable bitcoind instance that is current with the
network tip in a matter of minutes rather than hours. UTXO snapshot are typically obtained via third-party sources (HTTP, torrent, etc.) which is reasonable since their contents are always checked by hash. - You can find more information on this process in the
assumeutxo
design document. getchainstates
has been added to aid in monitoring the assumeutxo
sync process.
- Meanwhile, the original chainstate will complete the initial block
- A new
getprioritisedtransactions
RPC has been added. It returns a
map of all fee deltas created by the user with prioritisetransaction, indexed by txid. The map also indicates whether each transaction is present in the mempool. - A new RPC,
submitpackage
, has been added. It can be used to submit
a list of raw hex transactions to the mempool to be evaluated as a package using consensus and mempool policy rules.- These policies include package CPFP, allowing a child with high fees
to bump a parent below the mempool minimum feerate (but not minimum relay feerate). - Warning: successful submission does not mean the transactions will
propagate throughout the network, as package relay is not supported. - Not all features are available. The package is limited to a child
with all of its unconfirmed parents, and no parent may spend the output of another parent. Also, package RBF is not supported. Refer to doc/policy/packages.md for more details on package policies and limitations. - This RPC is experimental. Its interface may change.
- These policies include package CPFP, allowing a child with high fees
- A new RPC
getaddrmaninfo
has been added to view the distribution
of addresses in the new and tried table of the node's address manager across different networks(ipv4, ipv6, onion, i2p, cjdns). The RPC returns count of addresses in new and tried table as well as their sum for all networks. - A new
importmempool
RPC has been added. It loads a validmempool.dat
file and attempts to add its contents to the mempool. This can be useful to import mempool data from another node without having to modify the datadir contents and without having to restart the node.- Warning: Importing untrusted files is dangerous, especially if
metadata from the file is taken over. - If you want to apply fee deltas, it is recommended to use the
getprioritisedtransactions
andprioritisetransaction
RPCs instead of theapply_fee_delta_priority
option to avoid double-prioritising any already-prioritised transactions in the mempool.
- Warning: Importing untrusted files is dangerous, especially if
Updated settings
bitcoind
andbitcoin-qt
will now raise an error on startup
if a datadir that is being used contains a bitcoin.conf file that
will be ignored, which can happen when a datadir= line is used in
a bitcoin.conf file. The error message is just a diagnostic intended
to prevent accidental misconfiguration, and it can be disabled to
restore the previous behavior of using the datadir while ignoring
the bitcoin.conf contained in it.- Passing an invalid
-debug
,-debugexclude
, or-loglevel
logging
configuration option now raises an error, rather than logging an easily missed warning.
Tools and Utilities
- A new
bitcoinconsensus_verify_script_with_spent_outputs
function
is available in libconsensus which optionally accepts the spent
outputs of the transaction being verified. - A new
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT
flag is
available in libconsensus that will verify scripts with the Taproot
spending rules.
Wallet
- Wallet loading has changed in this release. Wallets with some
corrupted records that could be previously loaded (with warnings) may no longer load. For example, wallets with corrupted address book entries may no longer load. If this happens, it is recommended load the wallet in a previous version of Bitcoin Core and import the data into a new wallet.- Please also report an issue to help improve the software and make
wallet loading more robust in these cases.
- Please also report an issue to help improve the software and make
- The
gettransaction
,listtransactions
,listsinceblock
RPCs now return theabandoned
field for all transactions. Previously, the "abandoned" field was only returned for sent transactions. - The
listdescriptors
,decodepsbt
and similar RPC methods now showh
rather than apostrophe (`'`) to indicate hardened derivation. This does not apply when using theprivate
parameter, which matches the marker used when descriptor was generated or imported. - Newly created wallets use
h
. This change makes it easier to handle descriptor strings manually.- E.g. the
importdescriptors
RPC call is easiest to useh
as the
marker:'["desc": ".../0h/..."]'
. With this changelistdescriptors
will useh
, so you can copy-paste the result, without having to add escape characters or switch `'` to 'h' manually. - Note that this changes the descriptor checksum.
- For legacy wallets the
hdkeypath
field ingetaddressinfo
is unchanged, nor is the serialization format of wallet dumps.
- E.g. the
- The
getbalances
RPC now returns alastprocessedblock
JSON object
which contains the wallet's last processed block hash and height at the time the balances were calculated. This result shouldn't be cached because importing new keys could invalidate it. - The
gettransaction
RPC now returns alastprocessedblock
JSON
object which contains the wallet's last processed block hash and height at the time the transaction information was generated. - The
getwalletinfo
RPC now returns alastprocessedblock
JSON
object which contains the wallet's last processed block hash and height at the time the wallet information was generated. - Coin selection and transaction building now accounts for unconfirmed
low-feerate ancestor transactions. When it is necessary to spend
unconfirmed outputs, the wallet will add fees to ensure that the new
transaction with its ancestors will achieve a mining score equal to
the feerate requested by the user. - For RPC methods which accept `options` parameters ((
importmulti
,listunspent
,fundrawtransaction
,bumpfee
,send
,sendall
,walletcreatefundedpsbt
,simulaterawtransaction
), it is now possible to pass the options as named parameters without the need for a nested object. - The
deprecatedrpc=walletwarningfield
configuration option has been removed. Thecreatewallet
,loadwallet
,restorewallet
andunloadwallet
RPCs no longer return the "warning" string field. The same information is provided through the "warnings" field added in v25.0, which returns a JSON array of strings. The "warning" string field was deprecated also in v25.0. - The
signrawtransactionwithkey
,signrawtransactionwithwallet
,walletprocesspsbt
anddescriptorprocesspsbt
calls now return the more specific RPC_INVALID_PARAMETER error instead of RPC_MISC_ERROR if their sighashtype argument is malformed. - RPC
walletprocesspsbt
, anddescriptorprocesspsbt
return object now includes fieldhex
(if the transaction is complete) containing the serialized transaction suitable for RPCsendrawtransaction
. - It's now possible to use Miniscript inside Taproot leaves for descriptor wallets.
GUI changes
- The transaction list in the GUI no longer provides a special
category for "payment to yourself". Now transactions that have both
inputs and outputs that affect the wallet are displayed on separate
lines for spending and receiving. - A new menu option allows migrating a legacy wallet based on keys and
implied output script types stored in BerkeleyDB (BDB) to a modern
wallet that uses descriptors stored in SQLite. - The PSBT operations dialog marks outputs paying your own wallet with "own address".
- The ability to create legacy wallets is being removed.
Tests
- Non-standard transactions are now disabled by default on testnet for relay and mempool acceptance. The previous behaviour can be re-enabled by setting
-acceptnonstdtxn=1
.
Announcement / Archive
Blog Post / Archive
Release notes / Archive
GitHub Repo