From 34d0a5a42597af636eac4075bf9bc8bfb62b6d17 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Wed, 10 Aug 2011 03:32:40 -0400 Subject: [PATCH] indentation and imports cleaned up --- nattraverso/ipdiscover.py | 2 - nattraverso/portmapper.py | 196 +++++++++++++++++++------------------- nattraverso/pynupnp/__init__.py | 32 +++--- nattraverso/pynupnp/soap.py | 162 ++++++++++++++++---------------- nattraverso/pynupnp/upnpxml.py | 138 ++++++++++++++-------------- nattraverso/utils.py | 70 +++++++------- p2pool/bitcoin/data.py | 3 +- p2pool/bitcoin/p2p.py | 32 +++--- p2pool/data.py | 5 +- p2pool/draw.py | 10 +- p2pool/main.py | 2 +- p2pool/skiplists.py | 2 +- p2pool/util/expiring_dict.py | 1 - 13 files changed, 324 insertions(+), 331 deletions(-) diff --git a/nattraverso/ipdiscover.py b/nattraverso/ipdiscover.py index 7baea11..5c12ef3 100644 --- a/nattraverso/ipdiscover.py +++ b/nattraverso/ipdiscover.py @@ -18,8 +18,6 @@ from twisted.internet import defer, reactor from twisted.internet.protocol import DatagramProtocol from twisted.internet.error import CannotListenError -from twisted.internet.interfaces import IReactorMulticast -from twisted.python import log from nattraverso.utils import is_rfc1918_ip, is_bogus_ip diff --git a/nattraverso/portmapper.py b/nattraverso/portmapper.py index 2cee267..d026b01 100644 --- a/nattraverso/portmapper.py +++ b/nattraverso/portmapper.py @@ -16,103 +16,103 @@ from twisted.internet.base import BasePort # Public API def get_port_mapper(proto="TCP"): - """ - Returns a L{NATMapper} instance, suited to map a port for - the given protocol. Defaults to TCP. - - For the moment, only upnp mapper is available. It accepts both UDP and TCP. - - @param proto: The protocol: 'TCP' or 'UDP' - @type proto: string - @return: A deferred called with a L{NATMapper} instance - @rtype: L{twisted.internet.defer.Deferred} - """ - import nattraverso.pynupnp - return nattraverso.pynupnp.get_port_mapper() - -class NATMapper: - """ - Define methods to map port objects (as returned by twisted's listenXX). - This allows NAT to be traversed from incoming packets. - - Currently the only implementation of this class is the UPnP Mapper, which - can map UDP and TCP ports, if an UPnP Device exists. - """ - def __init__(self): - raise NotImplementedError("Cannot instantiate the class") - - def map(self, port): - """ - Create a mapping for the given twisted's port object. - - The deferred will call back with a tuple (extaddr, extport): - - extaddr: The ip string of the external ip address of this host - - extport: the external port number used to map the given Port object - - When called multiple times with the same Port, - callback with the existing mapping. - - @param port: The port object to map - @type port: a L{twisted.internet.interfaces.IListeningPort} object - @return: A deferred called with the above defined tuple - @rtype: L{twisted.internet.defer.Deferred} - """ - raise NotImplementedError - - def info(self, port): - """ - Returns the existing mapping for the given port object. That means map() - has to be called before. - - @param port: The port object to retreive info from - @type port: a L{twisted.internet.interfaces.IListeningPort} object - @raise ValueError: When there is no such existing mapping - @return: a tuple (extaddress, extport). - @see: L{map() function} - """ - raise NotImplementedError + """ + Returns a L{NATMapper} instance, suited to map a port for + the given protocol. Defaults to TCP. + + For the moment, only upnp mapper is available. It accepts both UDP and TCP. + + @param proto: The protocol: 'TCP' or 'UDP' + @type proto: string + @return: A deferred called with a L{NATMapper} instance + @rtype: L{twisted.internet.defer.Deferred} + """ + import nattraverso.pynupnp + return nattraverso.pynupnp.get_port_mapper() - def unmap(self, port): - """ - Remove an existing mapping for the given twisted's port object. - - @param port: The port object to unmap - @type port: a L{twisted.internet.interfaces.IListeningPort} object - @return: A deferred called with None - @rtype: L{twisted.internet.defer.Deferred} - @raise ValueError: When there is no such existing mapping - """ - raise NotImplementedError - - def get_port_mappings(self): - """ - Returns a deferred that will be called with a dictionnary of the - existing mappings. - - The dictionnary structure is the following: - - Keys: tuple (protocol, external_port) - - protocol is "TCP" or "UDP". - - external_port is the external port number, as see on the - WAN side. - - Values:tuple (internal_ip, internal_port) - - internal_ip is the LAN ip address of the host. - - internal_port is the internal port number mapped - to external_port. - - @return: A deferred called with the above defined dictionnary - @rtype: L{twisted.internet.defer.Deferred} - """ - raise NotImplementedError - - def _check_valid_port(self, port): - """Various Port object validity checks. Raise a ValueError.""" - if not isinstance(port, BasePort): - raise ValueError("expected a Port, got %r"%(port)) - - if not port.connected: - raise ValueError("Port %r is not listening"%(port)) +class NATMapper: + """ + Define methods to map port objects (as returned by twisted's listenXX). + This allows NAT to be traversed from incoming packets. + + Currently the only implementation of this class is the UPnP Mapper, which + can map UDP and TCP ports, if an UPnP Device exists. + """ + def __init__(self): + raise NotImplementedError("Cannot instantiate the class") + + def map(self, port): + """ + Create a mapping for the given twisted's port object. + + The deferred will call back with a tuple (extaddr, extport): + - extaddr: The ip string of the external ip address of this host + - extport: the external port number used to map the given Port object + + When called multiple times with the same Port, + callback with the existing mapping. + + @param port: The port object to map + @type port: a L{twisted.internet.interfaces.IListeningPort} object + @return: A deferred called with the above defined tuple + @rtype: L{twisted.internet.defer.Deferred} + """ + raise NotImplementedError + + def info(self, port): + """ + Returns the existing mapping for the given port object. That means map() + has to be called before. + + @param port: The port object to retreive info from + @type port: a L{twisted.internet.interfaces.IListeningPort} object + @raise ValueError: When there is no such existing mapping + @return: a tuple (extaddress, extport). + @see: L{map() function} + """ + raise NotImplementedError + + def unmap(self, port): + """ + Remove an existing mapping for the given twisted's port object. + + @param port: The port object to unmap + @type port: a L{twisted.internet.interfaces.IListeningPort} object + @return: A deferred called with None + @rtype: L{twisted.internet.defer.Deferred} + @raise ValueError: When there is no such existing mapping + """ + raise NotImplementedError + + def get_port_mappings(self): + """ + Returns a deferred that will be called with a dictionnary of the + existing mappings. + + The dictionnary structure is the following: + - Keys: tuple (protocol, external_port) + - protocol is "TCP" or "UDP". + - external_port is the external port number, as see on the + WAN side. + - Values:tuple (internal_ip, internal_port) + - internal_ip is the LAN ip address of the host. + - internal_port is the internal port number mapped + to external_port. + + @return: A deferred called with the above defined dictionnary + @rtype: L{twisted.internet.defer.Deferred} + """ + raise NotImplementedError + + def _check_valid_port(self, port): + """Various Port object validity checks. Raise a ValueError.""" + if not isinstance(port, BasePort): + raise ValueError("expected a Port, got %r"%(port)) + + if not port.connected: + raise ValueError("Port %r is not listening"%(port)) + + loc_addr = port.getHost() + if loc_addr.port == 0: + raise ValueError("Port %r has port number of 0"%(port)) - loc_addr = port.getHost() - if loc_addr.port == 0: - raise ValueError("Port %r has port number of 0"%(port)) - diff --git a/nattraverso/pynupnp/__init__.py b/nattraverso/pynupnp/__init__.py index 2db28dd..7c90af8 100644 --- a/nattraverso/pynupnp/__init__.py +++ b/nattraverso/pynupnp/__init__.py @@ -13,21 +13,21 @@ __revision__ = "$id" from nattraverso.pynupnp.upnp import search_upnp_device, UPnPMapper def get_external_ip(): - """ - Returns a deferred which will be called with the WAN ip address - retreived through UPnP. The ip is a string of the form "x.x.x.x" - - @return: A deferred called with the external ip address of this host - @rtype: L{twisted.internet.defer.Deferred} - """ - return search_upnp_device().addCallback(lambda x: x.get_external_ip()) + """ + Returns a deferred which will be called with the WAN ip address + retreived through UPnP. The ip is a string of the form "x.x.x.x" + + @return: A deferred called with the external ip address of this host + @rtype: L{twisted.internet.defer.Deferred} + """ + return search_upnp_device().addCallback(lambda x: x.get_external_ip()) def get_port_mapper(): - """ - Returns a deferred which will be called with a L{UPnPMapper} instance. - This is a L{nattraverso.portmapper.NATMapper} implementation. - - @return: A deferred called with the L{UPnPMapper} instance. - @rtype: L{twisted.internet.defer.Deferred} - """ - return search_upnp_device().addCallback(lambda x: UPnPMapper(x)) + """ + Returns a deferred which will be called with a L{UPnPMapper} instance. + This is a L{nattraverso.portmapper.NATMapper} implementation. + + @return: A deferred called with the L{UPnPMapper} instance. + @rtype: L{twisted.internet.defer.Deferred} + """ + return search_upnp_device().addCallback(lambda x: UPnPMapper(x)) diff --git a/nattraverso/pynupnp/soap.py b/nattraverso/pynupnp/soap.py index e3dc555..487bb88 100644 --- a/nattraverso/pynupnp/soap.py +++ b/nattraverso/pynupnp/soap.py @@ -19,86 +19,86 @@ from twisted.web import client, error Config.typed = False class SoapError(Exception): - """ - This is a SOAP error message, not an HTTP error message. - - The content of this error is a SOAPpy structure representing the - SOAP error message. - """ - pass + """ + This is a SOAP error message, not an HTTP error message. + + The content of this error is a SOAPpy structure representing the + SOAP error message. + """ + pass class SoapProxy: - """ - Proxy for an url to which we send SOAP rpc calls. - """ - def __init__(self, url, prefix): - """ - Init the proxy, it will connect to the given url, using the - given soap namespace. - - @param url: The url of the remote host to call - @param prefix: The namespace prefix to use, eg. - 'urn:schemas-upnp-org:service:WANIPConnection:1' - """ - logging.debug("Soap Proxy: '%s', prefix: '%s'", url, prefix) - self._url = url - self._prefix = prefix - - def call(self, method, **kwargs): - """ - Call the given remote method with the given arguments, as keywords. - - Returns a deferred, called with SOAPpy structure representing - the soap response. - - @param method: The method name to call, eg. 'GetExternalIP' - @param kwargs: The parameters of the call, as keywords - @return: A deferred called with the external ip address of this host - @rtype: L{twisted.internet.defer.Deferred} - """ - payload = SOAPpy.buildSOAP(method=method, config=Config, namespace=self._prefix, kw=kwargs) - # Here begins the nasty hack - payload = payload.replace( - # Upnp wants s: instead of SOAP-ENV - 'SOAP-ENV','s').replace( - # Doesn't seem to like these encoding stuff - 'xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"', '').replace( - 'SOAP-ENC:root="1"', '').replace( - # And it wants u: instead of ns1 namespace for arguments.. - 'ns1','u') - - logging.debug("SOAP Payload:\n%s", payload) - - return client.getPage(self._url, postdata=payload, method="POST", - headers={'content-type': 'text/xml', 'SOAPACTION': '%s#%s' % (self._prefix, method)} - ).addCallbacks(self._got_page, self._got_error) - - def _got_page(self, result): - """ - The http POST command was successful, we parse the SOAP - answer, and return it. - - @param result: the xml content - """ - parsed = SOAPpy.parseSOAPRPC(result) - - logging.debug("SOAP Answer:\n%s", result) - logging.debug("SOAP Parsed Answer: %r", parsed) - - return parsed - - def _got_error(self, res): - """ - The HTTP POST command did not succeed, depending on the error type: - - it's a SOAP error, we parse it and return a L{SoapError}. - - it's another type of error (http, other), we raise it as is - """ - logging.debug("SOAP Error:\n%s", res) - - if isinstance(res.value, error.Error): - try: - logging.debug("SOAP Error content:\n%s", res.value.response) - raise SoapError(SOAPpy.parseSOAPRPC(res.value.response)["detail"]) - except: - raise - raise Exception(res.value) + """ + Proxy for an url to which we send SOAP rpc calls. + """ + def __init__(self, url, prefix): + """ + Init the proxy, it will connect to the given url, using the + given soap namespace. + + @param url: The url of the remote host to call + @param prefix: The namespace prefix to use, eg. + 'urn:schemas-upnp-org:service:WANIPConnection:1' + """ + logging.debug("Soap Proxy: '%s', prefix: '%s'", url, prefix) + self._url = url + self._prefix = prefix + + def call(self, method, **kwargs): + """ + Call the given remote method with the given arguments, as keywords. + + Returns a deferred, called with SOAPpy structure representing + the soap response. + + @param method: The method name to call, eg. 'GetExternalIP' + @param kwargs: The parameters of the call, as keywords + @return: A deferred called with the external ip address of this host + @rtype: L{twisted.internet.defer.Deferred} + """ + payload = SOAPpy.buildSOAP(method=method, config=Config, namespace=self._prefix, kw=kwargs) + # Here begins the nasty hack + payload = payload.replace( + # Upnp wants s: instead of SOAP-ENV + 'SOAP-ENV','s').replace( + # Doesn't seem to like these encoding stuff + 'xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"', '').replace( + 'SOAP-ENC:root="1"', '').replace( + # And it wants u: instead of ns1 namespace for arguments.. + 'ns1','u') + + logging.debug("SOAP Payload:\n%s", payload) + + return client.getPage(self._url, postdata=payload, method="POST", + headers={'content-type': 'text/xml', 'SOAPACTION': '%s#%s' % (self._prefix, method)} + ).addCallbacks(self._got_page, self._got_error) + + def _got_page(self, result): + """ + The http POST command was successful, we parse the SOAP + answer, and return it. + + @param result: the xml content + """ + parsed = SOAPpy.parseSOAPRPC(result) + + logging.debug("SOAP Answer:\n%s", result) + logging.debug("SOAP Parsed Answer: %r", parsed) + + return parsed + + def _got_error(self, res): + """ + The HTTP POST command did not succeed, depending on the error type: + - it's a SOAP error, we parse it and return a L{SoapError}. + - it's another type of error (http, other), we raise it as is + """ + logging.debug("SOAP Error:\n%s", res) + + if isinstance(res.value, error.Error): + try: + logging.debug("SOAP Error content:\n%s", res.value.response) + raise SoapError(SOAPpy.parseSOAPRPC(res.value.response)["detail"]) + except: + raise + raise Exception(res.value) diff --git a/nattraverso/pynupnp/upnpxml.py b/nattraverso/pynupnp/upnpxml.py index d49df63..75059dc 100644 --- a/nattraverso/pynupnp/upnpxml.py +++ b/nattraverso/pynupnp/upnpxml.py @@ -15,75 +15,75 @@ import logging # Allowed UPnP services to use when mapping ports/external addresses WANSERVICES = ['urn:schemas-upnp-org:service:WANIPConnection:1', - 'urn:schemas-upnp-org:service:WANPPPConnection:1'] + 'urn:schemas-upnp-org:service:WANPPPConnection:1'] class UPnPXml: - """ - This objects parses the XML definition, and stores the useful - results in attributes. + """ + This objects parses the XML definition, and stores the useful + results in attributes. + + The device infos dictionnary may contain the following keys: + - friendlyname: A friendly name to call the device. + - manufacturer: A manufacturer name for the device. + + Here are the different attributes: + - deviceinfos: A dictionnary of device infos as defined above. + - controlurl: The control url, this is the url to use when sending SOAP + requests to the device, relative to the base url. + - wanservice: The WAN service to be used, one of the L{WANSERVICES} + - urlbase: The base url to use when talking in SOAP to the device. + + The full url to use is obtained by urljoin(urlbase, controlurl) + """ + + def __init__(self, xml): + """ + Parse the given XML string for UPnP infos. This creates the attributes + when they are found, or None if no value was found. + + @param xml: a xml string to parse + """ + logging.debug("Got UPNP Xml description:\n%s", xml) + doc = minidom.parseString(xml) + + # Fetch various device info + self.deviceinfos = {} + try: + attributes = { + 'friendlyname':'friendlyName', + 'manufacturer' : 'manufacturer' + } + device = doc.getElementsByTagName('device')[0] + for name, tag in attributes.iteritems(): + try: + self.deviceinfos[name] = device.getElementsByTagName( + tag)[0].firstChild.datas.encode('utf-8') + except: + pass + except: + pass + + # Fetch device control url + self.controlurl = None + self.wanservice = None + + for service in doc.getElementsByTagName('service'): + try: + stype = service.getElementsByTagName( + 'serviceType')[0].firstChild.data.encode('utf-8') + if stype in WANSERVICES: + self.controlurl = service.getElementsByTagName( + 'controlURL')[0].firstChild.data.encode('utf-8') + self.wanservice = stype + break + except: + pass + + # Find base url + self.urlbase = None + try: + self.urlbase = doc.getElementsByTagName( + 'URLBase')[0].firstChild.data.encode('utf-8') + except: + pass - The device infos dictionnary may contain the following keys: - - friendlyname: A friendly name to call the device. - - manufacturer: A manufacturer name for the device. - - Here are the different attributes: - - deviceinfos: A dictionnary of device infos as defined above. - - controlurl: The control url, this is the url to use when sending SOAP - requests to the device, relative to the base url. - - wanservice: The WAN service to be used, one of the L{WANSERVICES} - - urlbase: The base url to use when talking in SOAP to the device. - - The full url to use is obtained by urljoin(urlbase, controlurl) - """ - - def __init__(self, xml): - """ - Parse the given XML string for UPnP infos. This creates the attributes - when they are found, or None if no value was found. - - @param xml: a xml string to parse - """ - logging.debug("Got UPNP Xml description:\n%s", xml) - doc = minidom.parseString(xml) - - # Fetch various device info - self.deviceinfos = {} - try: - attributes = { - 'friendlyname':'friendlyName', - 'manufacturer' : 'manufacturer' - } - device = doc.getElementsByTagName('device')[0] - for name, tag in attributes.iteritems(): - try: - self.deviceinfos[name] = device.getElementsByTagName( - tag)[0].firstChild.datas.encode('utf-8') - except: - pass - except: - pass - - # Fetch device control url - self.controlurl = None - self.wanservice = None - - for service in doc.getElementsByTagName('service'): - try: - stype = service.getElementsByTagName( - 'serviceType')[0].firstChild.data.encode('utf-8') - if stype in WANSERVICES: - self.controlurl = service.getElementsByTagName( - 'controlURL')[0].firstChild.data.encode('utf-8') - self.wanservice = stype - break - except: - pass - - # Find base url - self.urlbase = None - try: - self.urlbase = doc.getElementsByTagName( - 'URLBase')[0].firstChild.data.encode('utf-8') - except: - pass - diff --git a/nattraverso/utils.py b/nattraverso/utils.py index b441496..1bfc6da 100644 --- a/nattraverso/utils.py +++ b/nattraverso/utils.py @@ -10,47 +10,47 @@ Various utility functions used in the nattraverso package. __revision__ = "$id" def is_rfc1918_ip(ip): - """ - Checks if the given ip address is a rfc1918 one. - - @param ip: The ip address to test - @type ip: a string "x.x.x.x" - @return: True if it's a LAN address, False otherwise - """ - if isinstance(ip, basestring): - ip = _ip_to_number(ip) - - for net, mask in _nets: - if ip&mask == net: - return True - - return False + """ + Checks if the given ip address is a rfc1918 one. + + @param ip: The ip address to test + @type ip: a string "x.x.x.x" + @return: True if it's a LAN address, False otherwise + """ + if isinstance(ip, basestring): + ip = _ip_to_number(ip) + + for net, mask in _nets: + if ip&mask == net: + return True + + return False def is_bogus_ip(ip): - """ - Checks if the given ip address is bogus, i.e. 0.0.0.0 or 127.0.0.1. - - @param ip: The ip address to test - @type ip: a string "x.x.x.x" - @return: True if it's bogus, False otherwise - """ - return ip.startswith('0.') or ip.startswith('127.') + """ + Checks if the given ip address is bogus, i.e. 0.0.0.0 or 127.0.0.1. + + @param ip: The ip address to test + @type ip: a string "x.x.x.x" + @return: True if it's bogus, False otherwise + """ + return ip.startswith('0.') or ip.startswith('127.') def _ip_to_number(ipstr): - """ - Translate a string ip address to a packed number. - - @param ipstr: the ip address to transform - @type ipstr: a string "x.x.x.x" - @return: an int32 number representing the ip address - """ - net = [ int(digit) for digit in ipstr.split('.') ] + [ 0, 0, 0 ] - net = net[:4] - return ((((((0L+net[0])<<8) + net[1])<<8) + net[2])<<8) +net[3] + """ + Translate a string ip address to a packed number. + + @param ipstr: the ip address to transform + @type ipstr: a string "x.x.x.x" + @return: an int32 number representing the ip address + """ + net = [ int(digit) for digit in ipstr.split('.') ] + [ 0, 0, 0 ] + net = net[:4] + return ((((((0L+net[0])<<8) + net[1])<<8) + net[2])<<8) +net[3] # List of rfc1918 net/mask _rfc1918_networks = [('127', 8), ('192.168', 16), ('10', 8), ('172.16', 12)] # Machine readable form of the above _nets = [(_ip_to_number(net), (2L**32 -1)^(2L**(32-mask)-1)) - for net, mask in _rfc1918_networks] - + for net, mask in _rfc1918_networks] + diff --git a/p2pool/bitcoin/data.py b/p2pool/bitcoin/data.py index d0228c1..dc8b8d6 100644 --- a/p2pool/bitcoin/data.py +++ b/p2pool/bitcoin/data.py @@ -1,11 +1,10 @@ from __future__ import division import hashlib -import itertools import struct from . import base58, skiplists -from p2pool.util import bases, math, skiplist, variable +from p2pool.util import bases, math, variable import p2pool class EarlyEnd(Exception): diff --git a/p2pool/bitcoin/p2p.py b/p2pool/bitcoin/p2p.py index e264ce3..d500417 100644 --- a/p2pool/bitcoin/p2p.py +++ b/p2pool/bitcoin/p2p.py @@ -317,7 +317,7 @@ class HeaderWrapper(object): @classmethod def from_header(cls, header): return cls(bitcoin_data.block_header_type.hash256(header), header['previous_block']) - + def __init__(self, hash, previous_hash): self.hash, self.previous_hash = hash, previous_hash @@ -348,21 +348,21 @@ class HeightTracker(object): def _load_backing(self): open(self.backing, 'ab').close() with open(self.backing, 'rb') as f: - count = 0 - for line in f: - try: - hash, previous_hash, checksum = (int(x, 16) for x in line.strip().split(' ')) - except Exception: - print "skipping over bad data in headers.dat" - else: - if (hash - previous_hash) % 2**256 != checksum: - print "checksum failed" - continue - if previous_hash == 0: previous_hash = None - count += 1 - if count % 10000 == 0 and count: print count - if hash not in self.tracker.shares: - self.tracker.add(HeaderWrapper(hash, previous_hash)) + count = 0 + for line in f: + try: + hash, previous_hash, checksum = (int(x, 16) for x in line.strip().split(' ')) + except Exception: + print "skipping over bad data in headers.dat" + else: + if (hash - previous_hash) % 2**256 != checksum: + print "checksum failed" + continue + if previous_hash == 0: previous_hash = None + count += 1 + if count % 10000 == 0 and count: print count + if hash not in self.tracker.shares: + self.tracker.add(HeaderWrapper(hash, previous_hash)) def think(self): highest_head = max(self.tracker.heads, key=lambda h: self.tracker.get_height_and_last(h)[0]) if self.tracker.heads else None diff --git a/p2pool/data.py b/p2pool/data.py index b457312..a463665 100644 --- a/p2pool/data.py +++ b/p2pool/data.py @@ -4,13 +4,12 @@ import itertools import random import time -from twisted.internet import defer from twisted.python import log import p2pool from p2pool import skiplists from p2pool.bitcoin import data as bitcoin_data, script -from p2pool.util import memoize, expiring_dict, math, deferral +from p2pool.util import memoize, expiring_dict, math merkle_branch_type = bitcoin_data.ListType(bitcoin_data.ComposedType([ @@ -279,7 +278,7 @@ class OkayTracker(bitcoin_data.Tracker): self.verified = bitcoin_data.Tracker() self.get_cumulative_weights = skiplists.WeightsSkipList(self) - + def add(self, share, known_verified=False): bitcoin_data.Tracker.add(self, share) if known_verified: diff --git a/p2pool/draw.py b/p2pool/draw.py index d341ff3..82cc591 100644 --- a/p2pool/draw.py +++ b/p2pool/draw.py @@ -1,13 +1,11 @@ import pygame -import random import time -import itertools import hashlib import math import StringIO from PIL import Image -from p2pool.util.vector import v, Vector +from p2pool.util.vector import v @apply class color(object): @@ -21,9 +19,9 @@ def get_uniform(bound, *data): return x % bound def get_pos(share, t, d): - x = 5 + get_uniform(d.get_width() - 10, share.hash, "pos") - y = d.get_height() - (t - share.time_seen)*10 - return v(x, y) + x = 5 + get_uniform(d.get_width() - 10, share.hash, "pos") + y = d.get_height() - (t - share.time_seen)*10 + return v(x, y) def get_color(data): return [get_uniform(256, data, x) for x in "rgb"] diff --git a/p2pool/main.py b/p2pool/main.py index 4d36d99..f001cdc 100644 --- a/p2pool/main.py +++ b/p2pool/main.py @@ -310,7 +310,7 @@ def main(args): if args.upnp: upnp_thread() - + # start listening for workers with a JSON-RPC server print 'Listening for workers on port %i...' % (args.worker_port,) diff --git a/p2pool/skiplists.py b/p2pool/skiplists.py index d272553..73744c8 100644 --- a/p2pool/skiplists.py +++ b/p2pool/skiplists.py @@ -58,7 +58,7 @@ class CountsSkipList(skiplist.SkipList): if element is None: raise AssertionError() share = self.tracker.shares[element] - return 1, set([share.hash]) if share.nonce[:8] == self.run_identifier else set() + return 1, set([share.hash]) if share.nonce[:8] == self.run_identifier else set() def combine_deltas(self, (share_count1, share_hashes1), (share_count2, share_hashes2)): if share_hashes1 & share_hashes2: diff --git a/p2pool/util/expiring_dict.py b/p2pool/util/expiring_dict.py index 081e85b..153fc76 100644 --- a/p2pool/util/expiring_dict.py +++ b/p2pool/util/expiring_dict.py @@ -1,6 +1,5 @@ from __future__ import division -import random import time from twisted.internet import task -- 1.7.1