Minor changes in cli, PoW, and a couple of new api calls.

This commit is contained in:
Peter Surda 2015-06-20 09:54:15 +02:00
parent 6a86ecd239
commit b6a91ed4b3
5 changed files with 154 additions and 9 deletions

View File

@ -26,7 +26,7 @@ from pyelliptic.openssl import OpenSSL
from struct import pack
# Classes
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute,sqlStoredProcedure
from debug import logger
# Helper Functions
@ -181,6 +181,12 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
return data
elif method == 'listAddressBookEntries' or method == 'listAddressbook': # the listAddressbook alias should be removed eventually.
queryreturn = sqlQuery('''SELECT label, address from addressbook''')
if len(params) == 1:
label, = params
label = self._decode(label, "base64")
queryreturn = sqlQuery('''SELECT label, address from addressbook WHERE label = ?''', label)
elif len(params) > 1:
raise APIError(0, "Too many paremeters, max 1")
data = '{"addresses":['
for row in queryreturn:
label, address = row
@ -190,6 +196,22 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
data += ']}'
return data
elif method == 'getAddressBookEntry': # search by label
if len(params) != 1:
raise APIError(0, "I need a label")
label, = params
label = self._decode(label, "base64")
queryreturn = sqlQuery('''SELECT label, address from addressbook WHERE label = ?''', label)
data = '{"address":['
for row in queryreturn:
label, address = row
label = shared.fixPotentiallyInvalidUTF8Data(label)
if len(data) > 20:
data += ','
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
data += ']}'
return data
elif method == 'addAddressBookEntry' or method == 'addAddressbook': # the addAddressbook alias should be deleted eventually.
if len(params) != 2:
raise APIError(0, "I need label and address")
@ -951,6 +973,52 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
return json.dumps({'status':status, 'addressVersion':addressVersion,
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
separators=(',', ': '))
elif method == 'getInboxCount':
#queryreturn = sqlQuery('''SELECT read, received < 'now' - 60 AS old, COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' GROUP BY read, old''')
ret = {}
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received < 'now' - 60''')
for row in queryreturn:
count, = row
ret['oldread'] = count
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received < 'now' - 60''')
for row in queryreturn:
count, = row
ret['oldunread'] = count
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received >= 'now' - 60''')
for row in queryreturn:
count, = row
ret['newread'] = count
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received >= 'now' - 60''')
for row in queryreturn:
count, = row
ret['newunread'] = count
data = '{"inboxCount":{'
for key in ret:
val = ret[key]
if len(data) > 16:
data += ','
data += json.dumps({key:val}, indent=4, separators=(',', ': '))
data += '}}'
elif method == 'getSentCount':
ret = {}
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgqueued' ''')
for row in queryreturn:
count, = row
ret['queued'] = count
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgsent' ''')
for row in queryreturn:
count, = row
ret['awaitingack'] = count
data = '{"sentCount":{'
for key in ret:
val = ret[key]
if len(data) > 15:
data += ','
data += json.dumps({key:val}, indent=4, separators=(',', ': '))
data += '}}'
elif method == 'deleteAndVacuum':
sqlStoredProcedure('deleteandvacuume')
return 'done'
else:
raise APIError(20, 'Invalid method: %s' % method)

View File

@ -575,6 +575,46 @@ def genAdd(lbl,deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): #
else:
return 'Entry Error'
def delMilAddr(): #Generate address
global usrPrompt
try:
response = api.listAddresses2()
# if api is too old just return then fail
if "API Error 0020" in response: return
addresses = json.loads(response)
for entry in addresses['addresses']:
if entry['label'].decode('base64')[:6] == "random":
api.deleteAddress(entry['address'])
except:
print '\n Connection Error\n'
usrPrompt = 0
main()
def genMilAddr(): #Generate address
global usrPrompt
maxn = 0
try:
response = api.listAddresses2()
if "API Error 0020" in response: return
addresses = json.loads(response)
for entry in addresses['addresses']:
if entry['label'].decode('base64')[:6] == "random":
newn = int(entry['label'].decode('base64')[6:])
if maxn < newn:
maxn = newn
except:
print "\n Some error\n"
print "\n Starting at " + str(maxn) + "\n"
for i in range(maxn, 10000):
lbl = "random" + str(i)
addressLabel = lbl.encode('base64')
try:
generatedAddress = api.createRandomAddress(addressLabel)
except:
print '\n Connection Error\n'
usrPrompt = 0
main()
def saveFile(fileName, fileData): #Allows attachments and messages/broadcats to be saved
#This section finds all invalid characters and replaces them with ~
@ -1249,6 +1289,19 @@ def markAllMessagesUnread():
if message['read']:
markMessageUnread(message['msgid'])
def clientStatus():
try:
clientStatus = json.loads(api.clientStatus())
except:
print '\n Connection Error\n'
usrPrompt = 0
main()
print "\nnetworkStatus: " + clientStatus['networkStatus'] + "\n"
print "\nnetworkConnections: " + str(clientStatus['networkConnections']) + "\n"
print "\nnumberOfPubkeysProcessed: " + str(clientStatus['numberOfPubkeysProcessed']) + "\n"
print "\nnumberOfMessagesProcessed: " + str(clientStatus['numberOfMessagesProcessed']) + "\n"
print "\nnumberOfBroadcastsProcessed: " + str(clientStatus['numberOfBroadcastsProcessed']) + "\n"
def UI(usrInput): #Main user menu
global usrPrompt
@ -1666,6 +1719,21 @@ def UI(usrInput): #Main user menu
usrPrompt = 1
main()
elif usrInput == "status":
clientStatus()
usrPrompt = 1
main()
elif usrInput == "million+":
genMilAddr()
usrPrompt = 1
main()
elif usrInput == "million-":
delMilAddr()
usrPrompt = 1
main()
else:
print '\n "',usrInput,'" is not a command.\n'
usrPrompt = 1

