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