Normalize the noncetrialsperbyte and payloadlengthextrabytes for each of the user's existing addresses
This commit is contained in:
parent
90800af729
commit
c84cdecba4
|
@ -77,6 +77,7 @@ def decodeVarint(data):
|
||||||
Decodes an encoded varint to an integer and returns it.
|
Decodes an encoded varint to an integer and returns it.
|
||||||
Per protocol v3, the encoded value must be encoded with
|
Per protocol v3, the encoded value must be encoded with
|
||||||
the minimum amount of data possible or else it is malformed.
|
the minimum amount of data possible or else it is malformed.
|
||||||
|
Returns a tuple: (theEncodedValue, theSizeOfTheVarintInBytes)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if len(data) == 0:
|
if len(data) == 0:
|
||||||
|
@ -131,23 +132,17 @@ def encodeAddress(version,stream,ripe):
|
||||||
raise Exception("Programming error in encodeAddress: The length of a given ripe hash was not 20.")
|
raise Exception("Programming error in encodeAddress: The length of a given ripe hash was not 20.")
|
||||||
ripe = ripe.lstrip('\x00')
|
ripe = ripe.lstrip('\x00')
|
||||||
|
|
||||||
a = encodeVarint(version) + encodeVarint(stream) + ripe
|
storedBinaryData = encodeVarint(version) + encodeVarint(stream) + ripe
|
||||||
|
|
||||||
|
# Generate the checksum
|
||||||
sha = hashlib.new('sha512')
|
sha = hashlib.new('sha512')
|
||||||
sha.update(a)
|
sha.update(storedBinaryData)
|
||||||
currentHash = sha.digest()
|
currentHash = sha.digest()
|
||||||
#print 'sha after first hashing: ', sha.hexdigest()
|
|
||||||
sha = hashlib.new('sha512')
|
sha = hashlib.new('sha512')
|
||||||
sha.update(currentHash)
|
sha.update(currentHash)
|
||||||
#print 'sha after second hashing: ', sha.hexdigest()
|
|
||||||
|
|
||||||
checksum = sha.digest()[0:4]
|
checksum = sha.digest()[0:4]
|
||||||
#print 'len(a) = ', len(a)
|
|
||||||
#print 'checksum = ', checksum.encode('hex')
|
|
||||||
#print 'len(checksum) = ', len(checksum)
|
|
||||||
|
|
||||||
asInt = int(a.encode('hex') + checksum.encode('hex'),16)
|
asInt = int(storedBinaryData.encode('hex') + checksum.encode('hex'),16)
|
||||||
#asInt = int(checksum.encode('hex') + a.encode('hex'),16)
|
|
||||||
# print asInt
|
|
||||||
return 'BM-'+ encodeBase58(asInt)
|
return 'BM-'+ encodeBase58(asInt)
|
||||||
|
|
||||||
def decodeAddress(address):
|
def decodeAddress(address):
|
||||||
|
|
|
@ -96,7 +96,7 @@ class sendDataThread(threading.Thread):
|
||||||
elif command == 'advertisepeer':
|
elif command == 'advertisepeer':
|
||||||
self.objectHashHolderInstance.holdPeer(data)
|
self.objectHashHolderInstance.holdPeer(data)
|
||||||
elif command == 'sendaddr':
|
elif command == 'sendaddr':
|
||||||
if self.connectionIsOrWasFullyEstablished: # only send addr messages if we have send and heard a verack from the remote node
|
if self.connectionIsOrWasFullyEstablished: # only send addr messages if we have sent and heard a verack from the remote node
|
||||||
numberOfAddressesInAddrMessage = len(data)
|
numberOfAddressesInAddrMessage = len(data)
|
||||||
payload = ''
|
payload = ''
|
||||||
for hostDetails in data:
|
for hostDetails in data:
|
||||||
|
|
|
@ -124,8 +124,6 @@ class sqlThread(threading.Thread):
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
shared.config.set('bitmessagesettings', 'settingsversion', '4')
|
shared.config.set('bitmessagesettings', 'settingsversion', '4')
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
|
||||||
shared.config.write(configfile)
|
|
||||||
|
|
||||||
if shared.config.getint('bitmessagesettings', 'settingsversion') == 4:
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 4:
|
||||||
shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte', str(
|
shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte', str(
|
||||||
|
@ -140,9 +138,6 @@ class sqlThread(threading.Thread):
|
||||||
shared.config.set(
|
shared.config.set(
|
||||||
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0')
|
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0')
|
||||||
shared.config.set('bitmessagesettings', 'settingsversion', '6')
|
shared.config.set('bitmessagesettings', 'settingsversion', '6')
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
|
||||||
shared.config.write(configfile)
|
|
||||||
|
|
||||||
# From now on, let us keep a 'version' embedded in the messages.dat
|
# From now on, let us keep a 'version' embedded in the messages.dat
|
||||||
# file so that when we make changes to the database, the database
|
# file so that when we make changes to the database, the database
|
||||||
# version we are on can stay embedded in the messages.dat file. Let us
|
# version we are on can stay embedded in the messages.dat file. Let us
|
||||||
|
@ -258,8 +253,6 @@ class sqlThread(threading.Thread):
|
||||||
shared.config.set('bitmessagesettings','defaultnoncetrialsperbyte', str(shared.networkDefaultProofOfWorkNonceTrialsPerByte * 2))
|
shared.config.set('bitmessagesettings','defaultnoncetrialsperbyte', str(shared.networkDefaultProofOfWorkNonceTrialsPerByte * 2))
|
||||||
"""
|
"""
|
||||||
shared.config.set('bitmessagesettings', 'settingsversion', '7')
|
shared.config.set('bitmessagesettings', 'settingsversion', '7')
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
|
||||||
shared.config.write(configfile)
|
|
||||||
|
|
||||||
# Add a new column to the pubkeys table to store the address version.
|
# Add a new column to the pubkeys table to store the address version.
|
||||||
# We're going to trash all of our pubkeys and let them be redownloaded.
|
# We're going to trash all of our pubkeys and let them be redownloaded.
|
||||||
|
@ -281,9 +274,6 @@ class sqlThread(threading.Thread):
|
||||||
shared.config.set('bitmessagesettings', 'useidenticons', 'True')
|
shared.config.set('bitmessagesettings', 'useidenticons', 'True')
|
||||||
if not shared.config.has_option('bitmessagesettings', 'identiconsuffix'): # acts as a salt
|
if not shared.config.has_option('bitmessagesettings', 'identiconsuffix'): # acts as a salt
|
||||||
shared.config.set('bitmessagesettings', 'identiconsuffix', ''.join(random.choice("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") for x in range(12))) # a twelve character pseudo-password to salt the identicons
|
shared.config.set('bitmessagesettings', 'identiconsuffix', ''.join(random.choice("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") for x in range(12))) # a twelve character pseudo-password to salt the identicons
|
||||||
# Since we've added a new config entry, let's write keys.dat to disk.
|
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
|
||||||
shared.config.write(configfile)
|
|
||||||
|
|
||||||
#Add settings to support no longer resending messages after a certain period of time even if we never get an ack
|
#Add settings to support no longer resending messages after a certain period of time even if we never get an ack
|
||||||
if shared.config.getint('bitmessagesettings', 'settingsversion') == 7:
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 7:
|
||||||
|
@ -332,10 +322,26 @@ class sqlThread(threading.Thread):
|
||||||
shared.config.set('bitmessagesettings','defaultnoncetrialsperbyte', str(shared.networkDefaultProofOfWorkNonceTrialsPerByte))
|
shared.config.set('bitmessagesettings','defaultnoncetrialsperbyte', str(shared.networkDefaultProofOfWorkNonceTrialsPerByte))
|
||||||
shared.config.set('bitmessagesettings','defaultpayloadlengthextrabytes', str(shared.networkDefaultPayloadLengthExtraBytes))
|
shared.config.set('bitmessagesettings','defaultpayloadlengthextrabytes', str(shared.networkDefaultPayloadLengthExtraBytes))
|
||||||
previousTotalDifficulty = int(shared.config.getint('bitmessagesettings', 'maxacceptablenoncetrialsperbyte')) / 320
|
previousTotalDifficulty = int(shared.config.getint('bitmessagesettings', 'maxacceptablenoncetrialsperbyte')) / 320
|
||||||
previousSmallMessageDifficulty = int(shared.config.getint('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes')) / 1400
|
previousSmallMessageDifficulty = int(shared.config.getint('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes')) / 14000
|
||||||
shared.config.set('bitmessagesettings','maxacceptablenoncetrialsperbyte', str(previousTotalDifficulty * 1000))
|
shared.config.set('bitmessagesettings','maxacceptablenoncetrialsperbyte', str(previousTotalDifficulty * 1000))
|
||||||
shared.config.set('bitmessagesettings','maxacceptablepayloadlengthextrabytes', str(previousSmallMessageDifficulty * 1000))
|
shared.config.set('bitmessagesettings','maxacceptablepayloadlengthextrabytes', str(previousSmallMessageDifficulty * 1000))
|
||||||
shared.config.set('bitmessagesettings', 'settingsversion', '9')
|
shared.config.set('bitmessagesettings', 'settingsversion', '9')
|
||||||
|
|
||||||
|
# Adjust the required POW values for each of this user's addresses to conform to protocol v3 norms.
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 9:
|
||||||
|
for addressInKeysFile in shared.config.sections():
|
||||||
|
try:
|
||||||
|
previousTotalDifficulty = float(shared.config.getint(addressInKeysFile, 'noncetrialsperbyte')) / 320
|
||||||
|
previousSmallMessageDifficulty = float(shared.config.getint(addressInKeysFile, 'payloadlengthextrabytes')) / 14000
|
||||||
|
if previousTotalDifficulty <= 2:
|
||||||
|
previousTotalDifficulty = 1
|
||||||
|
if previousSmallMessageDifficulty < 1:
|
||||||
|
previousSmallMessageDifficulty = 1
|
||||||
|
shared.config.set(addressInKeysFile,'noncetrialsperbyte', str(int(previousTotalDifficulty * 1000)))
|
||||||
|
shared.config.set(addressInKeysFile,'payloadlengthextrabytes', str(int(previousSmallMessageDifficulty * 1000)))
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '10')
|
||||||
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)
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ def knownNodes():
|
||||||
shared.knownNodes[stream][peer] = time
|
shared.knownNodes[stream][peer] = time
|
||||||
except:
|
except:
|
||||||
shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata)
|
shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata)
|
||||||
if shared.config.getint('bitmessagesettings', 'settingsversion') > 9:
|
if shared.config.getint('bitmessagesettings', 'settingsversion') > 10:
|
||||||
print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.'
|
print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.'
|
||||||
raise SystemExit
|
raise SystemExit
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ def loadConfig():
|
||||||
# This appears to be the first time running the program; there is
|
# This appears to be the first time running the program; there is
|
||||||
# no config file (or it cannot be accessed). Create config file.
|
# no config file (or it cannot be accessed). Create config file.
|
||||||
shared.config.add_section('bitmessagesettings')
|
shared.config.add_section('bitmessagesettings')
|
||||||
shared.config.set('bitmessagesettings', 'settingsversion', '9')
|
shared.config.set('bitmessagesettings', 'settingsversion', '10')
|
||||||
shared.config.set('bitmessagesettings', 'port', '8444')
|
shared.config.set('bitmessagesettings', 'port', '8444')
|
||||||
shared.config.set(
|
shared.config.set(
|
||||||
'bitmessagesettings', 'timeformat', '%%a, %%d %%b %%Y %%I:%%M %%p')
|
'bitmessagesettings', 'timeformat', '%%a, %%d %%b %%Y %%I:%%M %%p')
|
||||||
|
|
|
@ -370,7 +370,7 @@ def doCleanShutdown():
|
||||||
logger.info('Clean shutdown complete.')
|
logger.info('Clean shutdown complete.')
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
|
|
||||||
# When you want to command a sendDataThread to do something, like shutdown or send some data, this
|
# If you want to command all of the sendDataThreads to do something, like shutdown or send some data, this
|
||||||
# function puts your data into the queues for each of the sendDataThreads. The sendDataThreads are
|
# function puts your data into the queues for each of the sendDataThreads. The sendDataThreads are
|
||||||
# responsible for putting their queue into (and out of) the sendDataQueues list.
|
# responsible for putting their queue into (and out of) the sendDataQueues list.
|
||||||
def broadcastToSendDataQueues(data):
|
def broadcastToSendDataQueues(data):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user