commit
7b6bacc9eb
|
@ -21,7 +21,6 @@ import sys
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
import Queue
|
import Queue
|
||||||
from addresses import *
|
from addresses import *
|
||||||
#from shared import *
|
|
||||||
import shared
|
import shared
|
||||||
from defaultKnownNodes import *
|
from defaultKnownNodes import *
|
||||||
import time
|
import time
|
||||||
|
@ -47,6 +46,7 @@ from SimpleXMLRPCServer import *
|
||||||
import json
|
import json
|
||||||
from subprocess import call #used when the API must execute an outside program
|
from subprocess import call #used when the API must execute an outside program
|
||||||
import singleton
|
import singleton
|
||||||
|
import proofofwork
|
||||||
|
|
||||||
#For each stream to which we connect, several outgoingSynSender threads will exist and will collectively create 8 connections with peers.
|
#For each stream to which we connect, several outgoingSynSender threads will exist and will collectively create 8 connections with peers.
|
||||||
class outgoingSynSender(threading.Thread):
|
class outgoingSynSender(threading.Thread):
|
||||||
|
@ -321,19 +321,23 @@ class receiveDataThread(threading.Thread):
|
||||||
#print 'self.data is currently ', repr(self.data)
|
#print 'self.data is currently ', repr(self.data)
|
||||||
#shared.printLock.release()
|
#shared.printLock.release()
|
||||||
if len(self.data) < 20: #if so little of the data has arrived that we can't even unpack the payload length
|
if len(self.data) < 20: #if so little of the data has arrived that we can't even unpack the payload length
|
||||||
pass
|
return
|
||||||
elif self.data[0:4] != '\xe9\xbe\xb4\xd9':
|
if self.data[0:4] != '\xe9\xbe\xb4\xd9':
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
sys.stderr.write('The magic bytes were not correct. First 40 bytes of data: %s\n' % repr(self.data[0:40]))
|
sys.stderr.write('The magic bytes were not correct. First 40 bytes of data: %s\n' % repr(self.data[0:40]))
|
||||||
print 'self.data:', self.data.encode('hex')
|
print 'self.data:', self.data.encode('hex')
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
self.data = ""
|
self.data = ""
|
||||||
else:
|
return
|
||||||
self.payloadLength, = unpack('>L',self.data[16:20])
|
self.payloadLength, = unpack('>L',self.data[16:20])
|
||||||
if len(self.data) >= self.payloadLength+24: #check if the whole message has arrived yet. If it has,...
|
if len(self.data) < self.payloadLength+24: #check if the whole message has arrived yet.
|
||||||
if self.data[20:24] == hashlib.sha512(self.data[24:self.payloadLength+24]).digest()[0:4]:#test the checksum in the message. If it is correct...
|
return
|
||||||
#print 'message checksum is correct'
|
if self.data[20:24] != hashlib.sha512(self.data[24:self.payloadLength+24]).digest()[0:4]:#test the checksum in the message. If it is correct...
|
||||||
|
print 'Checksum incorrect. Clearing this message.'
|
||||||
|
self.data = self.data[self.payloadLength+24:]
|
||||||
|
self.processData()
|
||||||
|
return
|
||||||
#The time we've last seen this node is obviously right now since we just received valid data from it. So update the knownNodes list so that other peers can be made aware of its existance.
|
#The time we've last seen this node is obviously right now since we just received valid data from it. So update the knownNodes list so that other peers can be made aware of its existance.
|
||||||
if self.initiatedConnection and self.connectionIsOrWasFullyEstablished: #The remote port is only something we should share with others if it is the remote node's incoming port (rather than some random operating-system-assigned outgoing port).
|
if self.initiatedConnection and self.connectionIsOrWasFullyEstablished: #The remote port is only something we should share with others if it is the remote node's incoming port (rather than some random operating-system-assigned outgoing port).
|
||||||
shared.knownNodesLock.acquire()
|
shared.knownNodesLock.acquire()
|
||||||
|
@ -413,9 +417,8 @@ class receiveDataThread(threading.Thread):
|
||||||
if len(self.ackDataThatWeHaveYetToSend) > 0:
|
if len(self.ackDataThatWeHaveYetToSend) > 0:
|
||||||
self.data = self.ackDataThatWeHaveYetToSend.pop()
|
self.data = self.ackDataThatWeHaveYetToSend.pop()
|
||||||
self.processData()
|
self.processData()
|
||||||
else:
|
|
||||||
print 'Checksum incorrect. Clearing this message.'
|
|
||||||
self.data = self.data[self.payloadLength+24:]
|
|
||||||
|
|
||||||
def isProofOfWorkSufficient(self,data,nonceTrialsPerByte=0,payloadLengthExtraBytes=0):
|
def isProofOfWorkSufficient(self,data,nonceTrialsPerByte=0,payloadLengthExtraBytes=0):
|
||||||
if nonceTrialsPerByte < shared.networkDefaultProofOfWorkNonceTrialsPerByte:
|
if nonceTrialsPerByte < shared.networkDefaultProofOfWorkNonceTrialsPerByte:
|
||||||
|
@ -941,8 +944,7 @@ class receiveDataThread(threading.Thread):
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),encryptedData[readPosition:],'Acknowledgement of the message received just now.')
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(encryptedData[readPosition:],'Acknowledgement of the message received just now. '+ unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))))
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(encryptedData[readPosition:],'Acknowledgement of the message received just now.')))
|
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
|
@ -1152,7 +1154,7 @@ class receiveDataThread(threading.Thread):
|
||||||
|
|
||||||
#self.emit(SIGNAL("displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),toAddress,'[Broadcast subscribers]',fromAddress,subject,message,ackdata)
|
#self.emit(SIGNAL("displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),toAddress,'[Broadcast subscribers]',fromAddress,subject,message,ackdata)
|
||||||
shared.UISignalQueue.put(('displayNewSentMessage',(toAddress,'[Broadcast subscribers]',fromAddress,subject,message,ackdata)))
|
shared.UISignalQueue.put(('displayNewSentMessage',(toAddress,'[Broadcast subscribers]',fromAddress,subject,message,ackdata)))
|
||||||
shared.workerQueue.put(('sendbroadcast',(fromAddress,subject,message)))
|
shared.workerQueue.put(('sendbroadcast',''))
|
||||||
|
|
||||||
if self.isAckDataValid(ackData):
|
if self.isAckDataValid(ackData):
|
||||||
print 'ackData is valid. Will process it.'
|
print 'ackData is valid. Will process it.'
|
||||||
|
@ -1504,12 +1506,18 @@ class receiveDataThread(threading.Thread):
|
||||||
|
|
||||||
#We have received an inv message
|
#We have received an inv message
|
||||||
def recinv(self,data):
|
def recinv(self,data):
|
||||||
totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = 0
|
totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = 0 # ..from all peers, counting duplicates seperately (because they take up memory)
|
||||||
print 'number of keys(hosts) in numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer:', len(numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer)
|
if len(numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer) > 0:
|
||||||
for key, value in numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer.items():
|
for key, value in numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer.items():
|
||||||
totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave += value
|
totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave += value
|
||||||
|
shared.printLock.acquire()
|
||||||
|
print 'number of keys(hosts) in numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer:', len(numberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHavePerPeer)
|
||||||
print 'totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = ', totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave
|
print 'totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave = ', totalNumberOfObjectsThatWeHaveYetToCheckAndSeeWhetherWeAlreadyHave
|
||||||
|
shared.printLock.release()
|
||||||
numberOfItemsInInv, lengthOfVarint = decodeVarint(data[:10])
|
numberOfItemsInInv, lengthOfVarint = decodeVarint(data[:10])
|
||||||
|
if numberOfItemsInInv > 50000:
|
||||||
|
sys.stderr.write('Too many items in inv message!')
|
||||||
|
return
|
||||||
if len(data) < lengthOfVarint + (numberOfItemsInInv * 32):
|
if len(data) < lengthOfVarint + (numberOfItemsInInv * 32):
|
||||||
print 'inv message doesn\'t contain enough data. Ignoring.'
|
print 'inv message doesn\'t contain enough data. Ignoring.'
|
||||||
return
|
return
|
||||||
|
@ -2426,6 +2434,13 @@ class sqlThread(threading.Thread):
|
||||||
print 'Vacuuming message.dat. You might notice that the file size gets much smaller.'
|
print 'Vacuuming message.dat. You might notice that the file size gets much smaller.'
|
||||||
self.cur.execute( ''' VACUUM ''')
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
|
||||||
|
#After code refactoring, the possible status values for sent messages as changed.
|
||||||
|
self.cur.execute( '''update sent set status='doingmsgpow' where status='doingpow' ''')
|
||||||
|
self.cur.execute( '''update sent set status='msgsent' where status='sentmessage' ''')
|
||||||
|
self.cur.execute( '''update sent set status='doingpubkeypow' where status='findingpubkey' ''')
|
||||||
|
self.cur.execute( '''update sent set status='broadcastqueued' where status='broadcastpending' ''')
|
||||||
|
self.conn.commit()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
testpayload = '\x00\x00'
|
testpayload = '\x00\x00'
|
||||||
t = ('1234',testpayload,'12345678','no')
|
t = ('1234',testpayload,'12345678','no')
|
||||||
|
@ -2537,7 +2552,6 @@ class singleCleaner(threading.Thread):
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
del shared.inventory[hash]
|
del shared.inventory[hash]
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),"")
|
|
||||||
shared.UISignalQueue.put(('updateStatusBar',''))
|
shared.UISignalQueue.put(('updateStatusBar',''))
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
shared.broadcastToSendDataQueues((0, 'pong', 'no data')) #commands the sendData threads to send out a pong message if they haven't sent anything else in the last five minutes. The socket timeout-time is 10 minutes.
|
shared.broadcastToSendDataQueues((0, 'pong', 'no data')) #commands the sendData threads to send out a pong message if they haven't sent anything else in the last five minutes. The socket timeout-time is 10 minutes.
|
||||||
|
@ -2548,7 +2562,7 @@ class singleCleaner(threading.Thread):
|
||||||
timeWeLastClearedInventoryAndPubkeysTables = int(time.time())
|
timeWeLastClearedInventoryAndPubkeysTables = int(time.time())
|
||||||
#inventory (moves data from the inventory data structure to the on-disk sql database)
|
#inventory (moves data from the inventory data structure to the on-disk sql database)
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
#inventory (clears data more than 2 days and 12 hours old)
|
#inventory (clears pubkeys after 28 days and everything else after 2 days and 12 hours)
|
||||||
t = (int(time.time())-lengthOfTimeToLeaveObjectsInInventory,int(time.time())-lengthOfTimeToHoldOnToAllPubkeys)
|
t = (int(time.time())-lengthOfTimeToLeaveObjectsInInventory,int(time.time())-lengthOfTimeToHoldOnToAllPubkeys)
|
||||||
shared.sqlSubmitQueue.put('''DELETE FROM inventory WHERE (receivedtime<? AND objecttype<>'pubkey') OR (receivedtime<? AND objecttype='pubkey') ''')
|
shared.sqlSubmitQueue.put('''DELETE FROM inventory WHERE (receivedtime<? AND objecttype<>'pubkey') OR (receivedtime<? AND objecttype='pubkey') ''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
@ -2562,7 +2576,7 @@ class singleCleaner(threading.Thread):
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
|
||||||
t = ()
|
t = ()
|
||||||
shared.sqlSubmitQueue.put('''select toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber FROM sent WHERE ((status='findingpubkey' OR status='sentmessage') AND folder='sent') ''') #If the message's folder='trash' then we'll ignore it.
|
shared.sqlSubmitQueue.put('''select toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber FROM sent WHERE ((status='awaitingpubkey' OR status='msgsent') AND folder='sent') ''') #If the message's folder='trash' then we'll ignore it.
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
|
@ -2573,28 +2587,31 @@ class singleCleaner(threading.Thread):
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
break
|
break
|
||||||
toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber = row
|
toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber = row
|
||||||
if status == 'findingpubkey':
|
if status == 'awaitingpubkey':
|
||||||
if int(time.time()) - lastactiontime > (maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (pubkeyretrynumber))):
|
if int(time.time()) - lastactiontime > (maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (pubkeyretrynumber))):
|
||||||
print 'It has been a long time and we haven\'t heard a response to our getpubkey request. Sending again.'
|
print 'It has been a long time and we haven\'t heard a response to our getpubkey request. Sending again.'
|
||||||
try:
|
try:
|
||||||
del neededPubkeys[toripe] #We need to take this entry out of the neededPubkeys structure because the shared.workerQueue checks to see whether the entry is already present and will not do the POW and send the message because it assumes that it has already done it recently.
|
del neededPubkeys[toripe] #We need to take this entry out of the neededPubkeys structure because the shared.workerQueue checks to see whether the entry is already present and will not do the POW and send the message because it assumes that it has already done it recently.
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
shared.workerQueue.put(('sendmessage',toaddress))
|
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),"Doing work necessary to again attempt to request a public key...")
|
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),"Doing work necessary to again attempt to request a public key...")
|
||||||
shared.UISignalQueue.put(('updateStatusBar','Doing work necessary to again attempt to request a public key...'))
|
shared.UISignalQueue.put(('updateStatusBar','Doing work necessary to again attempt to request a public key...'))
|
||||||
t = (int(time.time()),pubkeyretrynumber+1,toripe)
|
t = (int(time.time()),pubkeyretrynumber+1,toripe)
|
||||||
shared.sqlSubmitQueue.put('''UPDATE sent SET lastactiontime=?, pubkeyretrynumber=? WHERE toripe=?''')
|
shared.sqlSubmitQueue.put('''UPDATE sent SET lastactiontime=?, pubkeyretrynumber=?, status='msgqueued' WHERE toripe=?''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
else:# status == sentmessage
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.workerQueue.put(('sendmessage',''))
|
||||||
|
else:# status == msgsent
|
||||||
if int(time.time()) - lastactiontime > (maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (msgretrynumber))):
|
if int(time.time()) - lastactiontime > (maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (msgretrynumber))):
|
||||||
print 'It has been a long time and we haven\'t heard an acknowledgement to our msg. Sending again.'
|
print 'It has been a long time and we haven\'t heard an acknowledgement to our msg. Sending again.'
|
||||||
t = (int(time.time()),msgretrynumber+1,'findingpubkey',ackdata)
|
t = (int(time.time()),msgretrynumber+1,'msgqueued',ackdata)
|
||||||
shared.sqlSubmitQueue.put('''UPDATE sent SET lastactiontime=?, msgretrynumber=?, status=? WHERE ackdata=?''')
|
shared.sqlSubmitQueue.put('''UPDATE sent SET lastactiontime=?, msgretrynumber=?, status=? WHERE ackdata=?''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
shared.workerQueue.put(('sendmessage',toaddress))
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.workerQueue.put(('sendmessage',''))
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),"Doing work necessary to again attempt to deliver a message...")
|
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),"Doing work necessary to again attempt to deliver a message...")
|
||||||
shared.UISignalQueue.put(('updateStatusBar','Doing work necessary to again attempt to deliver a message...'))
|
shared.UISignalQueue.put(('updateStatusBar','Doing work necessary to again attempt to deliver a message...'))
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
@ -2608,85 +2625,34 @@ class singleWorker(threading.Thread):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
time.sleep(10)
|
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
shared.sqlSubmitQueue.put('''SELECT toripe FROM sent WHERE (status=? AND folder='sent')''')
|
shared.sqlSubmitQueue.put('''SELECT toripe FROM sent WHERE (status='awaitingpubkey' AND folder='sent')''')
|
||||||
shared.sqlSubmitQueue.put(('findingpubkey',))
|
shared.sqlSubmitQueue.put('')
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
toripe, = row
|
toripe, = row
|
||||||
#It is possible for the status of a message in our sent folder (which is also our 'outbox' folder) to have a status of 'findingpubkey' even if we have the pubkey. This can
|
|
||||||
#happen if the worker thread is working on the POW for an earlier message and does not get to the message in question before the user closes Bitmessage. In this case, the
|
|
||||||
#status will still be 'findingpubkey' but Bitmessage will never have checked to see whether it actually already has the pubkey. We should therefore check here.
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put('''SELECT hash FROM pubkeys WHERE hash=? ''')
|
|
||||||
shared.sqlSubmitQueue.put((toripe,))
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
if queryreturn != []: #If we have the pubkey then send the message otherwise put the hash in the neededPubkeys data structure so that we will pay attention to it if it comes over the wire.
|
|
||||||
self.sendMsg(toripe)
|
|
||||||
else:
|
|
||||||
neededPubkeys[toripe] = 0
|
neededPubkeys[toripe] = 0
|
||||||
|
|
||||||
self.sendBroadcast() #just in case there are any proof of work tasks for Broadcasts that have yet to be sent.
|
|
||||||
|
|
||||||
#Now let us see if there are any proofs of work for msg messages that we have yet to complete..
|
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('doingpow',)
|
shared.sqlSubmitQueue.put('''SELECT DISTINCT toaddress FROM sent WHERE (status='doingpubkeypow' AND folder='sent')''')
|
||||||
shared.sqlSubmitQueue.put('''SELECT toripe FROM sent WHERE status=? and folder='sent' ''')
|
shared.sqlSubmitQueue.put('')
|
||||||
shared.sqlSubmitQueue.put(t)
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
toripe, = row
|
toaddress, = row
|
||||||
#Evidentially there is a remote possibility that we may, for some reason, no longer have the recipient's pubkey. Let us make sure we still have it or else the sendMsg function will appear to freeze.
|
self.requestPubKey(toaddress)
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put('''SELECT hash FROM pubkeys WHERE hash=? ''')
|
time.sleep(10) #give some time for the GUI to start before we start on any existing POW tasks.
|
||||||
shared.sqlSubmitQueue.put((toripe,))
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
self.sendMsg() #just in case there are any pending tasks for msg messages that have yet to be sent.
|
||||||
shared.sqlLock.release()
|
self.sendBroadcast() #just in case there are any tasks for Broadcasts that have yet to be sent.
|
||||||
if queryreturn != []:
|
|
||||||
#We have the needed pubkey
|
|
||||||
self.sendMsg(toripe)
|
|
||||||
else:
|
|
||||||
shared.printLock.acquire()
|
|
||||||
sys.stderr.write('For some reason, the status of a message in our outbox is \'doingpow\' even though we lack the pubkey. Here is the RIPE hash of the needed pubkey: %s\n' % toripe.encode('hex'))
|
|
||||||
shared.printLock.release()
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
command, data = shared.workerQueue.get()
|
command, data = shared.workerQueue.get()
|
||||||
#statusbar = 'The singleWorker thread is working on work.'
|
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),statusbar)
|
|
||||||
if command == 'sendmessage':
|
if command == 'sendmessage':
|
||||||
toAddress = data
|
self.sendMsg()
|
||||||
toStatus,toAddressVersionNumber,toStreamNumber,toRipe = decodeAddress(toAddress)
|
|
||||||
#print 'message type', type(message)
|
|
||||||
#print repr(message.toUtf8())
|
|
||||||
#print str(message.toUtf8())
|
|
||||||
shared.sqlLock.acquire()
|
|
||||||
shared.sqlSubmitQueue.put('SELECT hash FROM pubkeys WHERE hash=?')
|
|
||||||
shared.sqlSubmitQueue.put((toRipe,))
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
|
||||||
shared.sqlLock.release()
|
|
||||||
#print 'queryreturn', queryreturn
|
|
||||||
if queryreturn == []:
|
|
||||||
#We'll need to request the pub key because we don't have it.
|
|
||||||
if not toRipe in neededPubkeys:
|
|
||||||
neededPubkeys[toRipe] = 0
|
|
||||||
print 'requesting pubkey:', toRipe.encode('hex')
|
|
||||||
self.requestPubKey(toAddressVersionNumber,toStreamNumber,toRipe)
|
|
||||||
else:
|
|
||||||
print 'We have already requested this pubkey (the ripe hash is in neededPubkeys). We will re-request again soon.'
|
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"),toRipe,'Public key was requested earlier. Receiver must be offline. Will retry.')
|
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByHash',(toRipe,'Public key was requested earlier. Receiver must be offline. Will retry.')))
|
|
||||||
|
|
||||||
else:
|
|
||||||
print 'We already have the necessary public key.'
|
|
||||||
self.sendMsg(toRipe) #by calling this function, we are asserting that we already have the pubkey for toRipe
|
|
||||||
elif command == 'sendbroadcast':
|
elif command == 'sendbroadcast':
|
||||||
print 'Within WorkerThread, processing sendbroadcast command.'
|
|
||||||
fromAddress,subject,message = data
|
|
||||||
self.sendBroadcast()
|
self.sendBroadcast()
|
||||||
elif command == 'doPOWForMyV2Pubkey':
|
elif command == 'doPOWForMyV2Pubkey':
|
||||||
self.doPOWForMyV2Pubkey(data)
|
self.doPOWForMyV2Pubkey(data)
|
||||||
|
@ -2697,7 +2663,14 @@ class singleWorker(threading.Thread):
|
||||||
if toRipe in neededPubkeys:
|
if toRipe in neededPubkeys:
|
||||||
print 'We have been awaiting the arrival of this pubkey.'
|
print 'We have been awaiting the arrival of this pubkey.'
|
||||||
del neededPubkeys[toRipe]
|
del neededPubkeys[toRipe]
|
||||||
self.sendMsg(toRipe)
|
t = (toRipe,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='doingmsgpow' WHERE toripe=? AND status='awaitingpubkey' and folder='sent' ''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
self.sendMsg()
|
||||||
else:
|
else:
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print 'We don\'t need this pub key. We didn\'t ask for it. Pubkey hash:', toRipe.encode('hex')
|
print 'We don\'t need this pub key. We didn\'t ask for it. Pubkey hash:', toRipe.encode('hex')
|
||||||
|
@ -2706,7 +2679,6 @@ class singleWorker(threading.Thread):
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
sys.stderr.write('Probable programming error: The command sent to the workerThread is weird. It is: %s\n' % command)
|
sys.stderr.write('Probable programming error: The command sent to the workerThread is weird. It is: %s\n' % command)
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
|
|
||||||
shared.workerQueue.task_done()
|
shared.workerQueue.task_done()
|
||||||
|
|
||||||
def doPOWForMyV2Pubkey(self,hash): #This function also broadcasts out the pubkey message once it is done with the POW
|
def doPOWForMyV2Pubkey(self,hash): #This function also broadcasts out the pubkey message once it is done with the POW
|
||||||
|
@ -2744,16 +2716,11 @@ class singleWorker(threading.Thread):
|
||||||
payload += pubEncryptionKey[1:]
|
payload += pubEncryptionKey[1:]
|
||||||
|
|
||||||
#Do the POW for this pubkey message
|
#Do the POW for this pubkey message
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
print '(For pubkey message) Doing proof of work...'
|
print '(For pubkey message) Doing proof of work...'
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
print '(For pubkey message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For pubkey message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
|
|
||||||
payload = pack('>Q',nonce) + payload
|
payload = pack('>Q',nonce) + payload
|
||||||
"""t = (hash,payload,embeddedTime,'no')
|
"""t = (hash,payload,embeddedTime,'no')
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
|
@ -2810,14 +2777,10 @@ class singleWorker(threading.Thread):
|
||||||
payload += signature
|
payload += signature
|
||||||
|
|
||||||
#Do the POW for this pubkey message
|
#Do the POW for this pubkey message
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
print '(For pubkey message) Doing proof of work...'
|
print '(For pubkey message) Doing proof of work...'
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
print '(For pubkey message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For pubkey message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
|
|
||||||
payload = pack('>Q',nonce) + payload
|
payload = pack('>Q',nonce) + payload
|
||||||
|
@ -2885,16 +2848,12 @@ class singleWorker(threading.Thread):
|
||||||
payload += encodeVarint(len(signature))
|
payload += encodeVarint(len(signature))
|
||||||
payload += signature
|
payload += signature
|
||||||
|
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
print '(For broadcast message) Doing proof of work...'
|
print '(For broadcast message) Doing proof of work...'
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send broadcast...')
|
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send broadcast...')
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send broadcast...')))
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send broadcast...')))
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
print '(For broadcast message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For broadcast message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
|
|
||||||
payload = pack('>Q',nonce) + payload
|
payload = pack('>Q',nonce) + payload
|
||||||
|
@ -2902,7 +2861,7 @@ class singleWorker(threading.Thread):
|
||||||
inventoryHash = calculateInventoryHash(payload)
|
inventoryHash = calculateInventoryHash(payload)
|
||||||
objectType = 'broadcast'
|
objectType = 'broadcast'
|
||||||
shared.inventory[inventoryHash] = (objectType, streamNumber, payload, int(time.time()))
|
shared.inventory[inventoryHash] = (objectType, streamNumber, payload, int(time.time()))
|
||||||
print 'sending inv (within sendBroadcast function)'
|
print 'Broadcasting inv for my broadcast (within sendBroadcast function):', inventoryHash.encode('hex')
|
||||||
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
||||||
|
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Broadcast sent on '+unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))
|
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Broadcast sent on '+unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))
|
||||||
|
@ -2956,16 +2915,12 @@ class singleWorker(threading.Thread):
|
||||||
pubEncryptionKey = pointMult(privEncryptionKey)
|
pubEncryptionKey = pointMult(privEncryptionKey)
|
||||||
payload += highlevelcrypto.encrypt(dataToEncrypt,pubEncryptionKey.encode('hex'))
|
payload += highlevelcrypto.encrypt(dataToEncrypt,pubEncryptionKey.encode('hex'))
|
||||||
|
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
print '(For broadcast message) Doing proof of work...'
|
print '(For broadcast message) Doing proof of work...'
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send broadcast...')
|
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send broadcast...')
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send broadcast...')))
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send broadcast...')))
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
print '(For broadcast message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For broadcast message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
|
|
||||||
payload = pack('>Q',nonce) + payload
|
payload = pack('>Q',nonce) + payload
|
||||||
|
@ -2992,25 +2947,83 @@ class singleWorker(threading.Thread):
|
||||||
sys.stderr.write('Error: In the singleWorker thread, the sendBroadcast function doesn\'t understand the address version.\n')
|
sys.stderr.write('Error: In the singleWorker thread, the sendBroadcast function doesn\'t understand the address version.\n')
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
|
|
||||||
def sendMsg(self,toRipe):
|
def sendMsg(self):
|
||||||
|
#Check to see if there are any messages queued to be sent
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('doingpow','findingpubkey',toRipe)
|
shared.sqlSubmitQueue.put('''SELECT toaddress FROM sent WHERE (status='msgqueued' AND folder='sent')''')
|
||||||
shared.sqlSubmitQueue.put('''UPDATE sent SET status=? WHERE status=? AND toripe=? and folder='sent' ''')
|
shared.sqlSubmitQueue.put('')
|
||||||
shared.sqlSubmitQueue.put(t)
|
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlLock.release()
|
||||||
|
for row in queryreturn: #For each address to which we need to send a message, check to see if we have its pubkey already.
|
||||||
t = ('doingpow',toRipe)
|
toaddress, = row
|
||||||
shared.sqlSubmitQueue.put('''SELECT toaddress, fromaddress, subject, message, ackdata FROM sent WHERE status=? AND toripe=? and folder='sent' ''')
|
toripe = decodeAddress(toaddress)[3]
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''SELECT hash FROM pubkeys WHERE hash=? ''')
|
||||||
|
shared.sqlSubmitQueue.put((toripe,))
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
if queryreturn != []: #If we have the needed pubkey, set the status to doingmsgpow (we'll do it further down)
|
||||||
|
t = (toaddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='doingmsgpow' WHERE toaddress=? AND status='msgqueued' ''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
else: #We don't have the needed pubkey. Set the status to 'awaitingpubkey' and request it if we haven't already
|
||||||
|
if toripe in neededPubkeys:
|
||||||
|
#We already sent a request for the pubkey
|
||||||
|
t = (toaddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='awaitingpubkey' WHERE toaddress=? AND status='msgqueued' ''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
shared.UISignalQueue.put(('updateSentItemStatusByHash',(toripe,'Encryption key was requested earlier.')))
|
||||||
|
else:
|
||||||
|
#We have not yet sent a request for the pubkey
|
||||||
|
t = (toaddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='doingpubkeypow' WHERE toaddress=? AND status='msgqueued' ''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
shared.UISignalQueue.put(('updateSentItemStatusByHash',(toripe,'Sending a request for the recipient\'s encryption key.')))
|
||||||
|
self.requestPubKey(toaddress)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''SELECT toaddress, toripe, fromaddress, subject, message, ackdata FROM sent WHERE status='doingmsgpow' and folder='sent' ''')
|
||||||
|
shared.sqlSubmitQueue.put('')
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
toaddress, fromaddress, subject, message, ackdata = row
|
toaddress, toripe, fromaddress, subject, message, ackdata = row
|
||||||
|
|
||||||
|
#Evidently there is a remote possibility that we may no longer have the recipient's pubkey. Let us make sure we still have it or else the sendMsg function will appear to freeze.
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''SELECT hash FROM pubkeys WHERE hash=? ''')
|
||||||
|
shared.sqlSubmitQueue.put((toripe,))
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
if queryreturn == []:
|
||||||
|
#We no longer have the needed pubkey
|
||||||
|
shared.printLock.acquire()
|
||||||
|
sys.stderr.write('For some reason, the status of a message in our outbox is \'doingmsgpow\' even though we lack the pubkey. Here is the RIPE hash of the needed pubkey: %s\n' % toripe.encode('hex'))
|
||||||
|
shared.printLock.release()
|
||||||
|
t = (toaddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='msgqueued' WHERE toaddress=? AND status='doingmsgpow' ''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
shared.UISignalQueue.put(('updateSentItemStatusByHash',(toripe,'Sending a request for the recipient\'s encryption key.')))
|
||||||
|
self.requestPubKey(toaddress)
|
||||||
|
return
|
||||||
ackdataForWhichImWatching[ackdata] = 0
|
ackdataForWhichImWatching[ackdata] = 0
|
||||||
toStatus,toAddressVersionNumber,toStreamNumber,toHash = decodeAddress(toaddress)
|
toStatus,toAddressVersionNumber,toStreamNumber,toHash = decodeAddress(toaddress)
|
||||||
fromStatus,fromAddressVersionNumber,fromStreamNumber,fromHash = decodeAddress(fromaddress)
|
fromStatus,fromAddressVersionNumber,fromStreamNumber,fromHash = decodeAddress(fromaddress)
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send the message.')
|
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send the message.')))
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Doing work necessary to send the message.')))
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print 'Found a message in our database that needs to be sent with this pubkey.'
|
print 'Found a message in our database that needs to be sent with this pubkey.'
|
||||||
|
@ -3102,7 +3115,7 @@ class singleWorker(threading.Thread):
|
||||||
if toAddressVersionNumber == 2 or toAddressVersionNumber == 3:
|
if toAddressVersionNumber == 2 or toAddressVersionNumber == 3:
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
shared.sqlSubmitQueue.put('SELECT transmitdata FROM pubkeys WHERE hash=?')
|
shared.sqlSubmitQueue.put('SELECT transmitdata FROM pubkeys WHERE hash=?')
|
||||||
shared.sqlSubmitQueue.put((toRipe,))
|
shared.sqlSubmitQueue.put((toripe,))
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
if queryreturn == []:
|
if queryreturn == []:
|
||||||
|
@ -3137,10 +3150,9 @@ class singleWorker(threading.Thread):
|
||||||
requiredAverageProofOfWorkNonceTrialsPerByte = shared.networkDefaultProofOfWorkNonceTrialsPerByte
|
requiredAverageProofOfWorkNonceTrialsPerByte = shared.networkDefaultProofOfWorkNonceTrialsPerByte
|
||||||
if requiredPayloadLengthExtraBytes < shared.networkDefaultPayloadLengthExtraBytes:
|
if requiredPayloadLengthExtraBytes < shared.networkDefaultPayloadLengthExtraBytes:
|
||||||
requiredPayloadLengthExtraBytes = shared.networkDefaultPayloadLengthExtraBytes
|
requiredPayloadLengthExtraBytes = shared.networkDefaultPayloadLengthExtraBytes
|
||||||
|
#todo: pull yet-to-be-added values out of config: maximumacceptabletotaldifficult and maximumacceptablesmallmessagedifficulty and compare.
|
||||||
encrypted = highlevelcrypto.encrypt(payload,"04"+pubEncryptionKeyBase256.encode('hex'))
|
encrypted = highlevelcrypto.encrypt(payload,"04"+pubEncryptionKeyBase256.encode('hex'))
|
||||||
|
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
#We are now dropping the unencrypted data in payload since it has already been encrypted and replacing it with the encrypted payload that we will send out.
|
#We are now dropping the unencrypted data in payload since it has already been encrypted and replacing it with the encrypted payload that we will send out.
|
||||||
payload = embeddedTime + encodeVarint(toStreamNumber) + encrypted
|
payload = embeddedTime + encodeVarint(toStreamNumber) + encrypted
|
||||||
target = 2**64 / ((len(payload)+requiredPayloadLengthExtraBytes+8) * requiredAverageProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+requiredPayloadLengthExtraBytes+8) * requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
|
@ -3149,9 +3161,7 @@ class singleWorker(threading.Thread):
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
powStartTime = time.time()
|
powStartTime = time.time()
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
print '(For msg message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For msg message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
try:
|
try:
|
||||||
print 'POW took', int(time.time()-powStartTime), 'seconds.', nonce/(time.time()-powStartTime), 'nonce trials per second.'
|
print 'POW took', int(time.time()-powStartTime), 'seconds.', nonce/(time.time()-powStartTime), 'nonce trials per second.'
|
||||||
|
@ -3164,17 +3174,17 @@ class singleWorker(threading.Thread):
|
||||||
shared.inventory[inventoryHash] = (objectType, toStreamNumber, payload, int(time.time()))
|
shared.inventory[inventoryHash] = (objectType, toStreamNumber, payload, int(time.time()))
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Message sent. Waiting on acknowledgement. Sent on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))
|
#self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Message sent. Waiting on acknowledgement. Sent on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Message sent. Waiting on acknowledgement. Sent on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))))
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,'Message sent. Waiting on acknowledgement. Sent on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))))
|
||||||
print 'sending inv (within sendmsg function)'
|
print 'Broadcasting inv for my msg(within sendmsg function):', inventoryHash.encode('hex')
|
||||||
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
||||||
|
|
||||||
#Update the status of the message in the 'sent' table to have a 'sent' status
|
#Update the status of the message in the 'sent' table to have a 'sent' status
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('sentmessage',toaddress, fromaddress, subject, message,'doingpow')
|
t = ('msgsent',toaddress, fromaddress, subject, message,'doingmsgpow')
|
||||||
shared.sqlSubmitQueue.put('UPDATE sent SET status=? WHERE toaddress=? AND fromaddress=? AND subject=? AND message=? AND status=?')
|
shared.sqlSubmitQueue.put('UPDATE sent SET status=? WHERE toaddress=? AND fromaddress=? AND subject=? AND message=? AND status=?')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
|
||||||
t = (toRipe,)
|
t = (toripe,)
|
||||||
shared.sqlSubmitQueue.put('''UPDATE pubkeys SET usedpersonally='yes' WHERE hash=?''')
|
shared.sqlSubmitQueue.put('''UPDATE pubkeys SET usedpersonally='yes' WHERE hash=?''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
@ -3182,7 +3192,9 @@ class singleWorker(threading.Thread):
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
|
|
||||||
|
|
||||||
def requestPubKey(self,addressVersionNumber,streamNumber,ripe):
|
def requestPubKey(self,toAddress):
|
||||||
|
toStatus,addressVersionNumber,streamNumber,ripe = decodeAddress(toAddress)
|
||||||
|
neededPubkeys[ripe] = 0
|
||||||
payload = pack('>I',(int(time.time())+random.randrange(-300, 300)))#the current time plus or minus five minutes.
|
payload = pack('>I',(int(time.time())+random.randrange(-300, 300)))#the current time plus or minus five minutes.
|
||||||
payload += encodeVarint(addressVersionNumber)
|
payload += encodeVarint(addressVersionNumber)
|
||||||
payload += encodeVarint(streamNumber)
|
payload += encodeVarint(streamNumber)
|
||||||
|
@ -3190,20 +3202,14 @@ class singleWorker(threading.Thread):
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print 'making request for pubkey with ripe:', ripe.encode('hex')
|
print 'making request for pubkey with ripe:', ripe.encode('hex')
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
#print 'trial value', trialValue
|
#print 'trial value', trialValue
|
||||||
statusbar = 'Doing the computations necessary to request the recipient\'s public key.'
|
statusbar = 'Doing the computations necessary to request the recipient\'s public key.'
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),statusbar)
|
|
||||||
shared.UISignalQueue.put(('updateStatusBar',statusbar))
|
shared.UISignalQueue.put(('updateStatusBar',statusbar))
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"),ripe,'Doing work necessary to request public key.')
|
shared.UISignalQueue.put(('updateSentItemStatusByHash',(ripe,'Doing work necessary to request encryption key.')))
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByHash',(ripe,'Doing work necessary to request public key.')))
|
|
||||||
print 'Doing proof-of-work necessary to send getpubkey message.'
|
print 'Doing proof-of-work necessary to send getpubkey message.'
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print 'Found proof of work', trialValue, 'Nonce:', nonce
|
print 'Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
|
@ -3215,14 +3221,18 @@ class singleWorker(threading.Thread):
|
||||||
print 'sending inv (for the getpubkey message)'
|
print 'sending inv (for the getpubkey message)'
|
||||||
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
shared.broadcastToSendDataQueues((streamNumber, 'sendinv', inventoryHash))
|
||||||
|
|
||||||
#self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),'Broacasting the public key request. This program will auto-retry if they are offline.')
|
t = (toAddress,)
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''UPDATE sent SET status='awaitingpubkey' WHERE toaddress=? AND status='doingpubkeypow' ''')
|
||||||
|
shared.sqlSubmitQueue.put(t)
|
||||||
|
shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlSubmitQueue.put('commit')
|
||||||
|
shared.sqlLock.release()
|
||||||
|
|
||||||
shared.UISignalQueue.put(('updateStatusBar','Broacasting the public key request. This program will auto-retry if they are offline.'))
|
shared.UISignalQueue.put(('updateStatusBar','Broacasting the public key request. This program will auto-retry if they are offline.'))
|
||||||
#self.emit(SIGNAL("updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"),ripe,'Sending public key request. Waiting for reply. Requested at ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))
|
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByHash',(ripe,'Sending public key request. Waiting for reply. Requested at ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))))
|
shared.UISignalQueue.put(('updateSentItemStatusByHash',(ripe,'Sending public key request. Waiting for reply. Requested at ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8'))))
|
||||||
|
|
||||||
def generateFullAckMessage(self,ackdata,toStreamNumber,embeddedTime):
|
def generateFullAckMessage(self,ackdata,toStreamNumber,embeddedTime):
|
||||||
nonce = 0
|
|
||||||
trialValue = 99999999999999999999
|
|
||||||
payload = embeddedTime + encodeVarint(toStreamNumber) + ackdata
|
payload = embeddedTime + encodeVarint(toStreamNumber) + ackdata
|
||||||
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+shared.networkDefaultPayloadLengthExtraBytes+8) * shared.networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
|
@ -3230,9 +3240,7 @@ class singleWorker(threading.Thread):
|
||||||
shared.printLock.release()
|
shared.printLock.release()
|
||||||
powStartTime = time.time()
|
powStartTime = time.time()
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
while trialValue > target:
|
trialValue, nonce = proofofwork.run(target, initialHash)
|
||||||
nonce += 1
|
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
|
||||||
shared.printLock.acquire()
|
shared.printLock.acquire()
|
||||||
print '(For ack message) Found proof of work', trialValue, 'Nonce:', nonce
|
print '(For ack message) Found proof of work', trialValue, 'Nonce:', nonce
|
||||||
try:
|
try:
|
||||||
|
@ -3725,7 +3733,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
|
|
||||||
ackdata = OpenSSL.rand(32)
|
ackdata = OpenSSL.rand(32)
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('',toAddress,toRipe,fromAddress,subject,message,ackdata,int(time.time()),'findingpubkey',1,1,'sent',2)
|
t = ('',toAddress,toRipe,fromAddress,subject,message,ackdata,int(time.time()),'msgqueued',1,1,'sent',2)
|
||||||
shared.sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''')
|
shared.sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
|
@ -3799,7 +3807,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
#apiSignalQueue.put(('displayNewSentMessage',(toAddress,toLabel,fromAddress,subject,message,ackdata)))
|
#apiSignalQueue.put(('displayNewSentMessage',(toAddress,toLabel,fromAddress,subject,message,ackdata)))
|
||||||
#self.emit(SIGNAL("displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),toAddress,toLabel,fromAddress,subject,message,ackdata)
|
#self.emit(SIGNAL("displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),toAddress,toLabel,fromAddress,subject,message,ackdata)
|
||||||
shared.UISignalQueue.put(('displayNewSentMessage',(toAddress,toLabel,fromAddress,subject,message,ackdata)))
|
shared.UISignalQueue.put(('displayNewSentMessage',(toAddress,toLabel,fromAddress,subject,message,ackdata)))
|
||||||
shared.workerQueue.put(('sendbroadcast',(fromAddress,subject,message)))
|
shared.workerQueue.put(('sendbroadcast',''))
|
||||||
|
|
||||||
return ackdata.encode('hex')
|
return ackdata.encode('hex')
|
||||||
elif method == 'getStatus':
|
elif method == 'getStatus':
|
||||||
|
@ -3817,16 +3825,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
return 'notFound'
|
return 'notFound'
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
status, = row
|
status, = row
|
||||||
if status == 'findingpubkey':
|
return status
|
||||||
return 'findingPubkey'
|
|
||||||
if status == 'doingpow':
|
|
||||||
return 'doingPow'
|
|
||||||
if status == 'sentmessage':
|
|
||||||
return 'sentMessage'
|
|
||||||
if status == 'ackreceived':
|
|
||||||
return 'ackReceived'
|
|
||||||
else:
|
|
||||||
return 'otherStatus: '+status
|
|
||||||
elif method == 'addSubscription':
|
elif method == 'addSubscription':
|
||||||
if len(params) == 0:
|
if len(params) == 0:
|
||||||
return 'API Error 0000: I need parameters!'
|
return 'API Error 0000: I need parameters!'
|
||||||
|
@ -4056,7 +4055,7 @@ if __name__ == "__main__":
|
||||||
shared.reloadBroadcastSendersForWhichImWatching()
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
|
||||||
#Initialize the ackdataForWhichImWatching data structure using data from the sql database.
|
#Initialize the ackdataForWhichImWatching data structure using data from the sql database.
|
||||||
shared.sqlSubmitQueue.put('''SELECT ackdata FROM sent where (status='sentmessage' OR status='doingpow')''')
|
shared.sqlSubmitQueue.put('''SELECT ackdata FROM sent where (status='msgsent' OR status='doingmsgpow')''')
|
||||||
shared.sqlSubmitQueue.put('')
|
shared.sqlSubmitQueue.put('')
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
|
|
|
@ -71,17 +71,6 @@ class MyForm(QtGui.QMainWindow):
|
||||||
#startup for linux
|
#startup for linux
|
||||||
pass
|
pass
|
||||||
|
|
||||||
"""self.trayIcon = QtGui.QSystemTrayIcon(self)
|
|
||||||
self.trayIcon.setIcon( QtGui.QIcon(':/newPrefix/images/can-icon-16px.png') )
|
|
||||||
traySignal = "activated(QSystemTrayIcon::ActivationReason)"
|
|
||||||
QtCore.QObject.connect(self.trayIcon, QtCore.SIGNAL(traySignal), self.__icon_activated)
|
|
||||||
menu = QtGui.QMenu()
|
|
||||||
self.exitAction = menu.addAction("Quit", self.quit)
|
|
||||||
self.trayIcon.setContextMenu(menu)
|
|
||||||
#I'm currently under the impression that Mac users have different expectations for the tray icon. They don't necessairly expect it to open the main window when clicked and they still expect a program showing a tray icon to also be in the dock.
|
|
||||||
if 'darwin' in sys.platform:
|
|
||||||
self.trayIcon.show()"""
|
|
||||||
|
|
||||||
self.ui.labelSendBroadcastWarning.setVisible(False)
|
self.ui.labelSendBroadcastWarning.setVisible(False)
|
||||||
|
|
||||||
#FILE MENU and other buttons
|
#FILE MENU and other buttons
|
||||||
|
@ -358,16 +347,20 @@ class MyForm(QtGui.QMainWindow):
|
||||||
newItem.setData(Qt.UserRole,unicode(message,'utf-8)'))
|
newItem.setData(Qt.UserRole,unicode(message,'utf-8)'))
|
||||||
newItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled )
|
newItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled )
|
||||||
self.ui.tableWidgetSent.setItem(0,2,newItem)
|
self.ui.tableWidgetSent.setItem(0,2,newItem)
|
||||||
if status == 'findingpubkey':
|
if status == 'awaitingpubkey':
|
||||||
newItem = myTableWidgetItem('Waiting on their public key. Will request it again soon.')
|
newItem = myTableWidgetItem('Waiting on their encryption key. Will request it again soon.')
|
||||||
elif status == 'sentmessage':
|
elif status == 'doingpowforpubkey':
|
||||||
|
newItem = myTableWidgetItem('Encryption key request queued.')
|
||||||
|
elif status == 'msgqueued':
|
||||||
|
newItem = myTableWidgetItem('Queued.')
|
||||||
|
elif status == 'msgsent':
|
||||||
newItem = myTableWidgetItem('Message sent. Waiting on acknowledgement. Sent at ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(lastactiontime)),'utf-8'))
|
newItem = myTableWidgetItem('Message sent. Waiting on acknowledgement. Sent at ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(lastactiontime)),'utf-8'))
|
||||||
elif status == 'doingpow':
|
elif status == 'doingmsgpow':
|
||||||
newItem = myTableWidgetItem('Need to do work to send message. Work is queued.')
|
newItem = myTableWidgetItem('Need to do work to send message. Work is queued.')
|
||||||
elif status == 'ackreceived':
|
elif status == 'ackreceived':
|
||||||
newItem = myTableWidgetItem('Acknowledgement of the message received ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(lastactiontime))),'utf-8'))
|
newItem = myTableWidgetItem('Acknowledgement of the message received ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(lastactiontime))),'utf-8'))
|
||||||
elif status == 'broadcastpending':
|
elif status == 'broadcastqueued':
|
||||||
newItem = myTableWidgetItem('Doing the work necessary to send broadcast...')
|
newItem = myTableWidgetItem('Broadcast queued.')
|
||||||
elif status == 'broadcastsent':
|
elif status == 'broadcastsent':
|
||||||
newItem = myTableWidgetItem('Broadcast on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(lastactiontime))),'utf-8'))
|
newItem = myTableWidgetItem('Broadcast on ' + unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(lastactiontime))),'utf-8'))
|
||||||
else:
|
else:
|
||||||
|
@ -770,6 +763,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
def click_actionDeleteAllTrashedMessages(self):
|
def click_actionDeleteAllTrashedMessages(self):
|
||||||
if QtGui.QMessageBox.question(self, 'Delete trash?',"Are you sure you want to delete all trashed messages?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
|
if QtGui.QMessageBox.question(self, 'Delete trash?',"Are you sure you want to delete all trashed messages?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
|
||||||
return
|
return
|
||||||
|
self.statusBar().showMessage('Deleting messages and freeing empty space...')
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
shared.sqlSubmitQueue.put('''delete from inbox where folder='trash' ''')
|
shared.sqlSubmitQueue.put('''delete from inbox where folder='trash' ''')
|
||||||
shared.sqlSubmitQueue.put('')
|
shared.sqlSubmitQueue.put('')
|
||||||
|
@ -781,6 +775,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.sqlSubmitQueue.put('vacuum')
|
shared.sqlSubmitQueue.put('vacuum')
|
||||||
shared.sqlSubmitQueue.put('')
|
shared.sqlSubmitQueue.put('')
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
|
self.statusBar().showMessage('')
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
|
|
||||||
def click_actionRegenerateDeterministicAddresses(self):
|
def click_actionRegenerateDeterministicAddresses(self):
|
||||||
|
@ -825,23 +820,6 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.actionShow.setChecked(not self.actionShow.isChecked())
|
self.actionShow.setChecked(not self.actionShow.isChecked())
|
||||||
self.appIndicatorShowOrHideWindow()
|
self.appIndicatorShowOrHideWindow()
|
||||||
|
|
||||||
"""if 'linux' in sys.platform:
|
|
||||||
self.trayIcon.hide()
|
|
||||||
self.setWindowFlags(Qt.Window)
|
|
||||||
self.show()
|
|
||||||
elif 'win32' in sys.platform or 'win64' in sys.platform:
|
|
||||||
self.trayIcon.hide()
|
|
||||||
self.setWindowFlags(Qt.Window)
|
|
||||||
self.show()
|
|
||||||
self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
|
|
||||||
self.activateWindow()
|
|
||||||
elif 'darwin' in sys.platform:
|
|
||||||
#self.trayIcon.hide() #this line causes a segmentation fault
|
|
||||||
#self.setWindowFlags(Qt.Window)
|
|
||||||
#self.show()
|
|
||||||
self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
|
|
||||||
self.activateWindow()"""
|
|
||||||
|
|
||||||
def incrementNumberOfMessagesProcessed(self):
|
def incrementNumberOfMessagesProcessed(self):
|
||||||
self.numberOfMessagesProcessed += 1
|
self.numberOfMessagesProcessed += 1
|
||||||
self.ui.labelMessageCount.setText('Processed ' + str(self.numberOfMessagesProcessed) + ' person-to-person messages.')
|
self.ui.labelMessageCount.setText('Processed ' + str(self.numberOfMessagesProcessed) + ' person-to-person messages.')
|
||||||
|
@ -916,7 +894,6 @@ class MyForm(QtGui.QMainWindow):
|
||||||
if self.actionStatus != None:
|
if self.actionStatus != None:
|
||||||
self.actionStatus.setText('Not Connected')
|
self.actionStatus.setText('Not Connected')
|
||||||
self.tray.setIcon(QtGui.QIcon(":/newPrefix/images/can-icon-24px-red.png"))
|
self.tray.setIcon(QtGui.QIcon(":/newPrefix/images/can-icon-24px-red.png"))
|
||||||
#self.trayIcon.show()
|
|
||||||
if color == 'yellow':
|
if color == 'yellow':
|
||||||
if self.statusBar().currentMessage() == 'Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won\'t send until you connect.':
|
if self.statusBar().currentMessage() == 'Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won\'t send until you connect.':
|
||||||
self.statusBar().showMessage('')
|
self.statusBar().showMessage('')
|
||||||
|
@ -1104,7 +1081,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.statusBar().showMessage('Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won\'t send until you connect.')
|
self.statusBar().showMessage('Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won\'t send until you connect.')
|
||||||
ackdata = OpenSSL.rand(32)
|
ackdata = OpenSSL.rand(32)
|
||||||
shared.sqlLock.acquire()
|
shared.sqlLock.acquire()
|
||||||
t = ('',toAddress,ripe,fromAddress,subject,message,ackdata,int(time.time()),'findingpubkey',1,1,'sent',2)
|
t = ('',toAddress,ripe,fromAddress,subject,message,ackdata,int(time.time()),'msgqueued',1,1,'sent',2)
|
||||||
shared.sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''')
|
shared.sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''')
|
||||||
shared.sqlSubmitQueue.put(t)
|
shared.sqlSubmitQueue.put(t)
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
|
@ -1151,7 +1128,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
|
|
||||||
shared.workerQueue.put(('sendbroadcast',(fromAddress,subject,message)))
|
shared.workerQueue.put(('sendbroadcast',''))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fromLabel = shared.config.get(fromAddress, 'label')
|
fromLabel = shared.config.get(fromAddress, 'label')
|
||||||
|
@ -1454,6 +1431,10 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte',str(int(float(self.settingsDialogInstance.ui.lineEditTotalDifficulty.text())*shared.networkDefaultProofOfWorkNonceTrialsPerByte)))
|
shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte',str(int(float(self.settingsDialogInstance.ui.lineEditTotalDifficulty.text())*shared.networkDefaultProofOfWorkNonceTrialsPerByte)))
|
||||||
if float(self.settingsDialogInstance.ui.lineEditSmallMessageDifficulty.text()) >= 1:
|
if float(self.settingsDialogInstance.ui.lineEditSmallMessageDifficulty.text()) >= 1:
|
||||||
shared.config.set('bitmessagesettings', 'defaultpayloadlengthextrabytes',str(int(float(self.settingsDialogInstance.ui.lineEditSmallMessageDifficulty.text())*shared.networkDefaultPayloadLengthExtraBytes)))
|
shared.config.set('bitmessagesettings', 'defaultpayloadlengthextrabytes',str(int(float(self.settingsDialogInstance.ui.lineEditSmallMessageDifficulty.text())*shared.networkDefaultPayloadLengthExtraBytes)))
|
||||||
|
if str(self.settingsDialogInstance.ui.comboBoxMaxCores.currentText()) == 'All':
|
||||||
|
shared.config.set('bitmessagesettings', 'maxcores', '99999')
|
||||||
|
else:
|
||||||
|
shared.config.set('bitmessagesettings', 'maxcores', str(self.settingsDialogInstance.ui.comboBoxMaxCores.currentText()))
|
||||||
|
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
shared.config.write(configfile)
|
shared.config.write(configfile)
|
||||||
|
@ -1640,7 +1621,6 @@ class MyForm(QtGui.QMainWindow):
|
||||||
# unregister the messaging system
|
# unregister the messaging system
|
||||||
if self.mmapp is not None:
|
if self.mmapp is not None:
|
||||||
self.mmapp.unregister()
|
self.mmapp.unregister()
|
||||||
#self.trayIcon.hide()
|
|
||||||
self.statusBar().showMessage('All done. Closing user interface...')
|
self.statusBar().showMessage('All done. Closing user interface...')
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
|
|
||||||
|
@ -2129,12 +2109,10 @@ class settingsDialog(QtGui.QDialog):
|
||||||
self.ui.checkBoxStartOnLogon.setDisabled(True)
|
self.ui.checkBoxStartOnLogon.setDisabled(True)
|
||||||
self.ui.checkBoxMinimizeToTray.setDisabled(True)
|
self.ui.checkBoxMinimizeToTray.setDisabled(True)
|
||||||
self.ui.checkBoxShowTrayNotifications.setDisabled(True)
|
self.ui.checkBoxShowTrayNotifications.setDisabled(True)
|
||||||
self.ui.checkBoxStartInTray.setDisabled(True)
|
|
||||||
self.ui.labelSettingsNote.setText('Options have been disabled because they either aren\'t applicable or because they haven\'t yet been implimented for your operating system.')
|
self.ui.labelSettingsNote.setText('Options have been disabled because they either aren\'t applicable or because they haven\'t yet been implimented for your operating system.')
|
||||||
elif 'linux' in sys.platform:
|
elif 'linux' in sys.platform:
|
||||||
self.ui.checkBoxStartOnLogon.setDisabled(True)
|
self.ui.checkBoxStartOnLogon.setDisabled(True)
|
||||||
self.ui.checkBoxMinimizeToTray.setDisabled(True)
|
self.ui.checkBoxMinimizeToTray.setDisabled(True)
|
||||||
self.ui.checkBoxStartInTray.setDisabled(True)
|
|
||||||
self.ui.labelSettingsNote.setText('Options have been disabled because they either aren\'t applicable or because they haven\'t yet been implimented for your operating system.')
|
self.ui.labelSettingsNote.setText('Options have been disabled because they either aren\'t applicable or because they haven\'t yet been implimented for your operating system.')
|
||||||
#On the Network settings tab:
|
#On the Network settings tab:
|
||||||
self.ui.lineEditTCPPort.setText(str(shared.config.get('bitmessagesettings', 'port')))
|
self.ui.lineEditTCPPort.setText(str(shared.config.get('bitmessagesettings', 'port')))
|
||||||
|
@ -2161,6 +2139,25 @@ class settingsDialog(QtGui.QDialog):
|
||||||
|
|
||||||
self.ui.lineEditTotalDifficulty.setText(str((float(shared.config.getint('bitmessagesettings', 'defaultnoncetrialsperbyte'))/shared.networkDefaultProofOfWorkNonceTrialsPerByte)))
|
self.ui.lineEditTotalDifficulty.setText(str((float(shared.config.getint('bitmessagesettings', 'defaultnoncetrialsperbyte'))/shared.networkDefaultProofOfWorkNonceTrialsPerByte)))
|
||||||
self.ui.lineEditSmallMessageDifficulty.setText(str((float(shared.config.getint('bitmessagesettings', 'defaultpayloadlengthextrabytes'))/shared.networkDefaultPayloadLengthExtraBytes)))
|
self.ui.lineEditSmallMessageDifficulty.setText(str((float(shared.config.getint('bitmessagesettings', 'defaultpayloadlengthextrabytes'))/shared.networkDefaultPayloadLengthExtraBytes)))
|
||||||
|
|
||||||
|
#On the System tab
|
||||||
|
try:
|
||||||
|
maxCores = shared.config.getint('bitmessagesettings', 'maxcores')
|
||||||
|
except:
|
||||||
|
maxCores = 99999
|
||||||
|
if maxCores <= 1:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(0)
|
||||||
|
elif maxCores == 2:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(1)
|
||||||
|
elif maxCores <= 4:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(2)
|
||||||
|
elif maxCores <= 8:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(3)
|
||||||
|
elif maxCores <= 16:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(4)
|
||||||
|
else:
|
||||||
|
self.ui.comboBoxMaxCores.setCurrentIndex(5)
|
||||||
|
|
||||||
QtGui.QWidget.resize(self,QtGui.QWidget.sizeHint(self))
|
QtGui.QWidget.resize(self,QtGui.QWidget.sizeHint(self))
|
||||||
|
|
||||||
def comboBoxProxyTypeChanged(self,comboBoxIndex):
|
def comboBoxProxyTypeChanged(self,comboBoxIndex):
|
||||||
|
@ -2302,12 +2299,7 @@ def run():
|
||||||
app.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
app.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
||||||
myapp = MyForm()
|
myapp = MyForm()
|
||||||
|
|
||||||
if shared.config.getboolean('bitmessagesettings', 'startintray'):
|
if not shared.config.getboolean('bitmessagesettings', 'startintray'):
|
||||||
if not myapp.isUbuntu():
|
|
||||||
myapp.trayIcon.show()
|
|
||||||
if 'win32' in sys.platform or 'win64' in sys.platform:
|
|
||||||
myapp.setWindowFlags(Qt.ToolTip)
|
|
||||||
else:
|
|
||||||
myapp.show()
|
myapp.show()
|
||||||
|
|
||||||
myapp.appIndicatorInit(app)
|
myapp.appIndicatorInit(app)
|
||||||
|
|
42
src/proofofwork.py
Normal file
42
src/proofofwork.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
import shared
|
||||||
|
import time
|
||||||
|
from multiprocessing import Pool, cpu_count
|
||||||
|
import hashlib
|
||||||
|
from struct import unpack, pack
|
||||||
|
|
||||||
|
def _pool_worker(nonce, initialHash, target, pool_size):
|
||||||
|
trialValue = 99999999999999999999
|
||||||
|
while trialValue > target:
|
||||||
|
nonce += pool_size
|
||||||
|
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||||
|
return [trialValue, nonce]
|
||||||
|
|
||||||
|
def run(target, initialHash):
|
||||||
|
try:
|
||||||
|
pool_size = cpu_count()
|
||||||
|
except:
|
||||||
|
pool_size = 4
|
||||||
|
|
||||||
|
try:
|
||||||
|
maxCores = config.getint('bitmessagesettings', 'maxcores')
|
||||||
|
except:
|
||||||
|
maxCores = 99999
|
||||||
|
if pool_size > maxCores:
|
||||||
|
pool_size = maxCores
|
||||||
|
|
||||||
|
pool = Pool(processes=pool_size)
|
||||||
|
result = []
|
||||||
|
for i in range(pool_size):
|
||||||
|
result.append(pool.apply_async(_pool_worker, args = (i, initialHash, target, pool_size)))
|
||||||
|
while True:
|
||||||
|
if shared.shutdown:
|
||||||
|
pool.terminate()
|
||||||
|
time.sleep(5) #Don't return anything (doing so will cause exceptions because we'll return an unusable response). Sit here and wait for this thread to close.
|
||||||
|
return
|
||||||
|
for i in range(pool_size):
|
||||||
|
if result[i].ready():
|
||||||
|
result = result[i].get()
|
||||||
|
pool.terminate()
|
||||||
|
return result[0], result[1]
|
||||||
|
time.sleep(0.2)
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'settings.ui'
|
# Form implementation generated from reading ui file 'settings.ui'
|
||||||
#
|
#
|
||||||
# Created: Sat May 25 13:20:18 2013
|
# Created: Thu May 30 15:50:32 2013
|
||||||
# by: PyQt4 UI code generator 4.9.5
|
# by: PyQt4 UI code generator 4.9.4
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
|
@ -172,6 +172,28 @@ class Ui_settingsDialog(object):
|
||||||
self.label_10.setObjectName(_fromUtf8("label_10"))
|
self.label_10.setObjectName(_fromUtf8("label_10"))
|
||||||
self.gridLayout_6.addWidget(self.label_10, 2, 0, 1, 3)
|
self.gridLayout_6.addWidget(self.label_10, 2, 0, 1, 3)
|
||||||
self.tabWidgetSettings.addTab(self.tab, _fromUtf8(""))
|
self.tabWidgetSettings.addTab(self.tab, _fromUtf8(""))
|
||||||
|
self.tab_2 = QtGui.QWidget()
|
||||||
|
self.tab_2.setObjectName(_fromUtf8("tab_2"))
|
||||||
|
self.formLayout = QtGui.QFormLayout(self.tab_2)
|
||||||
|
self.formLayout.setObjectName(_fromUtf8("formLayout"))
|
||||||
|
self.label_13 = QtGui.QLabel(self.tab_2)
|
||||||
|
self.label_13.setObjectName(_fromUtf8("label_13"))
|
||||||
|
self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_13)
|
||||||
|
self.comboBoxMaxCores = QtGui.QComboBox(self.tab_2)
|
||||||
|
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.comboBoxMaxCores.sizePolicy().hasHeightForWidth())
|
||||||
|
self.comboBoxMaxCores.setSizePolicy(sizePolicy)
|
||||||
|
self.comboBoxMaxCores.setObjectName(_fromUtf8("comboBoxMaxCores"))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.comboBoxMaxCores.addItem(_fromUtf8(""))
|
||||||
|
self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.comboBoxMaxCores)
|
||||||
|
self.tabWidgetSettings.addTab(self.tab_2, _fromUtf8(""))
|
||||||
self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1)
|
self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1)
|
||||||
|
|
||||||
self.retranslateUi(settingsDialog)
|
self.retranslateUi(settingsDialog)
|
||||||
|
@ -222,4 +244,12 @@ class Ui_settingsDialog(object):
|
||||||
self.label_12.setText(QtGui.QApplication.translate("settingsDialog", "The \'Small message difficulty\' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn\'t really affect large messages.", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_12.setText(QtGui.QApplication.translate("settingsDialog", "The \'Small message difficulty\' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn\'t really affect large messages.", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.label_10.setText(QtGui.QApplication.translate("settingsDialog", "The \'Total difficulty\' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work.", None, QtGui.QApplication.UnicodeUTF8))
|
self.label_10.setText(QtGui.QApplication.translate("settingsDialog", "The \'Total difficulty\' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work.", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab), QtGui.QApplication.translate("settingsDialog", "Demanded difficulty", None, QtGui.QApplication.UnicodeUTF8))
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab), QtGui.QApplication.translate("settingsDialog", "Demanded difficulty", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.label_13.setText(QtGui.QApplication.translate("settingsDialog", "Maximum number of CPU cores to use when doing work:", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(0, QtGui.QApplication.translate("settingsDialog", "1", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(1, QtGui.QApplication.translate("settingsDialog", "2", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(2, QtGui.QApplication.translate("settingsDialog", "4", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(3, QtGui.QApplication.translate("settingsDialog", "8", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(4, QtGui.QApplication.translate("settingsDialog", "16", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.comboBoxMaxCores.setItemText(5, QtGui.QApplication.translate("settingsDialog", "All", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab_2), QtGui.QApplication.translate("settingsDialog", "System", None, QtGui.QApplication.UnicodeUTF8))
|
||||||
|
|
||||||
|
|
|
@ -373,6 +373,60 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_2">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>System</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QFormLayout" name="formLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum number of CPU cores to use when doing work:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxMaxCores">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>1</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>2</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>4</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>8</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>16</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>All</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -7,6 +7,7 @@ import highlevelcrypto
|
||||||
import Queue
|
import Queue
|
||||||
import pickle
|
import pickle
|
||||||
import os
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
myECCryptorObjects = {}
|
myECCryptorObjects = {}
|
||||||
MyECSubscriptionCryptorObjects = {}
|
MyECSubscriptionCryptorObjects = {}
|
||||||
|
@ -27,6 +28,7 @@ printLock = threading.Lock()
|
||||||
appdata = '' #holds the location of the application data storage directory
|
appdata = '' #holds the location of the application data storage directory
|
||||||
statusIconColor = 'red'
|
statusIconColor = 'red'
|
||||||
connectedHostsList = {} #List of hosts to which we are connected. Used to guarantee that the outgoingSynSender threads won't connect to the same remote node twice.
|
connectedHostsList = {} #List of hosts to which we are connected. Used to guarantee that the outgoingSynSender threads won't connect to the same remote node twice.
|
||||||
|
shutdown = 0 #Set to 1 by the doCleanShutdown function. Used to tell the proof of work worker threads to exit.
|
||||||
|
|
||||||
#If changed, these values will cause particularly unexpected behavior: You won't be able to either send or receive messages because the proof of work you do (or demand) won't match that done or demanded by others. Don't change them!
|
#If changed, these values will cause particularly unexpected behavior: You won't be able to either send or receive messages because the proof of work you do (or demand) won't match that done or demanded by others. Don't change them!
|
||||||
networkDefaultProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
|
networkDefaultProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
|
||||||
|
@ -141,6 +143,8 @@ def reloadBroadcastSendersForWhichImWatching():
|
||||||
MyECSubscriptionCryptorObjects[hash] = highlevelcrypto.makeCryptor(privEncryptionKey.encode('hex'))
|
MyECSubscriptionCryptorObjects[hash] = highlevelcrypto.makeCryptor(privEncryptionKey.encode('hex'))
|
||||||
|
|
||||||
def doCleanShutdown():
|
def doCleanShutdown():
|
||||||
|
global shutdown
|
||||||
|
shutdown = 1 #Used to tell proof of work worker threads to exit.
|
||||||
knownNodesLock.acquire()
|
knownNodesLock.acquire()
|
||||||
UISignalQueue.put(('updateStatusBar','Saving the knownNodes list of peers to disk...'))
|
UISignalQueue.put(('updateStatusBar','Saving the knownNodes list of peers to disk...'))
|
||||||
output = open(appdata + 'knownnodes.dat', 'wb')
|
output = open(appdata + 'knownnodes.dat', 'wb')
|
||||||
|
@ -173,6 +177,7 @@ def doCleanShutdown():
|
||||||
print 'Finished flushing inventory.'
|
print 'Finished flushing inventory.'
|
||||||
printLock.release()
|
printLock.release()
|
||||||
|
|
||||||
|
time.sleep(.25) #Wait long enough to guarantee that any running proof of work worker threads will check the shutdown variable and exit. If the main thread closes before they do then they won't stop.
|
||||||
|
|
||||||
if safeConfigGetBoolean('bitmessagesettings','daemon'):
|
if safeConfigGetBoolean('bitmessagesettings','daemon'):
|
||||||
printLock.acquire()
|
printLock.acquire()
|
||||||
|
|
Reference in New Issue
Block a user