Transactions

為什麼要在比特幣核心中轉播交易?

  • August 20, 2022

這裡有一個函式,ResendWalletTransactions在比特幣核心中命名:

// Rebroadcast transactions from the wallet. We do this on a random timer
// to slightly obfuscate which transactions come from our wallet.
//
// Ideally, we'd only resend transactions that we think should have been
// mined in the most recent block. Any transaction that wasn't in the top
// blockweight of transactions in the mempool shouldn't have been mined,
// and so is probably just sitting in the mempool waiting to be confirmed.
// Rebroadcasting does nothing to speed up confirmation and only damages
// privacy.
void CWallet::ResendWalletTransactions()
{
   // During reindex, importing and IBD, old wallet transactions become
   // unconfirmed. Don't resend them as that would spam other nodes.
   if (!chain().isReadyToBroadcast()) return;

   // Do this infrequently and randomly to avoid giving away
   // that these are our transactions.
   if (GetTime() < nNextResend || !fBroadcastTransactions) return;
   bool fFirst = (nNextResend == 0);
   // resend 12-36 hours from now, ~1 day on average.
   nNextResend = GetTime() + (12 * 60 * 60) + GetRand(24 * 60 * 60);
   if (fFirst) return;

   int submitted_tx_count = 0;

   { // cs_wallet scope
       LOCK(cs_wallet);

       // Try to add wallet transactions to memory pool
       for (auto wtx : GetSortedTxs()) {
           // Attempt to rebroadcast all txes more than 5 minutes older than
           // the last block. SubmitTxMemoryPoolAndRelay() will not rebroadcast
           // any confirmed or conflicting txs.
           if (wtx->nTimeReceived > m_best_block_time - 5 * 60) continue;
           std::string unused_err_string;
           if (SubmitTxMemoryPoolAndRelay(*wtx, unused_err_string, true)) ++submitted_tx_count;
       }
   } // cs_wallet

   if (submitted_tx_count > 0) {
       WalletLogPrintf("%s: resubmit %u unconfirmed transactions\n", __func__, submitted_tx_count);
   }
}
  1. 我不確定我是否正確理解了CWallet類的用法。通過閱讀評論和程式碼,我認為這個類管理比特幣核心節點本身的交易,它扮演著普通錢包的角色(除了它在節點上執行的事實)。它創建交易並管理 UTXO。這個對嗎?
  2. 我試圖從上面的評論中找出重播背後的原因,但無法理解任何有用的東西。重播交易需要什麼?顧名思義,它正在廣播以前廣播的交易。那麼我們為什麼要這樣呢?廣播一次還不夠嗎?
  3. 即使標誌fBroadcastTransactions設置為true,該函式也會等待,直到GetTime()大於nNextResend,並且此變數設置為至少 12 小時後GetTime()。所以這意味著使用比特幣核心錢包的人應該至少等待 12 小時才能廣播交易?我很確定我錯了,但不知道在哪裡。

謝謝你的幫助。

  1. 我不確定我是否正確理解了CWallet類的用法。通過閱讀評論和程式碼,我認為這個類管理比特幣核心節點本身的交易,它扮演著普通錢包的角色(除了它在節點上執行的事實)。它創建交易並管理 UTXO。這個對嗎?

是的,CWallet是 Bitcoin Core 錢包實現的核心。它跟踪使用者的交易和地址,並建構和簽署交易。

  1. 我試圖從上面的評論中找出重播背後的原因,但無法理解任何有用的東西。重播交易需要什麼?顧名思義,它正在廣播以前廣播的交易。那麼我們為什麼要這樣呢?廣播一次還不夠嗎?

比特幣的 P2P 網路不能保證可靠的傳輸,尤其是對於未經確認的交易。也許你只連接了一個或幾個節點,也許他們在收到你的交易後立即下線。也許他們是輕客戶端,被破壞,甚至是惡意的,並且完全忽略了你的交易。

即使你的交易到達了網路的大部分節點,如果有比你的更高費用交易的大量交易,它也可能被從這些節點的記憶體池中驅逐出去。如果是這樣,網路可能只是忘記了您的交易。

特別是如果是收款,您有責任確認交易。在較小程度上,發送者也是如此。實現這一點的方法是將其廣播到網路,如果它似乎沒有被探勘,偶爾嘗試重新廣播它。

一直在努力將這一責任從錢包轉移到記憶體池。最重要的原因是隱私:轉播是關心交易的一個非常明顯的信號,因為未參與交易的各方不會執行此轉播。如果對你的記憶體池中的所有交易(不僅僅是影響你自己錢包的交易)進行更普遍的重播,那麼它就不那麼明顯了。

  1. 即使標誌fBroadcastTransactions設置為true,該函式也會等待,直到GetTime()大於nNextResend,並且此變數設置為至少 12 小時後GetTime()。所以這意味著使用比特幣核心錢包的人應該至少等待 12 小時才能廣播交易?我很確定我錯了,但不知道在哪裡。

這是完全正確的。轉播活動的安排有些隨機,活動間隔為 12 到 36 小時。

引用自:https://bitcoin.stackexchange.com/questions/114973