Может кто-нибудь, пожалуйста, направить меня к разделу(ам) исходного кода, относящемуся к незапрошенной блокировке , как описано в Руководстве разработчика биткойнов ?
Я просматривал main.cpp
и искал термин MSG_BLOCK , служащий биглем для поиска правильного места в коде.
Но по мере того, как я читаю дальше, мне кажется, что только что добытый блок не добавляется к сообщению инвентаризации с помощью MSG_BLOCK , чтобы отправить его как «пакет» в качестве ответа на запрос (GetData Response) , НО есть отправляется как одно сообщение такой структуры:
Для меня до сих пор лучшим кандидатом для незапрашиваемой блокировки блоков , кажется, является часть main.cpp#L2393main.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 представляет удаленный узел в приведенном выше коде.)
Таким образом, страница, на которую вы смотрите, описывает поведение, которое вы могли бы реализовать и которое примут другие клиенты, но не описывает текущее основное поведение клиента.
Дэвид А. Хардинг
Ник Оделл
Алиакбар Ахмади
Ник Оделл
Алиакбар Ахмади
Ник Оделл