Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
dd6f869
docs: add omitted "Compatibility" heading to release notes template
kwvg Oct 24, 2025
cd0edeb
partial bitcoin#29023: add historical release notes for 26.0
kwvg Oct 24, 2025
bf8ce59
merge bitcoin#31048: Bump minimum supported macOS to 13.0
kwvg Oct 24, 2025
6ced0ce
merge bitcoin#31099: drop macOS LLVM install instructions
kwvg Oct 24, 2025
b664f8f
partial bitcoin#30454: Introduce CMake-based build system
kwvg Oct 24, 2025
a85be95
fix: bump `darwin_cmake_system_version` to match `OSX_MIN_VERSION`
kwvg Oct 27, 2025
4b7398c
merge bitcoin#31172: increase minimum supported Windows to 10.0
kwvg Oct 24, 2025
92d7f54
merge bitcoin#32400: Use modern Windows randomness functions
kwvg May 1, 2025
4ce5e80
partial bitcoin#32922: use notarized v28.2 binaries and fix macOS det…
kwvg Jul 8, 2025
e2ec55b
merge bitcoin#31608: Clarify min macOS and Xcode version
kwvg Jan 6, 2025
ec66215
merge bitcoin#13151: Serve blocks directly from disk when possible
kwvg Oct 28, 2025
6b8a52e
refactor: drop `message_start` from `ReadRawBlockFromDisk()`
kwvg Oct 28, 2025
14a2f55
partial bitcoin#27125: Decouple ArgsManager from blockstorage
kwvg Dec 19, 2025
d24bdc3
merge bitcoin#26415: faster getblock, NotifyBlock and rest_block by r…
kwvg Oct 28, 2025
23b0763
merge bitcoin#30321: don't copy data when sending binary response
kwvg Jun 22, 2024
dcf76ba
merge bitcoin#30263: Bump clang minimum supported version to 16
kwvg Oct 28, 2025
729d24d
merge bitcoin#33489: Drop support for EOL macOS 13
kwvg Sep 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,7 @@ case $host in
AC_MSG_ERROR([windres not found])
fi

CORE_CPPFLAGS="$CORE_CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -DWIN32_LEAN_AND_MEAN"
CORE_CPPFLAGS="$CORE_CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -D_WIN32_WINNT=0x0A00 -D_WIN32_IE=0x0A00 -DWIN32_LEAN_AND_MEAN"
dnl Prevent the definition of min/max macros.
dnl We always want to use the standard library.
CORE_CPPFLAGS="$CORE_CPPFLAGS -DNOMINMAX"
Expand All @@ -828,8 +828,10 @@ case $host in
archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib"
postdeps_CXX=

dnl We require Windows 7 (NT 6.1) or later
AX_CHECK_LINK_FLAG([-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1"], [], [$LDFLAG_WERROR])
dnl We support Windows 10+, however it's not possible to set these values accordingly,
dnl due to a bug in mingw-w64. See https://sourceforge.net/p/mingw-w64/bugs/968/.
dnl As a best effort, target Windows 8.
AX_CHECK_LINK_FLAG([-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,2], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,2"], [], [$LDFLAG_WERROR])

dnl Avoid the use of aligned vector instructions when building for Windows.
dnl See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54412.
Expand Down Expand Up @@ -1073,8 +1075,7 @@ if test "$use_hardening" != "no"; then

case $host in
*mingw*)
dnl stack-clash-protection doesn't compile with GCC 10 and earlier.
dnl In any case, it is a no-op for Windows.
dnl stack-clash-protection is a no-op for Windows.
dnl See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90458 for more details.
;;
*)
Expand Down
7 changes: 4 additions & 3 deletions contrib/devtools/symbol-check.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,8 @@
}

