work on proof of work
This commit is contained in:
parent
268cd10f34
commit
7d9936e55c
@ -561,6 +561,12 @@ class OnionrCommunicate:
|
||||
blockMeta2 = {'type': ''}
|
||||
pass
|
||||
blockContent = blockContent[blockContent.rfind(b'}') + 1:]
|
||||
|
||||
if not self.verifyPow(blockContent, blockMeta2):
|
||||
logger.warn(i + " has invalid or insufficient proof of work token, deleting")
|
||||
self._core.removeBlock(i)
|
||||
continue
|
||||
|
||||
try:
|
||||
blockMetadata['sig']
|
||||
blockMeta2['id']
|
||||
@ -657,6 +663,31 @@ class OnionrCommunicate:
|
||||
|
||||
return retVal
|
||||
|
||||
def verifyPow(self, blockContent, metadata):
|
||||
'''
|
||||
Verifies the proof of work associated with a block
|
||||
'''
|
||||
retData = False
|
||||
try:
|
||||
metadata['pow']
|
||||
token = metadata['pow']
|
||||
except KeyError:
|
||||
return False
|
||||
dataLen = len(blockContent)
|
||||
expectedHash = self._crypto.blake2bHash(blockContent)
|
||||
difficulty = 0
|
||||
if token == expectedHash:
|
||||
difficulty = math.floor(dataLen/1000000)
|
||||
|
||||
mainHash = '0000000000000000000000000000000000000000000000000000000000000000'#nacl.hash.blake2b(nacl.utils.random()).decode()
|
||||
puzzle = mainHash[0:difficulty]
|
||||
|
||||
if token[0:difficulty] == puzzle:
|
||||
logger.info('Validated block pow')
|
||||
retData = True
|
||||
|
||||
return retData
|
||||
|
||||
def urlencode(self, data):
|
||||
'''
|
||||
URL encodes the data
|
||||
|
@ -639,7 +639,6 @@ class Core:
|
||||
break
|
||||
time.sleep(0.3)
|
||||
|
||||
|
||||
try:
|
||||
data.decode()
|
||||
except AttributeError:
|
||||
|
@ -17,7 +17,7 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import nacl.signing, nacl.encoding, nacl.public, nacl.secret, os, binascii, base64, hashlib, logger
|
||||
import nacl.signing, nacl.encoding, nacl.public, nacl.hash, nacl.secret, os, binascii, base64, hashlib, logger
|
||||
|
||||
class OnionrCrypto:
|
||||
def __init__(self, coreInstance):
|
||||
@ -210,3 +210,11 @@ class OnionrCrypto:
|
||||
prev = hasher.hexdigest()
|
||||
result = prev
|
||||
return result
|
||||
|
||||
def sha3Hash(self, data):
|
||||
hasher = hashlib.sha3_256()
|
||||
hasher.update(data)
|
||||
return hasher.hexdigest()
|
||||
|
||||
def blake2bHash(self, data):
|
||||
return nacl.hash.blake2b(data)
|
Loading…
Reference in New Issue
Block a user