#!/usr/bin/python import struct import socket import asyncore import binascii import time import sys import re import random import cStringIO import hashlib MY_VERSION = 31800 MY_SUBVERSION = ".4" settings = { "host": "86.91.195.94", "port": 8333, "debug": True } def sha256(s): return hashlib.new('sha256', s).digest() def deser_string(f): nit = struct.unpack("H", f.read(2))[0] def serialize(self): r = "" r += struct.pack("H", self.port) return r def __repr__(self): return "CAddress(nServices=%i ip=%s port=%i)" % (self.nServices, self.ip, self.port) class msg_version(object): command = "version" def __init__(self): self.nVersion = MY_VERSION self.nServices = 1 self.nTime = time.time() self.addrTo = CAddress() self.addrFrom = CAddress() self.nNonce = random.getrandbits(64) self.strSubVer = MY_SUBVERSION self.nStartingHeight = -1 def deserialize(self, f): self.nVersion = struct.unpack("= 106: self.addrFrom = CAddress() self.addrFrom.deserialize(f) self.nNonce = struct.unpack("= 209: self.nStartingHeight = struct.unpack(" 0) def handle_write(self): try: sent = self.send(self.sendbuf) except: self.handle_close() return self.sendbuf = self.sendbuf[sent:] def got_data(self): while True: if len(self.recvbuf) < 4: return if self.recvbuf[:4] != "\xf9\xbe\xb4\xd9": raise ValueError("got garbage %s" % repr(self.recvbuf)) if self.ver_recv < 209: if len(self.recvbuf) < 4 + 12 + 4: return command = self.recvbuf[4:4+12].split("\x00", 1)[0] msglen = struct.unpack("= 209: th = sha256(data) h = sha256(th) tmsg += h[:4] tmsg += data self.sendbuf += tmsg self.last_sent = time.time() def got_message(self, message): show_debug_msg("Recv %s" % repr(message)) if message.command == "version": if message.nVersion >= 209: self.send_message(msg_verack()) self.ver_send = min(MY_VERSION, message.nVersion) if message.nVersion < 209: self.ver_recv = self.ver_send elif message.command == "verack": self.ver_recv = self.ver_send self.send_message(msg_getaddr()) if __name__ == '__main__': settings['port'] = int(settings['port']) c = NodeConn(settings['host'], settings['port']) asyncore.loop()