doc/release-notes/release-notes-22.0.md
Bitcoin Core version 22.0 is now available from:
https://bitcoincore.org/bin/bitcoin-core-22.0/
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:
https://github.com/bitcoin/bitcoin/issues
To receive security and update notifications, please subscribe to:
https://bitcoincore.org/en/list/announcements/join/
If you are running an older version, shut it down. Wait until it has completely
shut down (which might take a few minutes in some cases), then run the
installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac)
or bitcoind/bitcoin-qt (on Linux).
Upgrading directly from a version of Bitcoin Core that has reached its EOL is possible, but it might take some time if the data directory needs to be migrated. Old wallet versions of Bitcoin Core are generally supported.
Bitcoin Core is supported and extensively tested on operating systems using the Linux kernel, macOS 10.14+, and Windows 7 and newer. Bitcoin Core should also work on most other Unix-like systems but is not as frequently tested on them. It is not recommended to use Bitcoin Core on unsupported systems.
From Bitcoin Core 22.0 onwards, macOS versions earlier than 10.14 are no longer supported.
Added support for running Bitcoin Core as an I2P (Invisible Internet Project) service and connect to such services. See i2p.md for details. (#20685)
This release removes support for Tor version 2 hidden services in favor of Tor
v3 only, as the Tor network dropped support for Tor
v2 with the release of
Tor version 0.4.6. Henceforth, Bitcoin Core ignores Tor v2 addresses; it
neither rumors them over the network to other peers, nor stores them in memory
or to peers.dat. (#22050)
Added NAT-PMP port mapping support via
libnatpmp. (#18077)
Due to BIP 350 being implemented, behavior for all RPCs that accept addresses is changed when a native witness version 1 (or higher) is passed. These now require a Bech32m encoding instead of a Bech32 one, and Bech32m encoding will be used for such addresses in RPC output as well. No version 1 addresses should be created for mainnet until consensus rules are adopted that give them meaning (as will happen through BIP 341). Once that happens, Bech32m is expected to be used for them, so this shouldn't affect any production systems, but may be observed on other networks where such addresses already have meaning (like signet). (#20861)
The getpeerinfo RPC returns two new boolean fields, bip152_hb_to and
bip152_hb_from, that respectively indicate whether we selected a peer to be
in compact blocks high-bandwidth mode or whether a peer selected us as a
compact blocks high-bandwidth peer. High-bandwidth peers send new block
announcements via a cmpctblock message rather than the usual inv/headers
announcements. See BIP 152 for more details. (#19776)
getpeerinfo no longer returns the following fields: addnode, banscore,
and whitelisted, which were previously deprecated in 0.21. Instead of
addnode, the connection_type field returns manual. Instead of
whitelisted, the permissions field indicates if the peer has special
privileges. The banscore field has simply been removed. (#20755)
The following RPCs: gettxout, getrawtransaction, decoderawtransaction,
decodescript, gettransaction, and REST endpoints: /rest/tx,
/rest/getutxos, /rest/block deprecated the following fields (which are no
longer returned in the responses by default): addresses, reqSigs.
The -deprecatedrpc=addresses flag must be passed for these fields to be
included in the RPC response. This flag/option will be available only for this major release, after which
the deprecation will be removed entirely. Note that these fields are attributes of
the scriptPubKey object returned in the RPC response. However, in the response
of decodescript these fields are top-level attributes, and included again as attributes
of the scriptPubKey object. (#20286)
When creating a hex-encoded bitcoin transaction using the bitcoin-tx utility
with the -json option set, the following fields: addresses, reqSigs are no longer
returned in the tx output of the response. (#20286)
The listbanned RPC now returns two new numeric fields: ban_duration and time_remaining.
Respectively, these new fields indicate the duration of a ban and the time remaining until a ban expires,
both in seconds. Additionally, the ban_created field is repositioned to come before banned_until. (#21602)
The setban RPC can ban onion addresses again. This fixes a regression introduced in version 0.21.0. (#20852)
The getnodeaddresses RPC now returns a "network" field indicating the
network type (ipv4, ipv6, onion, or i2p) for each address. (#21594)
getnodeaddresses now also accepts a "network" argument (ipv4, ipv6, onion,
or i2p) to return only addresses of the specified network. (#21843)
The testmempoolaccept RPC now accepts multiple transactions (still experimental at the moment,
API may be unstable). This is intended for testing transaction packages with dependency
relationships; it is not recommended for batch-validating independent transactions. In addition to
mempool policy, package policies apply: the list cannot contain more than 25 transactions or have a
total size exceeding 101K virtual bytes, and cannot conflict with (spend the same inputs as) each other or
the mempool, even if it would be a valid BIP125 replace-by-fee. There are some known limitations to
the accuracy of the test accept: it's possible for testmempoolaccept to return "allowed"=True for a
group of transactions, but "too-long-mempool-chain" if they are actually submitted. (#20833)
addmultisigaddress and createmultisig now support up to 20 keys for
Segwit addresses. (#20867)
Changes to Wallet or GUI related RPCs can be found in the GUI or Wallet section below.
guix-based build system.
The /doc/release-process.md document has been updated accordingly.setban RPC) is now saved on disk
in JSON format in banlist.json instead of banlist.dat. banlist.dat is
only read on startup if banlist.json is not present. Changes are only written to the new
banlist.json. A future version of Bitcoin Core may completely ignore
banlist.dat. (#20966)-natpmp option has been added to use NAT-PMP to map the listening port.
If both UPnP and NAT-PMP are enabled, a successful allocation from UPnP
prevails over one from NAT-PMP. (#18077)Changes to Wallet or GUI related settings can be found in the GUI or Wallet section below.
-rpcauth argument now cause bitcoind to fail to start. (#20461)A new CLI -addrinfo command returns the number of addresses known to the
node per network type (including Tor v2 versus v3) and total. This can be
useful to see if the node knows enough addresses in a network to use options
like -onlynet=<network> or to upgrade to this release of Bitcoin Core 22.0
that supports Tor v3 only. (#21595)
A new -rpcwaittimeout argument to bitcoin-cli sets the timeout
in seconds to use with -rpcwait. If the timeout expires,
bitcoin-cli will report a failure. (#21056)
External signers such as hardware wallets can now be used through the new RPC methods enumeratesigners and displayaddress. Support is also added to the send RPC call. This feature is experimental. See external-signer.md for details. (#16546)
A new listdescriptors RPC is available to inspect the contents of descriptor-enabled wallets.
The RPC returns public versions of all imported descriptors, including their timestamp and flags.
For ranged descriptors, it also returns the range boundaries and the next index to generate addresses from. (#20226)
The bumpfee RPC is not available with wallets that have private keys
disabled. psbtbumpfee can be used instead. (#20891)
The fundrawtransaction, send and walletcreatefundedpsbt RPCs now support an include_unsafe option
that when true allows using unsafe inputs to fund the transaction.
Note that the resulting transaction may become invalid if one of the unsafe inputs disappears.
If that happens, the transaction must be funded with different inputs and republished. (#21359)
We now support up to 20 keys in multi() and sortedmulti() descriptors
under wsh(). (#20867)
Taproot descriptors can be imported into the wallet only after activation has occurred on the network (e.g. mainnet, testnet, signet) in use. See descriptors.md for supported descriptors.
The RPC server can process a limited number of simultaneous RPC requests.
Previously, if this limit was exceeded, the RPC server would respond with
status code 500 (HTTP_INTERNAL_SERVER_ERROR).
Now it returns status code 503 (HTTP_SERVICE_UNAVAILABLE). (#18335)
Error codes have been updated to be more accurate for the following error cases (#18466):
signmessage now returns RPC_INVALID_ADDRESS_OR_KEY (-5) if the
passed address is invalid. Previously returned RPC_TYPE_ERROR (-3).verifymessage now returns RPC_INVALID_ADDRESS_OR_KEY (-5) if the
passed address is invalid. Previously returned RPC_TYPE_ERROR (-3).verifymessage now returns RPC_TYPE_ERROR (-3) if the passed signature
is malformed. Previously returned RPC_INVALID_ADDRESS_OR_KEY (-5).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.
MAX_STANDARD_SCRIPTSIG_SIZE to policy (sanket1729)TX_MAX_STANDARD_VERSION to policy (MarcoFalke)DumpMempool(…) by using the RenameOver(…) return value (practicalswift)g_chainman usage (dongcarl)cs_main (dongcarl)cs_main (dongcarl)Warning: from warning message printed for unknown new rules (prayank23)args instead of gArgs (kiminuo)m_mempool optional in CChainState (jamesob)cs_feeFilter with simple std::atomic (MarcoFalke)CNode::m_inbound_onion is inbound in ctor, add getter, unit tests (jonatack)m_addr_known (sdaftuar)m_is_manual_connection from CNodeState (ariard)net_processing (jnewbery)cs_vSend lock (jnewbery)NET_UNROUTABLE as not_publicly_routable, automate helps (jonatack)net_processing (and some of net) use std::chrono types (dhruv)net_processing into txorphanage (ajtowns)CNode::m_inbound_onion public, initialize explicitly (jonatack)net_processing (jnewbery)net_processing (jnewbery)addr send functionality into MaybeSendAddr() (jnewbery)cs_vNodes mutex is locked (hebasto)CNode::cs_vSend (vasild)getnameinfo when formatting IPv6 addresses in CNetAddr::ToStringIP (practicalswift)m_block_inv_mutex (MarcoFalke)cs_main before calling RelayTransactions() (jnewbery)CNetAddr::ToStringIP() (laanwj)ios_base::failure specifically (Bushstar)OUTPUT_GROUP_MAX_ENTRIES to 100 (fjahr)parent_desc to getaddressinfo (achow101)importdescriptors update existing (S3RK)listdescriptors command (S3RK)upgradewallet fixes, improvements, test coverage (jonatack)unloadwallet: Allow specifying wallet_name param matching RPC endpoint wallet (luke-jr)createwallet examples for descriptor wallets (S3RK)walletdir is root directory (prayank23){sign,verify}message RPCs (theStack)getblock using BlockUndo data (robot-visions)hash_type MUHASH for gettxoutsetinfo (fjahr)gettxoutproof (promag)addresses and reqSigs from RPC outputs (mjdietzx)-rpcauth arguments (promag)submitblock, gettxout, getblocktemplate, scantxoutset) (MarcoFalke)getpeerinfo (amitiuttarwar)-netinfo user help and argument parsing improvements (jonatack)testmempoolaccept (MarcoFalke)RPC_TRANSACTION_ALREADY_IN_CHAIN exception (jarolrod)getmempoolinfo (MarcoFalke)-rpcwaittimeout parameter to limit time spent waiting (cdecker)-netinfo (laanwj)getchaintxstats result (theStack)include_unsafe option for fundrawtransaction (t-bast)scantxoutset EXPERIMENTAL warning (jonatack)network field to getnodeaddresses (jonatack)-addrinfo (jonatack)listbanned (jarolrod)getblock invalid datatype (klementtan)bumpfee/psbtbumpfee fixes and updates (jonatack)addpeeraddress test coverage, code simplify/constness (jonatack)-rpcwaittimeout (MarcoFalke)bip152_highbandwidth_{to, from} in peer details (jonatack)bitcoin_en.ts (hebasto)CMAKE_INSTALL_RPATH for native packages (ryanofsky)native_biplist dependency (fanquake)RELOC_SECTION security check for bitcoin-util (fanquake)BOOST_PROCESS macro (fanquake)HAVE_O_CLOEXEC available outside LevelDB (bugfix) (theStack)SDK_PATH into container (dongcarl)AM_CONDITIONAL([ENABLE_EXTERNAL_SIGNER]) unconditional (hebasto)id_string invocations (dongcarl)native_cctools (fanquake)bitcoin_qt.m4 more generic (fanquake)NO_BDB=1 (fanquake)QT_RCC_TEST=1 for determinism (hebasto)-isysroot over --sysroot on macOS (fanquake)-D_LIBCPP_DEBUG=1 to debug flags (MarcoFalke)getent(1) invocation, doc fixups (dongcarl)#if CLIENT_VERSION_IS_RELEASE (dongcarl)feature_block.py (sanket1729)feature_config_args.py not to rely on strange regtest=0 behavior (ryanofsky)OP_CLTV fail reasons in feature_cltv.py (BIP 65) (theStack)wallet_tests/CreateWallet (hebasto)wait_for_{block,header} helpers in p2p_fingerprint.py (theStack)test_txid_inv_delay (ariard)key_signature_tests (dgpv)feature_taproot.py --previous_release (MarcoFalke)is_bdb_compiled helper (Sjors)p2p_fingerprint issue (MarcoFalke)disconnect_p2ps (amitiuttarwar)MIN_VERSION_SUPPORTED to p2p.py (jnewbery)wallet_multiwallet issue on windows (MarcoFalke)wallet_multiwallet issue with got_loading_error (MarcoFalke)assert_start_raises_init_error (MarcoFalke)script_assets_test_minimizer (MarcoFalke)mempool_resurrect.py (MarcoFalke)epoll_ctl data race suppression (hebasto)NULL_DATA is unspendable (MarcoFalke)feature_csv_activation.py (PiRK)process_message* fuzz targets (MarcoFalke)nodes type in test_framework.py (kiminuo)get_previous_releases.py for aarch64 (MarcoFalke)msg_version (theStack)MIN_PEER_PROTO_VERSION (MarcoFalke)libtest_util, and use it in bench (MarcoFalke)setup_clean_chain documentation (fjahr)feature_assumevalid (brunoerg)xor_bytes (theStack)assert_blockchain_height (MarcoFalke)BOOST_CHECK to BOOST_CHECK_EQUAL for paths (kiminuo)tx_pool fuzz target (MarcoFalke)test_seed_peers (dhruv)mempool_reorg.py even with wallet disabled (DariusParvin)rpc_blockchain.py by removing miniwallet.generate() (MarcoFalke)P2WSH_OP_TRUE to shared test library (MarcoFalke)NODE_NETWORK_LIMITED_MIN_BLOCKS disconnection (MarcoFalke)feature_blockfilterindex_prune (MarcoFalke)transaction_tests (glozow)feature_blockfilterindex_prune.py improvements (jonatack)p2p_leak.py up to date (mzumsande)test/util/setup_common.h) (MarcoFalke)feature_nulldummy to fix timeouts, speed up (jonatack)rpc_timeout for fundrawtx test_transaction_too_large (jonatack)sync_all in wallet_ groups (jonatack)fuzzed_dns_lookup_function as a lambda (practicalswift)race:validation_chainstatemanager_tests suppression (MarcoFalke)rpc_tests (MarcoFalke)BOOST_CHECK in cnetaddr_basic (practicalswift)include_mempool value of gettxout (promag)feature_cltv with MiniWallet (MarcoFalke)mempool_spend_coinbase.py (MarcoFalke)feature_notifications.py intermittent issue (MarcoFalke)p2p_addr_relay.py (MarcoFalke)rpc_fundrawtransaction assertions (jonatack)p2p_segwit.py (MarcoFalke)tx_pool targets (MarcoFalke)p2p_segwit.py (jnewbery)feature_config_args.py intermittent issue (MarcoFalke)interface_bitcoin_cli.py (klementtan)-fsanitize=integer suppression needed for RPC fuzzer (generateblock) (practicalswift)p2p_blocksonly.py (theStack)WRITE_ALL_FUZZ_TARGETS_AND_ABORT (MarcoFalke)tx_pool (MarcoFalke)feature_csv_activation.py (theStack)utxo_snapshot target (MarcoFalke)COINBASE_MATURITY in functional tests (kiminuo)feature_dersig.py (theStack)CheckTxInputs [[nodiscard]]. Avoid UUM in fuzzing harness coins_view (practicalswift)p2p_invalid_block: Check that a block rejected due to too-new tim… (willcl-ark)p2p_leak.py intermittent failure (mzumsande)sync_blocks in wallet_orphanedreward.py (domob1812)denialofservice_tests (MarcoFalke)test_no_inherited_signaling RBF test (MarcoFalke)--failfast (S3RK)CPubKey (theStack)base_encode_decode (apoelstra)p2p_addr_relay.py (amitiuttarwar)p2p_blockfilters (MarcoFalke)sync_all to feature_coinstatsindex (MarcoFalke)script_util helpers for creating P2{PKH,SH,WPKH,WSH} scripts (theStack)bad-txns-prevout-null reject reason (theStack)wallet_listdescriptors.py if bdb is not compiled (hebasto)rpc_rawtransaction peers to speed up tests (jonatack)do_fund_send (S3RK)fee_estimates.dat is non-fatal (MarcoFalke)install_db4.sh (gruve-p)BASE_CACHE into container (dongcarl)posix_time usage from gettime* (fanquake)bech32_encode calls in gen_key_io_test_vectors.py (sipa)gcc-8 across the board (dongcarl)GetDataDir(net_specific) function (kiminuo)CONFIG_SITE variable instead of --prefix option (hebasto)OP_CLTV (nothingmuch)net_processing comments (sdaftuar)GUIX_COMMON_FLAGS doc (fanquake)okSafeMode RPC guideline from developer notes (theStack)REVIEWERS (practicalswift)--disable-external-signer in OpenBSD build guide (theStack)testmempoolaccept doc (glozow)Thanks to everyone who directly contributed to this release:
As well as to everyone that helped with translations on Transifex.