Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package bitcoin for openSUSE:Factory checked in at 2026-10-27 16:59:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/bitcoin (Old) and /work/SRC/openSUSE:Factory/.bitcoin.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bitcoin" Tue Oct 27 16:59:43 2026 rev:64 rq:1392927 version:32.1 Changes: -------- --- /work/SRC/openSUSE:Factory/bitcoin/bitcoin.changes 2026-10-26 10:05:58.137725577 +0100 +++ /work/SRC/openSUSE:Factory/.bitcoin.new.2252680/bitcoin.changes 2026-10-27 17:00:42.359989201 +0100 @@ -1,0 +2,13 @@ +Mon Oct 26 19:27:03 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 32.1: + * P2P: clamp -maxconnections values above 2000 with a warning + to reduce crash risk at very high peer counts. + * P2P: enforce the timeout interval for peers with + paused sending. + * Proxy: preserve network name case in errors and share the + network parsing between proxy options. + * Windows: use 64-bit file positioning syscalls for flat files. + * Update example bitcoin.conf and manual pages for v32.1. + +------------------------------------------------------------------- Old: ---- bitcoin-32.0.obscpio New: ---- bitcoin-32.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ bitcoin.spec ++++++ --- /var/tmp/diff_new_pack.0NpQLc/_old 2026-10-27 17:00:45.116104620 +0100 +++ /var/tmp/diff_new_pack.0NpQLc/_new 2026-10-27 17:00:45.118104703 +0100 @@ -24,7 +24,7 @@ %define consensus 0 %define is_base 1 Name: bitcoin -Version: 32.0 +Version: 32.1 Release: 0 Summary: P2P Digital Currency License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.0NpQLc/_old 2026-10-27 17:00:45.175107090 +0100 +++ /var/tmp/diff_new_pack.0NpQLc/_new 2026-10-27 17:00:45.179107258 +0100 @@ -6,7 +6,7 @@ <param name="changesgenerate">enable</param> <param name="exclude">.*</param> <param name="versionrewrite-pattern">v(.*)</param> - <param name="revision">refs/tags/v32.0</param> + <param name="revision">refs/tags/v32.1</param> </service> <service name="tar" mode="buildtime"/> <service name="recompress" mode="buildtime"> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.0NpQLc/_old 2026-10-27 17:00:45.206108388 +0100 +++ /var/tmp/diff_new_pack.0NpQLc/_new 2026-10-27 17:00:45.211108598 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/bitcoin/bitcoin.git</param> - <param name="changesrevision">465dde277447e2f11e01bea09d2a094d7fb6ef45</param></service></servicedata> + <param name="changesrevision">f0de87f040621468b956f01f526a43a010310501</param></service></servicedata> (No newline at EOF) ++++++ bitcoin-32.0.obscpio -> bitcoin-32.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/CMakeLists.txt new/bitcoin-32.1/CMakeLists.txt --- old/bitcoin-32.0/CMakeLists.txt 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/CMakeLists.txt 2026-10-26 18:57:47.000000000 +0100 @@ -28,7 +28,7 @@ #============================= set(CLIENT_NAME "Bitcoin Core") set(CLIENT_VERSION_MAJOR 32) -set(CLIENT_VERSION_MINOR 0) +set(CLIENT_VERSION_MINOR 1) set(CLIENT_VERSION_BUILD 0) set(CLIENT_VERSION_RC 0) set(CLIENT_VERSION_IS_RELEASE "true") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin-cli.1 new/bitcoin-32.1/doc/man/bitcoin-cli.1 --- old/bitcoin-32.0/doc/man/bitcoin-cli.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin-cli.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-CLI "1" "October 2026" "bitcoin-cli v32.0.0" "User Commands" +.TH BITCOIN-CLI "1" "October 2026" "bitcoin-cli v32.1.0" "User Commands" .SH NAME -bitcoin-cli \- manual page for bitcoin-cli v32.0.0 +bitcoin-cli \- manual page for bitcoin-cli v32.1.0 .SH SYNOPSIS .B bitcoin-cli [\fI\,options\/\fR] \fI\,<command> \/\fR[\fI\,params\/\fR] @@ -15,7 +15,7 @@ .B bitcoin-cli [\fI\,options\/\fR] \fI\,help <command>\/\fR .SH DESCRIPTION -Bitcoin Core RPC client version v32.0.0 +Bitcoin Core RPC client version v32.1.0 .PP The bitcoin\-cli utility provides a command line interface to interact with a Bitcoin Core RPC server. .PP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin-qt.1 new/bitcoin-32.1/doc/man/bitcoin-qt.1 --- old/bitcoin-32.0/doc/man/bitcoin-qt.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin-qt.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-QT "1" "October 2026" "bitcoin-qt v32.0.0" "User Commands" +.TH BITCOIN-QT "1" "October 2026" "bitcoin-qt v32.1.0" "User Commands" .SH NAME -bitcoin-qt \- manual page for bitcoin-qt v32.0.0 +bitcoin-qt \- manual page for bitcoin-qt v32.1.0 .SH SYNOPSIS .B bitcoin-qt [\fI\,options\/\fR] [\fI\,URI\/\fR] .SH DESCRIPTION -Bitcoin Core version v32.0.0 +Bitcoin Core version v32.1.0 .PP The bitcoin\-qt application provides a graphical interface for interacting with Bitcoin Core. .PP @@ -319,14 +319,14 @@ .HP \fB\-maxconnections=\fR<n> .IP -Maintain at most <n> automatic connections to peers (default: 200). 11 -slots of these are reserved for outgoing connections. See -\fB\-inboundrelaypercent\fR for more information about limits applied to -transaction relay inbound peers. This limit does not apply to -connections manually added via \fB\-addnode\fR or the addnode RPC, which -have a separate limit of 8. It does not apply to short\-lived -private broadcast connections either, which have a separate limit -of 64. +Maintain at most <n> automatic connections to peers (default: 200, +maximum: 2000). 11 slots of these are reserved for outgoing +connections. See \fB\-inboundrelaypercent\fR for more information about +limits applied to transaction relay inbound peers. This limit +does not apply to connections manually added via \fB\-addnode\fR or the +addnode RPC, which have a separate limit of 8. It does not apply +to short\-lived private broadcast connections either, which have a +separate limit of 64. .HP \fB\-maxreceivebuffer=\fR<n> .IP @@ -388,7 +388,7 @@ Connect through SOCKS5 proxy, set \fB\-noproxy\fR to disable. May be a local file path prefixed with 'unix:' if the proxy supports it. Could end in =network to set the proxy only for that network. The -network can be any of ipv4, ipv6, tor or cjdns. (default: +network can be any of ipv4, ipv6, onion, cjdns. (default: disabled) .HP \fB\-proxyrandomize\fR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin-tx.1 new/bitcoin-32.1/doc/man/bitcoin-tx.1 --- old/bitcoin-32.0/doc/man/bitcoin-tx.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin-tx.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-TX "1" "October 2026" "bitcoin-tx v32.0.0" "User Commands" +.TH BITCOIN-TX "1" "October 2026" "bitcoin-tx v32.1.0" "User Commands" .SH NAME -bitcoin-tx \- manual page for bitcoin-tx v32.0.0 +bitcoin-tx \- manual page for bitcoin-tx v32.1.0 .SH SYNOPSIS .B bitcoin-tx [\fI\,options\/\fR] \fI\,<hex-tx> \/\fR[\fI\,commands\/\fR] @@ -9,7 +9,7 @@ .B bitcoin-tx [\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] .SH DESCRIPTION -Bitcoin Core bitcoin\-tx utility version v32.0.0 +Bitcoin Core bitcoin\-tx utility version v32.1.0 .PP The bitcoin\-tx tool is used for creating and modifying bitcoin transactions. .PP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin-util.1 new/bitcoin-32.1/doc/man/bitcoin-util.1 --- old/bitcoin-32.0/doc/man/bitcoin-util.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin-util.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-UTIL "1" "October 2026" "bitcoin-util v32.0.0" "User Commands" +.TH BITCOIN-UTIL "1" "October 2026" "bitcoin-util v32.1.0" "User Commands" .SH NAME -bitcoin-util \- manual page for bitcoin-util v32.0.0 +bitcoin-util \- manual page for bitcoin-util v32.1.0 .SH SYNOPSIS .B bitcoin-util [\fI\,options\/\fR] [\fI\,command\/\fR] @@ -9,7 +9,7 @@ .B bitcoin-util [\fI\,options\/\fR] \fI\,grind <hex-block-header>\/\fR .SH DESCRIPTION -Bitcoin Core bitcoin\-util utility version v32.0.0 +Bitcoin Core bitcoin\-util utility version v32.1.0 .PP The bitcoin\-util tool provides bitcoin related functionality that does not rely on the ability to access a running node. Available [commands] are listed below. .SH OPTIONS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin-wallet.1 new/bitcoin-32.1/doc/man/bitcoin-wallet.1 --- old/bitcoin-32.0/doc/man/bitcoin-wallet.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin-wallet.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN-WALLET "1" "October 2026" "bitcoin-wallet v32.0.0" "User Commands" +.TH BITCOIN-WALLET "1" "October 2026" "bitcoin-wallet v32.1.0" "User Commands" .SH NAME -bitcoin-wallet \- manual page for bitcoin-wallet v32.0.0 +bitcoin-wallet \- manual page for bitcoin-wallet v32.1.0 .SH SYNOPSIS .B bitcoin-wallet [\fI\,options\/\fR] \fI\,<command>\/\fR .SH DESCRIPTION -Bitcoin Core bitcoin\-wallet utility version v32.0.0 +Bitcoin Core bitcoin\-wallet utility version v32.1.0 .PP bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files. .PP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoin.1 new/bitcoin-32.1/doc/man/bitcoin.1 --- old/bitcoin-32.0/doc/man/bitcoin.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoin.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIN "1" "October 2026" "bitcoin v32.0.0" "User Commands" +.TH BITCOIN "1" "October 2026" "bitcoin v32.1.0" "User Commands" .SH NAME -bitcoin \- manual page for bitcoin v32.0.0 +bitcoin \- manual page for bitcoin v32.1.0 .SH SYNOPSIS .B bitcoin [\fI\,OPTIONS\/\fR] \fI\,COMMAND\/\fR... diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/man/bitcoind.1 new/bitcoin-32.1/doc/man/bitcoind.1 --- old/bitcoin-32.0/doc/man/bitcoind.1 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/man/bitcoind.1 2026-10-26 18:57:47.000000000 +0100 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH BITCOIND "1" "October 2026" "bitcoind v32.0.0" "User Commands" +.TH BITCOIND "1" "October 2026" "bitcoind v32.1.0" "User Commands" .SH NAME -bitcoind \- manual page for bitcoind v32.0.0 +bitcoind \- manual page for bitcoind v32.1.0 .SH SYNOPSIS .B bitcoind [\fI\,options\/\fR] .SH DESCRIPTION -Bitcoin Core daemon version v32.0.0 bitcoind +Bitcoin Core daemon version v32.1.0 bitcoind .PP The Bitcoin Core daemon (bitcoind) is a headless program that connects to the Bitcoin network to validate and relay transactions and blocks, as well as relaying addresses. .PP @@ -319,14 +319,14 @@ .HP \fB\-maxconnections=\fR<n> .IP -Maintain at most <n> automatic connections to peers (default: 200). 11 -slots of these are reserved for outgoing connections. See -\fB\-inboundrelaypercent\fR for more information about limits applied to -transaction relay inbound peers. This limit does not apply to -connections manually added via \fB\-addnode\fR or the addnode RPC, which -have a separate limit of 8. It does not apply to short\-lived -private broadcast connections either, which have a separate limit -of 64. +Maintain at most <n> automatic connections to peers (default: 200, +maximum: 2000). 11 slots of these are reserved for outgoing +connections. See \fB\-inboundrelaypercent\fR for more information about +limits applied to transaction relay inbound peers. This limit +does not apply to connections manually added via \fB\-addnode\fR or the +addnode RPC, which have a separate limit of 8. It does not apply +to short\-lived private broadcast connections either, which have a +separate limit of 64. .HP \fB\-maxreceivebuffer=\fR<n> .IP @@ -388,7 +388,7 @@ Connect through SOCKS5 proxy, set \fB\-noproxy\fR to disable. May be a local file path prefixed with 'unix:' if the proxy supports it. Could end in =network to set the proxy only for that network. The -network can be any of ipv4, ipv6, tor or cjdns. (default: +network can be any of ipv4, ipv6, onion, cjdns. (default: disabled) .HP \fB\-proxyrandomize\fR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/release-notes.md new/bitcoin-32.1/doc/release-notes.md --- old/bitcoin-32.0/doc/release-notes.md 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/release-notes.md 2026-10-26 18:57:47.000000000 +0100 @@ -1,9 +1,12 @@ -v32.0 Release Notes +v32.1 Release Notes =================== -Bitcoin Core version 32.0 is now available from: +Due to last-minute issues, 32.0, although tagged, was never +fully announced or released. - <https://bitcoincore.org/bin/bitcoin-core-32.0/> +Bitcoin Core version 32.1 is now available from: + + <https://bitcoincore.org/bin/bitcoin-core-32.1/> This release includes new features, various bug fixes and performance improvements, as well as updated translations. @@ -23,7 +26,7 @@ * Medium and high severity vulnerabilities fixed in 30.0. There are 3 of these. -* Low severity vulnerabilities fixed in 32.0. There are 0 of these. +* Low severity vulnerabilities fixed in 32.1. There are 0 of these. How to Upgrade ============== @@ -114,6 +117,8 @@ - Explicitly configured `-maxconnections` values remain unchanged, but the new inbound transaction-relay limit still applies. To retain the previous connection limits, use `-maxconnections=125 -inboundrelaypercent=100`. +`-maxconnections` now clamps values above 2,000 with a warning to reduce + crash risk at very high peer counts. (#35919) Mempool ------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/doc/tor.md new/bitcoin-32.1/doc/tor.md --- old/bitcoin-32.0/doc/tor.md 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/doc/tor.md 2026-10-26 18:57:47.000000000 +0100 @@ -11,6 +11,11 @@ - Tor removed v2 support beginning with version 0.4.6. +- Bitcoin Core 31.0 removed `tor` as a network name. Use `onion` instead, + as in `-onlynet=onion` or `-proxy=addr:port=onion` + ([#34031](https://github.com/bitcoin/bitcoin/pull/34031)). + The `-debug=tor` logging category is unaffected. + ## How to see information about your Tor configuration via Bitcoin Core There are several ways to see your local onion address in Bitcoin Core: @@ -39,7 +44,7 @@ as well. You need to use -noonion or -onion=0 to explicitly disable outbound access to onion services. - -proxy=ip[:port]=tor + -proxy=ip[:port]=onion or -onion=ip[:port] Set the proxy server for reaching .onion addresses. You do not need to @@ -51,7 +56,7 @@ -proxy=addr:port=ipv4 or -proxy=addr:port=ipv6 (last one if multiple options are given). It is not taken from - -proxy=addr:port=tor or + -proxy=addr:port=onion or -onion=addr:port. If no proxy for DNS requests is configured, then they will be done using the functions provided by the operating system, most likely resulting in diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/share/examples/bitcoin.conf new/bitcoin-32.1/share/examples/bitcoin.conf --- old/bitcoin-32.0/share/examples/bitcoin.conf 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/share/examples/bitcoin.conf 2026-10-26 18:57:47.000000000 +0100 @@ -259,14 +259,14 @@ # Automatically create Tor onion service (default: 1) #listenonion=1 -# Maintain at most <n> automatic connections to peers (default: 200). 11 -# slots of these are reserved for outgoing connections. See -# -inboundrelaypercent for more information about limits applied to -# transaction relay inbound peers. This limit does not apply to -# connections manually added via -addnode or the addnode RPC, which -# have a separate limit of 8. It does not apply to short-lived -# private broadcast connections either, which have a separate limit -# of 64. +# Maintain at most <n> automatic connections to peers (default: 200, +# maximum: 2000). 11 slots of these are reserved for outgoing +# connections. See -inboundrelaypercent for more information about +# limits applied to transaction relay inbound peers. This limit +# does not apply to connections manually added via -addnode or the +# addnode RPC, which have a separate limit of 8. It does not apply +# to short-lived private broadcast connections either, which have a +# separate limit of 64. #maxconnections=<n> # Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000) @@ -317,7 +317,7 @@ # Connect through SOCKS5 proxy, set -noproxy to disable. May be a local # file path prefixed with 'unix:' if the proxy supports it. Could # end in =network to set the proxy only for that network. The -# network can be any of ipv4, ipv6, tor or cjdns. (default: +# network can be any of ipv4, ipv6, onion, cjdns. (default: # disabled) #proxy=<ip>[:<port>]|unix:<path>[=<network>] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/chain.h new/bitcoin-32.1/src/chain.h --- old/bitcoin-32.0/src/chain.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/chain.h 2026-10-26 18:57:47.000000000 +0100 @@ -109,10 +109,10 @@ int nFile GUARDED_BY(::cs_main){0}; //! Byte offset within blk?????.dat where this block's data is stored - unsigned int nDataPos GUARDED_BY(::cs_main){0}; + uint64_t nDataPos GUARDED_BY(::cs_main){0}; //! Byte offset within rev?????.dat where this block's undo data is stored - unsigned int nUndoPos GUARDED_BY(::cs_main){0}; + uint64_t nUndoPos GUARDED_BY(::cs_main){0}; //! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block arith_uint256 nChainWork{}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/flatfile.cpp new/bitcoin-32.1/src/flatfile.cpp --- old/bitcoin-32.0/src/flatfile.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/flatfile.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -46,7 +46,7 @@ LogError("Unable to open file %s", fs::PathToString(path)); return nullptr; } - if (pos.nPos && fseek(file, pos.nPos, SEEK_SET)) { + if (pos.nPos && FileSeek64(file, pos.nPos, SEEK_SET)) { LogError("Unable to seek to position %u of %s", pos.nPos, fs::PathToString(path)); if (fclose(file) != 0) { LogError("Unable to close file %s", fs::PathToString(path)); @@ -60,11 +60,11 @@ { out_of_space = false; - unsigned int n_old_chunks = CeilDiv(pos.nPos, m_chunk_size); - unsigned int n_new_chunks = CeilDiv(pos.nPos + add_size, m_chunk_size); + uint64_t n_old_chunks = CeilDiv(pos.nPos, uint64_t{m_chunk_size}); + uint64_t n_new_chunks = CeilDiv(pos.nPos + add_size, uint64_t{m_chunk_size}); if (n_new_chunks > n_old_chunks) { - size_t old_size = pos.nPos; - size_t new_size = n_new_chunks * m_chunk_size; + uint64_t old_size = pos.nPos; + uint64_t new_size = n_new_chunks * m_chunk_size; size_t inc_size = new_size - old_size; if (CheckDiskSpace(m_dir, inc_size)) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/flatfile.h new/bitcoin-32.1/src/flatfile.h --- old/bitcoin-32.0/src/flatfile.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/flatfile.h 2026-10-26 18:57:47.000000000 +0100 @@ -14,13 +14,13 @@ struct FlatFilePos { int32_t nFile{-1}; - uint32_t nPos{0}; + uint64_t nPos{0}; SERIALIZE_METHODS(FlatFilePos, obj) { READWRITE(VARINT_MODE(obj.nFile, VarIntMode::NONNEGATIVE_SIGNED), VARINT(obj.nPos)); } FlatFilePos() = default; - FlatFilePos(int32_t nFileIn, uint32_t nPosIn) + FlatFilePos(int32_t nFileIn, uint64_t nPosIn) : nFile{nFileIn}, nPos{nPosIn} {} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/init.cpp new/bitcoin-32.1/src/init.cpp --- old/bitcoin-32.0/src/init.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/init.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -575,10 +575,10 @@ argsman.AddArg("-forcednsseed", strprintf("Always query for peer addresses via DNS lookup (default: %u)", DEFAULT_FORCEDNSSEED), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-listen", strprintf("Accept connections from outside (default: %u if no -proxy, -connect or -maxconnections=0)", DEFAULT_LISTEN), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-listenonion", strprintf("Automatically create Tor onion service (default: %d)", DEFAULT_LISTEN_ONION), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-maxconnections=<n>", strprintf("Maintain at most <n> automatic connections to peers (default: %u). %u slots of these are reserved for outgoing connections. See -inboundrelaypercent for more information about limits applied to transaction relay inbound peers. " + argsman.AddArg("-maxconnections=<n>", strprintf("Maintain at most <n> automatic connections to peers (default: %u, maximum: %u). %u slots of these are reserved for outgoing connections. See -inboundrelaypercent for more information about limits applied to transaction relay inbound peers. " "This limit does not apply to connections manually added via -addnode or the addnode RPC, which have a separate limit of %u. " "It does not apply to short-lived private broadcast connections either, which have a separate limit of %u.", - DEFAULT_MAX_PEER_CONNECTIONS, MAX_OUTBOUND_FULL_RELAY_CONNECTIONS + MAX_BLOCK_RELAY_ONLY_CONNECTIONS + MAX_FEELER_CONNECTIONS, MAX_ADDNODE_CONNECTIONS, MAX_PRIVATE_BROADCAST_CONNECTIONS), + DEFAULT_MAX_PEER_CONNECTIONS, MAX_PEER_CONNECTIONS, MAX_OUTBOUND_FULL_RELAY_CONNECTIONS + MAX_BLOCK_RELAY_ONLY_CONNECTIONS + MAX_FEELER_CONNECTIONS, MAX_ADDNODE_CONNECTIONS, MAX_PRIVATE_BROADCAST_CONNECTIONS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-inboundrelaypercent=<n>", strprintf("Permit a maximum percent of inbound connections to relay transactions, to limit memory utilization (0 to 100, default: %u).", DEFAULT_FULL_RELAY_INBOUND_PCT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-maxreceivebuffer=<n>", strprintf("Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)", DEFAULT_MAXRECEIVEBUFFER), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); @@ -613,7 +613,7 @@ "Connect through SOCKS5 proxy, set -noproxy to disable. " + proxy_doc_for_unix_socket + "Could end in =network to set the proxy only for that network. " + - "The network can be any of ipv4, ipv6, tor or cjdns. " + + "The network can be any of " + Join(std::vector{NET_IPV4, NET_IPV6, NET_ONION, NET_CJDNS}, ", ", GetNetworkName) + ". " + "(default: disabled)", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION); @@ -1060,10 +1060,16 @@ // Number of bound interfaces (we have at least one) int num_p2p_bind = std::max(num_user_p2p_bind, size_t(1)); // Maximum number of connections with other nodes, this accounts for all types of outbounds and inbounds except for manual - int user_p2p_max_connections = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS); + int user_p2p_max_connections = args.GetArg<int>("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS); if (user_p2p_max_connections < 0) { return InitError(Untranslated("-maxconnections must be greater or equal than zero")); } + + if (user_p2p_max_connections > MAX_PEER_CONNECTIONS) { + InitWarning(strprintf(_("Reducing -maxconnections from %d to %d."), user_p2p_max_connections, MAX_PEER_CONNECTIONS)); + user_p2p_max_connections = MAX_PEER_CONNECTIONS; + } + const size_t max_private{args.GetBoolArg("-privatebroadcast", DEFAULT_PRIVATE_BROADCAST) ? MAX_PRIVATE_BROADCAST_CONNECTIONS : 0}; @@ -1761,7 +1767,7 @@ if (eq_pos + 1 == param_value.length()) { return InitError(strprintf(_("Invalid -proxy address or hostname, ends with '=': '%s'"), param_value)); } - net_str = ToLower(param_value.substr(eq_pos + 1)); // e.g. 127.0.0.1:9050=ipv4 -> ipv4 + net_str = param_value.substr(eq_pos + 1); // e.g. 127.0.0.1:9050=ipv4 -> ipv4 } Proxy proxy; @@ -1782,16 +1788,18 @@ if (net_str.empty()) { // For all networks. ipv4_proxy = ipv6_proxy = name_proxy = cjdns_proxy = onion_proxy = proxy; - } else if (net_str == "ipv4") { - ipv4_proxy = name_proxy = proxy; - } else if (net_str == "ipv6") { - ipv6_proxy = name_proxy = proxy; - } else if (net_str == "onion") { - onion_proxy = proxy; - } else if (net_str == "cjdns") { - cjdns_proxy = proxy; } else { - return InitError(strprintf(_("Unrecognized network in -proxy='%s': '%s'"), param_value, net_str)); + switch (ParseNetwork(net_str)) { + case NET_IPV4: ipv4_proxy = name_proxy = proxy; break; + case NET_IPV6: ipv6_proxy = name_proxy = proxy; break; + case NET_ONION: onion_proxy = proxy; break; + case NET_CJDNS: cjdns_proxy = proxy; break; + case NET_UNROUTABLE: + case NET_I2P: + case NET_INTERNAL: + case NET_MAX: + return InitError(strprintf(_("Unrecognized network in -proxy='%s': '%s'"), param_value, net_str)); + } // no default case, so the compiler can warn about missing cases } } if (ipv4_proxy.IsValid()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/kernel/chain.h new/bitcoin-32.1/src/kernel/chain.h --- old/bitcoin-32.0/src/kernel/chain.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/kernel/chain.h 2026-10-26 18:57:47.000000000 +0100 @@ -7,6 +7,7 @@ #include <attributes.h> +#include <cstdint> #include <iostream> class CBlock; @@ -21,7 +22,7 @@ const uint256* prev_hash = nullptr; int height = -1; int file_number = -1; - unsigned data_pos = 0; + uint64_t data_pos = 0; const CBlock* data = nullptr; const CBlockUndo* undo_data = nullptr; // The maximum time in the chain up to and including this block. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/net.cpp new/bitcoin-32.1/src/net.cpp --- old/bitcoin-32.0/src/net.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/net.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -1675,7 +1675,11 @@ } } - node.fPauseSend = node.m_send_memusage + node.m_transport->GetSendMemoryUsage() > nSendBufferMaxSize; + const bool pause_send{node.m_send_memusage + node.m_transport->GetSendMemoryUsage() > nSendBufferMaxSize}; + if (pause_send && !node.fPauseSend) { + node.m_pause_send_since = NodeClock::now(); + } + node.fPauseSend = pause_send; if (it == node.vSendMsg.end()) { assert(node.m_send_memusage == 0); @@ -2079,6 +2083,17 @@ return true; } + if (node.fPauseSend) { + const auto last_pause{node.m_pause_send_since.load()}; + if (now > last_pause + TIMEOUT_INTERVAL) { + LogDebug(BCLog::NET, + "send buffer full for %is, %s", Ticks<std::chrono::seconds>(now - last_pause), + node.DisconnectMsg() + ); + return true; + } + } + if (!node.fSuccessfullyConnected) { if (node.m_transport->GetInfo().transport_type == TransportProtocolType::DETECTING) { LogDebug(BCLog::NET, "V2 handshake timeout, %s", node.DisconnectMsg()); @@ -4203,7 +4218,10 @@ // Update memory usage of send buffer. pnode->m_send_memusage += msg.GetMemoryUsage(); - if (pnode->m_send_memusage + pnode->m_transport->GetSendMemoryUsage() > nSendBufferMaxSize) pnode->fPauseSend = true; + if (pnode->m_send_memusage + pnode->m_transport->GetSendMemoryUsage() > nSendBufferMaxSize && !pnode->fPauseSend) { + pnode->m_pause_send_since = NodeClock::now(); + pnode->fPauseSend = true; + } // Move message to vSendMsg queue. pnode->vSendMsg.push_back(std::move(msg)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/net.h new/bitcoin-32.1/src/net.h --- old/bitcoin-32.0/src/net.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/net.h 2026-10-26 18:57:47.000000000 +0100 @@ -79,6 +79,8 @@ inline constexpr bool DEFAULT_LISTEN = true; /** The maximum number of peer connections to maintain. */ inline constexpr unsigned int DEFAULT_MAX_PEER_CONNECTIONS{200}; +/** Maximum value of -maxconnections */ +inline constexpr int MAX_PEER_CONNECTIONS{2'000}; /** Default percentage of inbound connection slots that tx-relaying peers can use */ inline constexpr int DEFAULT_FULL_RELAY_INBOUND_PCT{50}; /** The default for -maxuploadtarget. 0 = Unlimited */ @@ -749,6 +751,8 @@ const uint64_t nKeyedNetGroup; std::atomic_bool fPauseRecv{false}; std::atomic_bool fPauseSend{false}; + /** When was fPauseSend last set from false to true */ + std::atomic<NodeClock::time_point> m_pause_send_since{NodeClock::epoch}; /** Network key used to prevent fingerprinting our node across networks. * Influenced by the network and the bind address (+ bind port for inbounds) */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/node/blockstorage.h new/bitcoin-32.1/src/node/blockstorage.h --- old/bitcoin-32.0/src/node/blockstorage.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/node/blockstorage.h 2026-10-26 18:57:47.000000000 +0100 @@ -58,8 +58,8 @@ { public: uint32_t nBlocks{}; //!< number of blocks stored in file - uint32_t nSize{}; //!< number of used bytes of block file - uint32_t nUndoSize{}; //!< number of used bytes in the undo file + uint64_t nSize{}; //!< number of used bytes of block file + uint64_t nUndoSize{}; //!< number of used bytes in the undo file uint32_t nHeightFirst{}; //!< lowest height of block in file uint32_t nHeightLast{}; //!< highest height of block in file uint64_t nTimeFirst{}; //!< earliest time of block in file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/node/txorphanage.h new/bitcoin-32.1/src/node/txorphanage.h --- old/bitcoin-32.0/src/node/txorphanage.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/node/txorphanage.h 2026-10-26 18:57:47.000000000 +0100 @@ -20,7 +20,10 @@ inline constexpr int64_t DEFAULT_RESERVED_ORPHAN_WEIGHT_PER_PEER{404'000}; /** Default value for TxOrphanage::m_max_global_latency_score. Helps limit the maximum latency for operations like * EraseForBlock and LimitOrphans. */ -inline constexpr unsigned int DEFAULT_MAX_ORPHANAGE_LATENCY_SCORE{3000}; +inline constexpr unsigned int DEFAULT_MAX_ORPHANAGE_LATENCY_SCORE{3'000}; + +// Keep the connection caps below the default global latency limit to avoid a zero per-peer share. +static_assert(MAX_PEER_CONNECTIONS + MAX_ADDNODE_CONNECTIONS + MAX_PRIVATE_BROADCAST_CONNECTIONS < DEFAULT_MAX_ORPHANAGE_LATENCY_SCORE); /** A class to track orphan transactions (failed on TX_MISSING_INPUTS) * Since we cannot distinguish orphans from bad transactions with non-existent inputs, we heavily limit the amount of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/streams.cpp new/bitcoin-32.1/src/streams.cpp --- old/bitcoin-32.0/src/streams.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/streams.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -13,7 +13,7 @@ AutoFile::AutoFile(std::FILE* file, const Obfuscation& obfuscation) : m_file{file}, m_obfuscation{obfuscation} { if (!IsNull()) { - auto pos{std::ftell(m_file)}; + auto pos{FileTell64(m_file)}; if (pos >= 0) m_position = pos; } } @@ -35,7 +35,7 @@ if (IsNull()) { throw std::ios_base::failure("AutoFile::seek: file handle is nullptr"); } - if (std::fseek(m_file, offset, origin) != 0) { + if (FileSeek64(m_file, offset, origin) != 0) { throw std::ios_base::failure(feof() ? "AutoFile::seek: end of file" : "AutoFile::seek: fseek failed"); } if (origin == SEEK_SET) { @@ -43,7 +43,7 @@ } else if (origin == SEEK_CUR && m_position.has_value()) { *m_position += offset; } else { - int64_t r{std::ftell(m_file)}; + int64_t r{FileTell64(m_file)}; if (r < 0) { throw std::ios_base::failure("AutoFile::seek: ftell failed"); } @@ -131,7 +131,7 @@ return ::FileCommit(m_file); } -bool AutoFile::Truncate(unsigned size) +bool AutoFile::Truncate(uint64_t size) { m_was_written = true; return ::TruncateFile(m_file, size); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/streams.h new/bitcoin-32.1/src/streams.h --- old/bitcoin-32.0/src/streams.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/streams.h 2026-10-26 18:57:47.000000000 +0100 @@ -466,7 +466,7 @@ bool Commit(); /** Wrapper around TruncateFile(). */ - bool Truncate(unsigned size); + bool Truncate(uint64_t size); //! Write a mutable buffer more efficiently than write(), obfuscating the buffer in-place. void write_buffer(std::span<std::byte> src); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/util/fs_helpers.cpp new/bitcoin-32.1/src/util/fs_helpers.cpp --- old/bitcoin-32.0/src/util/fs_helpers.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/util/fs_helpers.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -147,10 +147,10 @@ #endif } -bool TruncateFile(FILE* file, unsigned int length) +bool TruncateFile(FILE* file, uint64_t length) { #if defined(WIN32) - return _chsize(_fileno(file), length) == 0; + return _chsize_s(_fileno(file), length) == 0; #else return ftruncate(fileno(file), length) == 0; #endif @@ -197,7 +197,7 @@ * this function tries to make a particular range of a file allocated (corresponding to disk space) * it is advisory, and the range specified in the arguments will never contain live data */ -void AllocateFileRange(FILE* file, unsigned int offset, unsigned int length) +void AllocateFileRange(FILE* file, uint64_t offset, unsigned int length) { #if defined(WIN32) // Windows-specific version @@ -232,7 +232,7 @@ // Fallback version // TODO: just write one byte per block static const char buf[65536] = {}; - if (fseek(file, offset, SEEK_SET)) { + if (FileSeek64(file, offset, SEEK_SET)) { return; } while (length > 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/util/fs_helpers.h new/bitcoin-32.1/src/util/fs_helpers.h --- old/bitcoin-32.0/src/util/fs_helpers.h 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/util/fs_helpers.h 2026-10-26 18:57:47.000000000 +0100 @@ -44,7 +44,37 @@ */ void DirectoryCommit(const fs::path& dirname); -bool TruncateFile(FILE* file, unsigned int length); +bool TruncateFile(FILE* file, uint64_t length); + +/** + * 64-bit-clean file positioning. + * + * The wrapper is necessary for Windows, because `long` is only 32 bits there, + * even in 64-bit builds (LLP64). + */ +inline int FileSeek64(FILE* file, int64_t offset, int origin) +{ +#if defined(WIN32) + return _fseeki64(file, offset, origin); +#else + return std::fseek(file, offset, origin); +#endif +} + +/** + * 64-bit-clean file positioning. + * + * The wrapper is necessary for Windows, because `long` is only 32 bits there, + * even in 64-bit builds (LLP64). + */ +inline int64_t FileTell64(FILE* file) +{ +#if defined(WIN32) + return _ftelli64(file); +#else + return std::ftell(file); +#endif +} /** * Try to raise the file descriptor limit to the requested number. @@ -57,7 +87,7 @@ */ int RaiseFileDescriptorLimit(int min_fd); -void AllocateFileRange(FILE* file, unsigned int offset, unsigned int length); +void AllocateFileRange(FILE* file, uint64_t offset, unsigned int length); /** * Rename src to dest. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/src/util/sock.cpp new/bitcoin-32.1/src/util/sock.cpp --- old/bitcoin-32.0/src/util/sock.cpp 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/src/util/sock.cpp 2026-10-26 18:57:47.000000000 +0100 @@ -219,12 +219,14 @@ const auto& s = sock->m_socket; if (events.requested & RecvEvent) { FD_SET(s, &recv); + FD_SET(s, &err); } if (events.requested & SendEvent) { FD_SET(s, &send); } - FD_SET(s, &err); - socket_max = std::max(socket_max, s); + if (events.requested & (RecvEvent | SendEvent)) { + socket_max = std::max(socket_max, s); + } } timeval tv = MillisToTimeval(timeout); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/test/functional/feature_init.py new/bitcoin-32.1/test/functional/feature_init.py --- old/bitcoin-32.0/test/functional/feature_init.py 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/test/functional/feature_init.py 2026-10-26 18:57:47.000000000 +0100 @@ -386,10 +386,21 @@ # No HTTP server, no RPC `stop` sigterm_node(node) + # From net.h + MAX_PEER_CONNECTIONS = 2000 + + self.log.info("Checking -maxconnections is capped before reserving file descriptors") + for requested, parsed in [(MAX_PEER_CONNECTIONS + 1, MAX_PEER_CONNECTIONS + 1), (2**64, 2**31 - 1)]: + warning = f"Reducing -maxconnections from {parsed} to {MAX_PEER_CONNECTIONS}." + self.restart_node(1, extra_args=[f"-maxconnections={requested}"]) + self.stop_node(1, expected_stderr=re.compile(re.escape(warning))) + if self.RLIM_INFINITY is not None: # Get the platform's file descriptor limit, if possible import resource soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) + # Stay within the -maxconnections cap so the descriptor limit is what reduces it + soft = min(soft, MAX_PEER_CONNECTIONS) # Lower the hard limit so RaiseFileDescriptorLimit() has a ceiling. # The hard limit can not be raised again without root privilges, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/test/functional/feature_proxy.py new/bitcoin-32.1/test/functional/feature_proxy.py --- old/bitcoin-32.0/test/functional/feature_proxy.py 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/test/functional/feature_proxy.py 2026-10-26 18:57:47.000000000 +0100 @@ -441,20 +441,22 @@ self.start_node(1, extra_args=["-onlynet=onion", "-listenonion=1"]) self.stop_node(1) - self.log.info("Test passing unknown network to -onlynet raises expected init error") - self.nodes[1].extra_args = ["-onlynet=abc"] - msg = "Error: Unknown network specified in -onlynet: 'abc'" - self.nodes[1].assert_start_raises_init_error(expected_msg=msg) + self.log.info("Test unknown and removed network names are rejected by -onlynet") + for network in ["abc", "tor"]: + self.nodes[1].extra_args = [f"-onlynet={network}"] + msg = f"Error: Unknown network specified in -onlynet: '{network}'" + self.nodes[1].assert_start_raises_init_error(expected_msg=msg) self.log.info("Test passing trailing '=' raises expected init error") self.nodes[1].extra_args = ["-proxy=127.0.0.1:9050="] msg = "Error: Invalid -proxy address or hostname, ends with '=': '127.0.0.1:9050='" self.nodes[1].assert_start_raises_init_error(expected_msg=msg) - self.log.info("Test passing unrecognized network raises expected init error") - self.nodes[1].extra_args = ["-proxy=127.0.0.1:9050=foo"] - msg = "Error: Unrecognized network in -proxy='127.0.0.1:9050=foo': 'foo'" - self.nodes[1].assert_start_raises_init_error(expected_msg=msg) + self.log.info("Test unknown, removed and non-SOCKS5 network names are rejected by -proxy") + for network in ["Foo", "tor", "i2p"]: + self.nodes[1].extra_args = [f"-proxy=127.0.0.1:9050={network}"] + msg = f"Error: Unrecognized network in -proxy='127.0.0.1:9050={network}': '{network}'" + self.nodes[1].assert_start_raises_init_error(expected_msg=msg) self.log.info("Test passing proxy only for IPv6") self.start_node(1, extra_args=["-proxy=127.6.6.6:6666=ipv6"]) @@ -470,8 +472,8 @@ assert_equal(nets["ipv6"]["proxy"], "127.6.6.6:6666") self.stop_node(1) - self.log.info("Test overriding the Onion proxy") - self.start_node(1, extra_args=["-proxy=127.1.1.1:1111", "-proxy=127.2.2.2:2222=onion"]) + self.log.info("Test overriding the Onion proxy with a mixed-case network suffix") + self.start_node(1, extra_args=["-proxy=127.1.1.1:1111", "-proxy=127.2.2.2:2222=OnIoN"]) nets = networks_dict(self.nodes[1].getnetworkinfo()) assert_equal(nets["ipv4"]["proxy"], "127.1.1.1:1111") assert_equal(nets["ipv6"]["proxy"], "127.1.1.1:1111") @@ -487,6 +489,15 @@ assert_equal(nets["cjdns"]["proxy"], "") self.stop_node(1) + self.log.info("Test that clearing the IPv4 proxy also clears the name proxy") + self.start_node(1, extra_args=[f"-proxy={self.conf1.addr[0]}:{self.conf1.addr[1]}", "-proxy=0=ipv4", "-dns=0"]) + with self.nodes[1].assert_debug_log( + expected_msgs=["trying v1 connection (manual) to example.invalid:8333"], + unexpected_msgs=["SOCKS5 connecting example.invalid"], + ): + self.nodes[1].addnode("example.invalid:8333", "onetry", v2transport=False) + self.stop_node(1) + self.log.info("Test passing too-long unix path to -proxy raises init error") self.nodes[1].extra_args = [f"-proxy=unix:{'x' * 1000}"] if self.have_unix_sockets: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/test/functional/p2p_ibd_txrelay.py new/bitcoin-32.1/test/functional/p2p_ibd_txrelay.py --- old/bitcoin-32.0/test/functional/p2p_ibd_txrelay.py 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/test/functional/p2p_ibd_txrelay.py 2026-10-26 18:57:47.000000000 +0100 @@ -13,19 +13,19 @@ from test_framework.blocktools import create_block from test_framework.messages import ( - CInv, - COIN, - CTransaction, - from_hex, - msg_inv, - msg_tx, - MSG_WTX, + CInv, + COIN, + CTransaction, + from_hex, + msg_inv, + msg_tx, + MSG_WTX, ) from test_framework.p2p import ( - NONPREF_PEER_TX_DELAY, - P2PDataStore, - P2PInterface, - p2p_lock + NONPREF_PEER_TX_DELAY, + P2PDataStore, + P2PInterface, + p2p_lock, ) from test_framework.test_framework import BitcoinTestFramework @@ -54,6 +54,9 @@ block.solve() self.nodes[0].submitblock(block.serialize().hex()) assert self.nodes[0].getblockchaininfo()['initialblockdownload'] + # BlockConnected is async. Sync while in IBD so a delayed event cannot + # add ibd_wtxid to the recently-confirmed filter. + self.nodes[0].syncwithvalidationinterfacequeue() ibd_wtxid = int(self.nodes[0].getblock(f"{block.hash_int:064x}", 2)["tx"][0]["hash"], 16) self.log.info("Check that nodes don't send getdatas for transactions while still in IBD") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bitcoin-32.0/test/functional/rpc_net.py new/bitcoin-32.1/test/functional/rpc_net.py --- old/bitcoin-32.0/test/functional/rpc_net.py 2026-10-21 15:21:46.000000000 +0200 +++ new/bitcoin-32.1/test/functional/rpc_net.py 2026-10-26 18:57:47.000000000 +0100 @@ -334,13 +334,13 @@ assert_equal(res[0]["port"], 8333) assert_equal(res[0]["services"], P2P_SERVICES) - # Test for the absence of onion, I2P and CJDNS addresses. - for network in ["onion", "i2p", "cjdns"]: + for network in ["onion", "OnIoN", "i2p", "cjdns"]: assert_equal(self.nodes[0].getnodeaddresses(0, network), []) # Test invalid arguments. assert_raises_rpc_error(-8, "Address count out of range", self.nodes[0].getnodeaddresses, -1) - assert_raises_rpc_error(-8, "Network not recognized: Foo", self.nodes[0].getnodeaddresses, 1, "Foo") + for network in ["Foo", "tor"]: + assert_raises_rpc_error(-8, f"Network not recognized: {network}", self.nodes[0].getnodeaddresses, 1, network) def test_addpeeraddress(self): self.log.info("Test addpeeraddress") ++++++ bitcoin.obsinfo ++++++ --- /var/tmp/diff_new_pack.0NpQLc/_old 2026-10-27 17:00:47.907221504 +0100 +++ /var/tmp/diff_new_pack.0NpQLc/_new 2026-10-27 17:00:47.911221672 +0100 @@ -1,5 +1,5 @@ name: bitcoin -version: 32.0 -mtime: 1792588906 -commit: 465dde277447e2f11e01bea09d2a094d7fb6ef45 +version: 32.1 +mtime: 1793037467 +commit: f0de87f040621468b956f01f526a43a010310501