PE_ALLOWED_LIBRARIES = {
'ADVAPI32.dll', # security & registry
'ADVAPI32.dll', # legacy security & registry
'bcrypt.dll', # newer security and identity API
'IPHLPAPI.DLL', # IP helper API
'KERNEL32.dll', # win32 base APIs
'msvcrt.dll', # C standard library for MSVC
Expand Down Expand Up @@ -243,7 +244,7 @@ def check_MACHO_libraries(binary) -> bool:
return ok

def check_MACHO_min_os(binary) -> bool:
if binary.build_version.minos == [11,0,0]:
if binary.build_version.minos == [14,0,0]:
return True
return False

Expand All @@ -268,7 +269,7 @@ def check_PE_libraries(binary) -> bool:
def check_PE_subsystem_version(binary) -> bool:
major: int = binary.optional_header.major_subsystem_version
minor: int = binary.optional_header.minor_subsystem_version
if major == 6 and minor == 1:
if major == 6 and minor == 2:
return True
return False

Expand Down
6 changes: 3 additions & 3 deletions contrib/devtools/test-symbol-check.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def test_MACHO(self):
}
''')

self.assertEqual(call_symbol_check(cxx, source, executable, ['-Wl,-platform_version','-Wl,macos', '-Wl,11.0', '-Wl,11.4']),
self.assertEqual(call_symbol_check(cxx, source, executable, ['-Wl,-platform_version','-Wl,macos', '-Wl,13.0', '-Wl,11.4']),
(1, f'{executable}: failed SDK'))

def test_PE(self):
Expand All @@ -136,7 +136,7 @@ def test_PE(self):
}
''')

