diff --git a/doc/release-notes.md b/doc/release-notes.md
index ed7f3956d13..97280d5c0da 100644
--- a/doc/release-notes.md
+++ b/doc/release-notes.md
@@ -1,6 +1,6 @@
-Bitcoin Core version 28.x is now available from:
+Bitcoin Core version 28.3rc1 is now available from:
-
+
This release includes various bug fixes and performance
improvements, as well as updated translations.
@@ -37,6 +37,10 @@ unsupported systems.
Notable changes
===============
+### P2P
+
+- #33395 net: do not apply whitelist permissions to onion inbounds
+
### Test
- #32765 test: Fix list index out of range error in feature_bip68_sequence.py
@@ -54,6 +58,11 @@ Notable changes
- #32777 doc: fix Transifex 404s
- #33070 doc/zmq: fix unix socket path example
- #33133 rpc: fix getpeerinfo ping duration unit docs
+- #33236 doc: Remove wrong and redundant doxygen tag
+
+### Misc
+
+- #33340 Fix benchmark CSV output
Credits
=======
@@ -63,8 +72,11 @@ Thanks to everyone who directly contributed to this release:
- fanquake
- Hennadii Stepanov
- MarcoFalke
+- Martin Zumsande
- romanz
- Sjors Provoost
+- theStack
+- Vasil Dimov
- willcl-ark
- zaidmstrr
diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp
index deedc0a6d1c..e5a31f707ea 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -627,7 +627,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
Transform = sha256_x86_shani::Transform;
TransformD64 = TransformD64Wrapper;
TransformD64_2way = sha256d64_x86_shani::Transform_2way;
- ret = "x86_shani(1way,2way)";
+ ret = "x86_shani(1way;2way)";
have_sse4 = false; // Disable SSE4/AVX2;
have_avx2 = false;
}
@@ -641,14 +641,14 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
#endif
#if defined(ENABLE_SSE41)
TransformD64_4way = sha256d64_sse41::Transform_4way;
- ret += ",sse41(4way)";
+ ret += ";sse41(4way)";
#endif
}
#if defined(ENABLE_AVX2)
if (have_avx2 && have_avx && enabled_avx) {
TransformD64_8way = sha256d64_avx2::Transform_8way;
- ret += ",avx2(8way)";
+ ret += ";avx2(8way)";
}
#endif
#endif // defined(HAVE_GETCPUID)
@@ -682,7 +682,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
Transform = sha256_arm_shani::Transform;
TransformD64 = TransformD64Wrapper;
TransformD64_2way = sha256d64_arm_shani::Transform_2way;
- ret = "arm_shani(1way,2way)";
+ ret = "arm_shani(1way;2way)";
}
#endif
#endif // DISABLE_OPTIMIZED_SHA256
diff --git a/src/net.cpp b/src/net.cpp
index 05b98d1029b..ba29171ddd4 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -557,9 +557,9 @@ void CNode::CloseSocketDisconnect()
m_i2p_sam_session.reset();
}
-void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector& ranges) const {
+void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, std::optional addr, const std::vector& ranges) const {
for (const auto& subnet : ranges) {
- if (subnet.m_subnet.Match(addr)) {
+ if (addr.has_value() && subnet.m_subnet.Match(addr.value())) {
NetPermissions::AddFlag(flags, subnet.m_flags);
}
}
@@ -1731,7 +1731,11 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr&& sock,
{
int nInbound = 0;
- AddWhitelistPermissionFlags(permission_flags, addr, vWhitelistedRangeIncoming);
+ const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
+
+ // Tor inbound connections do not reveal the peer's actual network address.
+ // Therefore do not apply address-based whitelist permissions to them.
+ AddWhitelistPermissionFlags(permission_flags, inbound_onion ? std::optional{} : addr, vWhitelistedRangeIncoming);
{
LOCK(m_nodes_mutex);
@@ -1786,7 +1790,6 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr&& sock,
NodeId id = GetNewNodeId();
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
- const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
// The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
// detected, so use it whenever we signal NODE_P2P_V2.
ServiceFlags local_services = GetLocalServices();
diff --git a/src/net.h b/src/net.h
index b04b73e696f..3aa816d4396 100644
--- a/src/net.h
+++ b/src/net.h
@@ -1345,7 +1345,7 @@ private:
bool AttemptToEvictConnection();
CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
- void AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector& ranges) const;
+ void AddWhitelistPermissionFlags(NetPermissionFlags& flags, std::optional addr, const std::vector& ranges) const;
void DeleteNode(CNode* pnode);
diff --git a/src/policy/feerate.h b/src/policy/feerate.h
index d742a43acc7..23491c0320b 100644
--- a/src/policy/feerate.h
+++ b/src/policy/feerate.h
@@ -45,8 +45,6 @@ public:
/**
* Construct a fee rate from a fee in satoshis and a vsize in vB.
*
- * param@[in] nFeePaid The fee paid by a transaction, in satoshis
- * param@[in] num_bytes The vsize of a transaction, in vbytes
*/
CFeeRate(const CAmount& nFeePaid, uint32_t num_bytes);
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index b6fee37c956..b38029b6421 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -590,15 +590,15 @@ util::Result SelectCoinsSRD(const std::vector& utx
/** Find a subset of the OutputGroups that is at least as large as, but as close as possible to, the
* target amount; solve subset sum.
- * param@[in] groups OutputGroups to choose from, sorted by value in descending order.
- * param@[in] nTotalLower Total (effective) value of the UTXOs in groups.
- * param@[in] nTargetValue Subset sum target, not including change.
- * param@[out] vfBest Boolean vector representing the subset chosen that is closest to
+ * @param[in] groups OutputGroups to choose from, sorted by value in descending order.
+ * @param[in] nTotalLower Total (effective) value of the UTXOs in groups.
+ * @param[in] nTargetValue Subset sum target, not including change.
+ * @param[out] vfBest Boolean vector representing the subset chosen that is closest to
* nTargetValue, with indices corresponding to groups. If the ith
* entry is true, that means the ith group in groups was selected.
- * param@[out] nBest Total amount of subset chosen that is closest to nTargetValue.
- * paramp[in] max_selection_weight The maximum allowed weight for a selection result to be valid.
- * param@[in] iterations Maximum number of tries.
+ * @param[out] nBest Total amount of subset chosen that is closest to nTargetValue.
+ * @param[in] max_selection_weight The maximum allowed weight for a selection result to be valid.
+ * @param[in] iterations Maximum number of tries.
*/
static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::vector& groups,
const CAmount& nTotalLower, const CAmount& nTargetValue,
diff --git a/src/wallet/spend.h b/src/wallet/spend.h
index 62a7b4e4c89..4bdc8484648 100644
--- a/src/wallet/spend.h
+++ b/src/wallet/spend.h
@@ -123,14 +123,14 @@ FilteredOutputGroups GroupOutputs(const CWallet& wallet,
* the solution (according to the waste metric) will be chosen. If a valid input cannot be found from any
* single OutputType, fallback to running `ChooseSelectionResult()` over all available coins.
*
- * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees
- * param@[in] nTargetValue The target value
- * param@[in] groups The grouped outputs mapped by coin eligibility filters
- * param@[in] coin_selection_params Parameters for the coin selection
- * param@[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType
+ * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs
+ * @param[in] nTargetValue The target value
+ * @param[in] groups The grouped outputs mapped by coin eligibility filters
+ * @param[in] coin_selection_params Parameters for the coin selection
+ * @param[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType
* returns If successful, a SelectionResult containing the input set
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")
- * or (2) an specific error message if there was something particularly wrong (e.g. a selection
+ * or (2) a specific error message if there was something particularly wrong (e.g. a selection
* result that surpassed the tx max weight size).
*/
util::Result AttemptSelection(interfaces::Chain& chain, const CAmount& nTargetValue, OutputGroupTypeMap& groups,
@@ -141,13 +141,13 @@ util::Result AttemptSelection(interfaces::Chain& chain, const C
* Multiple coin selection algorithms will be run and the input set that produces the least waste
* (according to the waste metric) will be chosen.
*
- * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees
- * param@[in] nTargetValue The target value
- * param@[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative).
- * param@[in] coin_selection_params Parameters for the coin selection
+ * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs
+ * @param[in] nTargetValue The target value
+ * @param[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative).
+ * @param[in] coin_selection_params Parameters for the coin selection
* returns If successful, a SelectionResult containing the input set
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")
- * or (2) an specific error message if there was something particularly wrong (e.g. a selection
+ * or (2) a specific error message if there was something particularly wrong (e.g. a selection
* result that surpassed the tx max weight size).
*/
util::Result ChooseSelectionResult(interfaces::Chain& chain, const CAmount& nTargetValue, Groups& groups, const CoinSelectionParams& coin_selection_params);
@@ -181,10 +181,10 @@ util::Result FetchSelectedInputs(const CWallet& wallet, const
/**
* Select a set of coins such that nTargetValue is met; never select unconfirmed coins if they are not ours
- * param@[in] wallet The wallet which provides data necessary to spend the selected coins
- * param@[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering
- * param@[in] nTargetValue The target value
- * param@[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends,
+ * @param[in] wallet The wallet which provides data necessary to spend the selected coins
+ * @param[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering
+ * @param[in] nTargetValue The target value
+ * @param[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends,
* and whether to subtract the fee from the outputs.
* returns If successful, a SelectionResult containing the selected coins
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")