It seems a bit awkward to compress the PrivateBroadcast::AddResult result into a bool to then later decompress it into a TransactionError again. Have you considered returning a TransactionError from InitiateTxBroadcastPrivate instead? Seems more upgradable too.
I also think [[nodiscard]] would be good here.
<details>
<summary>git diff on e96c343137</summary>
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 8b6bdba75c..bdc4292166 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -540,7 +540,7 @@ public:
std::vector<CTransactionRef> AbortPrivateBroadcast(const uint256& id) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void SendPings() override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void InitiateTxBroadcastToAll(const Txid& txid, const Wtxid& wtxid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
- bool InitiateTxBroadcastPrivate(const CTransactionRef& tx) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
+ node::TransactionError InitiateTxBroadcastPrivate(const CTransactionRef& tx) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void SetBestBlock(int height, std::chrono::seconds time) override
{
m_best_height = height;
@@ -2264,20 +2264,20 @@ void PeerManagerImpl::InitiateTxBroadcastToAll(const Txid& txid, const Wtxid& wt
}
}
-bool PeerManagerImpl::InitiateTxBroadcastPrivate(const CTransactionRef& tx)
+node::TransactionError PeerManagerImpl::InitiateTxBroadcastPrivate(const CTransactionRef& tx)
{
const auto txstr{strprintf("txid=%s, wtxid=%s", tx->GetHash().ToString(), tx->GetWitnessHash().ToString())};
switch (m_tx_for_private_broadcast.Add(tx)) {
case PrivateBroadcast::AddResult::Added:
LogDebug(BCLog::PRIVBROADCAST, "Requesting %d new connections due to %s", NUM_PRIVATE_BROADCAST_PER_TX, txstr);
m_connman.m_private_broadcast.NumToOpenAdd(NUM_PRIVATE_BROADCAST_PER_TX);
- return true;
+ return node::TransactionError::OK;
case PrivateBroadcast::AddResult::AlreadyPresent:
LogDebug(BCLog::PRIVBROADCAST, "Ignoring unnecessary request to schedule an already scheduled transaction: %s", txstr);
- return true;
+ return node::TransactionError::OK;
case PrivateBroadcast::AddResult::QueueFull:
LogDebug(BCLog::PRIVBROADCAST, "Rejecting private broadcast, queue full (cap=%u): %s", PrivateBroadcast::MAX_TRANSACTIONS, txstr);
- return false;
+ return node::TransactionError::PRIVATE_BROADCAST_FULL;
} // no default case, so the compiler can warn about missing cases
assert(false);
}
diff --git a/src/net_processing.h b/src/net_processing.h
index 651e669ca2..b251e868c1 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -9,6 +9,7 @@
#include <consensus/amount.h>
#include <net.h>
#include <node/txorphanage.h>
+#include <node/types.h>
#include <private_broadcast.h>
#include <protocol.h>
#include <uint256.h>
@@ -146,10 +147,10 @@ public:
/**
* Initiate a private transaction broadcast. This is done
* asynchronously via short-lived connections to peers on privacy networks.
- * [@retval](/bitcoin-bitcoin/contributor/retval/) true The transaction is scheduled for private broadcast (or was already scheduled).
- * [@retval](/bitcoin-bitcoin/contributor/retval/) false Rejected because the private broadcast queue is full.
+ * [@retval](/bitcoin-bitcoin/contributor/retval/) node::TransactionError::OK The transaction is scheduled for private broadcast (or was already scheduled).
+ * [@retval](/bitcoin-bitcoin/contributor/retval/) node::TransactionError::PRIVATE_BROADCAST_FULL Rejected because the private broadcast queue is full.
*/
- virtual bool InitiateTxBroadcastPrivate(const CTransactionRef& tx) = 0;
+ [[nodiscard]] virtual node::TransactionError InitiateTxBroadcastPrivate(const CTransactionRef& tx) = 0;
/** Send ping message to all peers */
virtual void SendPings() = 0;
diff --git a/src/node/transaction.cpp b/src/node/transaction.cpp
index 0d462103d4..e7877c6985 100644
--- a/src/node/transaction.cpp
+++ b/src/node/transaction.cpp
@@ -133,10 +133,7 @@ TransactionError BroadcastTransaction(NodeContext& node,
node.peerman->InitiateTxBroadcastToAll(txid, wtxid);
break;
case TxBroadcast::NO_MEMPOOL_PRIVATE_BROADCAST:
- if (!node.peerman->InitiateTxBroadcastPrivate(tx)) {
- return TransactionError::PRIVATE_BROADCAST_FULL;
- }
- break;
+ return node.peerman->InitiateTxBroadcastPrivate(tx);
}
return TransactionError::OK;
</details>