self.assertEqual(call_symbol_check(cxx, source, executable, ['-lpdh', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,1']),
self.assertEqual(call_symbol_check(cxx, source, executable, ['-lpdh', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,2']),
(1, 'pdh.dll is not in ALLOWED_LIBRARIES!\n' +
executable + ': failed DYNAMIC_LIBRARIES'))

Expand Down Expand Up @@ -167,7 +167,7 @@ def test_PE(self):
}
''')

self.assertEqual(call_symbol_check(cxx, source, executable, ['-lole32', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,1']),
self.assertEqual(call_symbol_check(cxx, source, executable, ['-lole32', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,2']),
(0, ''))


Expand Down
2 changes: 1 addition & 1 deletion depends/funcs.mk
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ ifeq ($($(1)_type),build)
$(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib"
else
ifneq ($(host),$(build))
$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system)
$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system_name)
$(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host)
$(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host)
endif
Expand Down
7 changes: 5 additions & 2 deletions depends/hosts/darwin.mk
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
OSX_MIN_VERSION=11.0
OSX_MIN_VERSION=14.0
OSX_SDK_VERSION=14.0
XCODE_VERSION=15.0
XCODE_BUILD_ID=15A240d
Expand Down Expand Up @@ -76,4 +76,7 @@ darwin_release_CXXFLAGS=$(darwin_release_CFLAGS)
darwin_debug_CFLAGS=-O1 -g
darwin_debug_CXXFLAGS=$(darwin_debug_CFLAGS)

darwin_cmake_system=Darwin
darwin_cmake_system_name=Darwin
# Darwin version, which corresponds to OSX_MIN_VERSION.
# See https://en.wikipedia.org/wiki/Darwin_(operating_system)
darwin_cmake_system_version=22.1
2 changes: 1 addition & 1 deletion depends/hosts/freebsd.mk
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ x86_64_freebsd_CC=$(default_host_CC) -m64
x86_64_freebsd_CXX=$(default_host_CXX) -m64
endif

freebsd_cmake_system=FreeBSD
freebsd_cmake_system_name=FreeBSD
5 changes: 4 additions & 1 deletion depends/hosts/linux.mk
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,7 @@ i686_linux_CXX=$(default_host_CXX) -m32
x86_64_linux_CC=$(default_host_CC) -m64
x86_64_linux_CXX=$(default_host_CXX) -m64
endif
linux_cmake_system=Linux

linux_cmake_system_name=Linux
# Refer to doc/dependencies.md for the minimum required kernel.
linux_cmake_system_version=3.17.0
4 changes: 3 additions & 1 deletion depends/hosts/mingw32.mk
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ mingw32_debug_CXXFLAGS=$(mingw32_debug_CFLAGS)

mingw32_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC

mingw32_cmake_system=Windows
mingw32_cmake_system_name=Windows
# Windows 10
mingw32_cmake_system_version=10.0
2 changes: 1 addition & 1 deletion depends/hosts/netbsd.mk
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ x86_64_netbsd_CC=$(default_host_CC) -m64
x86_64_netbsd_CXX=$(default_host_CXX) -m64
endif

netbsd_cmake_system=NetBSD
netbsd_cmake_system_name=NetBSD
2 changes: 1 addition & 1 deletion depends/hosts/openbsd.mk
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ x86_64_openbsd_CC=$(default_host_CC) -m64
x86_64_openbsd_CXX=$(default_host_CXX) -m64
endif

openbsd_cmake_system=OpenBSD
openbsd_cmake_system_name=OpenBSD
4 changes: 2 additions & 2 deletions depends/packages/libevent.mk
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ $(package)_patches += winver_fixup.patch
$(package)_build_subdir=build

# When building for Windows, we set _WIN32_WINNT to target the same Windows
# version as we do in configure. Due to quirks in libevents build system, this
# version as we do in releases. Due to quirks in libevents build system, this
# is also required to enable support for ipv6. See #19375.
define $(package)_set_vars
$(package)_config_opts=-DCMAKE_BUILD_TYPE=None -DEVENT__DISABLE_BENCHMARK=ON -DEVENT__DISABLE_OPENSSL=ON
$(package)_config_opts+=-DEVENT__DISABLE_SAMPLES=ON -DEVENT__DISABLE_REGRESS=ON
$(package)_config_opts+=-DEVENT__DISABLE_TESTS=ON -DEVENT__LIBRARY_TYPE=STATIC
$(package)_cflags += -fdebug-prefix-map=$($(package)_extract_dir)=/usr -fmacro-prefix-map=$($(package)_extract_dir)=/usr
$(package)_cppflags += -D_GNU_SOURCE
$(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0601
$(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0A00

ifeq ($(NO_HARDEN),)
$(package)_cppflags += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3
Expand Down
2 changes: 1 addition & 1 deletion depends/packages/miniupnpc.mk
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ $(package)_patches=dont_leak_info.patch respect_mingw_cflags.patch no_libtool.pa
# See discussion in https://github.com/bitcoin/bitcoin/pull/25964.
define $(package)_set_vars
$(package)_build_opts=CC="$($(package)_cc)"
$(package)_build_opts_mingw32=-f Makefile.mingw CFLAGS="$($(package)_cflags) -D_WIN32_WINNT=0x0601"
$(package)_build_opts_mingw32=-f Makefile.mingw CFLAGS="$($(package)_cflags) -D_WIN32_WINNT=0x0A00"
$(package)_build_env+=CFLAGS="$($(package)_cflags) $($(package)_cppflags)" AR="$($(package)_ar)"
endef

Expand Down
2 changes: 1 addition & 1 deletion depends/packages/zeromq.mk
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ define $(package)_set_vars
$(package)_config_opts += -DBUILD_SHARED=OFF -DBUILD_TESTS=OFF -DZMQ_BUILD_TESTS=OFF
$(package)_config_opts += -DENABLE_DRAFTS=OFF -DZMQ_BUILD_TESTS=OFF
$(package)_cxxflags += -fdebug-prefix-map=$($(package)_extract_dir)=/usr -fmacro-prefix-map=$($(package)_extract_dir)=/usr
$(package)_config_opts_mingw32 += -DZMQ_WIN32_WINNT=0x0601 -DZMQ_HAVE_IPC=OFF
$(package)_config_opts_mingw32 += -DZMQ_WIN32_WINNT=0x0A00 -DZMQ_HAVE_IPC=OFF
endef

define $(package)_preprocess_cmds
Expand Down
20 changes: 3 additions & 17 deletions doc/build-osx.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# macOS Build Guide

**Updated for MacOS [11.2](https://www.apple.com/macos/big-sur/)**
**Updated for MacOS [14](https://www.apple.com/macos/macos-sequoia/)**

This guide describes how to build dashd, command-line utilities, and GUI on macOS
This guide describes how to build dashd, command-line utilities, and GUI on macOS.

## Preparation

The commands in this guide should be executed in a Terminal application.
macOS comes with a built-in Terminal located in:

```
```bash
/Applications/Utilities/Terminal.app
```

Expand Down Expand Up @@ -50,20 +50,6 @@ See [dependencies.md](dependencies.md) for a complete overview.
brew install automake libtool boost gmp pkg-config libevent
```

For macOS 11 (Big Sur) and 12 (Monterey) you need to install a more recent version of llvm.

``` bash
brew install llvm
```

And append the following to the configure commands below:

``` bash
CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++
```

Try `llvm@17` if compilation fails with the default version of llvm.

### 4. Clone Dash repository

`git` should already be installed by default on your system.
Expand Down
8 changes: 8 additions & 0 deletions doc/release-notes-empty-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ installer (on Windows) or just copy over `/Applications/Dash-Qt` (on macOS) or
Downgrading to a version older than *version* may not be supported, and will
likely require a reindex.

# Compatibility

Dash Core is supported and tested on operating systems using the
Linux Kernel 3.17+, macOS 14+, and Windows 10+. Dash Core
should also work on most other Unix-like systems but is not as
frequently tested on them. It is not recommended to use Dash Core on
unsupported systems.

# Release Notes

Notable changes
Expand Down
2 changes: 1 addition & 1 deletion share/qt/Info.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="0.9">
<dict>
<key>LSMinimumSystemVersion</key>
<string>11</string>
<string>14</string>

<key>LSArchitecturePriority</key>
<array>
Expand Down
5 changes: 3 additions & 2 deletions src/httpserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <cstdio>
#include <deque>
#include <optional>
#include <span>
#include <string>

#include <sys/types.h>
Expand Down Expand Up @@ -601,7 +602,7 @@ void HTTPRequest::WriteHeader(const std::string& hdr, const std::string& value)
* Replies must be sent in the main loop in the main http thread,
* this cannot be done from worker threads.
*/
void HTTPRequest::WriteReply(int nStatus, const std::string& strReply)
void HTTPRequest::WriteReply(int nStatus, std::span<const std::byte> reply)
{
assert(!replySent && req);
if (ShutdownRequested()) {
Expand All @@ -610,7 +611,7 @@ void HTTPRequest::WriteReply(int nStatus, const std::string& strReply)
// Send event to main http thread to send reply message
struct evbuffer* evb = evhttp_request_get_output_buffer(req);
assert(evb);
evbuffer_add(evb, strReply.data(), strReply.size());
evbuffer_add(evb, reply.data(), reply.size());
auto req_copy = req;
HTTPEvent* ev = new HTTPEvent(eventBase, true, [req_copy, nStatus]{
evhttp_send_reply(req_copy, nStatus, nullptr, nullptr);
Expand Down
9 changes: 7 additions & 2 deletions src/httpserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <functional>
#include <optional>
#include <span>
#include <string>

static const int DEFAULT_HTTP_THREADS=4;
Expand Down Expand Up @@ -118,12 +119,16 @@ class HTTPRequest
/**
* Write HTTP reply.
* nStatus is the HTTP status code to send.
* strReply is the body of the reply. Keep it empty to send a standard message.
* reply is the body of the reply. Keep it empty to send a standard message.
*
* @note Can be called only once. As this will give the request back to the
* main thread, do not call any other HTTPRequest methods after calling this.
*/
void WriteReply(int nStatus, const std::string& strReply = "");
void WriteReply(int nStatus, std::string_view reply = "")
{
WriteReply(nStatus, std::as_bytes(std::span{reply}));
}
void WriteReply(int nStatus, std::span<const std::byte> reply);
};

/** Get the query parameter value from request uri for a specified key, or std::nullopt if the key
Expand Down
5 changes: 4 additions & 1 deletion src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1937,7 +1937,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}

#if ENABLE_ZMQ
g_zmq_notification_interface = CZMQNotificationInterface::Create();
g_zmq_notification_interface = CZMQNotificationInterface::Create(
[](std::vector<uint8_t>& block, const CBlockIndex& index) {
return node::ReadRawBlockFromDisk(block, WITH_LOCK(cs_main, return index.GetBlockPos()));
});

if (g_zmq_notification_interface) {
RegisterValidationInterface(g_zmq_notification_interface.get());
Expand Down
52 changes: 52 additions & 0 deletions src/node/blockstorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -784,6 +784,58 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus
return true;
}

bool ReadRawBlockFromDisk(std::vector<uint8_t>& block, const FlatFilePos& pos)
{
FlatFilePos hpos = pos;
// If nPos is less than 8 the pos is null and we don't have the block data
// Return early to prevent undefined behavior of unsigned int underflow
if (hpos.nPos < 8) {
return error("%s: OpenBlockFile failed for %s\n", __func__, pos.ToString());
}
hpos.nPos -= 8; // Seek back 8 bytes for meta header
CAutoFile filein(OpenBlockFile(hpos, true), SER_DISK, CLIENT_VERSION);
if (filein.IsNull()) {
return error("%s: OpenBlockFile failed for %s", __func__, pos.ToString());
}

try {
CMessageHeader::MessageStartChars blk_start;
unsigned int blk_size;

filein >> blk_start >> blk_size;

// TODO: Switch to GetParams() when made BlockManager member
if (memcmp(blk_start, Params().MessageStart(), CMessageHeader::MESSAGE_START_SIZE)) {
return error("%s: Block magic mismatch for %s: %s versus expected %s", __func__, pos.ToString(),
HexStr(blk_start),
HexStr(Params().MessageStart()));
}

if (blk_size > MAX_SIZE) {
return error("%s: Block data is larger than maximum deserialization size for %s: %s versus %s", __func__, pos.ToString(),
blk_size, MAX_SIZE);
}

block.resize(blk_size); // Zeroing of memory is intentional here
filein.read(MakeWritableByteSpan(block));
} catch(const std::exception& e) {
return error("%s: Read from block file failed: %s for %s", __func__, e.what(), pos.ToString());
}

return true;
}

bool ReadRawBlockFromDisk(std::vector<uint8_t>& block, const CBlockIndex* pindex)
{
FlatFilePos block_pos;
{
LOCK(cs_main);
block_pos = pindex->GetBlockPos();
}

return ReadRawBlockFromDisk(block, block_pos);
}

FlatFilePos BlockManager::SaveBlockToDisk(const CBlock& block, int nHeight, CChain& active_chain, const CChainParams& chainparams, const FlatFilePos* dbp)
{
unsigned int nBlockSize = ::GetSerializeSize(block, CLIENT_VERSION);
Expand Down
2 changes: 2 additions & 0 deletions src/node/blockstorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune);
/** Functions for disk access for blocks */
bool ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos, const Consensus::Params& consensusParams);
bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams);
bool ReadRawBlockFromDisk(std::vector<uint8_t>& block, const FlatFilePos& pos);
bool ReadRawBlockFromDisk(std::vector<uint8_t>& block, const CBlockIndex* pindex);

bool UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex* pindex);

Expand Down
Loading
Loading