View File

@ -400,7 +400,7 @@ class sqlThread(threading.Thread):
queryreturn = self.cur.fetchall()
for row in queryreturn:
value, = row
if int(value) < int(time.time()) - 2592000:
if int(value) < int(time.time()) - 86400:
logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...')
try:
self.cur.execute( ''' VACUUM ''')

View File

@ -2,6 +2,7 @@ import numpy
from struct import pack, unpack
import time
import hashlib
import random
import pyopencl as cl
hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)])
@ -14,7 +15,7 @@ try:
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
f = open('kernel.cl', 'r')
f = open('/usr/src/PyBitmessage/src/kernel.cl', 'r')
fstr = ''.join(f.readlines())
program = cl.Program(ctx, fstr).build()
except:
@ -42,7 +43,10 @@ def do_opencl_pow(hash, target):
kernel.set_arg(1, dest_buf)
start = time.time()
#startpos = random.getrandbits(32) << 32 | random.getrandbits(32)
#startpos = random.getrandbits(32)
startpos = 0
progress = 0
globamt = worksize*2000
while output[0][0] == 0:
@ -50,17 +54,19 @@ def do_opencl_pow(hash, target):
cl.enqueue_nd_range_kernel(queue, kernel, (globamt,), (worksize,))
cl.enqueue_read_buffer(queue, dest_buf, output)
queue.finish()
#startpos == (globamt + startpos) & 0xFFFFFFFFFFFFFFFF
startpos += globamt
progress += globamt
sofar = time.time() - start
print sofar, startpos / sofar, "hashes/sec"
print sofar, progress / sofar, "hashes/sec"
taken = time.time() - start
print startpos, taken
print progress, taken
return output[0][0]
if __name__ == "__main__":
target = 54227212183L
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
nonce = do_pow(initialHash.encode("hex"), target)
nonce = do_opencl_pow(initialHash.encode("hex"), target)
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
print "{} - value {} < {}".format(nonce, trialValue, target)

View File

@ -6,7 +6,7 @@ from struct import unpack, pack
import sys
from shared import config, frozen
import shared
from openclpow import do_opencl_pow
import openclpow
#import os
def _set_idle():
@ -33,6 +33,7 @@ def _pool_worker(nonce, initialHash, target, pool_size):
return [trialValue, nonce]
def _doSafePoW(target, initialHash):
print "Safe POW\n"
nonce = 0
trialValue = float('inf')
while trialValue > target:
@ -41,6 +42,7 @@ def _doSafePoW(target, initialHash):
return [trialValue, nonce]
def _doFastPoW(target, initialHash):
print "Fast POW\n"
import time
from multiprocessing import Pool, cpu_count
try:
@ -72,13 +74,14 @@ def _doFastPoW(target, initialHash):
time.sleep(0.2)
def _doGPUPow(target, initialHash):
nonce = do_opencl_pow(initialHash.encode("hex"), target)
print "GPU POW\n"
nonce = openclpow.do_opencl_pow(initialHash.encode("hex"), target)
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
#print "{} - value {} < {}".format(nonce, trialValue, target)
return [trialValue, nonce]
def run(target, initialHash):
if has_opencl:
if openclpow.has_opencl():
return _doGPUPow(target, initialHash)
elif frozen == "macosx_app" or not frozen:
return _doFastPoW(target, initialHash)