The Broadcast
/ResendWalletTransactions
interface is strange:
- it’s the node saying to the wallet “Try to submit your unconfirmed transactions to the mempool again”
- it’s called in one place by the node, in
SendMessages()
here: https://github.com/bitcoin/bitcoin/blob/c033c4b5cef89a654e4d9d5c5f9bd823871b068b/src/net_processing.cpp#L3515.SendMessages()
is called on the message handling thread on a loop. - the actual scheduling of when the wallet sends messages is handled in the
ResendWalletTransactions()
function itself, using thenNextResend
andnLastResend
wallet globals (which could as easily be static variables inResendWalletTransactions()
).
Therefore the only use of Broadcast()
is to periodically prod the wallet. The wallet itself decides whether it’s time to resend transactions. This could be done by scheduling regular calls to ResendWalletTransactions()
, in the same way that we schedule regular wallet flushes here: https://github.com/bitcoin/bitcoin/blob/c033c4b5cef89a654e4d9d5c5f9bd823871b068b/src/wallet/init.cpp#L215.
A couple of minor implementation details:
- the call to
Broadcast()
inSendMessages()
is protected by an if statementif (!fReindex && !fImporting && !IsInitialBlockDownload()) {
. Those tests could be moved intoResendWalletTransactions()
(through theChain
interface). - The
Broadcast
notification passes in thenTimeBestReceived
time of the best block. That could be fetched byResendWalletTransactions()
through theChain
interface.