# Eloiza Sthefanny Rocha da Silva Cardoso GRR20235165 # Helen Kaori Iijima GRR20235160 from datetime import datetime from decimal import Decimal import hashlib # ---------- mapeamento de tipos de transacao DEPOSITO = "Deposito" SAQUE = "Saque" # ---------- cria o bloco inicial da blockchain def cria_bloco_genesis (valor_inicial, proprietario): bloco_0 = { 'Id': 0, 'timestamp': datetime.today().strftime("%d-%m-%Y %H:%M:%S"), 'proprietario': proprietario, 'transacao': {'tipo': DEPOSITO, 'valor': Decimal(valor_inicial)}, 'hash_anterior': None } bloco_0['hash_atual'] = calcular_hash(bloco_0) return bloco_0 # ---------- calcula a hash a partir dos campos necessarios def calcular_hash (bloco): dados_para_hash = ( str(bloco['Id']) + bloco['timestamp'] + str(bloco.get('proprietario', None)) + str(bloco['transacao']) + str(bloco['hash_anterior']) ) return hashlib.sha256(dados_para_hash.encode()).hexdigest() # ----------- retorna o ultimo bloco def get_ultimo_bloco (blockchain): return blockchain[-1] # ----------- percorre a blockchain para calcular o saldo atual def get_saldo_atual (blockchain): saldo = blockchain[0]['transacao']['valor'] hash_anterior = blockchain[0]['hash_atual'] # ignora o bloco genesis for bloco in blockchain[1:]: # verifica se hash esta correta if (bloco['hash_anterior'] == hash_anterior): if bloco['transacao']['tipo'] == DEPOSITO: saldo = saldo + bloco['transacao']['valor'] elif bloco['transacao']['tipo'] == SAQUE: saldo = saldo - bloco['transacao']['valor'] hash_anterior = bloco['hash_atual'] else: # caso tenha ocorrido alguma manipulacao anterior print (f"HASH INVALIDA: bloco Id = {bloco['Id']}") return -1 return saldo # ---------- adiciona trasacao no final da blockchain def nova_transacao (blockchain, tipo, valor): saldo_atual = get_saldo_atual(blockchain) valor_decimal = Decimal(valor) # verifica se tem valor necessario para retirar if (tipo == SAQUE) and (valor_decimal > saldo_atual): print('TRANSACAO INVALIDA!') return None # cria novo bloco ultimo_bloco = get_ultimo_bloco(blockchain) novo_bloco = { 'Id': ultimo_bloco['Id'] + 1, 'timestamp': datetime.today().strftime("%d-%m-%Y %H:%M:%S"), 'proprietario': None, 'transacao': {'tipo': tipo, 'valor': valor_decimal}, 'hash_anterior': ultimo_bloco['hash_atual'] } novo_bloco['hash_atual'] = calcular_hash(novo_bloco) return novo_bloco