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 version
Nachricht 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 verack
Antwort
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?
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