Block Broadcasting - Block Push no solicitado

¿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.cppy 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:

la imagen es una versión recortada de en-ibd-block.svg de la Guía para desarrolladores de Bitcoin

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?

Respuestas (1)

Podemos encontrar todas las instancias en el código donde el cliente enviará un blockmensaje buscando PushMessage("block". Este es el único partido:

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

(Fuente.)

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 getdataal 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);

(Fuente.)

(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.

"describe un comportamiento que podría implementar y que otros clientes aceptarán, pero no describe el comportamiento principal actual del cliente". Escribí los documentos vinculados anteriormente y no me di cuenta de que no era obvio. Lo siento. Debería actualizarse en breve: github.com/bitcoin/bitcoin.org/commit/…
@DavidA.Harding Eso fue rápido. :)
@NickODell: ¡Gracias, Nick! Una cosa todavía no está del todo clara. Usted dice: " Esto significa que el cliente estándar solo envía un mensaje de bloqueo cuando se lo solicita específicamente. Ese mensaje getdata entrante probablemente se active a su vez al enviar al nodo remoto un mensaje inv ". - ¿Significa esto: (1) nodo1? & el nodo2 están ambos a la altura n en una cadena activa común (2) el nodo1 es más rápido y encuentra un bloque n+1 y lo empuja a un mensaje inv y envía este mensaje inv al nodo2 y recibe un mensaje getdata del nodo2 solicitando el bloque n +1 (3) el nodo1 envía un mensaje de un solo bloque con el bloque n+1 ?
@AliakbarAhmadi Sí.
@NickODell: Ok, pero ¿en qué caso se transmitirá un mensaje de un solo bloque no solicitado a los compañeros? ¿Nunca? ¿Se envía un bloque recién extraído de forma no solicitada solo dentro de un mensaje inv?
@AliakbarAhmadi Nunca. A menos que modifique su cliente.