2023-11-20 15:39:43 +01:00

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