diff --git a/build_msvc/bitcoin_config.h.in b/build_msvc/bitcoin_config.h.in
index 33632ad17c..b0238c9112 100644
--- a/build_msvc/bitcoin_config.h.in
+++ b/build_msvc/bitcoin_config.h.in
@@ -49,9 +49,6 @@
*/
#define HAVE_DECL_SETSID 0
-/* Define if the dllexport attribute is supported. */
-#define HAVE_DLLEXPORT_ATTRIBUTE 1
-
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "https://github.com/bitcoin/bitcoin/issues"
diff --git a/configure.ac b/configure.ac
index 439bb508e7..eaecd1c7e4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -943,35 +943,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
[ AC_MSG_RESULT([no])]
)
-AC_MSG_CHECKING([for default visibility attribute])
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([
- int foo(void) __attribute__((visibility("default")));
- int main(){}
- ])],
- [
- AC_DEFINE([HAVE_DEFAULT_VISIBILITY_ATTRIBUTE], [1], [Define if the visibility attribute is supported.])
- AC_MSG_RESULT([yes])
- ],
- [
- AC_MSG_RESULT([no])
- if test "$use_reduce_exports" = "yes"; then
- AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.])
- fi
- ]
-)
-
-AC_MSG_CHECKING([for dllexport attribute])
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([
- __declspec(dllexport) int foo(void);
- int main(){}
- ])],
- [
- AC_DEFINE([HAVE_DLLEXPORT_ATTRIBUTE], [1], [Define if the dllexport attribute is supported.])
- AC_MSG_RESULT([yes])
- ],
- [AC_MSG_RESULT([no])]
-)
-
dnl Check for different ways of gathering OS randomness
AC_MSG_CHECKING([for Linux getrandom function])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@@ -1722,7 +1693,7 @@ CPPFLAGS="$CPPFLAGS_TEMP"
if test -n "$use_sanitizers"; then
export SECP_CFLAGS="$SECP_CFLAGS $SANITIZER_CFLAGS"
fi
-ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-ecmult-gen-kb=86 --enable-benchmark=no --enable-module-recovery --disable-module-ecdh"
+ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh"
AC_CONFIG_SUBDIRS([src/secp256k1])
AC_OUTPUT
diff --git a/contrib/completions/bash/bitcoin-cli.bash b/contrib/completions/bash/bitcoin-cli.bash
index 89e01bc09a..b04fdbcb0e 100644
--- a/contrib/completions/bash/bitcoin-cli.bash
+++ b/contrib/completions/bash/bitcoin-cli.bash
@@ -9,7 +9,7 @@ _bitcoin_rpc() {
local rpcargs=()
for i in ${COMP_LINE}; do
case "$i" in
- -conf=*|-datadir=*|-regtest|-rpc*|-testnet)
+ -conf=*|-datadir=*|-regtest|-rpc*|-testnet|-testnet4)
rpcargs=( "${rpcargs[@]}" "$i" )
;;
esac
diff --git a/contrib/devtools/copyright_header.py b/contrib/devtools/copyright_header.py
index 3dddffe324..3c98ee7b20 100755
--- a/contrib/devtools/copyright_header.py
+++ b/contrib/devtools/copyright_header.py
@@ -19,7 +19,6 @@
'src/qt/bitcoinstrings.cpp',
'src/chainparamsseeds.h',
# other external copyrights:
- 'src/reverse_iterator.h',
'src/test/fuzz/FuzzedDataProvider.h',
'src/tinyformat.h',
'src/bench/nanobench.h',
diff --git a/contrib/devtools/test_utxo_snapshots.sh b/contrib/devtools/test_utxo_snapshots.sh
index d7c019f4a6..ad948d4a14 100755
--- a/contrib/devtools/test_utxo_snapshots.sh
+++ b/contrib/devtools/test_utxo_snapshots.sh
@@ -138,7 +138,7 @@ echo
echo "-- Now: add the following to CMainParams::m_assumeutxo_data"
echo " in src/kernel/chainparams.cpp, and recompile:"
echo
-echo " {${RPC_BASE_HEIGHT}, AssumeutxoHash{uint256S(\"0x${RPC_AU}\")}, ${RPC_NCHAINTX}, uint256S(\"0x${RPC_BLOCKHASH}\")},"
+echo " {.height = ${RPC_BASE_HEIGHT}, .hash_serialized = AssumeutxoHash{uint256{\"${RPC_AU}\"}}, .m_chain_tx_count = ${RPC_NCHAINTX}, .blockhash = consteval_ctor(uint256{\"${RPC_BLOCKHASH}\"})},"
echo
echo
echo "-- IBDing more blocks to the server node (height=$FINAL_HEIGHT) so there is a diff between snapshot and tip..."
diff --git a/contrib/guix/libexec/prelude.bash b/contrib/guix/libexec/prelude.bash
index 5bc828625e..9cc151c706 100644
--- a/contrib/guix/libexec/prelude.bash
+++ b/contrib/guix/libexec/prelude.bash
@@ -51,7 +51,7 @@ fi
time-machine() {
# shellcheck disable=SC2086
guix time-machine --url=https://git.savannah.gnu.org/git/guix.git \
- --commit=efc26826400762207cde9f23802cfe75a737963c \
+ --commit=7bf1d7aeaffba15c4f680f93ae88fbef25427252 \
--cores="$JOBS" \
--keep-failed \
--fallback \
diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py
index f67e7b0f4c..72dd5d28cc 100755
--- a/contrib/seeds/generate-seeds.py
+++ b/contrib/seeds/generate-seeds.py
@@ -5,11 +5,12 @@
'''
Script to generate list of seed nodes for kernel/chainparams.cpp.
-This script expects two text files in the directory that is passed as an
+This script expects three text files in the directory that is passed as an
argument:
nodes_main.txt
nodes_test.txt
+ nodes_testnet4.txt
These files must consist of lines in the format
@@ -171,6 +172,9 @@ def main():
g.write('\n')
with open(os.path.join(indir,'nodes_test.txt'), 'r', encoding="utf8") as f:
process_nodes(g, f, 'chainparams_seed_test')
+ g.write('\n')
+ with open(os.path.join(indir,'nodes_testnet4.txt'), 'r', encoding="utf8") as f:
+ process_nodes(g, f, 'chainparams_seed_testnet4')
g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n')
if __name__ == '__main__':
diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk
index 7620df5477..df018a1032 100644
--- a/depends/packages/zeromq.mk
+++ b/depends/packages/zeromq.mk
@@ -10,6 +10,7 @@ $(package)_patches += builtin_sha1.patch
$(package)_patches += fix_have_windows.patch
$(package)_patches += openbsd_kqueue_headers.patch
$(package)_patches += cmake_minimum.patch
+$(package)_patches += cacheline_undefined.patch
$(package)_patches += no_librt.patch
define $(package)_set_vars
@@ -25,6 +26,7 @@ define $(package)_preprocess_cmds
patch -p1 < $($(package)_patch_dir)/remove_libstd_link.patch && \
patch -p1 < $($(package)_patch_dir)/macos_mktemp_check.patch && \
patch -p1 < $($(package)_patch_dir)/builtin_sha1.patch && \
+ patch -p1 < $($(package)_patch_dir)/cacheline_undefined.patch && \
patch -p1 < $($(package)_patch_dir)/fix_have_windows.patch && \
patch -p1 < $($(package)_patch_dir)/openbsd_kqueue_headers.patch && \
patch -p1 < $($(package)_patch_dir)/cmake_minimum.patch && \
diff --git a/depends/patches/zeromq/cacheline_undefined.patch b/depends/patches/zeromq/cacheline_undefined.patch
new file mode 100644
index 0000000000..02bd2a5fe5
--- /dev/null
+++ b/depends/patches/zeromq/cacheline_undefined.patch
@@ -0,0 +1,15 @@
+Use proper STREQUAL instead of EQUAL to compare strings.txt
+
+See: https://github.com/zeromq/libzmq/pull/4711.
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -476,7 +476,7 @@ execute_process(
+ if(CACHELINE_SIZE STREQUAL ""
+ OR CACHELINE_SIZE EQUAL 0
+ OR CACHELINE_SIZE EQUAL -1
+- OR CACHELINE_SIZE EQUAL "undefined")
++ OR CACHELINE_SIZE STREQUAL "undefined")
+ set(ZMQ_CACHELINE_SIZE 64)
+ else()
+ set(ZMQ_CACHELINE_SIZE ${CACHELINE_SIZE})
diff --git a/doc/REST-interface.md b/doc/REST-interface.md
index 2d7d0e3769..6664bc2a3a 100644
--- a/doc/REST-interface.md
+++ b/doc/REST-interface.md
@@ -4,7 +4,7 @@ Unauthenticated REST Interface
The REST API can be enabled with the `-rest` option.
The interface runs on the same port as the JSON-RPC interface, by default port 8332 for mainnet, port 18332 for testnet,
-port 38332 for signet, and port 18443 for regtest.
+port 48332 for testnet4, port 38332 for signet, and port 18443 for regtest.
REST Interface consistency guarantees
-------------------------------------
diff --git a/doc/bips.md b/doc/bips.md
index 19a8091f55..87258fce93 100644
--- a/doc/bips.md
+++ b/doc/bips.md
@@ -33,7 +33,7 @@ BIPs that are implemented by Bitcoin Core:
* [`BIP 111`](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki): `NODE_BLOOM` service bit added, and enforced for all peer versions as of **v0.13.0** ([PR #6579](https://github.com/bitcoin/bitcoin/pull/6579) and [PR #6641](https://github.com/bitcoin/bitcoin/pull/6641)).
* [`BIP 112`](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki): The CHECKSEQUENCEVERIFY opcode has been implemented since **v0.12.1** ([PR #7524](https://github.com/bitcoin/bitcoin/pull/7524)), and has been *buried* since **v0.19.0** ([PR #16060](https://github.com/bitcoin/bitcoin/pull/16060)).
* [`BIP 113`](https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki): Median time past lock-time calculations have been implemented since **v0.12.1** ([PR #6566](https://github.com/bitcoin/bitcoin/pull/6566)), and has been *buried* since **v0.19.0** ([PR #16060](https://github.com/bitcoin/bitcoin/pull/16060)).
-* [`BIP 125`](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki): Opt-in full replace-by-fee signaling partially implemented. See doc/policy/mempool-replacements.md.
+* [`BIP 125`](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki): Opt-in full replace-by-fee partially implemented: signaling is enforced if configured. For other replacement rules, see doc/policy/mempool-replacements.md.
* [`BIP 130`](https://github.com/bitcoin/bips/blob/master/bip-0130.mediawiki): direct headers announcement is negotiated with peer versions `>=70012` as of **v0.12.0** ([PR 6494](https://github.com/bitcoin/bitcoin/pull/6494)).
* [`BIP 133`](https://github.com/bitcoin/bips/blob/master/bip-0133.mediawiki): feefilter messages are respected and sent for peer versions `>=70013` as of **v0.13.0** ([PR 7542](https://github.com/bitcoin/bitcoin/pull/7542)).
* [`BIP 141`](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki): Segregated Witness (Consensus Layer) as of **v0.13.0** ([PR 8149](https://github.com/bitcoin/bitcoin/pull/8149)), defined for mainnet as of **v0.13.1** ([PR 8937](https://github.com/bitcoin/bitcoin/pull/8937)), and *buried* since **v0.19.0** ([PR #16060](https://github.com/bitcoin/bitcoin/pull/16060)).
diff --git a/doc/build-windows.md b/doc/build-windows.md
index 841693c77b..e35439bfe1 100644
--- a/doc/build-windows.md
+++ b/doc/build-windows.md
@@ -29,7 +29,7 @@ First, install the general dependencies:
sudo apt update
sudo apt upgrade
- sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git
+ sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils cmake curl git
A host toolchain (`build-essential`) is necessary because some dependency
packages need to build host utilities that are used in the build process.
diff --git a/doc/files.md b/doc/files.md
index 03e52f02c9..b738d6055a 100644
--- a/doc/files.md
+++ b/doc/files.md
@@ -34,12 +34,13 @@ Windows | `%LOCALAPPDATA%\Bitcoin\` [\[1\]](#note1)
3. All content of the data directory, except for `bitcoin.conf` file, is chain-specific. This means the actual data directory paths for non-mainnet cases differ:
-Chain option | Data directory path
--------------------------------|------------------------------
-`-chain=main` (default) | *path_to_datadir*`/`
-`-chain=test` or `-testnet` | *path_to_datadir*`/testnet3/`
-`-chain=signet` or `-signet` | *path_to_datadir*`/signet/`
-`-chain=regtest` or `-regtest` | *path_to_datadir*`/regtest/`
+Chain option | Data directory path
+---------------------------------|------------------------------
+`-chain=main` (default) | *path_to_datadir*`/`
+`-chain=test` or `-testnet` | *path_to_datadir*`/testnet3/`
+`-chain=testnet4` or `-testnet4` | *path_to_datadir*`/testnet4/`
+`-chain=signet` or `-signet` | *path_to_datadir*`/signet/`
+`-chain=regtest` or `-regtest` | *path_to_datadir*`/regtest/`
## Data directory layout
@@ -47,8 +48,9 @@ Subdirectory | File(s) | Description
-------------------|-----------------------|------------
`blocks/` | | Blocks directory; can be specified by `-blocksdir` option (except for `blocks/index/`)
`blocks/index/` | LevelDB database | Block index; `-blocksdir` option does not affect this path
-`blocks/` | `blkNNNNN.dat`[\[2\]](#note2) | Actual Bitcoin blocks (in network format, dumped in raw on disk, 128 MiB per file)
+`blocks/` | `blkNNNNN.dat`[\[2\]](#note2) | Actual Bitcoin blocks (dumped in network format, 128 MiB per file)
`blocks/` | `revNNNNN.dat`[\[2\]](#note2) | Block undo data (custom format)
+`blocks/` | `xor.dat` | Rolling XOR pattern for block and undo data files
`chainstate/` | LevelDB database | Blockchain state (a compact representation of all currently unspent transaction outputs (UTXOs) and metadata about the transactions they are from)
`indexes/txindex/` | LevelDB database | Transaction index; *optional*, used if `-txindex=1`
`indexes/blockfilter/basic/db/` | LevelDB database | Blockfilter index LevelDB database for the basic filtertype; *optional*, used if `-blockfilterindex=basic`
diff --git a/doc/policy/mempool-replacements.md b/doc/policy/mempool-replacements.md
index d5642eaccc..f044a0f8ad 100644
--- a/doc/policy/mempool-replacements.md
+++ b/doc/policy/mempool-replacements.md
@@ -10,14 +10,12 @@ A transaction ("replacement transaction") may replace its directly conflicting t
their in-mempool descendants (together, "original transactions") if, in addition to passing all
other consensus and policy rules, each of the following conditions are met:
-1. The directly conflicting transactions all signal replaceability explicitly. A transaction is
+1. If `-mempoolfullrbf=0` (the value is 1 by default), the directly conflicting transactions all signal replaceability explicitly. A transaction is
signaling BIP125 replaceability if any of its inputs have an nSequence number less than (0xffffffff - 1).
A transaction also signals replaceability if its version field is set to 3.
*Rationale*: See [BIP125
explanation](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki#motivation).
- Use the (`-mempoolfullrbf`) configuration option to allow transaction replacement without enforcement of the
- opt-in signaling rule.
2. The replacement transaction only include an unconfirmed input if that input was included in
one of the directly conflicting transactions. An unconfirmed input spends an output from a
@@ -80,3 +78,5 @@ This set of rules is similar but distinct from BIP125.
* Full replace-by-fee enabled as a configurable mempool policy as of **v24.0** ([PR
#25353](https://github.com/bitcoin/bitcoin/pull/25353)).
+
+* Full replace-by-fee is the default policy as of **v28.0** ([PR #30493](https://github.com/bitcoin/bitcoin/pull/30493)).
diff --git a/doc/policy/packages.md b/doc/policy/packages.md
index 9b321799f1..b432008d7b 100644
--- a/doc/policy/packages.md
+++ b/doc/policy/packages.md
@@ -38,7 +38,7 @@ The following rules are enforced for all packages:
* Only limited package replacements are currently considered. (#28984)
- - All direct conflicts must signal replacement (or the node must have `-mempoolfullrbf=1` set).
+ - If `-mempoolfullrbf=0` (the value is 1 by default), all direct conflicts must signal replacement.
- Packages are 1-parent-1-child, with no in-mempool ancestors of the package.
diff --git a/doc/release-notes-22729.md b/doc/release-notes-22729.md
new file mode 100644
index 0000000000..7b836c2701
--- /dev/null
+++ b/doc/release-notes-22729.md
@@ -0,0 +1,21 @@
+Notable changes
+===============
+
+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)
diff --git a/doc/release-notes-28052.md b/doc/release-notes-28052.md
new file mode 100644
index 0000000000..386f0cee5f
--- /dev/null
+++ b/doc/release-notes-28052.md
@@ -0,0 +1,6 @@
+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.
diff --git a/doc/release-notes-29775.md b/doc/release-notes-29775.md
new file mode 100644
index 0000000000..6cb3ed3e8d
--- /dev/null
+++ b/doc/release-notes-29775.md
@@ -0,0 +1,10 @@
+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.
diff --git a/doc/release-notes-30212.md b/doc/release-notes-30212.md
new file mode 100644
index 0000000000..cc4ea59b7f
--- /dev/null
+++ b/doc/release-notes-30212.md
@@ -0,0 +1,8 @@
+RPC
+---
+
+- Previously when using the `sendrawtransaction` rpc and specifying outputs
+ that are already in the UXTO set an RPC error code `-27` with RPC error
+ text "Transaction already in block chain" was returned in response.
+ The help text has been updated to "Transaction outputs already in utxo set"
+ to more accurately describe the source of the issue.
diff --git a/doc/release-notes-30275.md b/doc/release-notes-30275.md
new file mode 100644
index 0000000000..2fcaef17c8
--- /dev/null
+++ b/doc/release-notes-30275.md
@@ -0,0 +1,7 @@
+RPC
+---
+
+- The default mode for the `estimatesmartfee` RPC has been updated from `conservative` to `economical`.
+ which is expected to reduce overestimation 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 overestimating,
+ the `conservative` mode remains available.
diff --git a/doc/release-notes-30493.md b/doc/release-notes-30493.md
new file mode 100644
index 0000000000..98afbcc7d1
--- /dev/null
+++ b/doc/release-notes-30493.md
@@ -0,0 +1,4 @@
+Full Replace-By-Fee
+===================
+
+`mempoolfullrbf=1` is now set by default.
diff --git a/doc/release-process.md b/doc/release-process.md
index 1e6d49100e..fa2c53eb0c 100644
--- a/doc/release-process.md
+++ b/doc/release-process.md
@@ -311,13 +311,15 @@ Both variables are used as a guideline for how much space the user needs on thei
Note that all values should be taken from a **fully synced** node and have an overhead of 5-10% added on top of its base value.
To calculate `m_assumed_blockchain_size`, take the size in GiB of these directories:
-- For `mainnet` -> the data directory, excluding the `/testnet3`, `/signet`, and `/regtest` directories and any overly large files, e.g. a huge `debug.log`
+- For `mainnet` -> the data directory, excluding the `/testnet3`, `/testnet4`, `/signet`, and `/regtest` directories and any overly large files, e.g. a huge `debug.log`
- For `testnet` -> `/testnet3`
+- For `testnet4` -> `/testnet4`
- For `signet` -> `/signet`
To calculate `m_assumed_chain_state_size`, take the size in GiB of these directories:
- For `mainnet` -> `/chainstate`
- For `testnet` -> `/testnet3/chainstate`
+- For `testnet4` -> `/testnet4/chainstate`
- For `signet` -> `/signet/chainstate`
Notes:
diff --git a/doc/tor.md b/doc/tor.md
index 65aa3ece02..9560dc29eb 100644
--- a/doc/tor.md
+++ b/doc/tor.md
@@ -193,7 +193,7 @@ In a typical situation, where you're only reachable via Tor, this should suffice
listen on all devices and another node could establish a clearnet connection, when knowing
your address. To mitigate this, additionally bind the address of your Tor proxy:
- ./bitcoind ... -bind=127.0.0.1
+ ./bitcoind ... -bind=127.0.0.1:8334=onion
If you don't care too much about hiding your node, and want to be reachable on IPv4
as well, use `discover` instead:
diff --git a/src/Makefile.am b/src/Makefile.am
index c2fbc1a470..cd85709808 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -258,7 +258,6 @@ BITCOIN_CORE_H = \
random.h \
randomenv.h \
rest.h \
- reverse_iterator.h \
rpc/auxpow_miner.h \
rpc/blockchain.h \
rpc/client.h \
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index 395bdf4552..ed1c14e7ea 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -86,6 +86,7 @@ BITCOIN_TESTS =\
test/checkqueue_tests.cpp \
test/cluster_linearize_tests.cpp \
test/coins_tests.cpp \
+ test/coinscachepair_tests.cpp \
test/coinstatsindex_tests.cpp \
test/common_url_tests.cpp \
test/compilerbug_tests.cpp \
diff --git a/src/bech32.cpp b/src/bech32.cpp
index d8d31a415c..5694ad54c8 100644
--- a/src/bech32.cpp
+++ b/src/bech32.cpp
@@ -19,9 +19,6 @@ namespace
typedef std::vector data;
-/** The Bech32 and Bech32m checksum size */
-constexpr size_t CHECKSUM_SIZE = 6;
-
/** The Bech32 and Bech32m character set for encoding. */
const char* CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
diff --git a/src/bech32.h b/src/bech32.h
index fe2a276ae0..33d1ca1935 100644
--- a/src/bech32.h
+++ b/src/bech32.h
@@ -21,6 +21,9 @@
namespace bech32
{
+/** The Bech32 and Bech32m checksum size */
+constexpr size_t CHECKSUM_SIZE = 6;
+
enum class Encoding {
INVALID, //!< Failed decoding
diff --git a/src/bench/cluster_linearize.cpp b/src/bench/cluster_linearize.cpp
index 9987d376a5..269648f4e2 100644
--- a/src/bench/cluster_linearize.cpp
+++ b/src/bench/cluster_linearize.cpp
@@ -169,6 +169,38 @@ void BenchLinearizeNoItersWorstCaseLIMO(ClusterIndex ntx, benchmark::Bench& benc
});
}
+template
+void BenchPostLinearizeWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ DepGraph depgraph = MakeWideGraph(ntx);
+ std::vector lin(ntx);
+ bench.run([&] {
+ for (ClusterIndex i = 0; i < ntx; ++i) lin[i] = i;
+ PostLinearize(depgraph, lin);
+ });
+}
+
+template
+void BenchMergeLinearizationsWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ DepGraph depgraph;
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ depgraph.AddTransaction({i, 1});
+ if (i) depgraph.AddDependency(0, i);
+ }
+ std::vector lin1;
+ std::vector lin2;
+ lin1.push_back(0);
+ lin2.push_back(0);
+ for (ClusterIndex i = 1; i < ntx; ++i) {
+ lin1.push_back(i);
+ lin2.push_back(ntx - i);
+ }
+ bench.run([&] {
+ MergeLinearizations(depgraph, lin1, lin2);
+ });
+}
+
} // namespace
static void LinearizePerIter16TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase>(16, bench); }
@@ -192,6 +224,20 @@ static void LinearizeNoIters64TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLi
static void LinearizeNoIters75TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO>(75, bench); }
static void LinearizeNoIters99TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO>(99, bench); }
+static void PostLinearize16TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(16, bench); }
+static void PostLinearize32TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(32, bench); }
+static void PostLinearize48TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(48, bench); }
+static void PostLinearize64TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(64, bench); }
+static void PostLinearize75TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(75, bench); }
+static void PostLinearize99TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase>(99, bench); }
+
+static void MergeLinearizations16TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(16, bench); }
+static void MergeLinearizations32TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(32, bench); }
+static void MergeLinearizations48TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(48, bench); }
+static void MergeLinearizations64TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(64, bench); }
+static void MergeLinearizations75TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(75, bench); }
+static void MergeLinearizations99TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase>(99, bench); }
+
BENCHMARK(LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizePerIter48TxWorstCase, benchmark::PriorityLevel::HIGH);
@@ -212,3 +258,17 @@ BENCHMARK(LinearizeNoIters48TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizeNoIters64TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizeNoIters75TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizeNoIters99TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(PostLinearize16TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize32TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize48TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize64TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize75TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize99TxWorstCase, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(MergeLinearizations16TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations32TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations48TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations64TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations75TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations99TxWorstCase, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/sign_transaction.cpp b/src/bench/sign_transaction.cpp
index 7a2e26e339..6f28f581af 100644
--- a/src/bench/sign_transaction.cpp
+++ b/src/bench/sign_transaction.cpp
@@ -12,6 +12,7 @@
#include