¿Puede alguien, por favor, dirigirme a la (s) sección(es) del código fuente relevantes para un envío de bloque no solicitado como se describe en la Guía para desarrolladores de Bitcoin ?
Estuve revisando main.cpp
y busqué el término MSG_BLOCK , sirviendo como un sabueso para encontrar el lugar correcto en el código.
Pero a medida que sigo leyendo, me parece que un bloque recién extraído no se adjunta a un mensaje de inventario, con MSG_BLOCK , para enviarlo como un "paquete" como respuesta a una solicitud (Respuesta GetData) PERO es enviado como un solo mensaje de esta estructura:
Para mí, hasta ahora, el mejor candidato para el envío de bloques no solicitados parece ser parte de main.cpp#L2393,main.cpp
pero estoy confundido porque no sé si hay más código posiblemente relevante (como main.cpp#L3830 ) para envío de bloque no solicitado/src/
.
Entonces: en un primer paso, estoy buscando un código que sea relevante para transmitir un bloque recién encontrado. ¿Puede ayudarme alguien, por favor?
Podemos encontrar todas las instancias en el código donde el cliente enviará un block
mensaje buscando PushMessage("block"
. Este es el único partido:
void static ProcessGetData(CNode* pfrom)
{
[...]
pfrom->PushMessage("block", block);
Esto significa que el cliente estándar solo envía un mensaje de bloqueo cuando se lo solicita específicamente. Ese mensaje entrante probablemente se active a su vez al enviar un mensaje getdata
al nodo remoto . inv
(Aunque eso no es necesario, puede solicitar un bloque que el otro nodo no haya anunciado). Este es el código que envía mensajes de inventario:
//
// 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 representa el nodo remoto en el código anterior).
Entonces, la página que está viendo describe un comportamiento que podría implementar y que otros clientes aceptarán, pero no describe el comportamiento principal actual del cliente.
David A. Harding
Nick ODell
Aliakbar Ahmadi
Nick ODell
Aliakbar Ahmadi
Nick ODell