Nachricht „Version“ kann nicht korrekt gesendet werden

Vor ein paar Tagen habe ich diesen Artikel über die Verwendung des Raw-Bitcoin-Protokolls gefunden und versuche jetzt, meine eigene Transaktion mit Python durchzuführen. Aber ich stecke schon beim Senden der versionNachricht fest.

Ich habe versucht, Codeschnipsel aus dem Artikel zu verwenden. Demnach sollte dieser Code unten funktionieren, aber Wireshark kann nichts erkennen und es kommt keine verackAntwort

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

Vielleicht funktioniert es nicht, weil der Artikel 2014 geschrieben wurde und jetzt total veraltet ist?

Antworten (2)

Der msgUtils.py-Code funktionierte aufgrund eines Fehlers nicht mit 64-Bit-Python. Ich habe es behoben, sodass Sie den aktualisierten Code ausprobieren können. (Ich bin der Autor des Artikels.)

Nun, wahrscheinlich ist da ein Fehler, hier ist eine funktionierende Version, die auf diesem Code basiert :

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