Minor changes in cli, PoW, and a couple of new api calls.
This commit is contained in:
parent
6a86ecd239
commit
b6a91ed4b3
70
src/api.py
70
src/api.py
|
@ -26,7 +26,7 @@ from pyelliptic.openssl import OpenSSL
|
||||||
from struct import pack
|
from struct import pack
|
||||||
|
|
||||||
# Classes
|
# Classes
|
||||||
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute
|
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute,sqlStoredProcedure
|
||||||
from debug import logger
|
from debug import logger
|
||||||
|
|
||||||
# Helper Functions
|
# Helper Functions
|
||||||
|
@ -181,6 +181,12 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
return data
|
return data
|
||||||
elif method == 'listAddressBookEntries' or method == 'listAddressbook': # the listAddressbook alias should be removed eventually.
|
elif method == 'listAddressBookEntries' or method == 'listAddressbook': # the listAddressbook alias should be removed eventually.
|
||||||
queryreturn = sqlQuery('''SELECT label, address from addressbook''')
|
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":['
|
data = '{"addresses":['
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
label, address = row
|
label, address = row
|
||||||
|
@ -190,6 +196,22 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
|
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
|
||||||
data += ']}'
|
data += ']}'
|
||||||
return 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.
|
elif method == 'addAddressBookEntry' or method == 'addAddressbook': # the addAddressbook alias should be deleted eventually.
|
||||||
if len(params) != 2:
|
if len(params) != 2:
|
||||||
raise APIError(0, "I need label and address")
|
raise APIError(0, "I need label and address")
|
||||||
|
@ -951,6 +973,52 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
return json.dumps({'status':status, 'addressVersion':addressVersion,
|
return json.dumps({'status':status, 'addressVersion':addressVersion,
|
||||||
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
|
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
|
||||||
separators=(',', ': '))
|
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:
|
else:
|
||||||
raise APIError(20, 'Invalid method: %s' % method)
|
raise APIError(20, 'Invalid method: %s' % method)
|
||||||
|
|
||||||
|
|
|
@ -575,6 +575,46 @@ def genAdd(lbl,deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): #
|
||||||
else:
|
else:
|
||||||
return 'Entry Error'
|
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
|
def saveFile(fileName, fileData): #Allows attachments and messages/broadcats to be saved
|
||||||
|
|
||||||
#This section finds all invalid characters and replaces them with ~
|
#This section finds all invalid characters and replaces them with ~
|
||||||
|
@ -1249,6 +1289,19 @@ def markAllMessagesUnread():
|
||||||
if message['read']:
|
if message['read']:
|
||||||
markMessageUnread(message['msgid'])
|
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
|
def UI(usrInput): #Main user menu
|
||||||
global usrPrompt
|
global usrPrompt
|
||||||
|
@ -1666,6 +1719,21 @@ def UI(usrInput): #Main user menu
|
||||||
usrPrompt = 1
|
usrPrompt = 1
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "status":
|
||||||
|
clientStatus()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "million+":
|
||||||
|
genMilAddr()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "million-":
|
||||||
|
delMilAddr()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print '\n "',usrInput,'" is not a command.\n'
|
print '\n "',usrInput,'" is not a command.\n'
|
||||||
usrPrompt = 1
|
usrPrompt = 1
|
||||||
|
|
|
@ -400,7 +400,7 @@ class sqlThread(threading.Thread):
|
||||||
queryreturn = self.cur.fetchall()
|
queryreturn = self.cur.fetchall()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
value, = row
|
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...')
|
logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...')
|
||||||
try:
|
try:
|
||||||
self.cur.execute( ''' VACUUM ''')
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
|
|
@ -2,6 +2,7 @@ import numpy
|
||||||
from struct import pack, unpack
|
from struct import pack, unpack
|
||||||
import time
|
import time
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import random
|
||||||
import pyopencl as cl
|
import pyopencl as cl
|
||||||
|
|
||||||
hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)])
|
hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)])
|
||||||
|
@ -14,7 +15,7 @@ try:
|
||||||
ctx = cl.create_some_context()
|
ctx = cl.create_some_context()
|
||||||
queue = cl.CommandQueue(ctx)
|
queue = cl.CommandQueue(ctx)
|
||||||
|
|
||||||
f = open('kernel.cl', 'r')
|
f = open('/usr/src/PyBitmessage/src/kernel.cl', 'r')
|
||||||
fstr = ''.join(f.readlines())
|
fstr = ''.join(f.readlines())
|
||||||
program = cl.Program(ctx, fstr).build()
|
program = cl.Program(ctx, fstr).build()
|
||||||
except:
|
except:
|
||||||
|
@ -42,7 +43,10 @@ def do_opencl_pow(hash, target):
|
||||||
kernel.set_arg(1, dest_buf)
|
kernel.set_arg(1, dest_buf)
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
#startpos = random.getrandbits(32) << 32 | random.getrandbits(32)
|
||||||
|
#startpos = random.getrandbits(32)
|
||||||
startpos = 0
|
startpos = 0
|
||||||
|
progress = 0
|
||||||
globamt = worksize*2000
|
globamt = worksize*2000
|
||||||
|
|
||||||
while output[0][0] == 0:
|
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_nd_range_kernel(queue, kernel, (globamt,), (worksize,))
|
||||||
cl.enqueue_read_buffer(queue, dest_buf, output)
|
cl.enqueue_read_buffer(queue, dest_buf, output)
|
||||||
queue.finish()
|
queue.finish()
|
||||||
|
#startpos == (globamt + startpos) & 0xFFFFFFFFFFFFFFFF
|
||||||
startpos += globamt
|
startpos += globamt
|
||||||
|
progress += globamt
|
||||||
sofar = time.time() - start
|
sofar = time.time() - start
|
||||||
print sofar, startpos / sofar, "hashes/sec"
|
print sofar, progress / sofar, "hashes/sec"
|
||||||
taken = time.time() - start
|
taken = time.time() - start
|
||||||
print startpos, taken
|
print progress, taken
|
||||||
return output[0][0]
|
return output[0][0]
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
target = 54227212183L
|
target = 54227212183L
|
||||||
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
|
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])
|
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||||
print "{} - value {} < {}".format(nonce, trialValue, target)
|
print "{} - value {} < {}".format(nonce, trialValue, target)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ from struct import unpack, pack
|
||||||
import sys
|
import sys
|
||||||
from shared import config, frozen
|
from shared import config, frozen
|
||||||
import shared
|
import shared
|
||||||
from openclpow import do_opencl_pow
|
import openclpow
|
||||||
#import os
|
#import os
|
||||||
|
|
||||||
def _set_idle():
|
def _set_idle():
|
||||||
|
@ -33,6 +33,7 @@ def _pool_worker(nonce, initialHash, target, pool_size):
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def _doSafePoW(target, initialHash):
|
def _doSafePoW(target, initialHash):
|
||||||
|
print "Safe POW\n"
|
||||||
nonce = 0
|
nonce = 0
|
||||||
trialValue = float('inf')
|
trialValue = float('inf')
|
||||||
while trialValue > target:
|
while trialValue > target:
|
||||||
|
@ -41,6 +42,7 @@ def _doSafePoW(target, initialHash):
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def _doFastPoW(target, initialHash):
|
def _doFastPoW(target, initialHash):
|
||||||
|
print "Fast POW\n"
|
||||||
import time
|
import time
|
||||||
from multiprocessing import Pool, cpu_count
|
from multiprocessing import Pool, cpu_count
|
||||||
try:
|
try:
|
||||||
|
@ -72,13 +74,14 @@ def _doFastPoW(target, initialHash):
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
|
|
||||||
def _doGPUPow(target, initialHash):
|
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])
|
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||||
#print "{} - value {} < {}".format(nonce, trialValue, target)
|
#print "{} - value {} < {}".format(nonce, trialValue, target)
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def run(target, initialHash):
|
def run(target, initialHash):
|
||||||
if has_opencl:
|
if openclpow.has_opencl():
|
||||||
return _doGPUPow(target, initialHash)
|
return _doGPUPow(target, initialHash)
|
||||||
elif frozen == "macosx_app" or not frozen:
|
elif frozen == "macosx_app" or not frozen:
|
||||||
return _doFastPoW(target, initialHash)
|
return _doFastPoW(target, initialHash)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user