diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a5c322fc23834..0ea479b667d7c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -153,12 +153,10 @@ jobs:
- name: Get tool information
run: |
- msbuild -version | Out-File -FilePath "$env:GITHUB_WORKSPACE\msbuild_version"
- Get-Content -Path "$env:GITHUB_WORKSPACE\msbuild_version"
- $env:VCToolsVersion | Out-File -FilePath "$env:GITHUB_WORKSPACE\toolset_version"
- Write-Host "VCToolsVersion $(Get-Content -Path "$env:GITHUB_WORKSPACE\toolset_version")"
- $env:CI_QT_URL | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_url"
- $env:CI_QT_CONF | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_conf"
+ msbuild -version | Tee-Object -FilePath "msbuild_version"
+ $env:VCToolsVersion | Tee-Object -FilePath "toolset_version"
+ $env:CI_QT_URL | Out-File -FilePath "qt_url"
+ $env:CI_QT_CONF | Out-File -FilePath "qt_conf"
py -3 --version
Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())"
@@ -241,10 +239,8 @@ jobs:
run: |
Set-Location "$env:VCPKG_INSTALLATION_ROOT"
Add-Content -Path "triplets\x64-windows-static.cmake" -Value "set(VCPKG_BUILD_TYPE release)"
- Add-Content -Path "triplets\x64-windows-static.cmake" -Value "set(VCPKG_PLATFORM_TOOLSET_VERSION $env:VCToolsVersion)"
.\vcpkg.exe --vcpkg-root "$env:VCPKG_INSTALLATION_ROOT" integrate install
- git rev-parse HEAD | Out-File -FilePath "$env:GITHUB_WORKSPACE\vcpkg_commit"
- Get-Content -Path "$env:GITHUB_WORKSPACE\vcpkg_commit"
+ git rev-parse HEAD | Tee-Object -FilePath "$env:GITHUB_WORKSPACE\vcpkg_commit"
- name: vcpkg tools cache
uses: actions/cache@v4
diff --git a/ci/test/00_setup_env_mac_cross.sh b/ci/test/00_setup_env_mac_cross.sh
index 76f960f0f2a24..b94cee0b1f27a 100755
--- a/ci/test/00_setup_env_mac_cross.sh
+++ b/ci/test/00_setup_env_mac_cross.sh
@@ -9,10 +9,10 @@ export LC_ALL=C.UTF-8
export SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks}
export CONTAINER_NAME=ci_macos_cross
-export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
+export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
export HOST=x86_64-apple-darwin
export DEP_OPTS="PROTOBUF=1"
-export PACKAGES="zip libprotobuf-dev protobuf-compiler"
+export PACKAGES="clang lld llvm zip libprotobuf-dev protobuf-compiler"
export XCODE_VERSION=15.0
export XCODE_BUILD_ID=15A240d
export RUN_UNIT_TESTS=false
diff --git a/configure.ac b/configure.ac
index b8e78ba26243e..172316dc7e3c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -215,9 +215,9 @@ AC_ARG_WITH([qrencode],
AC_ARG_ENABLE([hardening],
[AS_HELP_STRING([--disable-hardening],
- [do not attempt to harden the resulting executables (default is to harden when possible)])],
+ [do not attempt to harden the resulting executables (default is to harden)])],
[use_hardening=$enableval],
- [use_hardening=auto])
+ [use_hardening=yes])
AC_ARG_ENABLE([reduce-exports],
[AS_HELP_STRING([--enable-reduce-exports],
@@ -290,13 +290,6 @@ AC_ARG_WITH([sanitizers],
[comma separated list of extra sanitizers to build with (default is none enabled)])],
[use_sanitizers=$withval])
-dnl Enable gprof profiling
-AC_ARG_ENABLE([gprof],
- [AS_HELP_STRING([--enable-gprof],
- [use gprof profiling compiler flags (default is no)])],
- [enable_gprof=$enableval],
- [enable_gprof=no])
-
dnl Turn warnings into errors
AC_ARG_ENABLE([werror],
[AS_HELP_STRING([--enable-werror],
@@ -420,12 +413,12 @@ AX_CHECK_COMPILE_FLAG([-Wsuggest-override], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsug
AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wimplicit-fallthrough"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunreachable-code"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR])
+AX_CHECK_COMPILE_FLAG([-Wself-assign], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wself-assign"], [], [$CXXFLAG_WERROR])
dnl Some compilers (gcc) ignore unknown -Wno-* options, but warn about all
dnl unknown options if any other warning is produced. Test the -Wfoo case, and
dnl set the -Wno-foo case if it works.
AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"], [], [$CXXFLAG_WERROR])
-AX_CHECK_COMPILE_FLAG([-Wself-assign], [NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"], [], [$CXXFLAG_WERROR])
dnl Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review.
AX_CHECK_COMPILE_FLAG([-fno-extended-identifiers], [CORE_CXXFLAGS="$CORE_CXXFLAGS -fno-extended-identifiers"], [], [$CXXFLAG_WERROR])
@@ -859,30 +852,12 @@ if test "$ac_cv_sys_large_files" != "" &&
CORE_CPPFLAGS="$CORE_CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files"
fi
-if test "$enable_gprof" = "yes"; then
- dnl -pg is incompatible with -pie. Since hardening and profiling together doesn't make sense,
- dnl we simply make them mutually exclusive here. Additionally, hardened toolchains may force
- dnl -pie by default, in which case it needs to be turned off with -no-pie.
-
- if test "$use_hardening" = "yes"; then
- AC_MSG_ERROR([gprof profiling is not compatible with hardening. Reconfigure with --disable-hardening or --disable-gprof])
- fi
- use_hardening=no
- AX_CHECK_COMPILE_FLAG([-pg],[GPROF_CXXFLAGS="-pg"],
- [AC_MSG_ERROR([gprof profiling requested but not available])], [$CXXFLAG_WERROR])
-
- AX_CHECK_LINK_FLAG([-no-pie], [GPROF_LDFLAGS="-no-pie"])
- AX_CHECK_LINK_FLAG([-pg], [GPROF_LDFLAGS="$GPROF_LDFLAGS -pg"],
- [AC_MSG_ERROR([gprof profiling requested but not available])], [$GPROF_LDFLAGS])
-fi
-
if test "$TARGET_OS" != "windows"; then
dnl All windows code is PIC, forcing it on just adds useless compile warnings
AX_CHECK_COMPILE_FLAG([-fPIC], [PIC_FLAGS="-fPIC"])
fi
if test "$use_hardening" != "no"; then
- use_hardening=yes
AX_CHECK_COMPILE_FLAG([-Wstack-protector], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"])
AX_CHECK_COMPILE_FLAG([-fstack-protector-all], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"])
@@ -1779,8 +1754,6 @@ AC_SUBST(WARN_CXXFLAGS)
AC_SUBST(NOWARN_CXXFLAGS)
AC_SUBST(DEBUG_CXXFLAGS)
AC_SUBST(ERROR_CXXFLAGS)
-AC_SUBST(GPROF_CXXFLAGS)
-AC_SUBST(GPROF_LDFLAGS)
AC_SUBST(HARDENED_CXXFLAGS)
AC_SUBST(HARDENED_CPPFLAGS)
AC_SUBST(HARDENED_LDFLAGS)
@@ -1892,7 +1865,6 @@ echo " with natpmp = $use_natpmp"
echo " USDT tracing = $use_usdt"
echo " sanitizers = $use_sanitizers"
echo " debug enabled = $enable_debug"
-echo " gprof enabled = $enable_gprof"
echo " werror = $enable_werror"
echo
echo " target os = $host_os"
@@ -1902,8 +1874,8 @@ echo " CC = $CC"
echo " CFLAGS = $PTHREAD_CFLAGS $SANITIZER_CFLAGS $CFLAGS"
echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CORE_CPPFLAGS $CPPFLAGS"
echo " CXX = $CXX"
-echo " CXXFLAGS = $CORE_CXXFLAGS $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $SANITIZER_CXXFLAGS $CXXFLAGS"
-echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $SANITIZER_LDFLAGS $CORE_LDFLAGS $LDFLAGS"
+echo " CXXFLAGS = $CORE_CXXFLAGS $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $SANITIZER_CXXFLAGS $CXXFLAGS"
+echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $SANITIZER_LDFLAGS $CORE_LDFLAGS $LDFLAGS"
echo " AR = $AR"
echo " ARFLAGS = $ARFLAGS"
echo
diff --git a/contrib/devtools/check-deps.sh b/contrib/devtools/check-deps.sh
new file mode 100755
index 0000000000000..9d2eebe14d8de
--- /dev/null
+++ b/contrib/devtools/check-deps.sh
@@ -0,0 +1,203 @@
+#!/usr/bin/env bash
+
+export LC_ALL=C
+set -Eeuo pipefail
+
+# Declare paths to libraries
+declare -A LIBS
+LIBS[cli]="libbitcoin_cli.a"
+LIBS[common]="libbitcoin_common.a"
+LIBS[consensus]="libbitcoin_consensus.a"
+LIBS[crypto]="crypto/.libs/libbitcoin_crypto_base.a crypto/.libs/libbitcoin_crypto_x86_shani.a crypto/.libs/libbitcoin_crypto_sse41.a crypto/.libs/libbitcoin_crypto_avx2.a"
+LIBS[node]="libbitcoin_node.a"
+LIBS[util]="libbitcoin_util.a"
+LIBS[wallet]="libbitcoin_wallet.a"
+LIBS[wallet_tool]="libbitcoin_wallet_tool.a"
+
+# Declare allowed dependencies "X Y" where X is allowed to depend on Y. This
+# list is taken from doc/design/libraries.md.
+ALLOWED_DEPENDENCIES=(
+ "cli common"
+ "cli util"
+ "common consensus"
+ "common crypto"
+ "common util"
+ "consensus crypto"
+ "node common"
+ "node consensus"
+ "node crypto"
+ "node kernel"
+ "node util"
+ "util crypto"
+ "wallet common"
+ "wallet crypto"
+ "wallet util"
+ "wallet_tool util"
+ "wallet_tool wallet"
+)
+
+# Add minor dependencies omitted from doc/design/libraries.md to keep the
+# dependency diagram simple.
+ALLOWED_DEPENDENCIES+=(
+ "wallet consensus"
+ "wallet_tool common"
+ "wallet_tool crypto"
+)
+
+# Declare list of known errors that should be suppressed.
+declare -A SUPPRESS
+# init.cpp file currently calls Berkeley DB sanity check function on startup, so
+# there is an undocumented dependency of the node library on the wallet library.
+SUPPRESS["libbitcoin_node_a-init.o libbitcoin_wallet_a-bdb.o _ZN6wallet27BerkeleyDatabaseSanityCheckEv"]=1
+# init/common.cpp file calls InitError and InitWarning from interface_ui which
+# is currently part of the node library. interface_ui should just be part of the
+# common library instead, and is moved in
+# https://github.com/bitcoin/bitcoin/issues/10102
+SUPPRESS["libbitcoin_common_a-common.o libbitcoin_node_a-interface_ui.o _Z11InitWarningRK13bilingual_str"]=1
+SUPPRESS["libbitcoin_common_a-common.o libbitcoin_node_a-interface_ui.o _Z9InitErrorRK13bilingual_str"]=1
+# rpc/external_signer.cpp adds defines node RPC methods but is built as part of the
+# common library. It should be moved to the node library instead.
+SUPPRESS["libbitcoin_common_a-external_signer.o libbitcoin_node_a-server.o _ZN9CRPCTable13appendCommandERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPK11CRPCCommand"]=1
+
+usage() {
+ echo "Usage: $(basename "${BASH_SOURCE[0]}") [BUILD_DIR]"
+}
+
+# Output makefile targets, converting library .a paths to libtool .la targets
+lib_targets() {
+ for lib in "${!LIBS[@]}"; do
+ for lib_path in ${LIBS[$lib]}; do
+ # shellcheck disable=SC2001
+ sed 's:/.libs/\(.*\)\.a$:/\1.la:g' <<<"$lib_path"
+ done
+ done
+}
+
+# Extract symbol names and object names and write to text files
+extract_symbols() {
+ local temp_dir="$1"
+ for lib in "${!LIBS[@]}"; do
+ for lib_path in ${LIBS[$lib]}; do
+ nm -o "$lib_path" | grep ' T ' | awk '{print $3, $1}' >> "${temp_dir}/${lib}_exports.txt"
+ nm -o "$lib_path" | grep ' U ' | awk '{print $3, $1}' >> "${temp_dir}/${lib}_imports.txt"
+ awk '{print $1}' "${temp_dir}/${lib}_exports.txt" | sort -u > "${temp_dir}/${lib}_exported_symbols.txt"
+ awk '{print $1}' "${temp_dir}/${lib}_imports.txt" | sort -u > "${temp_dir}/${lib}_imported_symbols.txt"
+ done
+ done
+}
+
+# Lookup object name(s) corresponding to symbol name in text file
+obj_names() {
+ local symbol="$1"
+ local txt_file="$2"
+ sed -n "s/^$symbol [^:]\\+:\\([^:]\\+\\):[^:]*\$/\\1/p" "$txt_file" | sort -u
+}
+
+# Iterate through libraries and find disallowed dependencies
+check_libraries() {
+ local temp_dir="$1"
+ local result=0
+ for src in "${!LIBS[@]}"; do
+ for dst in "${!LIBS[@]}"; do
+ if [ "$src" != "$dst" ] && ! is_allowed "$src" "$dst"; then
+ if ! check_disallowed "$src" "$dst" "$temp_dir"; then
+ result=1
+ fi
+ fi
+ done
+ done
+ check_not_suppressed
+ return $result
+}
+
+# Return whether src library is allowed to depend on dst.
+is_allowed() {
+ local src="$1"
+ local dst="$2"
+ for allowed in "${ALLOWED_DEPENDENCIES[@]}"; do
+ if [ "$src $dst" = "$allowed" ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+# Return whether src library imports any symbols from dst, assuming src is not
+# allowed to depend on dst.
+check_disallowed() {
+ local src="$1"
+ local dst="$2"
+ local temp_dir="$3"
+ local result=0
+
+ # Loop over symbol names exported by dst and imported by src
+ while read symbol; do
+ local dst_obj
+ dst_obj=$(obj_names "$symbol" "${temp_dir}/${dst}_exports.txt")
+ while read src_obj; do
+ if ! check_suppress "$src_obj" "$dst_obj" "$symbol"; then
+ echo "Error: $src_obj depends on $dst_obj symbol '$(c++filt "$symbol")', can suppess with:"
+ echo " SUPPRESS[\"$src_obj $dst_obj $symbol\"]=1"
+ result=1
+ fi
+ done < <(obj_names "$symbol" "${temp_dir}/${src}_imports.txt")
+ done < <(comm -12 "${temp_dir}/${dst}_exported_symbols.txt" "${temp_dir}/${src}_imported_symbols.txt")
+ return $result
+}
+
+# Declare array to track errors which were suppressed.
+declare -A SUPPRESSED
+
+# Return whether error should be suppressed and record suppresssion in
+# SUPPRESSED array.
+check_suppress() {
+ local src_obj="$1"
+ local dst_obj="$2"
+ local symbol="$3"
+ for suppress in "${!SUPPRESS[@]}"; do
+ read suppress_src suppress_dst suppress_pattern <<<"$suppress"
+ if [[ "$src_obj" == "$suppress_src" && "$dst_obj" == "$suppress_dst" && "$symbol" =~ $suppress_pattern ]]; then
+ SUPPRESSED["$suppress"]=1
+ return 0
+ fi
+ done
+ return 1
+}
+
+# Warn about error which were supposed to be suppress, but were not encountered.
+check_not_suppressed() {
+ for suppress in "${!SUPPRESS[@]}"; do
+ if [[ ! -v SUPPRESSED[$suppress] ]]; then
+ echo >&2 "Warning: suppression '$suppress' was ignored, consider deleting."
+ fi
+ done
+}
+
+# Check arguments.
+if [ "$#" = 0 ]; then
+ BUILD_DIR="$(dirname "${BASH_SOURCE[0]}")/../../src"
+elif [ "$#" = 1 ]; then
+ BUILD_DIR="$1"
+else
+ echo >&2 "Error: wrong number of arguments."
+ usage >&2
+ exit 1
+fi
+if [ ! -f "$BUILD_DIR/Makefile" ]; then
+ echo >&2 "Error: directory '$BUILD_DIR' does not contain a makefile, please specify path to build directory for library targets."
+ usage >&2
+ exit 1
+fi
+
+# Build libraries and run checks.
+cd "$BUILD_DIR"
+# shellcheck disable=SC2046
+make -j"$(nproc)" $(lib_targets)
+TEMP_DIR="$(mktemp -d)"
+extract_symbols "$TEMP_DIR"
+if check_libraries "$TEMP_DIR"; then
+ echo "Success! No unexpected dependencies were detected."
+else
+ echo >&2 "Error: Unexpected dependencies were detected. Check previous output."
+fi
+rm -r "$TEMP_DIR"
diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py
index 707814d26e56c..9683b8e2ca5b8 100755
--- a/contrib/devtools/symbol-check.py
+++ b/contrib/devtools/symbol-check.py
@@ -246,8 +246,8 @@ def check_MACHO_sdk(binary) -> bool:
return True
return False
-def check_MACHO_ld64(binary) -> bool:
- if binary.build_version.tools[0].version == [17, 0, 6]:
+def check_MACHO_lld(binary) -> bool:
+ if binary.build_version.tools[0].version == [18, 1, 6]:
return True
return False
@@ -291,7 +291,7 @@ def check_ELF_ABI(binary) -> bool:
('DYNAMIC_LIBRARIES', check_MACHO_libraries),
('MIN_OS', check_MACHO_min_os),
('SDK', check_MACHO_sdk),
- ('LD64', check_MACHO_ld64),
+ ('LLD', check_MACHO_lld),
],
lief.EXE_FORMATS.PE: [
('DYNAMIC_LIBRARIES', check_PE_libraries),
diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh
index 4cc4476cdea2e..743c12a163910 100755
--- a/contrib/guix/libexec/build.sh
+++ b/contrib/guix/libexec/build.sh
@@ -187,8 +187,7 @@ make -C depends --jobs="$JOBS" HOST="$HOST" \
x86_64_linux_RANLIB=x86_64-linux-gnu-gcc-ranlib \
x86_64_linux_NM=x86_64-linux-gnu-gcc-nm \
x86_64_linux_STRIP=x86_64-linux-gnu-strip \
- ${NO_USB:+NO_USB=1} \
- FORCE_USE_SYSTEM_CLANG=1
+ ${NO_USB:+NO_USB=1}
###########################
diff --git a/contrib/guix/manifest.scm b/contrib/guix/manifest.scm
index 118158099a81e..3fba5111b9e96 100644
--- a/contrib/guix/manifest.scm
+++ b/contrib/guix/manifest.scm
@@ -543,9 +543,9 @@ inspecting signatures in Mach-O binaries.")
((string-contains target "darwin")
(list ;; Native GCC 11 toolchain
gcc-toolchain-11
- clang-toolchain-17
- lld-17
- (make-lld-wrapper lld-17 #:lld-as-ld? #t)
+ clang-toolchain-18
+ lld-18
+ (make-lld-wrapper lld-18 #:lld-as-ld? #t)
python-signapple
zip))
(else '())))))
diff --git a/contrib/signet/miner b/contrib/signet/miner
index 7b7b3feb39b54..4216ada5fa633 100755
--- a/contrib/signet/miner
+++ b/contrib/signet/miner
@@ -58,14 +58,14 @@ def signet_txs(block, challenge):
sd += block.nTime.to_bytes(4, "little")
to_spend = CTransaction()
- to_spend.nVersion = 0
+ to_spend.version = 0
to_spend.nLockTime = 0
to_spend.vin = [CTxIn(COutPoint(0, 0xFFFFFFFF), b"\x00" + CScriptOp.encode_op_pushdata(sd), 0)]
to_spend.vout = [CTxOut(0, challenge)]
to_spend.rehash()
spend = CTransaction()
- spend.nVersion = 0
+ spend.version = 0
spend.nLockTime = 0
spend.vin = [CTxIn(COutPoint(to_spend.sha256, 0), b"", 0)]
spend.vout = [CTxOut(0, b"\x6a")]
diff --git a/depends/Makefile b/depends/Makefile
index 00f069ef5a613..2255fabc4b9ce 100644
--- a/depends/Makefile
+++ b/depends/Makefile
@@ -195,8 +195,6 @@ all_packages = $(packages) $(native_packages)
meta_depends = Makefile config.guess config.sub funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk
-$(host_arch)_$(host_os)_native_toolchain?=$($(host_os)_native_toolchain)
-
include funcs.mk
final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
diff --git a/depends/README.md b/depends/README.md
index e09b36c765a9b..f14a960be845e 100644
--- a/depends/README.md
+++ b/depends/README.md
@@ -49,11 +49,11 @@ The paths are automatically configured and no other options are needed.
#### For macOS cross compilation
- sudo apt-get install g++ zip
+ apt install clang lld llvm g++ zip
-Note: You must obtain the macOS SDK before proceeding with a cross-compile.
-Under the depends directory, create a subdirectory named `SDKs`.
-Then, place the extracted SDK under this new directory.
+Clang 18 or later is required. You must also obtain the macOS SDK before
+proceeding with a cross-compile. Under the depends directory, create a
+subdirectory named `SDKs`. Then, place the extracted SDK under this new directory.
For more information, see [SDK Extraction](../contrib/macdeploy/README.md#sdk-extraction).
#### For Win64 cross compilation
@@ -119,9 +119,6 @@ The following can be set when running make: `make FOO=bar`
- `DEBUG`: Disable some optimizations and enable more runtime checking
- `HOST_ID_SALT`: Optional salt to use when generating host package ids
- `BUILD_ID_SALT`: Optional salt to use when generating build package ids
-- `FORCE_USE_SYSTEM_CLANG`: (EXPERTS ONLY) When cross-compiling for macOS, use Clang found in the
- system's `$PATH` rather than the default prebuilt release of Clang
- from llvm.org. Clang 8 or later is required
- `LOG`: Use file-based logging for individual packages. During a package build its log file
resides in the `depends` directory, and the log file is printed out automatically in case
of build error. After successful build log files are moved along with package archives
diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk
index d84c23ed44b5f..2b59353e84f31 100644
--- a/depends/builders/darwin.mk
+++ b/depends/builders/darwin.mk
@@ -18,7 +18,6 @@ darwin_STRIP:=$(shell xcrun -f strip)
darwin_OBJDUMP:=$(shell xcrun -f objdump)
darwin_NM:=$(shell xcrun -f nm)
darwin_DSYMUTIL:=$(shell xcrun -f dsymutil)
-darwin_native_toolchain=
x86_64_darwin_CFLAGS += -arch x86_64
x86_64_darwin_CXXFLAGS += -arch x86_64
diff --git a/depends/funcs.mk b/depends/funcs.mk
index 537051c030bf1..3c0dc7a7fcab5 100644
--- a/depends/funcs.mk
+++ b/depends/funcs.mk
@@ -46,7 +46,7 @@ endef
define int_get_build_id
$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies))
-$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies)))
+$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($(1)_dependencies)))
$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash)))
$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id))
$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)))
@@ -297,6 +297,3 @@ $(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$
#create build targets
$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package))))
-
-#special exception: if a toolchain package exists, all non-native packages depend on it
-$(foreach package,$(packages),$(eval $($(package)_extracted): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) ))
diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk
index a64008d6aa786..f2e9abdf373f6 100644
--- a/depends/hosts/darwin.mk
+++ b/depends/hosts/darwin.mk
@@ -2,39 +2,10 @@ OSX_MIN_VERSION=11.0
OSX_SDK_VERSION=14.0
XCODE_VERSION=15.0
XCODE_BUILD_ID=15A240d
-LD64_VERSION=711
+LLD_VERSION=711
OSX_SDK=$(SDK_PATH)/Xcode-$(XCODE_VERSION)-$(XCODE_BUILD_ID)-extracted-SDK-with-libcxx-headers
-ifeq ($(strip $(FORCE_USE_SYSTEM_CLANG)),)
-# FORCE_USE_SYSTEM_CLANG is empty, so we use our depends-managed, pinned LLVM
-# from llvm.org
-
-darwin_native_toolchain=native_llvm
-
-clang_prog=$(build_prefix)/bin/clang
-clangxx_prog=$(clang_prog)++
-llvm_config_prog=$(build_prefix)/bin/llvm-config
-
-llvm_TOOLS=AR NM OBJDUMP RANLIB STRIP
-
-# Make-only lowercase function
-lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
-
-# For well-known tools provided by LLVM, make sure that their well-known
-# variable is set to the full path of the tool, just like how AC_PATH_{TOO,PROG}
-# would.
-$(foreach TOOL,$(llvm_TOOLS),$(eval darwin_$(TOOL) = $$(build_prefix)/bin/llvm-$(call lc,$(TOOL))))
-
-# Clang expects dsymutil to be called dsymutil
-darwin_DSYMUTIL=$(build_prefix)/bin/dsymutil
-
-else
-# FORCE_USE_SYSTEM_CLANG is non-empty, so we use the clang from the user's
-# system
-
-darwin_native_toolchain=
-
# We can't just use $(shell command -v clang) because GNU Make handles builtins
# in a special way and doesn't know that `command` is a POSIX-standard builtin
# prior to 1af314465e5dfe3e8baa839a32a72e83c04f26ef, first released in v4.2.90.
@@ -44,9 +15,6 @@ darwin_native_toolchain=
# Source: https://lists.gnu.org/archive/html/bug-make/2017-11/msg00017.html
clang_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang")
clangxx_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang++")
-llvm_config_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-config")
-
-llvm_lib_dir=$(shell $(llvm_config_prog) --libdir)
darwin_AR=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-ar")
darwin_DSYMUTIL=$(shell $(SHELL) $(.SHELLFLAGS) "command -v dsymutil")
@@ -54,7 +22,6 @@ darwin_NM=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-nm")
darwin_OBJDUMP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-objdump")
darwin_RANLIB=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-ranlib")
darwin_STRIP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-strip")
-endif
# Flag explanations:
#
@@ -63,11 +30,6 @@ endif
# Ensures that modern linker features are enabled. See here for more
# details: https://github.com/bitcoin/bitcoin/pull/19407.
#
-# -B$(build_prefix)/bin
-#
-# Explicitly point to our binaries so that they are
-# ensured to be found and preferred over other possibilities.
-#
# -isysroot$(OSX_SDK) -nostdlibinc
#
# Disable default include paths built into the compiler as well as
@@ -92,7 +54,6 @@ darwin_CC=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \
-u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \
-u LIBRARY_PATH \
$(clang_prog) --target=$(host) \
- -B$(build_prefix)/bin \
-isysroot$(OSX_SDK) -nostdlibinc \
-iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks
@@ -100,7 +61,6 @@ darwin_CXX=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \
-u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \
-u LIBRARY_PATH \
$(clangxx_prog) --target=$(host) \
- -B$(build_prefix)/bin \
-isysroot$(OSX_SDK) -nostdlibinc \
-iwithsysroot/usr/include/c++/v1 \
-iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks
@@ -110,8 +70,8 @@ darwin_CXXFLAGS=-pipe -std=$(CXX_STANDARD) -mmacosx-version-min=$(OSX_MIN_VERSIO
darwin_LDFLAGS=-Wl,-platform_version,macos,$(OSX_MIN_VERSION),$(OSX_SDK_VERSION)
ifneq ($(build_os),darwin)
-darwin_CFLAGS += -mlinker-version=$(LD64_VERSION)
-darwin_CXXFLAGS += -mlinker-version=$(LD64_VERSION)
+darwin_CFLAGS += -mlinker-version=$(LLD_VERSION)
+darwin_CXXFLAGS += -mlinker-version=$(LLD_VERSION)
darwin_LDFLAGS += -Wl,-no_adhoc_codesign -fuse-ld=lld
endif
diff --git a/depends/packages/native_llvm.mk b/depends/packages/native_llvm.mk
deleted file mode 100644
index c701147edc8b9..0000000000000
--- a/depends/packages/native_llvm.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-package=native_llvm
-$(package)_version=17.0.6
-$(package)_major_version=$(firstword $(subst ., ,$($(package)_version)))
-$(package)_download_path=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version)
-ifneq (,$(findstring aarch64,$(BUILD)))
-$(package)_file_name=clang+llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz
-$(package)_sha256_hash=6dd62762285326f223f40b8e4f2864b5c372de3f7de0731cb7cd55ca5287b75a
-else
-$(package)_file_name=clang+llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-22.04.tar.xz
-$(package)_sha256_hash=884ee67d647d77e58740c1e645649e29ae9e8a6fe87c1376be0f3a30f3cc9ab3
-endif
-
-define $(package)_stage_cmds
- mkdir -p $($(package)_staging_prefix_dir)/lib/clang/$($(package)_major_version)/include && \
- mkdir -p $($(package)_staging_prefix_dir)/bin && \
- mkdir -p $($(package)_staging_prefix_dir)/include/llvm-c && \
- cp bin/clang $($(package)_staging_prefix_dir)/bin/ && \
- cp -P bin/clang++ $($(package)_staging_prefix_dir)/bin/ && \
- cp bin/dsymutil $($(package)_staging_prefix_dir)/bin/dsymutil && \
- cp bin/ld64.lld $($(package)_staging_prefix_dir)/bin/ld64.lld && \
- cp bin/llvm-ar $($(package)_staging_prefix_dir)/bin/llvm-ar && \
- cp bin/llvm-config $($(package)_staging_prefix_dir)/bin/ && \
- cp bin/llvm-nm $($(package)_staging_prefix_dir)/bin/llvm-nm && \
- cp bin/llvm-objdump $($(package)_staging_prefix_dir)/bin/llvm-objdump && \
- cp bin/llvm-ranlib $($(package)_staging_prefix_dir)/bin/llvm-ranlib && \
- cp bin/llvm-strip $($(package)_staging_prefix_dir)/bin/llvm-strip && \
- cp include/llvm-c/ExternC.h $($(package)_staging_prefix_dir)/include/llvm-c && \
- cp include/llvm-c/lto.h $($(package)_staging_prefix_dir)/include/llvm-c && \
- cp lib/libLTO.so $($(package)_staging_prefix_dir)/lib/ && \
- cp -r lib/clang/$($(package)_major_version)/include/* $($(package)_staging_prefix_dir)/lib/clang/$($(package)_major_version)/include/
-endef
diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk
index 5191562fcaeeb..9417c018f698d 100644
--- a/depends/packages/packages.mk
+++ b/depends/packages/packages.mk
@@ -30,13 +30,3 @@ multiprocess_packages = libmultiprocess capnp
multiprocess_native_packages = native_libmultiprocess native_capnp
usdt_linux_packages=systemtap
-
-darwin_native_packages =
-
-ifneq ($(build_os),darwin)
-
-ifeq ($(strip $(FORCE_USE_SYSTEM_CLANG)),)
-darwin_native_packages+= native_llvm
-endif
-
-endif
diff --git a/doc/dependencies.md b/doc/dependencies.md
index 0879b00f436a5..a4c08feb199db 100644
--- a/doc/dependencies.md
+++ b/doc/dependencies.md
@@ -30,7 +30,7 @@ You can find installation instructions in the `build-*.md` file for your platfor
| [Fontconfig](../depends/packages/fontconfig.mk) | [link](https://www.freedesktop.org/wiki/Software/fontconfig/) | [2.12.6](https://github.com/bitcoin/bitcoin/pull/23495) | 2.6 | Yes |
| [FreeType](../depends/packages/freetype.mk) | [link](https://freetype.org) | [2.11.0](https://github.com/bitcoin/bitcoin/commit/01544dd78ccc0b0474571da854e27adef97137fb) | 2.3.0 | Yes |
| [qrencode](../depends/packages/qrencode.mk) | [link](https://fukuchi.org/works/qrencode/) | [4.1.1](https://github.com/bitcoin/bitcoin/pull/27312) | | No |
-| [Qt](../depends/packages/qt.mk) | [link](https://download.qt.io/official_releases/qt/) | [5.15.13](https://github.com/bitcoin/bitcoin/pull/29732) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No |
+| [Qt](../depends/packages/qt.mk) | [link](https://download.qt.io/official_releases/qt/) | [5.15.14](https://github.com/bitcoin/bitcoin/pull/30198) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No |
### Networking
| Dependency | Releases | Version used | Minimum required | Runtime |
diff --git a/doc/design/libraries.md b/doc/design/libraries.md
index 251c52199d0bc..aa8034ab37b44 100644
--- a/doc/design/libraries.md
+++ b/doc/design/libraries.md
@@ -5,6 +5,7 @@
| *libbitcoin_cli* | RPC client functionality used by *bitcoin-cli* executable |
| *libbitcoin_common* | Home for common functionality shared by different executables and libraries. Similar to *libbitcoin_util*, but higher-level (see [Dependencies](#dependencies)). |
| *libbitcoin_consensus* | Stable, backwards-compatible consensus functionality used by *libbitcoin_node* and *libbitcoin_wallet*. |
+| *libbitcoin_crypto* | Hardware-optimized functions for data encryption, hashing, message authentication, and key derivation. |
| *libbitcoin_kernel* | Consensus engine and support library used for validation by *libbitcoin_node*. |
| *libbitcoinqt* | GUI functionality used by *bitcoin-qt* and *bitcoin-gui* executables. |
| *libbitcoin_ipc* | IPC functionality used by *bitcoin-node*, *bitcoin-wallet*, *bitcoin-gui* executables to communicate when [`--enable-multiprocess`](multiprocess.md) is used. |
@@ -53,13 +54,18 @@ bitcoin-wallet[bitcoin-wallet]-->libbitcoin_wallet_tool;
libbitcoin_cli-->libbitcoin_util;
libbitcoin_cli-->libbitcoin_common;
+libbitcoin_consensus-->libbitcoin_crypto;
+
libbitcoin_common-->libbitcoin_consensus;
+libbitcoin_common-->libbitcoin_crypto;
libbitcoin_common-->libbitcoin_util;
libbitcoin_kernel-->libbitcoin_consensus;
+libbitcoin_kernel-->libbitcoin_crypto;
libbitcoin_kernel-->libbitcoin_util;
libbitcoin_node-->libbitcoin_consensus;
+libbitcoin_node-->libbitcoin_crypto;
libbitcoin_node-->libbitcoin_kernel;
libbitcoin_node-->libbitcoin_common;
libbitcoin_node-->libbitcoin_util;
@@ -67,7 +73,10 @@ libbitcoin_node-->libbitcoin_util;
libbitcoinqt-->libbitcoin_common;
libbitcoinqt-->libbitcoin_util;
+libbitcoin_util-->libbitcoin_crypto;
+
libbitcoin_wallet-->libbitcoin_common;
+libbitcoin_wallet-->libbitcoin_crypto;
libbitcoin_wallet-->libbitcoin_util;
libbitcoin_wallet_tool-->libbitcoin_wallet;
@@ -78,22 +87,23 @@ class bitcoin-qt,bitcoind,bitcoin-cli,bitcoin-wallet bold
```
-**Dependency graph**. Arrows show linker symbol dependencies. *Consensus* lib depends on nothing. *Util* lib is depended on by everything. *Kernel* lib depends only on consensus and util.
+**Dependency graph**. Arrows show linker symbol dependencies. *Crypto* lib depends on nothing. *Util* lib is depended on by everything. *Kernel* lib depends only on consensus, crypto, and util.
|
- The graph shows what _linker symbols_ (functions and variables) from each library other libraries can call and reference directly, but it is not a call graph. For example, there is no arrow connecting *libbitcoin_wallet* and *libbitcoin_node* libraries, because these libraries are intended to be modular and not depend on each other's internal implementation details. But wallet code is still able to call node code indirectly through the `interfaces::Chain` abstract class in [`interfaces/chain.h`](../../src/interfaces/chain.h) and node code calls wallet code through the `interfaces::ChainClient` and `interfaces::Chain::Notifications` abstract classes in the same file. In general, defining abstract classes in [`src/interfaces/`](../../src/interfaces/) can be a convenient way of avoiding unwanted direct dependencies or circular dependencies between libraries.
-- *libbitcoin_consensus* should be a standalone dependency that any library can depend on, and it should not depend on any other libraries itself.
+- *libbitcoin_crypto* should be a standalone dependency that any library can depend on, and it should not depend on any other libraries itself.
-- *libbitcoin_util* should also be a standalone dependency that any library can depend on, and it should not depend on other internal libraries.
+- *libbitcoin_consensus* should only depend on *libbitcoin_crypto*, and all other libraries besides *libbitcoin_crypto* should be allowed to depend on it.
-- *libbitcoin_common* should serve a similar function as *libbitcoin_util* and be a place for miscellaneous code used by various daemon, GUI, and CLI applications and libraries to live. It should not depend on anything other than *libbitcoin_util* and *libbitcoin_consensus*. The boundary between _util_ and _common_ is a little fuzzy but historically _util_ has been used for more generic, lower-level things like parsing hex, and _common_ has been used for bitcoin-specific, higher-level things like parsing base58. The difference between util and common is mostly important because *libbitcoin_kernel* is not supposed to depend on *libbitcoin_common*, only *libbitcoin_util*. In general, if it is ever unclear whether it is better to add code to *util* or *common*, it is probably better to add it to *common* unless it is very generically useful or useful particularly to include in the kernel.
+- *libbitcoin_util* should be a standalone dependency that any library can depend on, and it should not depend on other libraries except *libbitcoin_crypto*. It provides basic utilities that fill in gaps in the C++ standard library and provide lightweight abstractions over platform-specific features. Since the util library is distributed with the kernel and is usable by kernel applications, it shouldn't contain functions that external code shouldn't call, like higher level code targetted at the node or wallet. (*libbitcoin_common* is a better place for higher level code, or code that is meant to be used by internal applications only.)
+- *libbitcoin_common* is a home for miscellaneous shared code used by different Bitcoin Core applications. It should not depend on anything other than *libbitcoin_util*, *libbitcoin_consensus*, and *libbitcoin_crypto*.
-- *libbitcoin_kernel* should only depend on *libbitcoin_util* and *libbitcoin_consensus*.
+- *libbitcoin_kernel* should only depend on *libbitcoin_util*, *libbitcoin_consensus*, and *libbitcoin_crypto*.
-- The only thing that should depend on *libbitcoin_kernel* internally should be *libbitcoin_node*. GUI and wallet libraries *libbitcoinqt* and *libbitcoin_wallet* in particular should not depend on *libbitcoin_kernel* and the unneeded functionality it would pull in, like block validation. To the extent that GUI and wallet code need scripting and signing functionality, they should be get able it from *libbitcoin_consensus*, *libbitcoin_common*, and *libbitcoin_util*, instead of *libbitcoin_kernel*.
+- The only thing that should depend on *libbitcoin_kernel* internally should be *libbitcoin_node*. GUI and wallet libraries *libbitcoinqt* and *libbitcoin_wallet* in particular should not depend on *libbitcoin_kernel* and the unneeded functionality it would pull in, like block validation. To the extent that GUI and wallet code need scripting and signing functionality, they should be get able it from *libbitcoin_consensus*, *libbitcoin_common*, *libbitcoin_crypto*, and *libbitcoin_util*, instead of *libbitcoin_kernel*.
- GUI, node, and wallet code internal implementations should all be independent of each other, and the *libbitcoinqt*, *libbitcoin_node*, *libbitcoin_wallet* libraries should never reference each other's symbols. They should only call each other through [`src/interfaces/`](../../src/interfaces/) abstract interfaces.
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index 7e55962471408..eb2bb41aa41fd 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -13,7 +13,6 @@ Developer Notes
- [Development tips and tricks](#development-tips-and-tricks)
- [Compiling for debugging](#compiling-for-debugging)
- [Show sources in debugging](#show-sources-in-debugging)
- - [Compiling for gprof profiling](#compiling-for-gprof-profiling)
- [`debug.log`](#debuglog)
- [Signet, testnet, and regtest modes](#signet-testnet-and-regtest-modes)
- [DEBUG_LOCKORDER](#debug_lockorder)
@@ -386,10 +385,6 @@ ln -s /path/to/project/root/src src
3. Use `debugedit` to modify debug information in the binary.
-### Compiling for gprof profiling
-
-Run configure with the `--enable-gprof` option, then make.
-
### `debug.log`
If the code is behaving strangely, take a look in the `debug.log` file in the data directory;
diff --git a/doc/policy/mempool-replacements.md b/doc/policy/mempool-replacements.md
index 3fd7ff2ad2de9..d5642eaccce35 100644
--- a/doc/policy/mempool-replacements.md
+++ b/doc/policy/mempool-replacements.md
@@ -12,7 +12,7 @@ other consensus and policy rules, each of the following conditions are met:
1. 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 nVersion field is set to 3.
+ 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).
diff --git a/doc/release-notes-29091-29165.md b/doc/release-notes-29091-29165.md
new file mode 100644
index 0000000000000..9c9f8e4e50d6d
--- /dev/null
+++ b/doc/release-notes-29091-29165.md
@@ -0,0 +1,5 @@
+Build
+-----
+
+GCC 11.1 or later, or Clang 15+ or later,
+are now required to compile Bitcoin Core.
diff --git a/src/Makefile.am b/src/Makefile.am
index 7352982e67d08..cf33a36deefb2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,8 +8,8 @@ print-%: FORCE
DIST_SUBDIRS = secp256k1
-AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
-AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS)
+AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
+AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(SANITIZER_CXXFLAGS)
AM_OBJCXXFLAGS = $(AM_CXXFLAGS)
AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS)
AM_CFLAGS = $(AM_CXXFLAGS)
@@ -151,13 +151,16 @@ BITCOIN_CORE_H = \
common/bloom.h \
common/init.h \
common/run_command.h \
+ common/types.h \
common/url.h \
compat/assumptions.h \
compat/byteswap.h \
compat/compat.h \
compat/cpuid.h \
compat/endian.h \
+ common/messages.h \
common/settings.h \
+ common/signmessage.h \
common/system.h \
common/globals.h \
compressor.h \
@@ -255,6 +258,7 @@ BITCOIN_CORE_H = \
node/timeoffsets.h \
node/transaction.h \
node/txreconciliation.h \
+ node/types.h \
node/utxo_snapshot.h \
node/validation_cache_args.h \
noui.h \
@@ -292,6 +296,7 @@ BITCOIN_CORE_H = \
script/descriptor.h \
script/keyorigin.h \
script/miniscript.h \
+ script/parsing.h \
script/sigcache.h \
script/sign.h \
script/signingprovider.h \
@@ -326,15 +331,14 @@ BITCOIN_CORE_H = \
util/batchpriority.h \
util/bip32.h \
util/bitdeque.h \
+ util/bitset.h \
util/bytevectorhash.h \
util/chaintype.h \
util/check.h \
util/epochguard.h \
- util/error.h \
util/exception.h \
util/fastrange.h \
util/feefrac.h \
- util/fees.h \
util/fs.h \
util/fs_helpers.h \
util/golombrice.h \
@@ -342,7 +346,6 @@ BITCOIN_CORE_H = \
util/hasher.h \
util/insert.h \
util/macros.h \
- util/message.h \
util/moneystr.h \
util/overflow.h \
util/overloaded.h \
@@ -352,7 +355,7 @@ BITCOIN_CORE_H = \
util/serfloat.h \
util/signalinterrupt.h \
util/sock.h \
- util/spanparsing.h \
+ util/strencodings.h \
util/string.h \
util/subprocess.h \
util/syserror.h \
@@ -668,6 +671,8 @@ crypto_libparticl_crypto_base_la_SOURCES = \
crypto/chacha20poly1305.h \
crypto/chacha20poly1305.cpp \
crypto/common.h \
+ crypto/hex_base.cpp \
+ crypto/hex_base.h \
crypto/hkdf_sha256_32.cpp \
crypto/hkdf_sha256_32.h \
crypto/hmac_sha256.cpp \
@@ -690,7 +695,8 @@ crypto_libparticl_crypto_base_la_SOURCES = \
crypto/sha512.cpp \
crypto/sha512.h \
crypto/siphash.cpp \
- crypto/siphash.h
+ crypto/siphash.h \
+ support/cleanse.cpp
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
# CXXFLAGS above
@@ -760,9 +766,7 @@ libparticl_consensus_a_SOURCES = \
span.h \
tinyformat.h \
uint256.cpp \
- uint256.h \
- util/strencodings.cpp \
- util/strencodings.h
+ uint256.h
#
# common #
@@ -772,6 +776,7 @@ libparticl_common_a_SOURCES = \
addresstype.cpp \
base58.cpp \
bech32.cpp \
+ chainparamsbase.cpp \
chainparams.cpp \
coins.cpp \
common/args.cpp \
@@ -779,8 +784,10 @@ libparticl_common_a_SOURCES = \
common/config.cpp \
common/init.cpp \
common/interfaces.cpp \
+ common/messages.cpp \
common/run_command.cpp \
common/settings.cpp \
+ common/signmessage.cpp \
common/system.cpp \
common/url.cpp \
compressor.cpp \
@@ -816,6 +823,7 @@ libparticl_common_a_SOURCES = \
scheduler.cpp \
script/descriptor.cpp \
script/miniscript.cpp \
+ script/parsing.cpp \
script/sign.cpp \
script/signingprovider.cpp \
script/solver.cpp \
@@ -828,13 +836,11 @@ libparticl_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libparticl_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libparticl_util_a_SOURCES = \
support/lockedpool.cpp \
- chainparamsbase.cpp \
clientversion.cpp \
logging.cpp \
random.cpp \
randomenv.cpp \
streams.cpp \
- support/cleanse.cpp \
sync.cpp \
util/asmap.cpp \
util/batchpriority.cpp \
@@ -842,16 +848,13 @@ libparticl_util_a_SOURCES = \
util/bytevectorhash.cpp \
util/chaintype.cpp \
util/check.cpp \
- util/error.cpp \
util/exception.cpp \
util/feefrac.cpp \
- util/fees.cpp \
util/fs.cpp \
util/fs_helpers.cpp \
util/hasher.cpp \
util/sock.cpp \
util/syserror.cpp \
- util/message.cpp \
util/moneystr.cpp \
util/rbf.cpp \
util/readwritefile.cpp \
@@ -860,7 +863,6 @@ libparticl_util_a_SOURCES = \
util/threadinterrupt.cpp \
util/threadnames.cpp \
util/serfloat.cpp \
- util/spanparsing.cpp \
util/strencodings.cpp \
util/string.cpp \
util/time.cpp \
@@ -1165,7 +1167,6 @@ libparticlkernel_la_SOURCES = \
script/solver.cpp \
signet.cpp \
streams.cpp \
- support/cleanse.cpp \
support/lockedpool.cpp \
sync.cpp \
txdb.cpp \
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
index c0880f651e319..aa8b817382cb7 100644
--- a/src/Makefile.bench.include
+++ b/src/Makefile.bench.include
@@ -23,6 +23,7 @@ bench_bench_particl_SOURCES = \
bench/ccoins_caching.cpp \
bench/chacha20.cpp \
bench/checkblock.cpp \
+ bench/checkblockindex.cpp \
bench/checkqueue.cpp \
bench/crypto_hash.cpp \
bench/data.cpp \
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index fbdef0b29e9ab..457b97848ae5b 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -319,6 +319,7 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/bech32.cpp \
test/fuzz/bip324.cpp \
test/fuzz/bitdeque.cpp \
+ test/fuzz/bitset.cpp \
test/fuzz/block.cpp \
test/fuzz/block_header.cpp \
test/fuzz/blockfilter.cpp \
@@ -352,6 +353,7 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/headerssync.cpp \
test/fuzz/hex.cpp \
test/fuzz/http_request.cpp \
+ test/fuzz/i2p.cpp \
test/fuzz/integer.cpp \
test/fuzz/key.cpp \
test/fuzz/key_io.cpp \
@@ -398,6 +400,7 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/script_format.cpp \
test/fuzz/script_interpreter.cpp \
test/fuzz/script_ops.cpp \
+ test/fuzz/script_parsing.cpp \
test/fuzz/script_sigcache.cpp \
test/fuzz/script_sign.cpp \
test/fuzz/scriptnum_ops.cpp \
@@ -407,7 +410,6 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/signet.cpp \
test/fuzz/socks5.cpp \
test/fuzz/span.cpp \
- test/fuzz/spanparsing.cpp \
test/fuzz/string.cpp \
test/fuzz/strprintf.cpp \
test/fuzz/system.cpp \
diff --git a/src/base58.cpp b/src/base58.cpp
index 4dd459cb098ee..8faabfb860692 100644
--- a/src/base58.cpp
+++ b/src/base58.cpp
@@ -14,6 +14,8 @@
#include
+using util::ContainsNoNUL;
+
/** All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
static const int8_t mapBase58[256] = {
diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp
index a13a693ad778c..733f8085ca757 100644
--- a/src/bench/bench.cpp
+++ b/src/bench/bench.cpp
@@ -18,6 +18,7 @@
#include
using namespace std::chrono_literals;
+using util::Join;
const std::function G_TEST_LOG_FUN{};
diff --git a/src/bench/bench_bitcoin.cpp b/src/bench/bench_bitcoin.cpp
index 8c421c3fec6e3..a1b880e40b0d5 100644
--- a/src/bench/bench_bitcoin.cpp
+++ b/src/bench/bench_bitcoin.cpp
@@ -16,6 +16,8 @@
#include
#include
+using util::SplitString;
+
static const char* DEFAULT_BENCH_FILTER = ".*";
static constexpr int64_t DEFAULT_MIN_TIME_MS{10};
/** Priority level default value, run "all" priority levels */
diff --git a/src/bench/checkblockindex.cpp b/src/bench/checkblockindex.cpp
new file mode 100644
index 0000000000000..e8a848dbd409b
--- /dev/null
+++ b/src/bench/checkblockindex.cpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2023-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
+
+static void CheckBlockIndex(benchmark::Bench& bench)
+{
+ auto testing_setup{MakeNoLogFileContext()};
+ // Mine some more blocks
+ testing_setup->mineBlocks(1000);
+ bench.run([&] {
+ testing_setup->m_node.chainman->CheckBlockIndex();
+ });
+}
+
+
+BENCHMARK(CheckBlockIndex, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/particl_add_tx.cpp b/src/bench/particl_add_tx.cpp
index 1d3b695808685..bf349d1b33597 100644
--- a/src/bench/particl_add_tx.cpp
+++ b/src/bench/particl_add_tx.cpp
@@ -139,7 +139,7 @@ static std::shared_ptr CreateTestWallet(wallet::WalletContext& wallet
std::vector warnings;
options.create_flags = WALLET_FLAG_BLANK_WALLET;
auto database = MakeWalletDatabase(wallet_name, options, status, error);
- auto wallet = CWallet::Create(wallet_context, wallet_name, std::move(database), options.create_flags, error, warnings);
+ auto wallet = CWallet::Create(wallet_context, wallet_name, std::move(database), options.create_flags, error, warnings, /*warn_no_active_acc*/ false);
return std::static_pointer_cast(wallet);
}
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp
index d0a731ccfb80e..067295855ee5c 100644
--- a/src/bitcoin-chainstate.cpp
+++ b/src/bitcoin-chainstate.cpp
@@ -158,7 +158,7 @@ int main(int argc, char* argv[])
{
LOCK(chainman.GetMutex());
std::cout
- << "\t" << "Reindexing: " << std::boolalpha << chainman.m_blockman.m_reindexing.load() << std::noboolalpha << std::endl
+ << "\t" << "Blockfiles Indexed: " << std::boolalpha << chainman.m_blockman.m_blockfiles_indexed.load() << std::noboolalpha << std::endl
<< "\t" << "Snapshot Active: " << std::boolalpha << chainman.IsSnapshotActive() << std::noboolalpha << std::endl
<< "\t" << "Active Height: " << chainman.ActiveHeight() << std::endl
<< "\t" << "Active IBD: " << std::boolalpha << chainman.IsInitialBlockDownload() << std::noboolalpha << std::endl;
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 5280af56936d2..c7589b2345746 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -42,6 +42,9 @@
#include
#include
+using util::Join;
+using util::ToString;
+
// The server returns time values from a mockable system clock, but it is not
// trivial to get the mocked time from the server, nor is it needed for now, so
// just use a plain system_clock.
@@ -743,8 +746,41 @@ static UniValue CallRPC(BaseRequestHandler* rh, const std::string& strMethod, co
// 2. port in -rpcconnect (ie following : in ipv4 or ]: in ipv6)
// 3. default port for chain
uint16_t port{BaseParams().RPCPort()};
- SplitHostPort(gArgs.GetArg("-rpcconnect", DEFAULT_RPCCONNECT), port, host);
- port = static_cast(gArgs.GetIntArg("-rpcport", port));
+ {
+ uint16_t rpcconnect_port{0};
+ const std::string rpcconnect_str = gArgs.GetArg("-rpcconnect", DEFAULT_RPCCONNECT);
+ if (!SplitHostPort(rpcconnect_str, rpcconnect_port, host)) {
+ // Uses argument provided as-is
+ // (rather than value parsed)
+ // to aid the user in troubleshooting
+ throw std::runtime_error(strprintf("Invalid port provided in -rpcconnect: %s", rpcconnect_str));
+ } else {
+ if (rpcconnect_port != 0) {
+ // Use the valid port provided in rpcconnect
+ port = rpcconnect_port;
+ } // else, no port was provided in rpcconnect (continue using default one)
+ }
+
+ if (std::optional rpcport_arg = gArgs.GetArg("-rpcport")) {
+ // -rpcport was specified
+ const uint16_t rpcport_int{ToIntegral(rpcport_arg.value()).value_or(0)};
+ if (rpcport_int == 0) {
+ // Uses argument provided as-is
+ // (rather than value parsed)
+ // to aid the user in troubleshooting
+ throw std::runtime_error(strprintf("Invalid port provided in -rpcport: %s", rpcport_arg.value()));
+ }
+
+ // Use the valid port provided
+ port = rpcport_int;
+
+ // If there was a valid port provided in rpcconnect,
+ // rpcconnect_port is non-zero.
+ if (rpcconnect_port != 0) {
+ tfm::format(std::cerr, "Warning: Port specified in both -rpcconnect and -rpcport. Using -rpcport %u\n", port);
+ }
+ }
+ }
// Obtain event base
raii_event_base base = obtain_event_base();
diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
index 36344211e9ce1..9ef94d6fa2e3b 100644
--- a/src/bitcoin-tx.cpp
+++ b/src/bitcoin-tx.cpp
@@ -35,6 +35,11 @@
// Particl
#include
+using util::SplitString;
+using util::ToString;
+using util::TrimString;
+using util::TrimStringView;
+
static bool fCreateBlank;
static std::map registers;
static const int CONTINUE_EXECUTION=-1;
@@ -215,8 +220,8 @@ static CAmount ExtractAndValidateValue(const std::string& strValue)
static void MutateTxVersion(CMutableTransaction& tx, const std::string& cmdVal)
{
- int64_t newVersion;
- if (!ParseInt64(cmdVal, &newVersion) || newVersion < 1 || newVersion > TX_MAX_STANDARD_VERSION_PARTICL) {
+ uint32_t newVersion;
+ if (!ParseUInt32(cmdVal, &newVersion) || newVersion < 1 || newVersion > TX_MAX_STANDARD_VERSION) {
throw std::runtime_error("Invalid TX version requested: '" + cmdVal + "'");
}
@@ -244,7 +249,7 @@ static void MutateTxVersion(CMutableTransaction& tx, const std::string& cmdVal)
}
}
- tx.nVersion = (int) newVersion;
+ tx.version = (int) newVersion;
}
static void MutateTxLocktime(CMutableTransaction& tx, const std::string& cmdVal)
@@ -1029,7 +1034,7 @@ static int CommandLineRawTx(int argc, char* argv[])
}
CMutableTransaction tx;
- tx.nVersion = CTransaction::CURRENT_PARTICL_VERSION;
+ tx.version = CTransaction::CURRENT_PARTICL_VERSION;
int startArg;
if (!fCreateBlank) {
diff --git a/src/bitcoin-wallet.cpp b/src/bitcoin-wallet.cpp
index 0e181c488130a..cecbb72d16e85 100644
--- a/src/bitcoin-wallet.cpp
+++ b/src/bitcoin-wallet.cpp
@@ -28,6 +28,8 @@
// Particl includes
#include
+using util::Join;
+
const std::function G_TRANSLATION_FUN = nullptr;
static void SetupWalletToolArgs(ArgsManager& argsman)
diff --git a/src/blockfilter.cpp b/src/blockfilter.cpp
index e045b88513e1e..5e6702ccc3ccc 100644
--- a/src/blockfilter.cpp
+++ b/src/blockfilter.cpp
@@ -16,6 +16,8 @@
#include
#include
+using util::Join;
+
static const std::map g_filter_types = {
{BlockFilterType::BASIC, "basic"},
};
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index cff17146274a9..82f0476a1095f 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -21,6 +21,7 @@
#include
#include
+using util::SplitString;
void ReadSigNetArgs(const ArgsManager& args, CChainParams::SigNetOptions& options)
{
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index a69152da35417..eca8cc1d47b87 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -13,6 +13,8 @@
#include
#include
+using util::Join;
+
/**
* Name of client reported in the 'version' message. Report the same name
* for both bitcoind and bitcoin-qt, to make it harder for attackers to
diff --git a/src/common/config.cpp b/src/common/config.cpp
index 1c85273f69c67..98223fc3e3a59 100644
--- a/src/common/config.cpp
+++ b/src/common/config.cpp
@@ -27,6 +27,9 @@
#include
#include
+using util::TrimString;
+using util::TrimStringView;
+
static bool GetConfigOptions(std::istream& stream, const std::string& filepath, std::string& error, std::vector>& options, std::list& sections)
{
std::string str, prefix;
diff --git a/src/common/messages.cpp b/src/common/messages.cpp
new file mode 100644
index 0000000000000..a84121b36294c
--- /dev/null
+++ b/src/common/messages.cpp
@@ -0,0 +1,149 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2022 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
+#include
+#include
+#include
+#include
+
+#include
+#include