Transactions
為什麼要在比特幣核心中轉播交易?
這裡有一個函式,
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); } }
- 我不確定我是否正確理解了
CWallet
類的用法。通過閱讀評論和程式碼,我認為這個類管理比特幣核心節點本身的交易,它扮演著普通錢包的角色(除了它在節點上執行的事實)。它創建交易並管理 UTXO。這個對嗎?- 我試圖從上面的評論中找出重播背後的原因,但無法理解任何有用的東西。重播交易需要什麼?顧名思義,它正在廣播以前廣播的交易。那麼我們為什麼要這樣呢?廣播一次還不夠嗎?
- 即使標誌
fBroadcastTransactions
設置為true
,該函式也會等待,直到GetTime()
大於nNextResend
,並且此變數設置為至少 12 小時後GetTime()
。所以這意味著使用比特幣核心錢包的人應該至少等待 12 小時才能廣播交易?我很確定我錯了,但不知道在哪裡。謝謝你的幫助。
- 我不確定我是否正確理解了
CWallet
類的用法。通過閱讀評論和程式碼,我認為這個類管理比特幣核心節點本身的交易,它扮演著普通錢包的角色(除了它在節點上執行的事實)。它創建交易並管理 UTXO。這個對嗎?是的,
CWallet
是 Bitcoin Core 錢包實現的核心。它跟踪使用者的交易和地址,並建構和簽署交易。
- 我試圖從上面的評論中找出重播背後的原因,但無法理解任何有用的東西。重播交易需要什麼?顧名思義,它正在廣播以前廣播的交易。那麼我們為什麼要這樣呢?廣播一次還不夠嗎?
比特幣的 P2P 網路不能保證可靠的傳輸,尤其是對於未經確認的交易。也許你只連接了一個或幾個節點,也許他們在收到你的交易後立即下線。也許他們是輕客戶端,被破壞,甚至是惡意的,並且完全忽略了你的交易。
即使你的交易到達了網路的大部分節點,如果有比你的更高費用交易的大量交易,它也可能被從這些節點的記憶體池中驅逐出去。如果是這樣,網路可能只是忘記了您的交易。
特別是如果是收款,您有責任確認交易。在較小程度上,發送者也是如此。實現這一點的方法是將其廣播到網路,如果它似乎沒有被探勘,偶爾嘗試重新廣播它。
一直在努力將這一責任從錢包轉移到記憶體池。最重要的原因是隱私:轉播是您關心交易的一個非常明顯的信號,因為未參與交易的各方不會執行此轉播。如果對你的記憶體池中的所有交易(不僅僅是影響你自己錢包的交易)進行更普遍的重播,那麼它就不那麼明顯了。
- 即使標誌
fBroadcastTransactions
設置為true
,該函式也會等待,直到GetTime()
大於nNextResend
,並且此變數設置為至少 12 小時後GetTime()
。所以這意味著使用比特幣核心錢包的人應該至少等待 12 小時才能廣播交易?我很確定我錯了,但不知道在哪裡。這是完全正確的。轉播活動的安排有些隨機,活動間隔為 12 到 36 小時。