Block

塊廣播 - 主動塊推送

  • June 19, 2015

有人可以指導我到比特幣開發者指南中描述的與主動塊推送相關的原始碼部分嗎?

我一直在main.cpp搜尋並蒐索術語MSG_BLOCK,充當在程式碼中找到正確位置的小獵犬。
但是當我進一步閱讀時,在我看來,好像沒有將新開采的塊附加到庫存消息中,使用MSG_BLOCK,以便將其作為“包”作為對請求的響應(GetData Response)但是是作為此結構的單個消息發送:

圖片是比特幣開發者指南中 en-ibd-block.svg 的裁剪版本

對我來說,到目前為止,主動塊推送的最佳候選似乎是main.cpp#L2393的一部分,main.cpp但我很困惑,因為我不知道是否還有更多可能相關的程式碼(比如main.cpp#L3830 ) 對於未經請求的塊/src/推送。

**所以:在第一步中,我正在尋找與廣播新發現的塊相關的程式碼。有人可以幫忙嗎?

block我們可以通過搜尋在程式碼中找到客戶端發送消息的所有實例PushMessage("block"。這是唯一的匹配:

void static ProcessGetData(CNode* pfrom)
{
[...]
   pfrom->PushMessage("block", block);

(資源。)

這意味著標準客戶端僅在特別要求時才發送阻止消息。該傳入getdata消息可能會通過向遠端節點發送消息來依次觸發inv。(雖然這不是必需的 - 您可以請求其他節點尚未公佈的塊。)這是發送庫存消息的程式碼:

//
// Message: inventory
//
vector<CInv> vInv;
vector<CInv> vInvWait;
{
   LOCK(pto->cs_inventory);
   vInv.reserve(pto->vInventoryToSend.size());
   vInvWait.reserve(pto->vInventoryToSend.size());
   BOOST_FOREACH(const CInv& inv, pto->vInventoryToSend)
   {
       // If the other node already knows the message, don't send
       if (pto->setInventoryKnown.count(inv))
           continue;

       // trickle out tx inv to protect privacy
       [...]

       // returns true if remote node hasn't seen it
       if (pto->setInventoryKnown.insert(inv).second)
       {
           // Add to the list of inventory messages to send
           vInv.push_back(inv);
           // If there's 1000 inventory messages queued up, send them
           // (Protocol limit is 50000 at a time.)
           if (vInv.size() >= 1000)
           {
               pto->PushMessage("inv", vInv);
               vInv.clear();
           }
       }
   }
   pto->vInventoryToSend = vInvWait;
}
// Send any that are left over.
if (!vInv.empty())
   pto->PushMessage("inv", vInv);

(資源。)

(pto 代表上述程式碼中的遠端節點。)

因此,您正在查看的頁面描述了您可以實現並且其他客戶端將接受的行為,但它沒有描述目前的核心客戶端行為。

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