# Eloiza Sthefanny Rocha da Silva Cardoso GRR20235165 # Helen Kaori Iijima GRR20235160 import socket import json import sys from blockchain import * host = '0.0.0.0' porta = 5000 def iniciar_servidor(): blockchain = [] # cria e configura o socket TCP servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM) servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) servidor.bind((host, porta)) servidor.listen(1) try: # aceita UMA conexao com o cliente e depois segue para o loop de atendimento novo_socket, addr = servidor.accept() print(f"Conectado por: {addr}") try: while True: # recebe dados do socket dados_bytes = novo_socket.recv(1024) # se cliente desconectar com CTRL+C ou fechar janela if not dados_bytes: print("Cliente desconectou.\n") break # transforma dados em bytes dados = json.loads(dados_bytes.decode()) print(f"{dados['acao']}".upper()) resposta = {} # cria bloco genesis if dados["acao"] == "criar_conta": proprietario = dados["proprietario"] valor_inicial = dados["valor_inicial"] blockchain.append(cria_bloco_genesis(valor_inicial, proprietario)) print(f" - Proprietario: {blockchain[0]['proprietario']}") print(f" - Saldo inicial: {get_saldo_atual(blockchain)} MiniCoins") # responde cliente com sucesso resposta = {"status": "OK", "mensagem": "Conta criada com sucesso!"} print(f"[Output] {resposta['mensagem']}") # adiciona nova transacao no blockchain elif dados["acao"] == "transacao": tipo, valor = dados["tipo"], dados["valor"] print(f"Processando transacao Tipo: {tipo}, Valor: {valor}") # cria novo bloco de transacao novo_bloco = nova_transacao(blockchain, tipo, valor) if novo_bloco: # coloca novo bloco no blockchain e avisa cliente blockchain.append(novo_bloco) resposta = {"status": "OK", "mensagem": "Transacao realizada"} else: # caso cliente tente sacar mais dinheiro do que saldo resposta = {"status": "ERRO", "mensagem": "Saldo insuficiente"} # retorna o saldo da conta elif dados["acao"] == "ver_saldo": saldo = get_saldo_atual(blockchain) print(f"Consultando saldo: {saldo}") resposta = {"status": "OK", "mensagem": f"{saldo} MiniCoins"} # cliente selecionou sair elif dados["acao"] == "sair": print("Cliente solicitou encerramento.") novo_socket.sendall(json.dumps({"status": "OK", "mensagem": "Tchau!"}).encode()) break # acoes nao previstas else: resposta = {"status": "ERRO", "mensagem": "Acao invalida"} # envia resposta quando a acao nao eh sair if dados["acao"] != "sair": novo_socket.sendall(json.dumps(resposta).encode()) if blockchain and dados["acao"] != "sair": print(f"[Saldo] {get_saldo_atual(blockchain)} MiniCoins\n") # excecao de conexao perdida com o cliente except (ConnectionResetError, json.JSONDecodeError): print("\nConexao perdida com o cliente.") # fecha o socket finally: novo_socket.close() # caso de CTRL+C except KeyboardInterrupt: print("\nServidor interrompido via teclado (Ctrl+C).") # fecha o socket de escuta finally: servidor.close() if blockchain: print(f"Servidor encerrado. Saldo final: {get_saldo_atual(blockchain)} MiniCoins") else: print("Servidor encerrado.")