63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
from classes.Blockchain import CBlock
|
|
from helpers.SignatureHelper import *
|
|
from cryptography.hazmat.primitives import hashes
|
|
from cryptography.hazmat.backends import default_backend
|
|
|
|
import random
|
|
|
|
REWARD_VALUE = 50.0
|
|
leading_zeros = 1
|
|
leading_extra = 2
|
|
next_char_limit = 25
|
|
|
|
class TxBlock (CBlock):
|
|
|
|
def __init__(self, previousBlock):
|
|
self.nonce = "A random nonce"
|
|
self.metadata = {}
|
|
self.time = None
|
|
self.date = None
|
|
super(TxBlock, self).__init__([], previousBlock)
|
|
|
|
def addTx(self, Tx_in):
|
|
self.data.append(Tx_in)
|
|
|
|
def is_valid(self):
|
|
if not super(TxBlock, self).is_valid():
|
|
return False
|
|
for tx in self.data:
|
|
if not tx.is_valid():
|
|
return False
|
|
|
|
if self.nonce != "A random nonce":
|
|
if not self.good_nonce():
|
|
return False
|
|
|
|
return True
|
|
|
|
def good_nonce(self):
|
|
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
|
|
digest.update(bytes(str(self.data), 'utf8'))
|
|
digest.update(bytes(str(self.previousHash), 'utf8'))
|
|
digest.update(bytes(str(self.nonce), 'utf8'))
|
|
this_hash = digest.finalize()
|
|
|
|
bytes_array = [b'\x00', b'\x01', b'\x02', b'\x03', b'\x04', b'\x05', b'\x06', b'\x07', b'\x08', b'\x09']
|
|
if this_hash[:leading_zeros] == b'\x00'*leading_zeros:
|
|
|
|
for i in range(leading_extra):
|
|
if this_hash[:leading_extra + i + 1][leading_extra+i:] in bytes_array:
|
|
continue
|
|
|
|
else:
|
|
return False
|
|
|
|
return True
|
|
|
|
def find_nonce(self):
|
|
for i in range(350000):
|
|
self.nonce = "".join([random.choice("1234567890ABCDEF") for n in range(next_char_limit)])
|
|
if self.good_nonce():
|
|
return self.nonce
|
|
return None
|