From 0f14b0b5902983ab0de23833867b4eb689884100 Mon Sep 17 00:00:00 2001 From: Spekulaas <“ryan@aterve.nl”> Date: Sun, 21 Jan 2024 20:56:17 +0100 Subject: [PATCH] update --- goodchain/src/helpers/BlockHelper.py | 82 +++++++++++++++++----- goodchain/src/helpers/SocketHelper.py | 30 +++++++- goodchain/src/helpers/TaskHelper.py | 26 ++++++- goodchain/src/helpers/TransactionHelper.py | 12 +++- goodchain/src/helpers/UtilityHelper.py | 2 +- 5 files changed, 127 insertions(+), 25 deletions(-) diff --git a/goodchain/src/helpers/BlockHelper.py b/goodchain/src/helpers/BlockHelper.py index 053dfe8..483f276 100644 --- a/goodchain/src/helpers/BlockHelper.py +++ b/goodchain/src/helpers/BlockHelper.py @@ -6,6 +6,7 @@ from helpers import TaskHelper as taskHelper import time import pickle +import os MIN_MINING_TIME = 0 MAX_MINING_TIME = 20 @@ -266,7 +267,10 @@ def createBlock(self): fees += transactions[i].inputs[0][1] - transactions[i].outputs[0][1] fees = round(fees, 2) print(f"After validating you will receive a reward of {fees + 25} coins!") - + new_reward = Tx() + new_reward.createRewardTransaction(block.metadata['miner'], self.user.private_ser, "MINE", fees) + socketHelper.sendObj(self.peer_ip_addr, new_reward, self.peer_port) + utilityHelper.addFile("../data/transaction_pool.dat", new_reward) return True def validateMinedBlock(self): @@ -355,25 +359,37 @@ def validateMinedBlock(self): def socketBlock(block): # check if item is indeed a cblock if type(block) != TxBlock: - return False + return False, False, None # check if ID exists in ledger last_block = getLastBlock() + block_status = block.is_valid() + block.metadata['validated_by'].append("" + os.getenv("IP") + ":" + os.getenv("PORT")) + block.metadata['validated'] = block_status + if last_block == []: if block.id != 0: - return False, True + return False, True, None else: + block.previousBlock = None return addBlockToChain(block, last_block) + if block.id < last_block.id: - return False, True - - if last_block.id == block.id and last_block.metadata['validated'] == False: - return updateBlockValidation(block) + return False, False, block - if block.id == last_block.id + 1: - return addBlockToChain(block, last_block) + if block_status: + + if block.id == last_block.id and block.blockHash == last_block.blockHash and last_block.metadata['validated'] == False: + block.previousBlock = last_block.previousBlock + return updateBlockValidation(block) + + if block.id == last_block.id + 1 and block.previousHash == last_block.blockHash: + block.previousBlock = last_block + return addBlockToChain(block, last_block) + + return False, False, block def canAddBlock(last_block): if last_block == [] or last_block == None: @@ -405,18 +421,17 @@ def transactionsInPool(transactions, block): def addBlockToChain(block, last_block): if not canAddBlock(last_block): - return False, False + return False, False, block # get transaction pool transactions = Tx() transactions = utilityHelper.loadFile("../data/transaction_pool.dat") if not transactionsInPool(transactions, block): - print("deze man") - return False, True + return False, True, block if len(block.data) < 5 or len(block.data) > 10: - return False, False + return False, False, block utilityHelper.addFile("../data/ledger.dat", block) utilityHelper.resetFile("../data/transaction_pool.dat") @@ -424,20 +439,22 @@ def addBlockToChain(block, last_block): if transaction not in block.data: utilityHelper.addFile("../data/transaction_pool.dat", transaction) - return True, False + return True, False, block def updateBlockValidation(block): blocks = utilityHelper.loadFile("../data/ledger.dat") + last_block = getLastBlock() if blocks == []: - return False, False + return False, False, block try: del blocks[-1] except: - return False, False + return False, False, block utilityHelper.resetFile("../data/ledger.dat") + block.previousBlock = last_block blocks.append(block) if block.metadata['false_validations'] >= 3: @@ -449,12 +466,41 @@ def updateBlockValidation(block): del blocks[-1] except: print(f"{utilityHelper.errorMessage('Something went wrong')}") - return False, True + return False, True, block for b in blocks: utilityHelper.addFile("../data/ledger.dat", b) - return True, False + return True, False, block +def removeInvalid(block): + blocks = utilityHelper.loadFile("../data/ledger.dat") + last_block = getLastBlock() + + if blocks == []: + return False + + if last_block.blockHash == block.blockHash: + # try to delete + try: + del blocks[-1] + except: + return False + + # remove last transaction from pool + transactions = Tx() + transactions = utilityHelper.loadFile("../data/transaction_pool.dat") + if transactions[-1].type == 1 and transactions[-1].outputs[0][0] == block.metadata['miner']: + try: + del transactions[-1] + except: + return False + + utilityHelper.resetFile("../data/ledger.dat") + + for b in blocks: + utilityHelper.addFile("../data/ledger.dat", b) + + return True diff --git a/goodchain/src/helpers/SocketHelper.py b/goodchain/src/helpers/SocketHelper.py index a4c4bd5..6d4bab0 100644 --- a/goodchain/src/helpers/SocketHelper.py +++ b/goodchain/src/helpers/SocketHelper.py @@ -5,6 +5,8 @@ from classes.TxBlock import TxBlock from helpers import DatabaseHelper as databaseHelper from helpers import UtilityHelper as utilityHelper from helpers import BlockHelper as blockHelper +from helpers import TransactionHelper as transactionHelper +from helpers import TaskHelper as taskHelper import socket import pickle @@ -39,6 +41,7 @@ def recvObj(socket): def sendObj(ip_addr, blk, port): try: + print("sending to peer") soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.connect((ip_addr, port)) data = pickle.dumps(blk) @@ -47,7 +50,7 @@ def sendObj(ip_addr, blk, port): return True except: print("Could not connect to peer") - utilityHelper.close() + # utilityHelper.close() return False def connection(ip, port, db): @@ -64,21 +67,28 @@ def connection(ip, port, db): print(">>: ") if item.is_valid(): + if item.type == 0: + if item.outputs[0][1] > taskHelper.getBalanceWithOutgoingPoolByPublicKey(item.inputs[0][0], taskHelper.getBalanceByPublicKey(item.inputs[0][0])): + print(f"{utilityHelper.errorMessage('Received transaction is not valid')}") + sendObj(os.getenv("PEER_IP"), ["INVALID TRANSACTION",item], int(os.getenv("PEER_PORT"))) + continue utilityHelper.addFile("../data/transaction_pool.dat", item) continue print(f"{utilityHelper.errorMessage('Received transaction is not valid')}") + sendObj(os.getenv("PEER_IP"), ["INVALID TRANSACTION",item], int(os.getenv("PEER_PORT"))) if type(item) == TxBlock: print() print(f"{utilityHelper.blinkMessage('Received block from peer')}") print(">>: ") - valid, exit = blockHelper.socketBlock(item) + valid, exit, block = blockHelper.socketBlock(item) if not valid: print(f"{utilityHelper.errorMessage('Received block is not valid')}") - continue + sendObj(os.getenv("PEER_IP"), ["INVALID BLOCK",block], int(os.getenv("PEER_PORT"))) + continue if exit: print() @@ -120,6 +130,20 @@ def connection(ip, port, db): db.updateLogStatus(item[1]) continue + case "INVALID TRANSACTION": + print() + print(f"{utilityHelper.errorMessage('Last send transaction is not valid, removing from pool...')}") + print(">>: ") + transactionHelper.removeTransaction(item[1]) + continue + + case "INVALID BLOCK": + print() + print(f"{utilityHelper.errorMessage('Last send block is not valid, removing from ledger...')}") + blockHelper.removeInvalid(item[1]) + print(">>: ") + continue + if type(item) == str: match item: case "EXIT": diff --git a/goodchain/src/helpers/TaskHelper.py b/goodchain/src/helpers/TaskHelper.py index c737d71..643261a 100644 --- a/goodchain/src/helpers/TaskHelper.py +++ b/goodchain/src/helpers/TaskHelper.py @@ -9,7 +9,7 @@ def displayUnreadLogs(self): return False printLogs(logs) - socketHelper.testConnection(self.peer_ip_addr, self.peer_port) + utilityHelper.testConnection(self.peer_ip_addr, self.peer_port) for log in logs: self.db.updateLogStatus(log[0]) # NEW SEND USER @@ -37,6 +37,8 @@ def getBalance(self): balance = 0 blocks = utilityHelper.loadFile("../data/ledger.dat") for block in blocks: + if not block.metadata['validated']: + continue for transaction in block.data: if transaction.outputs[0][0] == self.user.public_ser: balance += transaction.outputs[0][1] @@ -44,6 +46,19 @@ def getBalance(self): balance -= transaction.inputs[0][1] return balance +def getBalanceByPublicKey(public_key): + balance = 0 + blocks = utilityHelper.loadFile("../data/ledger.dat") + for block in blocks: + if not block.metadata['validated']: + continue + for transaction in block.data: + if transaction.outputs[0][0] == public_key: + balance += transaction.outputs[0][1] + elif transaction.type != 1 and transaction.inputs[0][0] == public_key: + balance -= transaction.inputs[0][1] + return balance + def getBalanceWithOutgoingPool(self, balance): transactions = utilityHelper.loadFile("../data/transaction_pool.dat") for transaction in transactions: @@ -51,6 +66,13 @@ def getBalanceWithOutgoingPool(self, balance): balance -= transaction.inputs[0][1] return balance +def getBalanceWithOutgoingPoolByPublicKey(public_key, balance): + transactions = utilityHelper.loadFile("../data/transaction_pool.dat") + for transaction in transactions: + if transaction.type != 1 and transaction.inputs[0][0] == public_key: + balance -= transaction.inputs[0][1] + return balance + def getPersonalTransactions(self): blocks = utilityHelper.loadFile("../data/ledger.dat") total = 0 @@ -87,7 +109,7 @@ def getPersonalTransactions(self): print("-----------------------------------------------------------------------------------") def createLog(self, public_key, date, info, unread = 0): - socketHelper.testConnection(self.peer_ip_addr, self.peer_port) + utilityHelper.testConnection(self.peer_ip_addr, self.peer_port) self.db.createLog(public_key, date, info, unread) # NEW SEND USER socketHelper.sendObj(self.peer_ip_addr, ["CREATE LOG",public_key, date, info, unread], self.peer_port) \ No newline at end of file diff --git a/goodchain/src/helpers/TransactionHelper.py b/goodchain/src/helpers/TransactionHelper.py index 5576c4b..c22cdff 100644 --- a/goodchain/src/helpers/TransactionHelper.py +++ b/goodchain/src/helpers/TransactionHelper.py @@ -259,4 +259,14 @@ def pendingTransactions(self): case _: utilityHelper.clearScreen() print("Wrong input, try again") - return \ No newline at end of file + return + +def removeTransaction(transaction): + transactions = utilityHelper.loadFile("../data/transaction_pool.dat") + transactions.remove(transaction) + utilityHelper.resetFile("../data/transaction_pool.dat") + + # add old transactions to pool + for transaction in transactions: + utilityHelper.addFile("../data/transaction_pool.dat", transaction) + return \ No newline at end of file diff --git a/goodchain/src/helpers/UtilityHelper.py b/goodchain/src/helpers/UtilityHelper.py index 850f609..e646ad9 100644 --- a/goodchain/src/helpers/UtilityHelper.py +++ b/goodchain/src/helpers/UtilityHelper.py @@ -68,7 +68,7 @@ def loadFile(fileloc): return objs def loginStartup(self): - blockHelper.validateMinedBlock(self) + # blockHelper.validateMinedBlock(self) taskHelper.displayUnreadLogs(self) def errorMessage(text):