From 17d045da106b2265b1f0d0a9ccf5f889e0b22cf1 Mon Sep 17 00:00:00 2001 From: mailchuck Date: Tue, 15 Dec 2015 12:14:21 +0100 Subject: [PATCH] Sensible default maximum difficulty Fixes #144 --- src/class_sqlThread.py | 8 +++++++- src/proofofwork.py | 25 +++++++++++++++++++++++++ src/shared.py | 4 ++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/class_sqlThread.py b/src/class_sqlThread.py index 682cffee..0c28bc22 100644 --- a/src/class_sqlThread.py +++ b/src/class_sqlThread.py @@ -326,7 +326,13 @@ class sqlThread(threading.Thread): shared.config.set('bitmessagesettings', 'maxdownloadrate', '0') shared.config.set('bitmessagesettings', 'maxuploadrate', '0') shared.config.set('bitmessagesettings', 'settingsversion', '10') - shared.writeKeysFile() + shared.writeKeysFile() + + # sanity check + if shared.config.getint('bitmessagesettings', 'maxacceptablenoncetrialsperbyte') == 0: + shared.config.set('bitmessagesettings','maxacceptablenoncetrialsperbyte', str(shared.ridiculousDifficulty * shared.networkDefaultProofOfWorkNonceTrialsPerByte)) + if shared.config.getint('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes') == 0: + shared.config.set('bitmessagesettings','maxacceptablepayloadlengthextrabytes', str(shared.ridiculousDifficulty * shared.networkDefaultPayloadLengthExtraBytes)) # The format of data stored in the pubkeys table has changed. Let's # clear it, and the pubkeys from inventory, so that they'll be re-downloaded. diff --git a/src/proofofwork.py b/src/proofofwork.py index 841c7791..39999212 100644 --- a/src/proofofwork.py +++ b/src/proofofwork.py @@ -133,6 +133,31 @@ def _doGPUPoW(target, initialHash): raise Exception("GPU did not calculate correctly.") logger.debug("GPU PoW done") return [trialValue, nonce] + +def estimate(difficulty, format = False): + ret = difficulty / 10 + if ret < 1: + ret = 1 + if format: + out = str(int(ret)) + " seconds" + if ret > 60: + ret /= 60 + out = str(int(ret)) + " minutes" + if ret > 60: + ret /= 60 + out = str(int(ret)) + " hours" + if ret > 24: + ret /= 24 + out = str(int(ret)) + " days" + if ret > 7: + out = str(int(ret)) + " weeks" + if ret > 31: + out = str(int(ret)) + " months" + if ret > 366: + ret /= 366 + out = str(int(ret)) + " years" + else: + return ret def run(target, initialHash): target = int(target) diff --git a/src/shared.py b/src/shared.py index 944cb659..c52ff3ac 100644 --- a/src/shared.py +++ b/src/shared.py @@ -91,6 +91,10 @@ objectProcessorQueue = Queue.Queue( ) # receiveDataThreads dump objects they hear on the network into this queue to be processed. streamsInWhichIAmParticipating = {} +# sanity check, prevent doing ridiculous PoW +# 20 million PoWs equals approximately 2 days on dev's dual R9 290 +ridiculousDifficulty = 20000000 + #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 = 1000 #The amount of work that should be performed (and demanded) per byte of the payload. networkDefaultPayloadLengthExtraBytes = 1000 #To make sending short messages a little more difficult, this value is added to the payload length for use in calculating the proof of work target.