Advertisement
Guest User

diff

a guest
Jun 23rd, 2011
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 10.66 KB | None | 0 0
  1. diff -u a/BitcoinMiner.py b/BitcoinMiner.py
  2. --- a/BitcoinMiner.py   2011-06-23 23:48:07.673549232 +0200
  3. +++ b/BitcoinMiner.py   2011-06-23 23:56:13.359806664 +0200
  4. @@ -8,6 +8,7 @@
  5.  from sha256 import *
  6.  from hashlib import md5
  7.  from base64 import b64encode
  8. +from decimal import Decimal
  9.  from time import sleep, time
  10.  from json import dumps, loads
  11.  from datetime import datetime
  12. @@ -26,7 +27,7 @@
  13.  socket.socket = socketwrap
  14.  
  15.  
  16. -VERSION = '2011.beta4'
  17. +VERSION = '2011.beta4.botch'
  18.  
  19.  USER_AGENT = 'poclbm/' + VERSION
  20.  
  21. @@ -92,17 +93,18 @@
  22.  class RPCError(Exception): pass
  23.  
  24.  class BitcoinMiner():
  25. -   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):
  26. +   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):
  27.         (self.defines, self.rateDivisor, self.hashspace) = if_else(vectors, ('-DVECTORS', 500, 0x7FFFFFFF), ('', 1000, 0xFFFFFFFF))
  28.         self.defines += (' -DOUTPUT_SIZE=' + str(OUTPUT_SIZE))
  29.         self.defines += (' -DOUTPUT_MASK=' + str(OUTPUT_SIZE - 1))
  30.  
  31.         self.device = device
  32. +       self.phatk = phatk
  33.         self.rate = max(float(rate), 0.1)
  34.         self.askrate = max(int(askrate), 1)
  35.         self.askrate = min(self.askrate, 10)
  36.         self.worksize = int(worksize)
  37. -       self.frames = max(int(frames), 3)
  38. +       self.frames = max(int(frames), 1)
  39.         self.verbose = verbose
  40.         self.frameSleep = frameSleep
  41.         self.longPollActive = self.stop = False
  42. @@ -112,6 +114,9 @@
  43.         self.lastWork = 0
  44.         self.lastBlock = self.updateTime = self.longPollURL = ''
  45.  
  46. +       self.shareCount = [0, 0]
  47. +       self.getworkCount = 0
  48. +
  49.         self.workQueue = Queue()
  50.         self.resultQueue = Queue()
  51.  
  52. @@ -145,22 +150,31 @@
  53.         with self.outputLock:
  54.             p = format % args
  55.             if self.verbose:
  56. -               print '%s,' % datetime.now().strftime(TIME_FORMAT), p
  57. +               pool = self.pool[2] if self.pool else ''
  58. +               print '%s %s' % (pool, datetime.now().strftime(TIME_FORMAT)), p
  59.             else:
  60. -               pool = self.pool[2]+' ' if self.pool else ''
  61. -               sys.stdout.write('\r%s\r%s%s' % (" "*len(p), pool, p))
  62. +               sys.stdout.write('\033[2K\033[G')
  63. +               sys.stdout.write('\r%s' % p)
  64.             sys.stdout.flush()
  65.  
  66.     def sayLine(self, format, args=()):
  67.         if not self.verbose:
  68. +           sys.stdout.write('\033[2K\033[G')
  69.             format = '%s, %s\n' % (datetime.now().strftime(TIME_FORMAT), format)
  70.         self.say(format, args)
  71.  
  72.     def exit(self):
  73.         self.stop = True
  74.  
  75. -   def hashrate(self, rate):
  76. -       self.say('%s khash/s', rate)
  77. +   def sayStatus(self, rate, estRate):
  78. +       rate = Decimal(rate) / 1000
  79. +       estRate = Decimal(estRate) / 1000
  80. +       totShares = self.shareCount[1] + self.shareCount[0]
  81. +       totSharesE = max(totShares, totShares, 1)
  82. +       eff = 0
  83. +       if (self.getworkCount):
  84. +           eff = self.shareCount[1] * 100 / self.getworkCount
  85. +       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))
  86.  
  87.     def failure(self, message):
  88.         print '\n%s' % message
  89. @@ -171,7 +185,7 @@
  90.             self.sayLine('checking %s <= %s', (hash, target))
  91.  
  92.     def blockFound(self, hash, accepted):
  93. -       self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale')))
  94. +       self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'rejected')))
  95.  
  96.     def mine(self):
  97.         self.stop = False
  98. @@ -187,13 +201,20 @@
  99.                     update = self.update = (self.update or time() - self.lastWork > if_else(self.longPollActive, LONG_POLL_MAX_ASKRATE, self.askrate))
  100.                 if update:
  101.                     work = self.getwork()
  102. +                   if self.update:
  103. +                       self.queueWork(work)
  104. +
  105. +               retry = []
  106. +               while not self.resultQueue.empty():
  107. +                   result = self.resultQueue.get(False)
  108.                     with self.lock:
  109. -                       if self.update:
  110. -                           self.queueWork(work)
  111. +                       rv = self.sendResult(result)
  112. +                   if rv is False:
  113. +                       retry.append(result)
  114. +               if retry:
  115. +                   for result in retry:
  116. +                       self.resultQueue.put(result)
  117.  
  118. -               with self.lock:
  119. -                   if not self.resultQueue.empty():
  120. -                       self.sendResult(self.resultQueue.get(False))
  121.                 sleep(1)
  122.             except Exception:
  123.                 self.sayLine("Unexpected error:")
  124. @@ -214,15 +235,20 @@
  125.             if result['output'][i]:
  126.                 h = hash(result['state'], result['data'][0], result['data'][1], result['data'][2], result['output'][i])
  127.                 if h[7] != 0:
  128. -                   self.failure('Verification failed, check hardware!')
  129. +                   self.failure('Verification failed, check hardware!\a')
  130.                 else:
  131.                     self.diff1Found(bytereverse(h[6]), result['target'][6])
  132.                     if belowOrEquals(h[:7], result['target'][:7]):
  133.                         d = result['work']['data']
  134.                         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:]])
  135. +                       hashid = pack('I', long(h[6])).encode('hex')
  136.                         accepted = self.getwork(d)
  137.                         if accepted != None:
  138. -                           self.blockFound(pack('I', long(h[6])).encode('hex'), accepted)
  139. +                           self.blockFound(hashid, accepted)
  140. +                           self.shareCount[if_else(accepted, 1, 0)] += 1
  141. +                       else:
  142. +                           self.sayLine('%s, %s', (hashid, 'ERROR (will resend)'))
  143. +                           return False
  144.  
  145.     def getwork(self, data=None):
  146.         save_pool = None
  147. @@ -236,6 +262,8 @@
  148.                 self.failback_getwork_count += 1
  149.             if not self.connection:
  150.                 self.connection = httplib.HTTPConnection(self.host, strict=True, timeout=TIMEOUT)
  151. +           if data is None:
  152. +               self.getworkCount += 1
  153.             self.postdata['params'] = if_else(data, [data], [])
  154.             (self.connection, result) = self.request(self.connection, '/', self.headers, dumps(self.postdata))
  155.             self.errors = 0
  156. @@ -344,11 +372,13 @@
  157.        
  158.         queue = cl.CommandQueue(self.context)
  159.  
  160. -       lastRatedPace = lastRated = lastNTime = time()
  161. -       base = lastHashRate = threadsRunPace = threadsRun = 0
  162. +       startTime = lastRatedPace = lastRated = lastNTime = time()
  163. +       accepted = base = lastHashRate = threadsRunPace = threadsRun = 0
  164. +       acceptHist = []
  165.         f = np.zeros(8, np.uint32)
  166.         output = np.zeros(OUTPUT_SIZE+1, np.uint32)
  167.         output_buf = cl.Buffer(self.context, cl.mem_flags.WRITE_ONLY | cl.mem_flags.USE_HOST_PTR, hostbuf=output)
  168. +       timedelta = 900
  169.  
  170.         work = None
  171.         while True:
  172. @@ -366,16 +396,24 @@
  173.                     state  = np.array(unpack('IIIIIIII',         work['midstate'].decode('hex')),   dtype=np.uint32)
  174.                     target = np.array(unpack('IIIIIIII',         work['target'].decode('hex')),     dtype=np.uint32)
  175.                     state2 = partial(state, data, f)
  176. -                   calculateF(state, data, f, state2)
  177. -
  178. -           self.miner.search(  queue, (globalThreads, ), (self.worksize, ),
  179. +                   if (self.phatk):
  180. +                       calculateF(state, data, f, state2)
  181. +          
  182. +           if (self.phatk):
  183. +               self.miner.search(  queue, (globalThreads, ), (self.worksize, ),
  184.                                 state[0], state[1], state[2], state[3], state[4], state[5], state[6], state[7],
  185.                                 state2[1], state2[2], state2[3], state2[5], state2[6], state2[7],
  186.                                 pack('I', base),
  187. -                               f[0], f[1], f[2], f[3], f[4],# f[5], f[6], f[7],
  188. +                               f[0], f[1], f[2], f[3], f[4],
  189. +                               output_buf)
  190. +           else:
  191. +               self.miner.search(  queue, (globalThreads, ), (self.worksize, ),
  192. +                               state[0], state[1], state[2], state[3], state[4], state[5], state[6], state[7],
  193. +                               state2[1], state2[2], state2[3], state2[5], state2[6], state2[7],
  194. +                               pack('I', base),
  195. +                               f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7],
  196.                                 output_buf)
  197.             cl.enqueue_read_buffer(queue, output_buf, output)
  198. -
  199.             noncesLeft -= globalThreads
  200.             threadsRunPace += globalThreads
  201.             threadsRun += globalThreads
  202. @@ -392,7 +430,20 @@
  203.                     lastHashRate = rate
  204.             t = now - lastRated
  205.             if (t > self.rate):
  206. -               self.hashrate(int((threadsRun / t) / self.rateDivisor))
  207. +               rate = int((threadsRun / t) / self.rateDivisor)
  208. +
  209. +               if (len(acceptHist)):
  210. +                   LAH = acceptHist.pop()
  211. +                   if LAH[1] != self.shareCount[1]:
  212. +                       acceptHist.append(LAH)
  213. +               acceptHist.append( (now, self.shareCount[1]) )
  214. +               while (acceptHist[0][0] < now - timedelta):
  215. +                   acceptHist.pop(0)
  216. +               newAccept = self.shareCount[1] - acceptHist[0][1]
  217. +               # FIXME: this next line assumes diff 1: calculate by real target
  218. +               estRate = Decimal(newAccept) * (2**32) / min(int(now - startTime), timedelta) / 1000
  219. +
  220. +               self.sayStatus(rate, estRate)
  221.                 lastRated = now; threadsRun = 0
  222.  
  223.             queue.finish()
  224. @@ -418,16 +469,21 @@
  225.             elif now - lastNTime > 1:
  226.                 data[1] = bytereverse(bytereverse(data[1]) + 1)
  227.                 state2 = partial(state, data, f)
  228. -               calculateF(state, data, f, state2)
  229. +               if (self.phatk):
  230. +                   calculateF(state, data, f, state2)
  231.                 lastNTime = now
  232.  
  233.     def loadKernel(self):
  234.         self.context = cl.Context([self.device], None, None)
  235.         if (self.device.extensions.find('cl_amd_media_ops') != -1):
  236.             self.defines += ' -DBITALIGN'
  237. -           self.defines += ' -DBFI_INT'
  238. -
  239. -       kernelFile = open('phatk.cl', 'r')
  240. +           if (self.phatk):
  241. +               self.defines += ' -DBFI_INT'
  242. +               kernelFile = open('phatk.cl', 'r')
  243. +               self.sayLine('Kernel: phatk')
  244. +           else:
  245. +               kernelFile = open('BitcoinMiner.cl', 'r')
  246. +               self.sayLine('Kernel: poclbm')
  247.         kernel = kernelFile.read()
  248.         kernelFile.close()
  249.         m = md5(); m.update(''.join([self.device.platform.name, self.device.platform.version, self.device.name, self.defines, kernel]))
  250. diff -u a/poclbm.py b/poclbm.py
  251. --- a/poclbm.py 2011-06-23 23:48:07.673549232 +0200
  252. +++ b/poclbm.py 2011-06-23 23:59:42.661884695 +0200
  253. @@ -1,4 +1,4 @@
  254. -#!/usr/bin/python
  255. +#!/usr/bin/python -OO
  256.  
  257.  import pyopencl as cl
  258.  from time import sleep
  259. @@ -6,8 +6,9 @@
  260.  from optparse import OptionParser
  261.  
  262.  parser = OptionParser(version=USER_AGENT)
  263. +parser.add_option('-P', '--phatk',    dest='phatk',    action='store_true', help='use phatk')
  264.  parser.add_option('-u', '--user',     dest='user',     default='bitcoin',   help='user name')
  265. -parser.add_option('--pass',              dest='password', default='password',  help='password')
  266. +parser.add_option('--pass',           dest='password', default='password',  help='password')
  267.  parser.add_option('-o', '--host',     dest='host',     default='127.0.0.1', help='RPC host (without \'http://\')')
  268.  parser.add_option('-p', '--port',     dest='port',     default='8332',      help='RPC port', type='int')
  269.  parser.add_option('-r', '--rate',     dest='rate',     default=1,           help='hash rate display interval in seconds, default=1', type='float')
  270. @@ -56,6 +57,7 @@
  271.                             options.host,
  272.                             options.user,
  273.                             options.password,
  274. +                           options.phatk,
  275.                             options.port,
  276.                             options.frames,
  277.                             options.rate,
  278. @@ -69,4 +71,3 @@
  279.     print '\nbye'
  280.  finally:
  281.     if miner: miner.exit()
  282. -sleep(1.1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement