Bitcoind
交換“版本”數據包時,bitcoind 如何“害羞”?
這更像是一個技術/程式問題。
我理解不將版本數據包發送到新
accept
連接的邏輯,除非他們先發送一個,但是我連結到的程式碼並沒有完全做到這一點,或者是這樣嗎?此時我們已經在一個
if
塊中,該塊驗證接收到的命令是“版本”,因此對等方已經向我們發送了一個版本數據包,無論是誰發起了連接。我錯過了什麼嗎?
- 首先,選擇連接的對等方共享他們的版本。
- 每個對等點只能發送一個版本消息。
PushNodeVersion
用於發送版本消息。它被兩個函式呼叫1)
PeerLogicValidation::InitializeNode
當連接出站時。2)
ProcessMessage
收到消息時。它看起來像這樣:bool static ProcessMessage(...) { if (strCommand == NetMsgType::VERSION) { if (pfrom->fInbound) PushNodeVersion(pfrom, connman, GetAdjustedTime()); } }
如果它是
if (strCommand == NetMsgType::VERSION) { // If this if clause didn't exist: if (pfrom->fInbound) PushNodeVersion(pfrom, connman, GetAdjustedTime()); }
考慮以下情況:
客戶端 A 連接到客戶端 B
客戶端 A 將其版本發送給客戶端 B
3)客戶端B,作為答案,分享它的版本
現在,如果該
if
原因不存在,客戶端 A 將再次發送版本消息。評論
// Be shy and don't send version until we hear
實際上是無關緊要的。