diff --git a/build_msvc/fuzz/fuzz.vcxproj b/build_msvc/fuzz/fuzz.vcxproj index 7c72703c93..a989b562c0 100644 --- a/build_msvc/fuzz/fuzz.vcxproj +++ b/build_msvc/fuzz/fuzz.vcxproj @@ -9,7 +9,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ - + $(IntDir)test_fuzz_util_descriptor.obj diff --git a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh b/ci/test/00_setup_env_native_fuzz_with_valgrind.sh index bf4d1573e3..9e410b06ee 100755 --- a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh +++ b/ci/test/00_setup_env_native_fuzz_with_valgrind.sh @@ -17,3 +17,4 @@ export FUZZ_TESTS_CONFIG="--valgrind" export GOAL="install" export BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer CC=clang-16 CXX=clang++-16" export CCACHE_MAXSIZE=200M +export LLVM_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-16" diff --git a/configure.ac b/configure.ac index d7b7ed4c8a..273929af72 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 28) -define(_CLIENT_VERSION_MINOR, 0) +define(_CLIENT_VERSION_MINOR, 1) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_RC, 0) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/devtools/gen-blackmore-conf.sh b/contrib/devtools/gen-blackmore-conf.sh index 4be822f593..2293c8e150 100755 --- a/contrib/devtools/gen-blackmore-conf.sh +++ b/contrib/devtools/gen-blackmore-conf.sh @@ -72,9 +72,12 @@ cat >> "${EXAMPLE_CONF_FILE}" << 'EOF' # Options for mainnet [main] -# Options for testnet +# Options for testnet3 [test] +# Options for testnet4 +[testnet4] + # Options for signet [signet] diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk index 4c657358f6..73c70fe017 100644 --- a/depends/hosts/mingw32.mk +++ b/depends/hosts/mingw32.mk @@ -1,3 +1,6 @@ +ifneq ($(shell $(SHELL) $(.SHELLFLAGS) "command -v $(host)-gcc-posix"),) +mingw32_CC := $(host)-gcc-posix +endif ifneq ($(shell $(SHELL) $(.SHELLFLAGS) "command -v $(host)-g++-posix"),) mingw32_CXX := $(host)-g++-posix endif diff --git a/depends/hosts/netbsd.mk b/depends/hosts/netbsd.mk index f33b2d2889..6e0fa9e12f 100644 --- a/depends/hosts/netbsd.mk +++ b/depends/hosts/netbsd.mk @@ -7,8 +7,6 @@ netbsd_NM = $(host_toolchain)gcc-nm netbsd_RANLIB = $(host_toolchain)gcc-ranlib endif -netbsd_CXXFLAGS=$(netbsd_CFLAGS) - netbsd_release_CFLAGS=-O2 netbsd_release_CXXFLAGS=$(netbsd_release_CFLAGS) diff --git a/doc/bitcoin-conf.md b/doc/bitcoin-conf.md index 4b0796d93e..dc75b24f94 100644 --- a/doc/bitcoin-conf.md +++ b/doc/bitcoin-conf.md @@ -31,7 +31,7 @@ Comments may appear in two ways: ### Network specific options Network specific options can be: -- placed into sections with headers `[main]` (not `[mainnet]`), `[test]` (not `[testnet]`), `[signet]` or `[regtest]`; +- placed into sections with headers `[main]` (not `[mainnet]`), `[test]` (not `[testnet]`, for testnet), `[testnet4]`, `[signet]` or `[regtest]`; - prefixed with a chain name; e.g., `regtest.maxmempool=100`. Network specific options take precedence over non-network specific options. diff --git a/doc/man/blackmore-cli.1 b/doc/man/blackmore-cli.1 index 453bff3db8..3c967667ca 100644 --- a/doc/man/blackmore-cli.1 +++ b/doc/man/blackmore-cli.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORE-CLI "1" "October 2024" "blackmore-cli v27.2.0" "User Commands" +.TH BLACKMORE-CLI "1" "December 2024" "blackmore-cli v28.1.0" "User Commands" .SH NAME -blackmore-cli \- manual page for blackmore-cli v27.2.0 +blackmore-cli \- manual page for blackmore-cli v28.1.0 .SH SYNOPSIS .B blackmore-cli [\fI\,options\/\fR] \fI\, \/\fR[\fI\,params\/\fR] \fI\,Send command to Blackcoin More\/\fR @@ -15,7 +15,7 @@ blackmore-cli \- manual page for blackmore-cli v27.2.0 .B blackmore-cli [\fI\,options\/\fR] \fI\,help Get help for a command\/\fR .SH DESCRIPTION -Blackcoin More RPC client version v27.2.0 +Blackcoin More RPC client version v28.1.0 .SH OPTIONS .HP \-? diff --git a/doc/man/blackmore-qt.1 b/doc/man/blackmore-qt.1 index ff9e80179f..5028924320 100644 --- a/doc/man/blackmore-qt.1 +++ b/doc/man/blackmore-qt.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORE-QT "1" "October 2024" "blackmore-qt v27.2.0" "User Commands" +.TH BLACKMORE-QT "1" "December 2024" "blackmore-qt v28.1.0" "User Commands" .SH NAME -blackmore-qt \- manual page for blackmore-qt v27.2.0 +blackmore-qt \- manual page for blackmore-qt v28.1.0 .SH SYNOPSIS .B blackmore-qt [\fI\,command-line options\/\fR] .SH DESCRIPTION -Blackcoin More version v27.2.0 +Blackcoin More version v28.1.0 .PP Optional URI is a Blackcoin address in BIP21 URI format. .SH OPTIONS @@ -351,10 +351,10 @@ Support filtering of blocks and transaction with bloom filters (default: .HP \fB\-port=\fR .IP -Listen for connections on . Nodes not using the default ports -(default: 15714, testnet: 25714, signet: 38333, regtest: 35714) -are unlikely to get incoming connections. Not relevant for I2P -(see doc/i2p.md). +Listen for connections on (default: 15714, testnet: 25714, +testnet4: 48333, signet: 38333, regtest: 35714). Not relevant for +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. .HP \fB\-proxy=\fR .IP diff --git a/doc/man/blackmore-tx.1 b/doc/man/blackmore-tx.1 index d99efc5bc8..fef5b2f5cc 100644 --- a/doc/man/blackmore-tx.1 +++ b/doc/man/blackmore-tx.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORE-TX "1" "October 2024" "blackmore-tx v27.2.0" "User Commands" +.TH BLACKMORE-TX "1" "December 2024" "blackmore-tx v28.1.0" "User Commands" .SH NAME -blackmore-tx \- manual page for blackmore-tx v27.2.0 +blackmore-tx \- manual page for blackmore-tx v28.1.0 .SH SYNOPSIS .B blackmore-tx [\fI\,options\/\fR] \fI\, \/\fR[\fI\,commands\/\fR] \fI\,Update hex-encoded blackcoin transaction\/\fR @@ -9,7 +9,7 @@ blackmore-tx \- manual page for blackmore-tx v27.2.0 .B blackmore-tx [\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] \fI\,Create hex-encoded blackcoin transaction\/\fR .SH DESCRIPTION -Blackcoin More blackmore\-tx utility version v27.2.0 +Blackcoin More blackmore\-tx utility version v28.1.0 .SH OPTIONS .HP \-? diff --git a/doc/man/blackmore-util.1 b/doc/man/blackmore-util.1 index 49638937ef..6b8566ba57 100644 --- a/doc/man/blackmore-util.1 +++ b/doc/man/blackmore-util.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORE-UTIL "1" "October 2024" "blackmore-util v27.2.0" "User Commands" +.TH BLACKMORE-UTIL "1" "December 2024" "blackmore-util v28.1.0" "User Commands" .SH NAME -blackmore-util \- manual page for blackmore-util v27.2.0 +blackmore-util \- manual page for blackmore-util v28.1.0 .SH SYNOPSIS .B blackmore-util [\fI\,options\/\fR] [\fI\,commands\/\fR] \fI\,Do stuff\/\fR .SH DESCRIPTION -Blackcoin More bitcoin\-util utility version v27.2.0 +Blackcoin More bitcoin\-util utility version v28.1.0 .SH OPTIONS .HP \-? diff --git a/doc/man/blackmore-wallet.1 b/doc/man/blackmore-wallet.1 index 03478f6018..2e4c37b55a 100644 --- a/doc/man/blackmore-wallet.1 +++ b/doc/man/blackmore-wallet.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORE-WALLET "1" "October 2024" "blackmore-wallet v27.2.0" "User Commands" +.TH BLACKMORE-WALLET "1" "December 2024" "blackmore-wallet v28.1.0" "User Commands" .SH NAME -blackmore-wallet \- manual page for blackmore-wallet v27.2.0 +blackmore-wallet \- manual page for blackmore-wallet v28.1.0 .SH DESCRIPTION -Blackcoin More blackmore\-wallet version v27.2.0 +Blackcoin More blackmore\-wallet version v28.1.0 .PP blackmore\-wallet is an offline tool for creating and interacting with Blackcoin More wallet files. By default blackmore\-wallet will act on wallets in the default mainnet wallet directory in the datadir. diff --git a/doc/man/blackmored.1 b/doc/man/blackmored.1 index f6613a4041..10c3eaf356 100644 --- a/doc/man/blackmored.1 +++ b/doc/man/blackmored.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BLACKMORED "1" "October 2024" "blackmored v27.2.0" "User Commands" +.TH BLACKMORED "1" "December 2024" "blackmored v28.1.0" "User Commands" .SH NAME -blackmored \- manual page for blackmored v27.2.0 +blackmored \- manual page for blackmored v28.1.0 .SH SYNOPSIS .B blackmored [\fI\,options\/\fR] \fI\,Start Blackcoin More\/\fR .SH DESCRIPTION -Blackcoin More version v27.2.0 +Blackcoin More version v28.1.0 .SH OPTIONS .HP \-? @@ -349,10 +349,10 @@ Support filtering of blocks and transaction with bloom filters (default: .HP \fB\-port=\fR .IP -Listen for connections on . Nodes not using the default ports -(default: 15714, testnet: 25714, signet: 38333, regtest: 35714) -are unlikely to get incoming connections. Not relevant for I2P -(see doc/i2p.md). +Listen for connections on (default: 15714, testnet: 25714, +testnet4: 48333, signet: 38333, regtest: 35714). Not relevant for +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. .HP \fB\-proxy=\fR .IP diff --git a/doc/release-notes.md b/doc/release-notes.md index d9e6a34d0f..e134dcce43 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -1,6 +1,6 @@ -Bitcoin Core version 28.0 is now available from: +Bitcoin Core version 28.1 is now available from: - + This release includes new features, various bug fixes and performance improvements, as well as updated translations. @@ -27,7 +27,7 @@ wallet versions of Bitcoin Core are generally supported. Running Bitcoin Core binaries on macOS requires self signing. ``` -cd /path/to/bitcoin-28.0/bin +cd /path/to/bitcoin-28.x/bin xattr -d com.apple.quarantine bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin codesign -s - bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin ``` @@ -44,328 +44,64 @@ unsupported systems. Notable changes =============== -Testnet4/BIP94 support ------ - -Support for Testnet4 as specified in [BIP94](https://github.com/bitcoin/bips/blob/master/bip-0094.mediawiki) -has been added. The network can be selected with the `-testnet4` option and -the section header is also named `[testnet4]`. - -While the intention is to phase out support for Testnet3 in an upcoming -version, support for it is still available via the known options in this -release. (#29775) - -Windows Data Directory ----------------------- - -The default data directory on Windows has been moved from `C:\Users\Username\AppData\Roaming\Bitcoin` -to `C:\Users\Username\AppData\Local\Bitcoin`. Bitcoin Core will check the existence -of the old directory first and continue to use that directory for backwards -compatibility if it is present. (#27064) - -JSON-RPC 2.0 Support --------------------- - -The JSON-RPC server now recognizes JSON-RPC 2.0 requests and responds with -strict adherence to the [specification](https://www.jsonrpc.org/specification). -See [JSON-RPC-interface.md](https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md#json-rpc-11-vs-20) for details. (#27101) - -JSON-RPC clients may need to be updated to be compatible with the JSON-RPC server. -Please open an issue on GitHub if any compatibility issues are found. - -libbitcoinconsensus Removal ---------------------------- - -The libbitcoin-consensus library was deprecated in 27.0 and is now completely removed. (#29648) - -P2P and Network Changes ------------------------ - -- Previously if Bitcoin Core was listening for P2P connections, either using - default settings or via `bind=addr:port` it would always also bind to - `127.0.0.1:8334` to listen for Tor connections. It was not possible to switch - this off, even if the node didn't use Tor. This has been changed and now - `bind=addr:port` results in binding on `addr:port` only. The default behavior - of binding to `0.0.0.0:8333` and `127.0.0.1:8334` has not been changed. - - If you are using a `bind=...` configuration without `bind=...=onion` and rely - on the previous implied behavior to accept incoming Tor connections at - `127.0.0.1:8334`, you need to now make this explicit by using - `bind=... bind=127.0.0.1:8334=onion`. (#22729) - -- Bitcoin Core will now fail to start up if any of its P2P binds fail, rather - than the previous behaviour where it would only abort startup if all P2P - binds had failed. (#22729) - -- UNIX domain sockets can now be used for proxy connections. Set `-onion` or `-proxy` - to the local socket path with the prefix `unix:` (e.g. `-onion=unix:/home/me/torsocket`). - (#27375) - -- UNIX socket paths are now accepted for `-zmqpubrawblock` and `-zmqpubrawtx` with - the format `-zmqpubrawtx=unix:/path/to/file` (#27679) - -- Additional "in" and "out" flags have been added to `-whitelist` to control whether - permissions apply to inbound connections and/or manual ones (default: inbound only). (#27114) - -- Transactions having a feerate that is too low will be opportunistically paired with - their child transactions and submitted as a package, thus enabling the node to download - 1-parent-1-child packages using the existing transaction relay protocol. Combined with - other mempool policies, this change allows limited "package relay" when a parent transaction - is below the mempool minimum feerate. Topologically Restricted Until Confirmation (TRUC) - parents are additionally allowed to be below the minimum relay feerate (i.e., pay 0 fees). - Use the `submitpackage` RPC to submit packages directly to the node. Warning: this P2P - feature is limited (unlike the `submitpackage` interface, a child with multiple unconfirmed - parents is not supported) and not yet reliable under adversarial conditions. (#28970) - -Mempool Policy Changes ----------------------- - -- Transactions with version number set to 3 are now treated as standard on all networks (#29496), - subject to opt-in Topologically Restricted Until Confirmation (TRUC) transaction policy as - described in [BIP 431](https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki). The - policy includes limits on spending unconfirmed outputs (#28948), eviction of a previous descendant - if a more incentive-compatible one is submitted (#29306), and a maximum transaction size of 10,000vB - (#29873). These restrictions simplify the assessment of incentive compatibility of accepting or - replacing TRUC transactions, thus ensuring any replacements are more profitable for the node and - making fee-bumping more reliable. - -- Pay To Anchor (P2A) is a new standard witness output type for spending, - a newly recognised output template. This allows for key-less anchor - outputs, with compact spending conditions for additional efficiencies on - top of an equivalent `sh(OP_TRUE)` output, in addition to the txid stability - of the spending transaction. - N.B. propagation of this output spending on the network will be limited - until a sufficient number of nodes on the network adopt this upgrade. (#30352) - -- Limited package RBF is now enabled, where the proposed conflicting package would result in - a connected component, aka cluster, of size 2 in the mempool. All clusters being conflicted - against must be of size 2 or lower. (#28984) - -- The default value of the `-mempoolfullrbf` configuration option has been changed from 0 to 1, - i.e. `mempoolfullrbf=1`. (#30493) - -Updated RPCs ------------- - -- The `dumptxoutset` RPC now returns the UTXO set dump in a new and - improved format. Correspondingly, the `loadtxoutset` RPC now expects - this new format in the dumps it tries to load. Dumps with the old - format are no longer supported and need to be recreated using the - new format to be usable. (#29612) - -- AssumeUTXO mainnet parameters have been added for height 840,000. - This means the `loadtxoutset` RPC can now be used on mainnet with - the matching UTXO set from that height. (#28553) - -- The `warnings` field in `getblockchaininfo`, `getmininginfo` and - `getnetworkinfo` now returns all the active node warnings as an array - of strings, instead of a single warning. The current behaviour - can be temporarily restored by running Bitcoin Core with the configuration - option `-deprecatedrpc=warnings`. (#29845) +### P2P -- Previously when using the `sendrawtransaction` RPC and specifying outputs - that are already in the UTXO set, an RPC error code of `-27` with the - message "Transaction already in block chain" was returned in response. - The error message has been changed to "Transaction outputs already in utxo set" - to more accurately describe the source of the issue. (#30212) - -- The default mode for the `estimatesmartfee` RPC has been updated from `conservative` to `economical`, - which is expected to reduce over-estimation for many users, particularly if Replace-by-Fee is an option. - For users that require high confidence in their fee estimates at the cost of potentially over-estimating, - the `conservative` mode remains available. (#30275) - -- RPC `scantxoutset` now returns 2 new fields in the "unspents" JSON array: `blockhash` and `confirmations`. - See the scantxoutset help for details. (#30515) - -- RPC `submitpackage` now allows 2 new arguments to be passed: `maxfeerate` and `maxburnamount`. See the - subtmitpackage help for details. (#28950) - -Changes to wallet-related RPCs can be found in the Wallet section below. - -Updated REST APIs ------------------ -- Parameter validation for `/rest/getutxos` has been improved by rejecting - truncated or overly large txids and malformed outpoint indices via raising - an HTTP_BAD_REQUEST "Parse error". These requests were previously handled - silently. (#30482, #30444) +- When the `-port` configuration option is used, the default onion listening port will now + be derived to be that port + 1 instead of being set to a fixed value (8334 on mainnet). + This re-allows setups with multiple local nodes using different `-port` and not using `-bind`, + which would lead to a startup failure in v28.0 due to a port collision. -Build System ------------- + Note that a `HiddenServicePort` manually configured in `torrc` may need adjustment if used in + connection with the `-port` option. + For example, if you are using `-port=5555` with a non-standard value and not using `-bind=...=onion`, + previously Bitcoin Core would listen for incoming Tor connections on `127.0.0.1:8334`. + Now it would listen on `127.0.0.1:5556` (`-port` plus one). If you configured the hidden service manually + in torrc now you have to change it from `HiddenServicePort 8333 127.0.0.1:8334` to `HiddenServicePort 8333 + 127.0.0.1:5556`, or configure bitcoind with `-bind=127.0.0.1:8334=onion` to get the previous behavior. + (#31223) +- #30568 addrman: change internal id counting to int64_t -- GCC 11.1 or later, or Clang 16.0 or later, -are now required to compile Bitcoin Core. (#29091, #30263) +### Key -- The minimum required glibc to run Bitcoin Core is now -2.31. This means that RHEL 8 and Ubuntu 18.04 (Bionic) -are no-longer supported. (#29987) +- #31166 key: clear out secret data in DecodeExtKey -- `--enable-lcov-branch-coverage` has been removed, given -incompatibilities between lcov version 1 & 2. `LCOV_OPTS` -should be used to set any options instead. (#30192) +### Build -Updated Settings ----------------- +- #31013 depends: For mingw cross compile use `-gcc-posix` to prevent library conflict +- #31502 depends: Fix CXXFLAGS on NetBSD -- When running with `-alertnotify`, an alert can now be raised multiple -times instead of just once. Previously, it was only raised when unknown -new consensus rules were activated. Its scope has now been increased to -include all kernel warnings. Specifically, alerts will now also be raised -when an invalid chain with a large amount of work has been detected. -Additional warnings may be added in the future. (#30058) +### Test -Changes to GUI or wallet related settings can be found in the GUI or Wallet section below. +- #31016 test: add missing sync to feature_fee_estimation.py +- #31448 fuzz: add cstdlib to FuzzedDataProvider +- #31419 test: fix MIN macro redefinition +- #31563 rpc: Extend scope of validation mutex in generateblock -Wallet ------- +### Doc -- The wallet now detects when wallet transactions conflict with the mempool. Mempool-conflicting - transactions can be seen in the `"mempoolconflicts"` field of `gettransaction`. The inputs - of mempool-conflicted transactions can now be respent without manually abandoning the - transactions when the parent transaction is dropped from the mempool, which can cause wallet - balances to appear higher. (#27307) +- #31007 doc: add testnet4 section header for config file -- A new `max_tx_weight` option has been added to the RPCs `fundrawtransaction`, `walletcreatefundedpsbt`, and `send`. -It specifies the maximum transaction weight. If the limit is exceeded during funding, the transaction will not be built. -The default value is 4,000,000 WU. (#29523) +### CI -- A new `createwalletdescriptor` RPC allows users to add new automatically generated - descriptors to their wallet. This can be used to upgrade wallets created prior to the - introduction of a new standard descriptor, such as taproot. (#29130) +- #30961 ci: add LLVM_SYMBOLIZER_PATH to Valgrind fuzz job -- A new RPC `gethdkeys` lists all of the BIP32 HD keys in use by all of the descriptors in the wallet. - These keys can be used in conjunction with `createwalletdescriptor` to create and add single key - descriptors to the wallet for a particular key that the wallet already knows. (#29130) +### Misc -- The `sendall` RPC can now spend unconfirmed change and will include additional fees as necessary - for the resulting transaction to bump the unconfirmed transactions' feerates to the specified feerate. (#28979) - -- In RPC `bumpfee`, if a `fee_rate` is specified, the feerate is no longer restricted - to following the wallet's incremental feerate of 5 sat/vb. The feerate must still be - at least the sum of the original fee and the mempool's incremental feerate. (#27969) - -GUI Changes ------------ - -- The "Migrate Wallet" menu allows users to migrate any legacy wallet in their wallet -directory, regardless of the wallets loaded. (gui#824) - -- The "Information" window now displays the maximum mempool size along with the -mempool usage. (gui#825) - -Low-level Changes -================= - -Tests ------ - -- The BIP94 timewarp attack mitigation is now active on the `regtest` network. (#30681) - -- A new `-testdatadir` option has been added to `test_bitcoin` to allow specifying the - location of unit test data directories. (#26564) - -Blockstorage ------------- - -- Block files are now XOR'd by default with a key stored in the blocksdir. -Previous releases of Bitcoin Core or previous external software will not be able to read the blocksdir with a non-zero XOR-key. -Refer to the `-blocksxor` help for more details. (#28052) - -Chainstate ----------- - -- The chainstate database flushes that occur when blocks are pruned will no longer -empty the database cache. The cache will remain populated longer, which significantly -reduces the time for initial block download to complete. (#28280) - -Dependencies ------------- - -- The dependency on Boost.Process has been replaced with cpp-subprocess, which is contained in source. -Builders will no longer need Boost.Process to build with external signer support. (#28981) +- #31267 refactor: Drop deprecated space in `operator""_mst` +- #31431 util: use explicit cast in MultiIntBitSet::Fill() Credits ======= -Thanks to everyone who directly contributed to this release: -- 0xb10c -- Alfonso Roman Zubeldia -- Andrew Toth -- AngusP -- Anthony Towns -- Antoine Poinsot -- Anton A -- Ava Chow -- Ayush Singh -- Ben Westgate -- Brandon Odiwuor -- brunoerg -- bstin -- Charlie -- Christopher Bergqvist -- Cory Fields -- crazeteam -- Daniela Brozzoni -- David Gumberg -- dergoegge -- Edil Medeiros -- Epic Curious -- Fabian Jahr - fanquake -- furszy -- glozow -- Greg Sanders -- hanmz - Hennadii Stepanov -- Hernan Marino -- Hodlinator -- ishaanam -- ismaelsadeeq -- Jadi -- Jon Atack -- josibake -- jrakibi -- kevkevin -- kevkevinpal -- Konstantin Akimov - laanwj -- Larry Ruane -- Lőrinc -- Luis Schwab -- Luke Dashjr - MarcoFalke -- marcofleon -- Marnix -- Martin Saposnic - Martin Zumsande -- Matt Corallo -- Matthew Zipkin -- Matt Whitlock -- Max Edwards -- Michael Dietz -- Murch -- nanlour -- pablomartin4btc -- Peter Todd -- Pieter Wuille -- @RandyMcMillan -- RoboSchmied -- Roman Zeyde -- Ryan Ofsky +- Marnix - Sebastian Falbesoner -- Sergi Delgado Segura -- Sjors Provoost -- spicyzboss -- StevenMia -- stickies-v -- stratospher -- Suhas Daftuar -- sunerok -- tdb3 -- TheCharlatan -- umiumi -- Vasil Dimov -- virtu -- willcl-ark + +Thanks to everyone who directly contributed to this release: As well as to everyone that helped with translations on [Transifex](https://www.transifex.com/bitcoin/bitcoin/). diff --git a/doc/release-notes/release-notes-28.0.md b/doc/release-notes/release-notes-28.0.md new file mode 100644 index 0000000000..d9e6a34d0f --- /dev/null +++ b/doc/release-notes/release-notes-28.0.md @@ -0,0 +1,371 @@ +Bitcoin Core version 28.0 is now available from: + + + +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: + + + +To receive security and update notifications, please subscribe to: + + + +How to Upgrade +============== + +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 macOS) +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. + +Running Bitcoin Core binaries on macOS requires self signing. +``` +cd /path/to/bitcoin-28.0/bin +xattr -d com.apple.quarantine bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin +codesign -s - bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin +``` + +Compatibility +============== + +Bitcoin Core is supported and extensively tested on operating systems +using the Linux Kernel 3.17+, macOS 11.0+, 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. + +Notable changes +=============== + +Testnet4/BIP94 support +----- + +Support for Testnet4 as specified in [BIP94](https://github.com/bitcoin/bips/blob/master/bip-0094.mediawiki) +has been added. The network can be selected with the `-testnet4` option and +the section header is also named `[testnet4]`. + +While the intention is to phase out support for Testnet3 in an upcoming +version, support for it is still available via the known options in this +release. (#29775) + +Windows Data Directory +---------------------- + +The default data directory on Windows has been moved from `C:\Users\Username\AppData\Roaming\Bitcoin` +to `C:\Users\Username\AppData\Local\Bitcoin`. Bitcoin Core will check the existence +of the old directory first and continue to use that directory for backwards +compatibility if it is present. (#27064) + +JSON-RPC 2.0 Support +-------------------- + +The JSON-RPC server now recognizes JSON-RPC 2.0 requests and responds with +strict adherence to the [specification](https://www.jsonrpc.org/specification). +See [JSON-RPC-interface.md](https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md#json-rpc-11-vs-20) for details. (#27101) + +JSON-RPC clients may need to be updated to be compatible with the JSON-RPC server. +Please open an issue on GitHub if any compatibility issues are found. + +libbitcoinconsensus Removal +--------------------------- + +The libbitcoin-consensus library was deprecated in 27.0 and is now completely removed. (#29648) + +P2P and Network Changes +----------------------- + +- Previously if Bitcoin Core was listening for P2P connections, either using + default settings or via `bind=addr:port` it would always also bind to + `127.0.0.1:8334` to listen for Tor connections. It was not possible to switch + this off, even if the node didn't use Tor. This has been changed and now + `bind=addr:port` results in binding on `addr:port` only. The default behavior + of binding to `0.0.0.0:8333` and `127.0.0.1:8334` has not been changed. + + If you are using a `bind=...` configuration without `bind=...=onion` and rely + on the previous implied behavior to accept incoming Tor connections at + `127.0.0.1:8334`, you need to now make this explicit by using + `bind=... bind=127.0.0.1:8334=onion`. (#22729) + +- Bitcoin Core will now fail to start up if any of its P2P binds fail, rather + than the previous behaviour where it would only abort startup if all P2P + binds had failed. (#22729) + +- UNIX domain sockets can now be used for proxy connections. Set `-onion` or `-proxy` + to the local socket path with the prefix `unix:` (e.g. `-onion=unix:/home/me/torsocket`). + (#27375) + +- UNIX socket paths are now accepted for `-zmqpubrawblock` and `-zmqpubrawtx` with + the format `-zmqpubrawtx=unix:/path/to/file` (#27679) + +- Additional "in" and "out" flags have been added to `-whitelist` to control whether + permissions apply to inbound connections and/or manual ones (default: inbound only). (#27114) + +- Transactions having a feerate that is too low will be opportunistically paired with + their child transactions and submitted as a package, thus enabling the node to download + 1-parent-1-child packages using the existing transaction relay protocol. Combined with + other mempool policies, this change allows limited "package relay" when a parent transaction + is below the mempool minimum feerate. Topologically Restricted Until Confirmation (TRUC) + parents are additionally allowed to be below the minimum relay feerate (i.e., pay 0 fees). + Use the `submitpackage` RPC to submit packages directly to the node. Warning: this P2P + feature is limited (unlike the `submitpackage` interface, a child with multiple unconfirmed + parents is not supported) and not yet reliable under adversarial conditions. (#28970) + +Mempool Policy Changes +---------------------- + +- Transactions with version number set to 3 are now treated as standard on all networks (#29496), + subject to opt-in Topologically Restricted Until Confirmation (TRUC) transaction policy as + described in [BIP 431](https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki). The + policy includes limits on spending unconfirmed outputs (#28948), eviction of a previous descendant + if a more incentive-compatible one is submitted (#29306), and a maximum transaction size of 10,000vB + (#29873). These restrictions simplify the assessment of incentive compatibility of accepting or + replacing TRUC transactions, thus ensuring any replacements are more profitable for the node and + making fee-bumping more reliable. + +- Pay To Anchor (P2A) is a new standard witness output type for spending, + a newly recognised output template. This allows for key-less anchor + outputs, with compact spending conditions for additional efficiencies on + top of an equivalent `sh(OP_TRUE)` output, in addition to the txid stability + of the spending transaction. + N.B. propagation of this output spending on the network will be limited + until a sufficient number of nodes on the network adopt this upgrade. (#30352) + +- Limited package RBF is now enabled, where the proposed conflicting package would result in + a connected component, aka cluster, of size 2 in the mempool. All clusters being conflicted + against must be of size 2 or lower. (#28984) + +- The default value of the `-mempoolfullrbf` configuration option has been changed from 0 to 1, + i.e. `mempoolfullrbf=1`. (#30493) + +Updated RPCs +------------ + +- The `dumptxoutset` RPC now returns the UTXO set dump in a new and + improved format. Correspondingly, the `loadtxoutset` RPC now expects + this new format in the dumps it tries to load. Dumps with the old + format are no longer supported and need to be recreated using the + new format to be usable. (#29612) + +- AssumeUTXO mainnet parameters have been added for height 840,000. + This means the `loadtxoutset` RPC can now be used on mainnet with + the matching UTXO set from that height. (#28553) + +- The `warnings` field in `getblockchaininfo`, `getmininginfo` and + `getnetworkinfo` now returns all the active node warnings as an array + of strings, instead of a single warning. The current behaviour + can be temporarily restored by running Bitcoin Core with the configuration + option `-deprecatedrpc=warnings`. (#29845) + +- Previously when using the `sendrawtransaction` RPC and specifying outputs + that are already in the UTXO set, an RPC error code of `-27` with the + message "Transaction already in block chain" was returned in response. + The error message has been changed to "Transaction outputs already in utxo set" + to more accurately describe the source of the issue. (#30212) + +- The default mode for the `estimatesmartfee` RPC has been updated from `conservative` to `economical`, + which is expected to reduce over-estimation for many users, particularly if Replace-by-Fee is an option. + For users that require high confidence in their fee estimates at the cost of potentially over-estimating, + the `conservative` mode remains available. (#30275) + +- RPC `scantxoutset` now returns 2 new fields in the "unspents" JSON array: `blockhash` and `confirmations`. + See the scantxoutset help for details. (#30515) + +- RPC `submitpackage` now allows 2 new arguments to be passed: `maxfeerate` and `maxburnamount`. See the + subtmitpackage help for details. (#28950) + +Changes to wallet-related RPCs can be found in the Wallet section below. + +Updated REST APIs +----------------- +- Parameter validation for `/rest/getutxos` has been improved by rejecting + truncated or overly large txids and malformed outpoint indices via raising + an HTTP_BAD_REQUEST "Parse error". These requests were previously handled + silently. (#30482, #30444) + +Build System +------------ + +- GCC 11.1 or later, or Clang 16.0 or later, +are now required to compile Bitcoin Core. (#29091, #30263) + +- The minimum required glibc to run Bitcoin Core is now +2.31. This means that RHEL 8 and Ubuntu 18.04 (Bionic) +are no-longer supported. (#29987) + +- `--enable-lcov-branch-coverage` has been removed, given +incompatibilities between lcov version 1 & 2. `LCOV_OPTS` +should be used to set any options instead. (#30192) + +Updated Settings +---------------- + +- When running with `-alertnotify`, an alert can now be raised multiple +times instead of just once. Previously, it was only raised when unknown +new consensus rules were activated. Its scope has now been increased to +include all kernel warnings. Specifically, alerts will now also be raised +when an invalid chain with a large amount of work has been detected. +Additional warnings may be added in the future. (#30058) + +Changes to GUI or wallet related settings can be found in the GUI or Wallet section below. + +Wallet +------ + +- The wallet now detects when wallet transactions conflict with the mempool. Mempool-conflicting + transactions can be seen in the `"mempoolconflicts"` field of `gettransaction`. The inputs + of mempool-conflicted transactions can now be respent without manually abandoning the + transactions when the parent transaction is dropped from the mempool, which can cause wallet + balances to appear higher. (#27307) + +- A new `max_tx_weight` option has been added to the RPCs `fundrawtransaction`, `walletcreatefundedpsbt`, and `send`. +It specifies the maximum transaction weight. If the limit is exceeded during funding, the transaction will not be built. +The default value is 4,000,000 WU. (#29523) + +- A new `createwalletdescriptor` RPC allows users to add new automatically generated + descriptors to their wallet. This can be used to upgrade wallets created prior to the + introduction of a new standard descriptor, such as taproot. (#29130) + +- A new RPC `gethdkeys` lists all of the BIP32 HD keys in use by all of the descriptors in the wallet. + These keys can be used in conjunction with `createwalletdescriptor` to create and add single key + descriptors to the wallet for a particular key that the wallet already knows. (#29130) + +- The `sendall` RPC can now spend unconfirmed change and will include additional fees as necessary + for the resulting transaction to bump the unconfirmed transactions' feerates to the specified feerate. (#28979) + +- In RPC `bumpfee`, if a `fee_rate` is specified, the feerate is no longer restricted + to following the wallet's incremental feerate of 5 sat/vb. The feerate must still be + at least the sum of the original fee and the mempool's incremental feerate. (#27969) + +GUI Changes +----------- + +- The "Migrate Wallet" menu allows users to migrate any legacy wallet in their wallet +directory, regardless of the wallets loaded. (gui#824) + +- The "Information" window now displays the maximum mempool size along with the +mempool usage. (gui#825) + +Low-level Changes +================= + +Tests +----- + +- The BIP94 timewarp attack mitigation is now active on the `regtest` network. (#30681) + +- A new `-testdatadir` option has been added to `test_bitcoin` to allow specifying the + location of unit test data directories. (#26564) + +Blockstorage +------------ + +- Block files are now XOR'd by default with a key stored in the blocksdir. +Previous releases of Bitcoin Core or previous external software will not be able to read the blocksdir with a non-zero XOR-key. +Refer to the `-blocksxor` help for more details. (#28052) + +Chainstate +---------- + +- The chainstate database flushes that occur when blocks are pruned will no longer +empty the database cache. The cache will remain populated longer, which significantly +reduces the time for initial block download to complete. (#28280) + +Dependencies +------------ + +- The dependency on Boost.Process has been replaced with cpp-subprocess, which is contained in source. +Builders will no longer need Boost.Process to build with external signer support. (#28981) + +Credits +======= + +Thanks to everyone who directly contributed to this release: +- 0xb10c +- Alfonso Roman Zubeldia +- Andrew Toth +- AngusP +- Anthony Towns +- Antoine Poinsot +- Anton A +- Ava Chow +- Ayush Singh +- Ben Westgate +- Brandon Odiwuor +- brunoerg +- bstin +- Charlie +- Christopher Bergqvist +- Cory Fields +- crazeteam +- Daniela Brozzoni +- David Gumberg +- dergoegge +- Edil Medeiros +- Epic Curious +- Fabian Jahr +- fanquake +- furszy +- glozow +- Greg Sanders +- hanmz +- Hennadii Stepanov +- Hernan Marino +- Hodlinator +- ishaanam +- ismaelsadeeq +- Jadi +- Jon Atack +- josibake +- jrakibi +- kevkevin +- kevkevinpal +- Konstantin Akimov +- laanwj +- Larry Ruane +- Lőrinc +- Luis Schwab +- Luke Dashjr +- MarcoFalke +- marcofleon +- Marnix +- Martin Saposnic +- Martin Zumsande +- Matt Corallo +- Matthew Zipkin +- Matt Whitlock +- Max Edwards +- Michael Dietz +- Murch +- nanlour +- pablomartin4btc +- Peter Todd +- Pieter Wuille +- @RandyMcMillan +- RoboSchmied +- Roman Zeyde +- Ryan Ofsky +- Sebastian Falbesoner +- Sergi Delgado Segura +- Sjors Provoost +- spicyzboss +- StevenMia +- stickies-v +- stratospher +- Suhas Daftuar +- sunerok +- tdb3 +- TheCharlatan +- umiumi +- Vasil Dimov +- virtu +- willcl-ark + +As well as to everyone that helped with translations on +[Transifex](https://www.transifex.com/bitcoin/bitcoin/). diff --git a/share/examples/blackmore.conf b/share/examples/blackmore.conf index 4944c7fd3a..e8ea5c23a3 100644 --- a/share/examples/blackmore.conf +++ b/share/examples/blackmore.conf @@ -286,10 +286,10 @@ # 0) #peerbloomfilters=1 -# Listen for connections on . Nodes not using the default ports -# (default: 15714, testnet: 25714, signet: 38333, regtest: 35714) -# are unlikely to get incoming connections. Not relevant for I2P -# (see doc/i2p.md). +# Listen for connections on (default: 15714, testnet: 25714, +# testnet4: 48333, signet: 38333, regtest: 35714). Not relevant for +# I2P (see doc/i2p.md). If set to a value x, the default onion +# listening port will be set to x+1. #port= # Connect through SOCKS5 proxy, set -noproxy to disable (default: @@ -685,9 +685,12 @@ # Options for mainnet [main] -# Options for testnet +# Options for testnet3 [test] +# Options for testnet4 +[testnet4] + # Options for signet [signet] diff --git a/src/addrman.cpp b/src/addrman.cpp index 054a9bee32..11ae49cfad 100644 --- a/src/addrman.cpp +++ b/src/addrman.cpp @@ -188,7 +188,7 @@ void AddrManImpl::Serialize(Stream& s_) const int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30); s << nUBuckets; - std::unordered_map mapUnkIds; + std::unordered_map mapUnkIds; int nIds = 0; for (const auto& entry : mapInfo) { mapUnkIds[entry.first] = nIds; @@ -398,7 +398,7 @@ void AddrManImpl::Unserialize(Stream& s_) } } -AddrInfo* AddrManImpl::Find(const CService& addr, int* pnId) +AddrInfo* AddrManImpl::Find(const CService& addr, nid_type* pnId) { AssertLockHeld(cs); @@ -413,11 +413,11 @@ AddrInfo* AddrManImpl::Find(const CService& addr, int* pnId) return nullptr; } -AddrInfo* AddrManImpl::Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId) +AddrInfo* AddrManImpl::Create(const CAddress& addr, const CNetAddr& addrSource, nid_type* pnId) { AssertLockHeld(cs); - int nId = nIdCount++; + nid_type nId = nIdCount++; mapInfo[nId] = AddrInfo(addr, addrSource); mapAddr[addr] = nId; mapInfo[nId].nRandomPos = vRandom.size(); @@ -438,8 +438,8 @@ void AddrManImpl::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2) const assert(nRndPos1 < vRandom.size() && nRndPos2 < vRandom.size()); - int nId1 = vRandom[nRndPos1]; - int nId2 = vRandom[nRndPos2]; + nid_type nId1 = vRandom[nRndPos1]; + nid_type nId2 = vRandom[nRndPos2]; const auto it_1{mapInfo.find(nId1)}; const auto it_2{mapInfo.find(nId2)}; @@ -453,7 +453,7 @@ void AddrManImpl::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2) const vRandom[nRndPos2] = nId1; } -void AddrManImpl::Delete(int nId) +void AddrManImpl::Delete(nid_type nId) { AssertLockHeld(cs); @@ -476,7 +476,7 @@ void AddrManImpl::ClearNew(int nUBucket, int nUBucketPos) // if there is an entry in the specified bucket, delete it. if (vvNew[nUBucket][nUBucketPos] != -1) { - int nIdDelete = vvNew[nUBucket][nUBucketPos]; + nid_type nIdDelete = vvNew[nUBucket][nUBucketPos]; AddrInfo& infoDelete = mapInfo[nIdDelete]; assert(infoDelete.nRefCount > 0); infoDelete.nRefCount--; @@ -488,7 +488,7 @@ void AddrManImpl::ClearNew(int nUBucket, int nUBucketPos) } } -void AddrManImpl::MakeTried(AddrInfo& info, int nId) +void AddrManImpl::MakeTried(AddrInfo& info, nid_type nId) { AssertLockHeld(cs); @@ -515,7 +515,7 @@ void AddrManImpl::MakeTried(AddrInfo& info, int nId) // first make space to add it (the existing tried entry there is moved to new, deleting whatever is there). if (vvTried[nKBucket][nKBucketPos] != -1) { // find an item to evict - int nIdEvict = vvTried[nKBucket][nKBucketPos]; + nid_type nIdEvict = vvTried[nKBucket][nKBucketPos]; assert(mapInfo.count(nIdEvict) == 1); AddrInfo& infoOld = mapInfo[nIdEvict]; @@ -554,7 +554,7 @@ bool AddrManImpl::AddSingle(const CAddress& addr, const CNetAddr& source, std::c if (!addr.IsRoutable()) return false; - int nId; + nid_type nId; AddrInfo* pinfo = Find(addr, &nId); // Do not set a penalty for a source's self-announcement @@ -627,7 +627,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond { AssertLockHeld(cs); - int nId; + nid_type nId; m_last_good = time; @@ -753,7 +753,8 @@ std::pair AddrManImpl::Select_(bool new_only, std::option // Iterate over the positions of that bucket, starting at the initial one, // and looping around. - int i, position, node_id; + int i, position; + nid_type node_id; for (i = 0; i < ADDRMAN_BUCKET_SIZE; ++i) { position = (initial_position + i) % ADDRMAN_BUCKET_SIZE; node_id = GetEntry(search_tried, bucket, position); @@ -786,7 +787,7 @@ std::pair AddrManImpl::Select_(bool new_only, std::option } } -int AddrManImpl::GetEntry(bool use_tried, size_t bucket, size_t position) const +nid_type AddrManImpl::GetEntry(bool use_tried, size_t bucket, size_t position) const { AssertLockHeld(cs); @@ -849,7 +850,7 @@ std::vector> AddrManImpl::GetEntries_(bool std::vector> infos; for (int bucket = 0; bucket < bucket_count; ++bucket) { for (int position = 0; position < ADDRMAN_BUCKET_SIZE; ++position) { - int id = GetEntry(from_tried, bucket, position); + nid_type id = GetEntry(from_tried, bucket, position); if (id >= 0) { AddrInfo info = mapInfo.at(id); AddressPosition location = AddressPosition( @@ -904,8 +905,8 @@ void AddrManImpl::ResolveCollisions_() { AssertLockHeld(cs); - for (std::set::iterator it = m_tried_collisions.begin(); it != m_tried_collisions.end();) { - int id_new = *it; + for (std::set::iterator it = m_tried_collisions.begin(); it != m_tried_collisions.end();) { + nid_type id_new = *it; bool erase_collision = false; @@ -923,7 +924,7 @@ void AddrManImpl::ResolveCollisions_() } else if (vvTried[tried_bucket][tried_bucket_pos] != -1) { // The position in the tried bucket is not empty // Get the to-be-evicted address that is being tested - int id_old = vvTried[tried_bucket][tried_bucket_pos]; + nid_type id_old = vvTried[tried_bucket][tried_bucket_pos]; AddrInfo& info_old = mapInfo[id_old]; const auto current_time{Now()}; @@ -969,11 +970,11 @@ std::pair AddrManImpl::SelectTriedCollision_() if (m_tried_collisions.size() == 0) return {}; - std::set::iterator it = m_tried_collisions.begin(); + std::set::iterator it = m_tried_collisions.begin(); // Selects a random element from m_tried_collisions std::advance(it, insecure_rand.randrange(m_tried_collisions.size())); - int id_new = *it; + nid_type id_new = *it; // If id_new not found in mapInfo remove it from m_tried_collisions if (mapInfo.count(id_new) != 1) { @@ -1058,15 +1059,15 @@ int AddrManImpl::CheckAddrman() const LOG_TIME_MILLIS_WITH_CATEGORY_MSG_ONCE( strprintf("new %i, tried %i, total %u", nNew, nTried, vRandom.size()), BCLog::ADDRMAN); - std::unordered_set setTried; - std::unordered_map mapNew; + std::unordered_set setTried; + std::unordered_map mapNew; std::unordered_map local_counts; if (vRandom.size() != (size_t)(nTried + nNew)) return -7; for (const auto& entry : mapInfo) { - int n = entry.first; + nid_type n = entry.first; const AddrInfo& info = entry.second; if (info.fInTried) { if (!TicksSinceEpoch(info.m_last_success)) { diff --git a/src/addrman_impl.h b/src/addrman_impl.h index dd7f7b318f..a3246da0ee 100644 --- a/src/addrman_impl.h +++ b/src/addrman_impl.h @@ -32,6 +32,13 @@ static constexpr int ADDRMAN_NEW_BUCKET_COUNT{1 << ADDRMAN_NEW_BUCKET_COUNT_LOG2 static constexpr int32_t ADDRMAN_BUCKET_SIZE_LOG2{6}; static constexpr int ADDRMAN_BUCKET_SIZE{1 << ADDRMAN_BUCKET_SIZE_LOG2}; +/** + * User-defined type for the internally used nIds + * This used to be int, making it feasible for attackers to cause an overflow, + * see https://bitcoincore.org/en/2024/07/31/disclose-addrman-int-overflow/ + */ +using nid_type = int64_t; + /** * Extended statistics about a CAddress */ @@ -179,36 +186,36 @@ class AddrManImpl static constexpr uint8_t INCOMPATIBILITY_BASE = 32; //! last used nId - int nIdCount GUARDED_BY(cs){0}; + nid_type nIdCount GUARDED_BY(cs){0}; //! table with information about all nIds - std::unordered_map mapInfo GUARDED_BY(cs); + std::unordered_map mapInfo GUARDED_BY(cs); //! find an nId based on its network address and port. - std::unordered_map mapAddr GUARDED_BY(cs); + std::unordered_map mapAddr GUARDED_BY(cs); //! randomly-ordered vector of all nIds //! This is mutable because it is unobservable outside the class, so any //! changes to it (even in const methods) are also unobservable. - mutable std::vector vRandom GUARDED_BY(cs); + mutable std::vector vRandom GUARDED_BY(cs); // number of "tried" entries int nTried GUARDED_BY(cs){0}; //! list of "tried" buckets - int vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs); + nid_type vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs); //! number of (unique) "new" entries int nNew GUARDED_BY(cs){0}; //! list of "new" buckets - int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs); + nid_type vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs); //! last time Good was called (memory only). Initially set to 1 so that "never" is strictly worse. NodeSeconds m_last_good GUARDED_BY(cs){1s}; //! Holds addrs inserted into tried table that collide with existing entries. Test-before-evict discipline used to resolve these collisions. - std::set m_tried_collisions; + std::set m_tried_collisions; /** Perform consistency checks every m_consistency_check_ratio operations (if non-zero). */ const int32_t m_consistency_check_ratio; @@ -225,22 +232,22 @@ class AddrManImpl std::unordered_map m_network_counts GUARDED_BY(cs); //! Find an entry. - AddrInfo* Find(const CService& addr, int* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); + AddrInfo* Find(const CService& addr, nid_type* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); //! Create a new entry and add it to the internal data structures mapInfo, mapAddr and vRandom. - AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); + AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, nid_type* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); //! Swap two elements in vRandom. void SwapRandom(unsigned int nRandomPos1, unsigned int nRandomPos2) const EXCLUSIVE_LOCKS_REQUIRED(cs); //! Delete an entry. It must not be in tried, and have refcount 0. - void Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs); + void Delete(nid_type nId) EXCLUSIVE_LOCKS_REQUIRED(cs); //! Clear a position in a "new" table. This is the only place where entries are actually deleted. void ClearNew(int nUBucket, int nUBucketPos) EXCLUSIVE_LOCKS_REQUIRED(cs); //! Move an entry from the "new" table(s) to the "tried" table - void MakeTried(AddrInfo& info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs); + void MakeTried(AddrInfo& info, nid_type nId) EXCLUSIVE_LOCKS_REQUIRED(cs); /** Attempt to add a single address to addrman's new table. * @see AddrMan::Add() for parameters. */ @@ -256,9 +263,9 @@ class AddrManImpl /** Helper to generalize looking up an addrman entry from either table. * - * @return int The nid of the entry. If the addrman position is empty or not found, returns -1. + * @return nid_type The nid of the entry. If the addrman position is empty or not found, returns -1. * */ - int GetEntry(bool use_tried, size_t bucket, size_t position) const EXCLUSIVE_LOCKS_REQUIRED(cs); + nid_type GetEntry(bool use_tried, size_t bucket, size_t position) const EXCLUSIVE_LOCKS_REQUIRED(cs); std::vector GetAddr_(size_t max_addresses, size_t max_pct, std::optional network, const bool filtered = true) const EXCLUSIVE_LOCKS_REQUIRED(cs); diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index 8408dd2a02..a0a4cf2b27 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -41,15 +41,15 @@ std::unique_ptr CreateBaseChainParams(const ChainType chain) { switch (chain) { case ChainType::MAIN: - return std::make_unique("", 15715, 15717); + return std::make_unique("", 15715); case ChainType::TESTNET: - return std::make_unique("testnet", 25715, 25717); + return std::make_unique("testnet", 25715); case ChainType::TESTNET4: - return std::make_unique("testnet4", 55715, 55717); + return std::make_unique("testnet4", 55715); case ChainType::SIGNET: - return std::make_unique("signet", 45715, 45717); + return std::make_unique("signet", 45715); case ChainType::REGTEST: - return std::make_unique("regtest", 35715, 35717); + return std::make_unique("regtest", 35715); } assert(false); } diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index d112291eeb..15d1842289 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -22,15 +22,13 @@ class CBaseChainParams public: const std::string& DataDir() const { return strDataDir; } uint16_t RPCPort() const { return m_rpc_port; } - uint16_t OnionServiceTargetPort() const { return m_onion_service_target_port; } CBaseChainParams() = delete; - CBaseChainParams(const std::string& data_dir, uint16_t rpc_port, uint16_t onion_service_target_port) - : m_rpc_port(rpc_port), m_onion_service_target_port(onion_service_target_port), strDataDir(data_dir) {} + CBaseChainParams(const std::string& data_dir, uint16_t rpc_port) + : m_rpc_port(rpc_port), strDataDir(data_dir) {} private: const uint16_t m_rpc_port; - const uint16_t m_onion_service_target_port; std::string strDataDir; }; diff --git a/src/init.cpp b/src/init.cpp index 44f74e5317..3fde6c6417 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -525,7 +525,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-addnode=", strprintf("Add a node to connect to and attempt to keep the connection open (see the addnode RPC help for more info). This option can be specified multiple times to add multiple nodes; connections are limited to %u at a time and are counted separately from the -maxconnections limit.", MAX_ADDNODE_CONNECTIONS), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-asmap=", strprintf("Specify asn mapping used for bucketing of the peers (default: %s). Relative paths will be prefixed by the net-specific datadir location.", DEFAULT_ASMAP_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-bantime=", strprintf("Default duration (in seconds) of manually configured bans (default: %u)", DEFAULT_MISBEHAVING_BANTIME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-bind=[:][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultBaseParams->OnionServiceTargetPort(), testnetBaseParams->OnionServiceTargetPort(), testnet4BaseParams->OnionServiceTargetPort(), signetBaseParams->OnionServiceTargetPort(), regtestBaseParams->OnionServiceTargetPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); + argsman.AddArg("-bind=[:][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultChainParams->GetDefaultPort() + 1, testnetChainParams->GetDefaultPort() + 1, testnet4ChainParams->GetDefaultPort() + 1, signetChainParams->GetDefaultPort() + 1, regtestChainParams->GetDefaultPort() + 1), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-cjdnsreachable", "If set, then this host is configured for CJDNS (connecting to fc00::/8 addresses would lead us to the CJDNS network, see doc/cjdns.md) (default: 0)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-connect=", "Connect only to the specified node; -noconnect disables automatic connections (the rules for this peer are the same as for -addnode). This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-discover", "Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); @@ -552,7 +552,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-peerbloomfilters", strprintf("Support filtering of blocks and transaction with bloom filters (default: %u)", DEFAULT_PEERBLOOMFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-peerblockfilters", strprintf("Serve compact block filters to peers per BIP 157 (default: %u)", DEFAULT_PEERBLOCKFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-txreconciliation", strprintf("Enable transaction reconciliations per BIP 330 (default: %d)", DEFAULT_TXRECONCILIATION_ENABLE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION); - argsman.AddArg("-port=", strprintf("Listen for connections on (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); + argsman.AddArg("-port=", strprintf("Listen for connections on (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md). If set to a value x, the default onion listening port will be set to x+1.", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); #ifdef HAVE_SOCKADDR_UN argsman.AddArg("-proxy=", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled). May be a local file path prefixed with 'unix:' if the proxy supports it.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION); #else @@ -1848,6 +1848,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const uint16_t default_bind_port = static_cast(args.GetIntArg("-port", Params().GetDefaultPort())); + const uint16_t default_bind_port_onion = default_bind_port + 1; + const auto BadPortWarning = [](const char* prefix, uint16_t port) { return strprintf(_("%s request to listen on port %u. This port is considered \"bad\" and " "thus it is unlikely that any peer will connect to it. See " @@ -1872,7 +1874,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) const std::string network_type = bind_arg.substr(index + 1); if (network_type == "onion") { const std::string truncated_bind_arg = bind_arg.substr(0, index); - bind_addr = Lookup(truncated_bind_arg, BaseParams().OnionServiceTargetPort(), false); + bind_addr = Lookup(truncated_bind_arg, default_bind_port_onion, false); if (bind_addr.has_value()) { connOptions.onion_binds.push_back(bind_addr.value()); continue; @@ -1908,7 +1910,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } else if (!connOptions.vBinds.empty()) { onion_service_target = connOptions.vBinds.front(); } else { - onion_service_target = DefaultOnionServiceTarget(); + onion_service_target = DefaultOnionServiceTarget(default_bind_port_onion); connOptions.onion_binds.push_back(onion_service_target); } diff --git a/src/key_io.cpp b/src/key_io.cpp index 29002afc45..6cece47e41 100644 --- a/src/key_io.cpp +++ b/src/key_io.cpp @@ -274,6 +274,9 @@ CExtKey DecodeExtKey(const std::string& str) key.Decode(data.data() + prefix.size()); } } + if (!data.empty()) { + memory_cleanse(data.data(), data.size()); + } return key; } diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 3debab1324..49b5c3330e 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2022 The Bitcoin Core developers +// Copyright (c) 2009-present The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -374,20 +374,21 @@ static RPCHelpMan generateblock() ChainstateManager& chainman = EnsureChainman(node); { - std::unique_ptr blocktemplate{miner.createNewBlock(coinbase_script, {.use_mempool = false})}; - if (!blocktemplate) { - throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block"); + LOCK(chainman.GetMutex()); + { + std::unique_ptr blocktemplate{miner.createNewBlock(coinbase_script, {.use_mempool = false})}; + if (!blocktemplate) { + throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block"); + } + block = blocktemplate->block; } - block = blocktemplate->block; - } - CHECK_NONFATAL(block.vtx.size() == 1); + CHECK_NONFATAL(block.vtx.size() == 1); - // Add transactions - block.vtx.insert(block.vtx.end(), txs.begin(), txs.end()); - RegenerateCommitments(block, chainman); + // Add transactions + block.vtx.insert(block.vtx.end(), txs.begin(), txs.end()); + RegenerateCommitments(block, chainman); - { BlockValidationState state; if (!miner.testBlockValidity(block, /*check_merkle_root=*/false, state)) { throw JSONRPCError(RPC_VERIFY_ERROR, strprintf("testBlockValidity failed: %s", state.ToString())); diff --git a/src/script/miniscript.cpp b/src/script/miniscript.cpp index 455bd56283..4b8d3673f9 100644 --- a/src/script/miniscript.cpp +++ b/src/script/miniscript.cpp @@ -1,14 +1,17 @@ -// Copyright (c) 2019-2022 The Bitcoin Core developers +// Copyright (c) 2019-present The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include +#include #include -#include