From 273b7f4552eae2615b8b6cd3a29e25b011996991 Mon Sep 17 00:00:00 2001 From: spekulaas Date: Tue, 7 Nov 2023 12:48:08 +0100 Subject: [PATCH] wip > laptop to pc --- alex.keys | Bin 0 -> 2246 bytes block.dat | Bin 0 -> 3560 bytes goodchain/data/block.dat | Bin 0 -> 3560 bytes goodchain/data/goodchain.db | Bin 0 -> 16384 bytes goodchain/data/transaction_pool.dat | 0 goodchain/data/transaction_pool.txt | 0 goodchain/src/classes/Blockchain.py | 25 ++++++ goodchain/src/classes/Transaction.py | 110 +++++++++++++++++++++++ goodchain/src/classes/TxBlock.py | 59 ++++++++++++ goodchain/src/helpers/BlockHelper.py | 0 goodchain/src/helpers/LoggerHelper.py | 1 - goodchain/src/helpers/MenuHelper.py | 22 ++++- goodchain/src/helpers/SignatureHelper.py | 9 +- goodchain/src/helpers/TaskHelper.py | 38 ++++++++ goodchain/src/helpers/UtilityHelper.py | 16 +++- mike.keys | Bin 0 -> 2246 bytes rose.keys | Bin 0 -> 2246 bytes 17 files changed, 272 insertions(+), 8 deletions(-) create mode 100644 alex.keys create mode 100644 block.dat create mode 100644 goodchain/data/block.dat create mode 100644 goodchain/data/goodchain.db create mode 100644 goodchain/data/transaction_pool.dat create mode 100644 goodchain/data/transaction_pool.txt create mode 100644 goodchain/src/classes/Blockchain.py create mode 100644 goodchain/src/classes/Transaction.py create mode 100644 goodchain/src/classes/TxBlock.py create mode 100644 goodchain/src/helpers/BlockHelper.py delete mode 100644 goodchain/src/helpers/LoggerHelper.py create mode 100644 goodchain/src/helpers/TaskHelper.py create mode 100644 mike.keys create mode 100644 rose.keys diff --git a/alex.keys b/alex.keys new file mode 100644 index 0000000000000000000000000000000000000000..0d5f7d7d80f9da28537bc4880e4bf596fcff5cf3 GIT binary patch literal 2246 zcmZuyH?Hi65nKU+An+7F=YG)-$<64^480#f0loKrB1JmE*J%{$E;@(aZnBV|iW;b- zyQ{0~Z-4y9KmYvGZ}{sE_TPW{>8J0%f)yl1|7JVPH`7*p#udIjh3Gd1Fqbj??%q@W z%QyUILFeqqbOj#Zh39u=D8^sDF@p0QB_7{7mirmQM3~`30!4U|WGR%TM1jT`f#gYw zgApD8Hlo?k0hS=84j#v|<0ZOKP-rXreP|@pp`1*T2I2GxIv-7V?B&gXH{yvR#+ zm^&gSy8GM^QpY(ht0m)kREx0gmD*cwF>C8*hQnHk?7bByLARA@68f%P> zF;j{~|DIr&nNriV+@0PD54Z2hn0YduHIE2zdu*Zual!NkV5K%c>LZ8*p8$6p+$t@T zTe%iLZxLnZT6RsEpSZ{PNf*sAKm16Lr5XuEg{GQlfxz3Ibt#Wv8d=?UK{3OkA?jLV z;|+?$f!^09JZya+(~Y&({cATLY0E2KC=|l=c>@EowCuV4)T${rFVHc(HaKS_3Y?Zj zJ+tOMnfpwJVC)|$10yn#$&k|qdf?xx1?TYs93dLwMOpC9M}bt-4k|~yjd(m6q5=i} zfX#@TUOgT~Qz337qLhN~-RJ5M{=T7`4je8gMxCDMr}*T#CZhLb+0}iydnbrdHFw2e zZmzBio50PBp-yJTO2kZCrSTl!D-1wuPx~Rk6ifWvJv}wt_a_fven+XtJt3)?Fd2p6 zhZ}H+nP4fh5qY38E{+=5xo$hKjxF3a67KbZPgQq?QoSF`#Y1~1WM3Vt+c;y*6=PMM z!E!lNWtj+dtWqXu8Wu?QfT;3L zOuR+$^5Z>4R$O*$BY@GvNU_Pa3uX4nf9IO_K~_0&d(9)^sml!bNFSGIV2`RjCDl1G zGT#&@_4ts8=8p)NB)axvnK|c`L`AnJ5C0WIujl&gIx|@my36K}%)c z$P>C(qn3alkj6y~A{;MSqXoSnxR0Vxn<(pSD8C0BtnGf;_e71>8#T`jgGeLZa)4l) z2!+AIDPW-)+PdQJ-R62dn=YSIkmw#lX_}$=ZHUCuz9jO|>PBSen73TPY4*T%XhifR zkNZ;U^+xViyGIS>u`y{PX^Q%2?uzV7$9J!txdGmmb}fwR3h7=~)PY*S;7c$TZ@8WG zCxI{(HoRy1kr#bKWG@H2lWezq&+Mj9mPgaW!%a%!)H=*i$8Ik&0d(RRAA3qF1HaF8 z0qFtqA4g+O7rtn@6p?f1|phP-P2VF*=fJMc~ zWp5VI%x?QhaatOCvML3u=yzBhmF#N4=#!SUt+!kJT#Q;fsRoswS-4GnX9JHiU{;in zw6u}dt7mwa$L!88Ne+rSnKhB6_qkHtvkmPex{O{ml;c>nKvcHlRu=>4sql=&u)nMM NzdHT+`;Yi9{{g&a*Np%G literal 0 HcmV?d00001 diff --git a/block.dat b/block.dat new file mode 100644 index 0000000000000000000000000000000000000000..74ee6ec498016b5563b47513f79ad87614f6c320 GIT binary patch literal 3560 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 total_in: + return False + return True + + def __gather(self): + data=[] + data.append(self.inputs) + data.append(self.outputs) + data.append(self.reqd) + return data + + def __repr__(self): + + repr_str = "INPUTS:\n" + for addr, amt in self.inputs: + repr_str = repr_str + str(amt) + "from" + str(addr) + "\n" + + repr_str += "OUTPUTS:\n" + for addr, amt in self.outputs: + repr_str = repr_str + str(amt) + "to" + str(addr) + "\n" + + repr_str += "EXTRA REQUIRED SIGNATURES:\n" + for req_sig in self.reqd: + repr_str = repr_str + str(req_sig) + "\n" + + repr_str += "SIGNATURES:\n" + for sig in self.sigs: + repr_str = repr_str + str(sig) + "\n" + + repr_str += "END\n" + + return repr_str + + def createTransaction(self, public_key, private_key, amount, fee, recipient, reqd = None, type = NORMAL): + self.add_input(public_key, amount + fee) + self.add_output(recipient, amount) + self.type = type + if reqd != None: + self.add_reqd(reqd) + self.sign(private_key) + + def createRewardTransaction(self, public_key, private_key, type): + value = type == "mine" and MINE_REWARD_VALUE or REGISTRATION_REWARD_VALUE + self.add_output(public_key, value) + self.type = REWARD + self.sign(private_key) + diff --git a/goodchain/src/classes/TxBlock.py b/goodchain/src/classes/TxBlock.py new file mode 100644 index 0000000..fe82526 --- /dev/null +++ b/goodchain/src/classes/TxBlock.py @@ -0,0 +1,59 @@ +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 = 25.0 +leading_zeros = 2 +next_char_limit = 20 + +class TxBlock (CBlock): + + def __init__(self, previousBlock): + self.nonce = "A random nonce" + super(TxBlock, self).__init__([], previousBlock) + + def addTx(self, Tx_in): + self.data.append(Tx_in) + + def __count_totals(self): + total_in = 0 + total_out = 0 + for tx in self.data: + for addr, amt in tx.inputs: + total_in = total_in + amt + for addr, amt in tx.outputs: + total_out = total_out + amt + return total_in, total_out + + 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 + + total_in, total_out = self.__count_totals() + + Tx_Balance = round(total_out - total_in, 10) + + if Tx_Balance > REWARD_VALUE: + 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() + return this_hash[:leading_zeros] == b'\x00'*leading_zeros + + def find_nonce(self): + for i in range(10000000): + self.nonce = i + if self.good_nonce(): + return self.nonce + return None diff --git a/goodchain/src/helpers/BlockHelper.py b/goodchain/src/helpers/BlockHelper.py new file mode 100644 index 0000000..e69de29 diff --git a/goodchain/src/helpers/LoggerHelper.py b/goodchain/src/helpers/LoggerHelper.py deleted file mode 100644 index f9bca2d..0000000 --- a/goodchain/src/helpers/LoggerHelper.py +++ /dev/null @@ -1 +0,0 @@ -# Not sure if we're planning to log anything tho \ No newline at end of file diff --git a/goodchain/src/helpers/MenuHelper.py b/goodchain/src/helpers/MenuHelper.py index 83b5658..4cf064e 100644 --- a/goodchain/src/helpers/MenuHelper.py +++ b/goodchain/src/helpers/MenuHelper.py @@ -1,6 +1,10 @@ import os from classes.User import User +from classes.Transaction import Tx +from helpers import BlockHelper as blockHelper +from helpers import TaskHelper as taskHelper +from helpers import UtilityHelper as utilityHelper class bcolors: HEADER = '\033[95m' @@ -131,10 +135,24 @@ class MenuHelper: case "Explore the Blockchain": print("TODO") + block = blockHelper.loadBlock() + i = 0 + for data in block.data: + + print(f"---------------------------------- Block {str(i)} ----------------------------------") + print(f"Block hash: {data.Inputs[0][1]}") + print(f"----------------------------------------------------------------------------------") + i += 1 case "Transfer coins": - input("Enter the username of the receiver: ") - print("TODO") + new_tx = taskHelper.transaction(self) + if new_tx.is_valid(): + # TODO: add to pool + print("Transaction is valid") + utilityHelper.saveFile("../data/transaction_pool.dat", new_tx) + continue + print("Transaction is invalid") + case "Cancel transaction": print("TODO") diff --git a/goodchain/src/helpers/SignatureHelper.py b/goodchain/src/helpers/SignatureHelper.py index 4c43ee6..fd22c7b 100644 --- a/goodchain/src/helpers/SignatureHelper.py +++ b/goodchain/src/helpers/SignatureHelper.py @@ -41,6 +41,12 @@ def bytesToKeys(private_ser, public_ser): ) return private_key, public_key +def publicBytesToKey(public_ser): + public_key = serialization.load_pem_public_key( + public_ser + ) + return public_key + def sign(message, private_key): message = bytes(str(message), 'utf-8') signature = private_key.sign( @@ -50,9 +56,8 @@ def sign(message, private_key): ) return signature -def verify(message, signature, pbc_ser): +def verify(message, signature, public_key): message = bytes(str(message), 'utf-8') - public_key = serialization.load_pem_public_key(pbc_ser) try: public_key.verify( signature, diff --git a/goodchain/src/helpers/TaskHelper.py b/goodchain/src/helpers/TaskHelper.py new file mode 100644 index 0000000..c993f31 --- /dev/null +++ b/goodchain/src/helpers/TaskHelper.py @@ -0,0 +1,38 @@ +from classes.Transaction import Tx +from helpers import SignatureHelper as signatureHelper + +def transaction(self): + receiver = input("Enter the username of the receiver:") + if receiver == "": + return False + + receiver_data = self.db.fetchUserByUsername(receiver) + if not receiver_data: + print("Username not found") + return False + + receiver_public_key = signatureHelper.publicBytesToKey(receiver_data[1]) + + amount = input("Enter the amount excluding fees:") + if amount == "": + return False + + try: + amount = int(amount) + except: + print("Wrong input, try again") + return False + + fee = input("Enter fee:") + if fee == "": + return False + + try: + fee = int(fee) + except: + print("Wrong input, try again") + return False + + new_tx = Tx() + new_tx.createTransaction(self.user.public_key, self.user.private_key, amount, fee, receiver_public_key) + return new_tx \ No newline at end of file diff --git a/goodchain/src/helpers/UtilityHelper.py b/goodchain/src/helpers/UtilityHelper.py index 1470242..227cfae 100644 --- a/goodchain/src/helpers/UtilityHelper.py +++ b/goodchain/src/helpers/UtilityHelper.py @@ -1,6 +1,4 @@ -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import hashes - +import pickle import hashlib def computeHash(data): @@ -8,3 +6,15 @@ def computeHash(data): data = str(data).encode() hash.update(data) return hash.hexdigest() + + +def saveFile(fileloc, data): + savefile = open(fileloc, "wb") + pickle.dump(data, savefile) + savefile.close() + +def loadFile(fileloc): + loadfile = open(fileloc ,"rb") + load = pickle.load(loadfile) + loadfile.close() + return load \ No newline at end of file diff --git a/mike.keys b/mike.keys new file mode 100644 index 0000000000000000000000000000000000000000..61de7bc1a4287fd4cdd7ca6f71ceb74758c863f2 GIT binary patch literal 2246 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 MPT&9jJ^jmn0L6IFb^rhX literal 0 HcmV?d00001