GetBlocks de la API P2P de Bitcoin siempre devuelve 500 elementos inv

Estoy tratando de construir un mini nodo completo para poder entender exactamente cómo funcionan. Me las arreglé para hacer que algunas partes de la API P2P funcionen, sin embargo, estoy atascado con cosas básicas como 'getblocks' y 'getheaders'

Por ejemplo, tengo los siguientes hashes de bloque que me interesan:

block_hash = "000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7"
block_stop = "000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5"

Command: getblocks
Request: 0b110907676574626c6f636b73000000450000002a0af9950100000001000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5

Mi pregunta es: ¿Por qué obtengo 500 elementos de inversión cuando el hash de parada está a solo 1 bloque del localizador de bloques? (Por cierto, me pasa lo mismo cuando uso getheaders en lugar de getblocks)

EDITAR

Ok, cambié el endian-ness de los datos que estoy enviando. También tuve que cambiar el localizador de bloques y detenerme para obtener una respuesta (por lo que el hash de parada está a una altura de bloque más baja que el localizador), lo que me hace sentir que estoy cometiendo más errores aquí.

Al hacer esto, todavía recibo 500 inv en el ejemplo anterior, sin embargo, si uso estos dos en su lugar:

block_stop = "0000000000000049a7ce260de7fcf63f34acf3fe1c5b2040ae77b9bdaf1abb38"
block_hash = "000000000000013d8a77f222805b1dca31d0fb48d60b29098c77609de5f93811

ACTUAL MESSAGE: 0b110907676574626c6f636b7300000045000000a83c12f901000000011138f9e59d60778c09290bd648fbd031ca1d5b8022f2778a3d0100000000000038bb1aafbdb977ae40205b1cfef3ac343ff6fce70d26cea74900000000000000

regresa correctamente desde la altura que necesito, sin embargo, devuelve todos los bloques hasta el último bloque en lugar del que busco. ¿Estoy malinterpretando el punto de esta API? Tenía la impresión de que devuelve los detalles del bloque, pero en su lugar solo devuelve los hashes de bloque que faltan. ¿Cómo averiguo entonces qué transacciones ocurrieron en ese bloque?

Respuestas (1)

Parece que tienes los hashes de bloque en el orden de bytes incorrecto. Los tiene en el orden de bytes de visualización, pero la red en realidad maneja hashes de bloque en el orden de bytes inverso, los ceros están al final.

Creo que los bloques que obtendrás en respuesta serán los primeros 500 bloques de la cadena de bloques también.


Entonces, lo que sucede es que un nodo ve su hash de inicio, no lo encuentra en su cadena de bloques, por lo que comienza con el bloque de génesis. Sigue avanzando por cada bloque y descubre que no encuentra el hash de parada. Esto se debe a que el hash de parada está en el orden de bytes incorrecto y porque comienza desde génesis y no desde su hash de inicio.

Entonces, la respuesta que obtiene es el máximo de 500 bloques a partir del bloque de génesis, el ancestro común más reciente entre su hash de inicio y su punta actual.


¿Estoy malinterpretando el punto de esta API? Tenía la impresión de que devuelve los detalles del bloque, pero en su lugar solo devuelve los hashes de bloque que faltan. ¿Cómo averiguo entonces qué transacciones ocurrieron en ese bloque?

getblocksobtiene los hashes del bloque. Para obtener el bloque real en sí, debe usarlo getdatacon los hash que ha recibido.