Bitcoind

交換“版本”數據包時,bitcoind 如何“害羞”?

  • October 12, 2018

這更像是一個技術/程式問題。

我指的是這行程式碼:https ://github.com/bitcoin/bitcoin/blob/be992701b018f256db6d64786624be4cb60d8975/src/net_processing.cpp#L1699

我理解不將版本數據包發送到新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());
   }

考慮以下情況:

  1. 客戶端 A 連接到客戶端 B

  2. 客戶端 A 將其版本發送給客戶端 B

3)客戶端B,作為答案,分享它的版本

現在,如果該if原因不存在,客戶端 A 將再次發送版本消息。

評論// Be shy and don't send version until we hear實際上是無關緊要的。

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