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 committed by Peter Surda
parent 800fd2a143
commit 69309b82fb
5 changed files with 364 additions and 120 deletions

View File

@ -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
@ -149,10 +149,17 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
return (status, addressVersionNumber, streamNumber, ripe) return (status, addressVersionNumber, streamNumber, ripe)
def _handle_request(self, method, params):
#Request Handlers if method == 'helloWorld':
(a, b) = params
def HandleListAddresses(self, method): return a + '-' + b
elif method == 'add':
(a, b) = params
return a + b
elif method == 'statusBar':
message, = params
shared.UISignalQueue.put(('updateStatusBar', message))
elif method == 'listAddresses' or method == 'listAddresses2':
data = '{"addresses":[' data = '{"addresses":['
configSections = shared.config.sections() configSections = shared.config.sections()
for addressInKeysFile in configSections: for addressInKeysFile in configSections:
@ -172,6 +179,201 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
streamNumber, 'enabled': shared.config.getboolean(addressInKeysFile, 'enabled'), 'chan': chan}, indent=4, separators=(',', ': ')) streamNumber, 'enabled': shared.config.getboolean(addressInKeysFile, 'enabled'), 'chan': chan}, indent=4, separators=(',', ': '))
data += ']}' data += ']}'
return data 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
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 == '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")
address, label = params
label = self._decode(label, "base64")
address = addBMIfNotPresent(address)
self._verifyAddress(address)
queryreturn = sqlQuery("SELECT address FROM addressbook WHERE address=?", address)
if queryreturn != []:
raise APIError(16, 'You already have this address in your address book.')
sqlExecute("INSERT INTO addressbook VALUES(?,?)", label, address)
shared.UISignalQueue.put(('rerenderInboxFromLabels',''))
shared.UISignalQueue.put(('rerenderSentToLabels',''))
shared.UISignalQueue.put(('rerenderAddressBook',''))
return "Added address %s to address book" % address
elif method == 'deleteAddressBookEntry' or method == 'deleteAddressbook': # The deleteAddressbook alias should be deleted eventually.
if len(params) != 1:
raise APIError(0, "I need an address")
address, = params
address = addBMIfNotPresent(address)
self._verifyAddress(address)
sqlExecute('DELETE FROM addressbook WHERE address=?', address)
shared.UISignalQueue.put(('rerenderInboxFromLabels',''))
shared.UISignalQueue.put(('rerenderSentToLabels',''))
shared.UISignalQueue.put(('rerenderAddressBook',''))
return "Deleted address book entry for %s if it existed" % address
elif method == 'createRandomAddress':
if len(params) == 0:
raise APIError(0, 'I need parameters!')
elif len(params) == 1:
label, = params
eighteenByteRipe = False
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 2:
label, eighteenByteRipe = params
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 3:
label, eighteenByteRipe, totalDifficulty = params
nonceTrialsPerByte = int(
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 4:
label, eighteenByteRipe, totalDifficulty, smallMessageDifficulty = params
nonceTrialsPerByte = int(
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
payloadLengthExtraBytes = int(
shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty)
else:
raise APIError(0, 'Too many parameters!')
label = self._decode(label, "base64")
try:
unicode(label, 'utf-8')
except:
raise APIError(17, 'Label is not valid UTF-8 data.')
shared.apiAddressGeneratorReturnQueue.queue.clear()
streamNumberForAddress = 1
shared.addressGeneratorQueue.put((
'createRandomAddress', 4, streamNumberForAddress, label, 1, "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes))
return shared.apiAddressGeneratorReturnQueue.get()
elif method == 'createDeterministicAddresses':
if len(params) == 0:
raise APIError(0, 'I need parameters!')
elif len(params) == 1:
passphrase, = params
numberOfAddresses = 1
addressVersionNumber = 0
streamNumber = 0
eighteenByteRipe = False
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 2:
passphrase, numberOfAddresses = params
addressVersionNumber = 0
streamNumber = 0
eighteenByteRipe = False
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 3:
passphrase, numberOfAddresses, addressVersionNumber = params
streamNumber = 0
eighteenByteRipe = False
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 4:
passphrase, numberOfAddresses, addressVersionNumber, streamNumber = params
eighteenByteRipe = False
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 5:
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe = params
nonceTrialsPerByte = shared.config.get(
'bitmessagesettings', 'defaultnoncetrialsperbyte')
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 6:
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe, totalDifficulty = params
nonceTrialsPerByte = int(
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
payloadLengthExtraBytes = shared.config.get(
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
elif len(params) == 7:
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe, totalDifficulty, smallMessageDifficulty = params
nonceTrialsPerByte = int(
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
payloadLengthExtraBytes = int(
shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty)
else:
raise APIError(0, 'Too many parameters!')
if len(passphrase) == 0:
raise APIError(1, 'The specified passphrase is blank.')
if not isinstance(eighteenByteRipe, bool):
raise APIError(23, 'Bool expected in eighteenByteRipe, saw %s instead' % type(eighteenByteRipe))
passphrase = self._decode(passphrase, "base64")
if addressVersionNumber == 0: # 0 means "just use the proper addressVersionNumber"
addressVersionNumber = 4
if addressVersionNumber != 3 and addressVersionNumber != 4:
raise APIError(2,'The address version number currently must be 3, 4, or 0 (which means auto-select). ' + addressVersionNumber + ' isn\'t supported.')
if streamNumber == 0: # 0 means "just use the most available stream"
streamNumber = 1
if streamNumber != 1:
raise APIError(3,'The stream number must be 1 (or 0 which means auto-select). Others aren\'t supported.')
if numberOfAddresses == 0:
raise APIError(4, 'Why would you ask me to generate 0 addresses for you?')
if numberOfAddresses > 999:
raise APIError(5, 'You have (accidentally?) specified too many addresses to make. Maximum 999. This check only exists to prevent mischief; if you really want to create more addresses than this, contact the Bitmessage developers and we can modify the check or you can do it yourself by searching the source code for this message.')
shared.apiAddressGeneratorReturnQueue.queue.clear()
logger.debug('Requesting that the addressGenerator create %s addresses.', numberOfAddresses)
shared.addressGeneratorQueue.put(
('createDeterministicAddresses', addressVersionNumber, streamNumber,
'unused API address', numberOfAddresses, passphrase, eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes))
data = '{"addresses":['
queueReturn = shared.apiAddressGeneratorReturnQueue.get()
for item in queueReturn:
if len(data) > 20:
data += ','
if shared.config.has_option(addressInKeysFile, 'chan'):
chan = shared.config.getboolean(addressInKeysFile, 'chan')
else:
chan = False
label = shared.config.get(addressInKeysFile, 'label')
if method == 'listAddresses2':
label = label.encode('base64')
data += json.dumps({'label': label, 'address': addressInKeysFile, 'stream':
streamNumber, 'enabled': shared.config.getboolean(addressInKeysFile, 'enabled'), 'chan': chan}, indent=4, separators=(',', ': '))
data += ']}'
return data
def HandleListAddressBookEntries(self, params): def HandleListAddressBookEntries(self, params):
queryreturn = sqlQuery('''SELECT label, address from addressbook''') queryreturn = sqlQuery('''SELECT label, address from addressbook''')
@ -908,24 +1110,11 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
'''SELECT hash, payload FROM inventory WHERE tag = '' and objecttype = 2 ; ''') '''SELECT hash, payload FROM inventory WHERE tag = '' and objecttype = 2 ; ''')
with SqlBulkExecute() as sql: with SqlBulkExecute() as sql:
for row in queryreturn: for row in queryreturn:
hash01, payload = row transmitdata, = row
readPosition = 16 # Nonce length + time length data += json.dumps({'data':transmitdata.encode('hex')}, indent=4, separators=(',', ': '))
readPosition += decodeVarint(payload[readPosition:readPosition+10])[1] # Stream Number length
t = (payload[readPosition:readPosition+32],hash01)
sql.execute('''UPDATE inventory SET tag=? WHERE hash=?; ''', *t)
queryreturn = sqlQuery('''SELECT payload FROM inventory WHERE tag = ?''',
requestedHash)
data = '{"receivedMessageDatas":['
for row in queryreturn:
payload, = row
if len(data) > 25:
data += ','
data += json.dumps({'data':payload.encode('hex')}, indent=4, separators=(',', ': '))
data += ']}' data += ']}'
return data return data
elif method == 'clientStatus':
def HandleClientStatus(self, params):
if len(shared.connectedHostsList) == 0: if len(shared.connectedHostsList) == 0:
networkStatus = 'notConnected' networkStatus = 'notConnected'
elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections: elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections:
@ -933,8 +1122,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
else: else:
networkStatus = 'connectedAndReceivingIncomingConnections' networkStatus = 'connectedAndReceivingIncomingConnections'
return json.dumps({'networkConnections':len(shared.connectedHostsList),'numberOfMessagesProcessed':shared.numberOfMessagesProcessed, 'numberOfBroadcastsProcessed':shared.numberOfBroadcastsProcessed, 'numberOfPubkeysProcessed':shared.numberOfPubkeysProcessed, 'networkStatus':networkStatus, 'softwareName':'PyBitmessage','softwareVersion':shared.softwareVersion}, indent=4, separators=(',', ': ')) return json.dumps({'networkConnections':len(shared.connectedHostsList),'numberOfMessagesProcessed':shared.numberOfMessagesProcessed, 'numberOfBroadcastsProcessed':shared.numberOfBroadcastsProcessed, 'numberOfPubkeysProcessed':shared.numberOfPubkeysProcessed, 'networkStatus':networkStatus, 'softwareName':'PyBitmessage','softwareVersion':shared.softwareVersion}, indent=4, separators=(',', ': '))
elif method == 'decodeAddress':
def HandleDecodeAddress(self, params):
# Return a meaningful decoding of an address. # Return a meaningful decoding of an address.
if len(params) != 1: if len(params) != 1:
raise APIError(0, 'I need 1 parameter!') raise APIError(0, 'I need 1 parameter!')
@ -943,73 +1131,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':
def HandleHelloWorld(self, params): #queryreturn = sqlQuery('''SELECT read, received < 'now' - 60 AS old, COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' GROUP BY read, old''')
(a, b) = params ret = {}
return a + '-' + b queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received < 'now' - 60''')
for row in queryreturn:
def HandleAdd(self, params): count, = row
(a, b) = params ret['oldread'] = count
return a + b queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received < 'now' - 60''')
for row in queryreturn:
def HandleStatusBar(self, params): count, = row
message, = params ret['oldunread'] = count
shared.UISignalQueue.put(('updateStatusBar', message)) queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received >= 'now' - 60''')
for row in queryreturn:
count, = row
handlers = {} ret['newread'] = count
handlers['helloWorld'] = HandleHelloWorld queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received >= 'now' - 60''')
handlers['add'] = HandleAdd for row in queryreturn:
handlers['statusBar'] = HandleStatusBar count, = row
handlers['listAddresses'] = HandleListAddresses ret['newunread'] = count
handlers['listAddressBookEntries'] = HandleListAddressBookEntries; data = '{"inboxCount":{'
handlers['listAddressbook'] = HandleListAddressBookEntries # the listAddressbook alias should be removed eventually. for key in ret:
handlers['addAddressBookEntry'] = HandleAddAddressBookEntry val = ret[key]
handlers['addAddressbook'] = HandleAddAddressBookEntry # the addAddressbook alias should be deleted eventually. if len(data) > 16:
handlers['deleteAddressBookEntry'] = HandleDeleteAddressBookEntry data += ','
handlers['deleteAddressbook'] = HandleDeleteAddressBookEntry # The deleteAddressbook alias should be deleted eventually. data += json.dumps({key:val}, indent=4, separators=(',', ': '))
handlers['createRandomAddress'] = HandleCreateRandomAddress data += '}}'
handlers['createDeterministicAddresses'] = HandleCreateDeterministicAddresses elif method == 'getSentCount':
handlers['getDeterministicAddress'] = HandleGetDeterministicAddress ret = {}
handlers['createChan'] = HandleCreateChan queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgqueued' ''')
handlers['joinChan'] = HandleJoinChan for row in queryreturn:
handlers['leaveChan'] = HandleLeaveChan count, = row
handlers['deleteAddress'] = HandleDeleteAddress ret['queued'] = count
handlers['getAllInboxMessages'] = HandleGetAllInboxMessages queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgsent' ''')
handlers['getAllInboxMessageIds'] = HandleGetAllInboxMessageIds for row in queryreturn:
handlers['getAllInboxMessageIDs'] = HandleGetAllInboxMessageIds count, = row
handlers['getInboxMessageById'] = HandleGetInboxMessageById ret['awaitingack'] = count
handlers['getInboxMessageByID'] = HandleGetInboxMessageById data = '{"sentCount":{'
handlers['getAllSentMessages'] = HandleGetAllSentMessages for key in ret:
handlers['getAllSentMessageIds'] = HandleGetAllSentMessageIds val = ret[key]
handlers['getAllSentMessageIDs'] = HandleGetAllSentMessageIds if len(data) > 15:
handlers['getInboxMessagesByReceiver'] = HandleInboxMessagesByReceiver data += ','
handlers['getInboxMessagesByAddress'] = HandleInboxMessagesByReceiver #after some time getInboxMessagesByAddress should be removed data += json.dumps({key:val}, indent=4, separators=(',', ': '))
handlers['getSentMessageById'] = HandleGetSentMessageById data += '}}'
handlers['getSentMessageByID'] = HandleGetSentMessageById elif method == 'deleteAndVacuum':
handlers['getSentMessagesByAddress'] = HandleGetSentMessagesByAddress sqlStoredProcedure('deleteandvacuume')
handlers['getSentMessagesBySender'] = HandleGetSentMessagesByAddress return 'done'
handlers['getSentMessageByAckData'] = HandleGetSentMessagesByAckData
handlers['trashMessage'] = HandleTrashMessage
handlers['trashInboxMessage'] = HandleTrashInboxMessage
handlers['trashSentMessage'] = HandleTrashSentMessage
handlers['trashSentMessageByAckData'] = HandleTrashSentMessageByAckDAta
handlers['sendMessage'] = HandleSendMessage
handlers['sendBroadcast'] = HandleSendBroadcast
handlers['getStatus'] = HandleGetStatus
handlers['addSubscription'] = HandleAddSubscription
handlers['deleteSubscription'] = HandleDeleteSubscription
handlers['listSubscriptions'] = ListSubscriptions
handlers['disseminatePreEncryptedMsg'] = HandleDisseminatePreEncryptedMsg
handlers['disseminatePubkey'] = HandleDissimatePubKey
handlers['getMessageDataByDestinationHash'] = HandleGetMessageDataByDestinationHash
handlers['getMessageDataByDestinationTag'] = HandleGetMessageDataByDestinationHash
handlers['clientStatus'] = HandleClientStatus
handlers['decodeAddress'] = HandleDecodeAddress
def _handle_request(self, method, params):
if (self.handlers.has_key(method)):
return self.handlers[method](self ,params)
else: else:
raise APIError(20, 'Invalid method: %s' % method) raise APIError(20, 'Invalid method: %s' % method)

View File

@ -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

View File

@ -450,7 +450,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 ''')

View File

@ -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)

View File

@ -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)