Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -u a/BitcoinMiner.py b/BitcoinMiner.py
- --- a/BitcoinMiner.py 2011-06-23 23:48:07.673549232 +0200
- +++ b/BitcoinMiner.py 2011-06-23 23:56:13.359806664 +0200
- @@ -8,6 +8,7 @@
- from sha256 import *
- from hashlib import md5
- from base64 import b64encode
- +from decimal import Decimal
- from time import sleep, time
- from json import dumps, loads
- from datetime import datetime
- @@ -26,7 +27,7 @@
- socket.socket = socketwrap
- -VERSION = '2011.beta4'
- +VERSION = '2011.beta4.botch'
- USER_AGENT = 'poclbm/' + VERSION
- @@ -92,17 +93,18 @@
- class RPCError(Exception): pass
- class BitcoinMiner():
- - def __init__(self, device, backup, tolerance, failback, host, user, password, port=8332, frames=30, rate=1, askrate=5, worksize=-1, vectors=False, verbose=False, frameSleep=0):
- + def __init__(self, device, backup, tolerance, failback, host, user, password, phatk=False, port=8332, frames=30, rate=1, askrate=5, worksize=-1, vectors=False, verbose=False, frameSleep=0):
- (self.defines, self.rateDivisor, self.hashspace) = if_else(vectors, ('-DVECTORS', 500, 0x7FFFFFFF), ('', 1000, 0xFFFFFFFF))
- self.defines += (' -DOUTPUT_SIZE=' + str(OUTPUT_SIZE))
- self.defines += (' -DOUTPUT_MASK=' + str(OUTPUT_SIZE - 1))
- self.device = device
- + self.phatk = phatk
- self.rate = max(float(rate), 0.1)
- self.askrate = max(int(askrate), 1)
- self.askrate = min(self.askrate, 10)
- self.worksize = int(worksize)
- - self.frames = max(int(frames), 3)
- + self.frames = max(int(frames), 1)
- self.verbose = verbose
- self.frameSleep = frameSleep
- self.longPollActive = self.stop = False
- @@ -112,6 +114,9 @@
- self.lastWork = 0
- self.lastBlock = self.updateTime = self.longPollURL = ''
- + self.shareCount = [0, 0]
- + self.getworkCount = 0
- +
- self.workQueue = Queue()
- self.resultQueue = Queue()
- @@ -145,22 +150,31 @@
- with self.outputLock:
- p = format % args
- if self.verbose:
- - print '%s,' % datetime.now().strftime(TIME_FORMAT), p
- + pool = self.pool[2] if self.pool else ''
- + print '%s %s' % (pool, datetime.now().strftime(TIME_FORMAT)), p
- else:
- - pool = self.pool[2]+' ' if self.pool else ''
- - sys.stdout.write('\r%s\r%s%s' % (" "*len(p), pool, p))
- + sys.stdout.write('\033[2K\033[G')
- + sys.stdout.write('\r%s' % p)
- sys.stdout.flush()
- def sayLine(self, format, args=()):
- if not self.verbose:
- + sys.stdout.write('\033[2K\033[G')
- format = '%s, %s\n' % (datetime.now().strftime(TIME_FORMAT), format)
- self.say(format, args)
- def exit(self):
- self.stop = True
- - def hashrate(self, rate):
- - self.say('%s khash/s', rate)
- + def sayStatus(self, rate, estRate):
- + rate = Decimal(rate) / 1000
- + estRate = Decimal(estRate) / 1000
- + totShares = self.shareCount[1] + self.shareCount[0]
- + totSharesE = max(totShares, totShares, 1)
- + eff = 0
- + if (self.getworkCount):
- + eff = self.shareCount[1] * 100 / self.getworkCount
- + self.say('[%.03f MH/s (~%d MH/s)] [Rej: %d/%d (%d%%)] [GW: %d (Eff: %d%%)]', (rate, round(estRate), self.shareCount[0], totShares, self.shareCount[0] * 100 / totSharesE, self.getworkCount, eff))
- def failure(self, message):
- print '\n%s' % message
- @@ -171,7 +185,7 @@
- self.sayLine('checking %s <= %s', (hash, target))
- def blockFound(self, hash, accepted):
- - self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale')))
- + self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'rejected')))
- def mine(self):
- self.stop = False
- @@ -187,13 +201,20 @@
- update = self.update = (self.update or time() - self.lastWork > if_else(self.longPollActive, LONG_POLL_MAX_ASKRATE, self.askrate))
- if update:
- work = self.getwork()
- + if self.update:
- + self.queueWork(work)
- +
- + retry = []
- + while not self.resultQueue.empty():
- + result = self.resultQueue.get(False)
- with self.lock:
- - if self.update:
- - self.queueWork(work)
- + rv = self.sendResult(result)
- + if rv is False:
- + retry.append(result)
- + if retry:
- + for result in retry:
- + self.resultQueue.put(result)
- - with self.lock:
- - if not self.resultQueue.empty():
- - self.sendResult(self.resultQueue.get(False))
- sleep(1)
- except Exception:
- self.sayLine("Unexpected error:")
- @@ -214,15 +235,20 @@
- 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!')
- + self.failure('Verification failed, check hardware!\a')
- else:
- self.diff1Found(bytereverse(h[6]), result['target'][6])
- if belowOrEquals(h[:7], result['target'][:7]):
- 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'), d[160:]])
- + hashid = pack('I', long(h[6])).encode('hex')
- accepted = self.getwork(d)
- if accepted != None:
- - self.blockFound(pack('I', long(h[6])).encode('hex'), accepted)
- + self.blockFound(hashid, accepted)
- + self.shareCount[if_else(accepted, 1, 0)] += 1
- + else:
- + self.sayLine('%s, %s', (hashid, 'ERROR (will resend)'))
- + return False
- def getwork(self, data=None):
- save_pool = None
- @@ -236,6 +262,8 @@
- self.failback_getwork_count += 1
- if not self.connection:
- self.connection = httplib.HTTPConnection(self.host, strict=True, timeout=TIMEOUT)
- + if data is None:
- + self.getworkCount += 1
- self.postdata['params'] = if_else(data, [data], [])
- (self.connection, result) = self.request(self.connection, '/', self.headers, dumps(self.postdata))
- self.errors = 0
- @@ -344,11 +372,13 @@
- queue = cl.CommandQueue(self.context)
- - lastRatedPace = lastRated = lastNTime = time()
- - base = lastHashRate = threadsRunPace = threadsRun = 0
- + startTime = lastRatedPace = lastRated = lastNTime = time()
- + accepted = base = lastHashRate = threadsRunPace = threadsRun = 0
- + acceptHist = []
- f = np.zeros(8, np.uint32)
- output = np.zeros(OUTPUT_SIZE+1, np.uint32)
- output_buf = cl.Buffer(self.context, cl.mem_flags.WRITE_ONLY | cl.mem_flags.USE_HOST_PTR, hostbuf=output)
- + timedelta = 900
- work = None
- while True:
- @@ -366,16 +396,24 @@
- state = np.array(unpack('IIIIIIII', work['midstate'].decode('hex')), dtype=np.uint32)
- target = np.array(unpack('IIIIIIII', work['target'].decode('hex')), dtype=np.uint32)
- state2 = partial(state, data, f)
- - calculateF(state, data, f, state2)
- -
- - self.miner.search( queue, (globalThreads, ), (self.worksize, ),
- + if (self.phatk):
- + calculateF(state, data, f, state2)
- +
- + if (self.phatk):
- + self.miner.search( queue, (globalThreads, ), (self.worksize, ),
- state[0], state[1], state[2], state[3], state[4], state[5], state[6], state[7],
- state2[1], state2[2], state2[3], state2[5], state2[6], state2[7],
- pack('I', base),
- - f[0], f[1], f[2], f[3], f[4],# f[5], f[6], f[7],
- + f[0], f[1], f[2], f[3], f[4],
- + output_buf)
- + else:
- + self.miner.search( queue, (globalThreads, ), (self.worksize, ),
- + state[0], state[1], state[2], state[3], state[4], state[5], state[6], state[7],
- + state2[1], state2[2], state2[3], state2[5], state2[6], state2[7],
- + pack('I', base),
- + f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7],
- output_buf)
- cl.enqueue_read_buffer(queue, output_buf, output)
- -
- noncesLeft -= globalThreads
- threadsRunPace += globalThreads
- threadsRun += globalThreads
- @@ -392,7 +430,20 @@
- lastHashRate = rate
- t = now - lastRated
- if (t > self.rate):
- - self.hashrate(int((threadsRun / t) / self.rateDivisor))
- + rate = int((threadsRun / t) / self.rateDivisor)
- +
- + if (len(acceptHist)):
- + LAH = acceptHist.pop()
- + if LAH[1] != self.shareCount[1]:
- + acceptHist.append(LAH)
- + acceptHist.append( (now, self.shareCount[1]) )
- + while (acceptHist[0][0] < now - timedelta):
- + acceptHist.pop(0)
- + newAccept = self.shareCount[1] - acceptHist[0][1]
- + # FIXME: this next line assumes diff 1: calculate by real target
- + estRate = Decimal(newAccept) * (2**32) / min(int(now - startTime), timedelta) / 1000
- +
- + self.sayStatus(rate, estRate)
- lastRated = now; threadsRun = 0
- queue.finish()
- @@ -418,16 +469,21 @@
- elif now - lastNTime > 1:
- data[1] = bytereverse(bytereverse(data[1]) + 1)
- state2 = partial(state, data, f)
- - calculateF(state, data, f, state2)
- + if (self.phatk):
- + calculateF(state, data, f, state2)
- lastNTime = now
- def loadKernel(self):
- self.context = cl.Context([self.device], None, None)
- if (self.device.extensions.find('cl_amd_media_ops') != -1):
- self.defines += ' -DBITALIGN'
- - self.defines += ' -DBFI_INT'
- -
- - kernelFile = open('phatk.cl', 'r')
- + if (self.phatk):
- + self.defines += ' -DBFI_INT'
- + kernelFile = open('phatk.cl', 'r')
- + self.sayLine('Kernel: phatk')
- + else:
- + kernelFile = open('BitcoinMiner.cl', 'r')
- + self.sayLine('Kernel: poclbm')
- kernel = kernelFile.read()
- kernelFile.close()
- m = md5(); m.update(''.join([self.device.platform.name, self.device.platform.version, self.device.name, self.defines, kernel]))
- diff -u a/poclbm.py b/poclbm.py
- --- a/poclbm.py 2011-06-23 23:48:07.673549232 +0200
- +++ b/poclbm.py 2011-06-23 23:59:42.661884695 +0200
- @@ -1,4 +1,4 @@
- -#!/usr/bin/python
- +#!/usr/bin/python -OO
- import pyopencl as cl
- from time import sleep
- @@ -6,8 +6,9 @@
- from optparse import OptionParser
- parser = OptionParser(version=USER_AGENT)
- +parser.add_option('-P', '--phatk', dest='phatk', action='store_true', help='use phatk')
- parser.add_option('-u', '--user', dest='user', default='bitcoin', help='user name')
- -parser.add_option('--pass', dest='password', default='password', help='password')
- +parser.add_option('--pass', dest='password', default='password', help='password')
- parser.add_option('-o', '--host', dest='host', default='127.0.0.1', help='RPC host (without \'http://\')')
- parser.add_option('-p', '--port', dest='port', default='8332', help='RPC port', type='int')
- parser.add_option('-r', '--rate', dest='rate', default=1, help='hash rate display interval in seconds, default=1', type='float')
- @@ -56,6 +57,7 @@
- options.host,
- options.user,
- options.password,
- + options.phatk,
- options.port,
- options.frames,
- options.rate,
- @@ -69,4 +71,3 @@
- print '\nbye'
- finally:
- if miner: miner.exit()
- -sleep(1.1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement