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 version
mensajes.
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 verack
respuesta
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?
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