def openURL(url, handler):
    """Parses a URL and opens a connection using the appropriate client."""

    parsed = urlparse.urlparse(url)
    if parsed.scheme.lower() == 'mmp':
        client = MMPClient(handler, parsed.hostname or 'localhost', parsed.port
                           or 8880, parsed.username or 'default',
                           parsed.password or 'default')

        for var, value in urlparse.parse_qsl(parsed.path.lstrip('/?')):
            client.setMeta(var, value)

        return client
    elif parsed.scheme.lower() in ['http', 'https']:
        return RPCClient(handler, parsed)
    else:
        raise ValueError('Unknown protocol: ' + parsed.scheme)
def openURL(url, handler):
    """Parses a URL and opens a connection using the appropriate client."""
    
    parsed = urlparse.urlparse(url)
    if parsed.scheme.lower() == 'mmp':
        client = MMPClient(handler, parsed.hostname or 'localhost',
            parsed.port or 8880, parsed.username or 'default',
            parsed.password or 'default')
        
        for var, value in urlparse.parse_qsl(parsed.path.lstrip('/?')):
            client.setMeta(var, value)
        
        return client
    elif parsed.scheme.lower() in ['http', 'https']:
        return RPCClient(handler, parsed)
    else:
        raise ValueError('Unknown protocol: ' + parsed.scheme)
Beispiel #3
0
    def __init__(self,
                 device,
                 host,
                 user,
                 password,
                 port=8332,
                 *args,
                 **kwargs):
        self.client = MMPClient(self)
        self.clientargs = (host, port, user, password)

        self.name = kwargs.get('name', '')

        self.lastRateUpdate = 0.0
        self.serverMsgBanner = False
        self.workRequested = False
        return BitcoinMiner.__init__(self, device, host, user, password, port,
                                     *args, **kwargs)
Beispiel #4
0
    def __init__(self, device, host, user, password, port=8332, *args, **kwargs):
        self.client = MMPClient(self)
        self.clientargs = (host, port, user, password)

        self.name = kwargs.get("name", "")

        self.lastRateUpdate = 0.0
        self.serverMsgBanner = False
        self.workRequested = False
        return BitcoinMiner.__init__(self, device, host, user, password, port, *args, **kwargs)
Beispiel #5
0
def openURL(url, handler):
    """Parses a URL and opens a connection using the appropriate client."""
    
    parsed = urlparse.urlparse(url)
    if parsed.scheme.lower() == 'mmp':
        client = MMPClient(handler, parsed.hostname or 'localhost',
            parsed.port or 8880, parsed.username or 'default',
            parsed.password or 'default')
        
        for var, value in urlparse.parse_qsl(parsed.path.lstrip('/?')):
            client.setMeta(var, value)
        
        return client
    elif parsed.scheme.lower() == 'http':
        p = (parsed.path or '/') + ('?' + parsed.query if parsed.query else '')
        
        client = RPCClient(handler, parsed.hostname or 'localhost',
            parsed.port or 80, parsed.username or 'default',
            parsed.password or 'default', p)
        
        for var, value in urlparse.parse_qsl(parsed.params):
            if var == 'askrate':
                try:
                    client.askrate = float(value)
                except ValueError:
                    pass
        
        return client
    else:
        raise ValueError('Unknown protocol: ' + parsed.scheme)
Beispiel #6
0
class MMPBitcoinMiner(BitcoinMiner):
    def __init__(self, device, host, user, password, port=8332, *args, **kwargs):
        self.client = MMPClient(self)
        self.clientargs = (host, port, user, password)

        self.name = kwargs.get("name", "")

        self.lastRateUpdate = 0.0
        self.serverMsgBanner = False
        self.workRequested = False
        return BitcoinMiner.__init__(self, device, host, user, password, port, *args, **kwargs)

    def say(self, *args):
        self.serverMsgBanner = False
        BitcoinMiner.say(self, *args)

    def hashrate(self, rate):
        if time() > (self.lastRateUpdate + 30.0):
            self.client.setMeta("rate", rate)
            self.lastRateUpdate = time()
        BitcoinMiner.hashrate(self, rate)

    def mine(self):
        self.stop = False
        Thread(target=self.miningThread).start()

        self.client.setMeta("device", self.device.name.replace("\x00", ""))
        self.client.setMeta("version", "poclbm v%s by m0mchil" % (VERSION,))
        if self.name:
            self.client.setMeta("name", self.name)
        self.client.setMeta("os", platform.system() + " " + platform.version())
        self.client.setMeta("cores", self.device.max_compute_units)

        self.client.connect(*self.clientargs)
        LoopingCall(self.checkQueues).start(0.5)
        reactor.run()

    def onConnect(self):
        self.sayLine("connected")

    def onDisconnect(self):
        self.sayLine("lost connection")

    def onMsg(self, message):
        if not self.serverMsgBanner:
            self.sayLine("server message(s):")
        self.say(message + "\n")
        self.serverMsgBanner = True

    def onWork(self, wu):
        self.workRequested = False
        work = {
            "midstate": pack(
                "I" * 8,
                *sha256(STATE, np.array(unpack("I" * 64, wu.data[:64] + "\x00" * 192), dtype=np.uint32)).tolist()
            ).encode("hex"),
            "data": wu.data.encode("hex") + "00000080" + ("00" * 40) + "80020000",
            "target": wu.target.encode("hex"),
            "mask": wu.mask,
        }
        with self.lock:
            self.queueWork(work)

    def sendResult(self, result):
        for i in xrange(OUTPUT_SIZE):
            if result["output"][i]:
                h = hash(result["state"], result["data"][0], result["data"][1], result["data"][2], result["output"][i])
                if h[7] != 0:
                    self.failure("Verification failed, check hardware!")
                else:
                    self.diff1Found(bytereverse(h[6]), result["target"][6])
                    if belowOrEquals(h[:7], result["target"][:7]):
                        if result["work"] is None:
                            return
                        d = result["work"]["data"]
                        d = "".join(
                            [
                                d[:136],
                                pack("I", long(result["data"][1])).encode("hex"),
                                d[144:152],
                                pack("I", long(result["output"][i])).encode("hex"),
                            ]
                        )
                        deferred = self.client.sendResult(d.decode("hex"))

                        def callback(accepted):
                            self.blockFound(pack("I", long(h[6])).encode("hex"), accepted)

                        deferred.addCallback(callback)

    def checkQueues(self):
        if self.stop:
            reactor.stop()
            return
        with self.lock:
            if self.update and not self.workRequested:
                self.workRequested = True
                self.client.requestWork()
            if not self.resultQueue.empty():
                self.sendResult(self.resultQueue.get(False))
