No se puede enviar el mensaje de 'versión' correctamente

Hace unos días encontré este artículo sobre el uso del protocolo Bitcoin sin procesar y ahora estoy tratando de hacer mi propia transacción con Python. Pero ya estoy atascado en el envío de versionmensajes.

He intentado usar fragmentos de código del artículo. Según él, este código a continuación debería funcionar, pero Wireshark no puede reconocer nada y no hay verackrespuesta

import msgUtils
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("NODE_IP_ADDRESS", 8333)) # Shodan search 'port:8333'

sock.send(msgUtils.getVersionMsg())
sock.recv(1000) # receive version
sock.recv(1000) # receive verack

¿Quizás no funciona porque el artículo se escribió en 2014 y ahora está totalmente desactualizado?

Respuestas (2)

El código msgUtils.py no funcionó con Python de 64 bits debido a un error. Lo arreglé, así que puedes probar el código actualizado. (Soy el autor del artículo.)

Bueno, probablemente haya un error, aquí hay una versión funcional, que se basa en este código :

import time
import socket
import struct
import random

def makeMessage(cmd, payload):
    magic = "F9BEB4D9".decode("hex") # Main network
    command = cmd + (12 - len(cmd)) * "\00"
    length = struct.pack("I", len(payload))
    check = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
    return magic + command + length + check + payload


def versionMessage():
    version = struct.pack("i", 60002)
    services = struct.pack("Q", 0)
    timestamp = struct.pack("q", time.time())
    addr_recv = struct.pack("Q", 0)
    addr_recv += struct.pack(">16s", "127.0.0.1")
    addr_recv += struct.pack(">H", 8333)
    addr_from = struct.pack("Q", 0)
    addr_from += struct.pack(">16s", "127.0.0.1")
    addr_from += struct.pack(">H", 8333)
    nonce = struct.pack("Q", random.getrandbits(64))
    user_agent_bytes = struct.pack("B", 0)
    height = struct.pack("i", 0)
    payload = version + services + timestamp + addr_recv + addr_from + nonce +user_agent_bytes + height
    return payload

if __name__ == "__main__":
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(("93.170.187.9", 8333))
    sock.send(makeMessage("version", versionMessage()))
    sock.recv(1024) # version
    sock.recv(1024) # verack