Beispiel #7
0
class MMPBitcoinMiner(BitcoinMiner):
    def __init__(self,
                 device,
                 host,
                 user,
                 password,
                 port=8332,
                 *args,
                 **kwargs):
        self.client = MMPClient(self)
        self.clientargs = (host, port, user, password)

        self.name = kwargs.get('name', '')

        self.lastRateUpdate = 0.0
        self.serverMsgBanner = False
        self.workRequested = False
        return BitcoinMiner.__init__(self, device, host, user, password, port,
                                     *args, **kwargs)

    def say(self, *args):
        self.serverMsgBanner = False
        BitcoinMiner.say(self, *args)

    def hashrate(self, rate):
        if time() > (self.lastRateUpdate + 30.0):
            self.client.setMeta('rate', rate)
            self.lastRateUpdate = time()
        BitcoinMiner.hashrate(self, rate)

    def mine(self):
        self.stop = False
        Thread(target=self.miningThread).start()

        self.client.setMeta('device', self.device.name.replace('\x00', ''))
        self.client.setMeta('version', 'poclbm v%s by m0mchil' % (VERSION, ))
        if self.name:
            self.client.setMeta('name', self.name)
        self.client.setMeta('os', platform.system() + ' ' + platform.version())
        self.client.setMeta('cores', self.device.max_compute_units)

        self.client.connect(*self.clientargs)
        LoopingCall(self.checkQueues).start(0.5)
        reactor.run()

    def onConnect(self):
        self.sayLine('connected')

    def onDisconnect(self):
        self.sayLine('lost connection')

    def onMsg(self, message):
        if not self.serverMsgBanner:
            self.sayLine('server message(s):')
        self.say(message + '\n')
        self.serverMsgBanner = True

    def onWork(self, wu):
        self.workRequested = False
        work = {
            'midstate':
            pack(
                'I' * 8,
                *sha256(
                    STATE,
                    np.array(unpack('I' * 64, wu.data[:64] + '\x00' * 192),
                             dtype=np.uint32)).tolist()).encode('hex'),
            'data':
            wu.data.encode('hex') + '00000080' + ('00' * 40) + '80020000',
            'target':
            wu.target.encode('hex'),
            'mask':
            wu.mask
        }
        with self.lock:
            self.queueWork(work)

    def sendResult(self, result):
        for i in xrange(OUTPUT_SIZE):
            if result['output'][i]:
                h = hash(result['state'], result['data'][0], result['data'][1],
                         result['data'][2], result['output'][i])
                if h[7] != 0:
                    self.failure('Verification failed, check hardware!')
                else:
                    self.diff1Found(bytereverse(h[6]), result['target'][6])
                    if belowOrEquals(h[:7], result['target'][:7]):
                        if result['work'] is None:
                            return
                        d = result['work']['data']
                        d = ''.join([
                            d[:136],
                            pack('I', long(result['data'][1])).encode('hex'),
                            d[144:152],
                            pack('I', long(result['output'][i])).encode('hex')
                        ])
                        deferred = self.client.sendResult(d.decode('hex'))

                        def callback(accepted):
                            self.blockFound(
                                pack('I', long(h[6])).encode('hex'), accepted)

                        deferred.addCallback(callback)

    def checkQueues(self):
        if self.stop:
            reactor.stop()
            return
        with self.lock:
            if self.update and not self.workRequested:
                self.workRequested = True
                self.client.requestWork()
            if not self.resultQueue.empty():
                self.sendResult(self.resultQueue.get(False))