Redes de Computadores 2
Autores: João Armênio Silveira (20211792), Fábio Naconeczny da Silva (20211782)
O objetivo deste trabalho foi projetar e implementar um sistema cliente/servidor que simula uma conta bancária usando estruturas de dados e conceitos de Blockchain para armazenar as transações. A arquitetura do sistema é composta por três arquivos, cada um com uma responsabilidade:
Block (um registro de transação) e o que é uma Blockchain (a corrente de blocos).minicoin.py para usar a lógica da blockchain.socket para abrir uma porta e "escutar" por conexões de clientes.socket para se conectar ao servidor.servidor.py é executado. Ele cria um socket, faz o bind() e entra no modo de escuta (listen()), aguardando conexões. A variável blockchain é iniciada vazia.cliente.py é executado. Ele usa connect() para se conectar ao servidor. O servidor aceita a conexão (s.accept()), criando um novo socket (cli_conn) dedicado a esse cliente.[EVENT]. Quando o servidor envia uma mensagem contendo [EVENT], o cliente sabe que deve parar e aguardar algum input do usuário. Quando o servidor envia outro tipo de mensagem ([SUCCESS], [INFO], [ERROR]), o cliente apenas imprime a mensagem e volta a esperar por novos dados.create_account(). Essa função cria o objeto Blockchain e chama createGenesisBlock(), passando o nome do dono e o depósito inicial. A variável blockchain no servidor recebe esse bloco inicial.blockchain.isValid(), que faz uma checagem da validez do hash de todos os blocos da blockchain, garantindo que ela não foi corrompida/falsificada.make_withdrawal(), quando é feita uma adição de bloco, é feita a verificação se o saque é maior que o saldo. Se for, levanta uma exceção.O código comentado está disponível nos seguintes links abaixo (salvos como .txt para visualização no navegador).
Os testes a seguir são scripts montados para cobrir operações corretas e casos de erro.
Esse teste simula ataques e cenários de erro para garantir que a classe Blockchain é segura e funciona corretamente.
Arquivo: robustness_test.py.txt
❯ python3 robustness_test.py
🔧 Criando conta de teste...
✔ Bloco gênesis criado!
=== 📜 Blockchain Atual ===
🔹 Bloco 0
Previous Hash: None
Hash: b5767239d6ebe0be193bdb8733fad837b73c38cac47bb476598bb0a6247ed900
Dados: {'amount': 1000, 'operation': 'deposit', 'acc_owner': 'Alice', 'creation_acc_date': '2025-11-13 11:28:46'}
🔹 Bloco 1
Previous Hash: b5767239d6ebe0be193bdb8733fad837b73c38cac47bb476598bb0a6247ed900
Hash: 78f2e9364a7c8e1d7f2369e8654eed4c984a59b34fb5c533a94a91b520446ff2
Dados: {'amount': 500, 'operation': 'deposit'}
🔹 Bloco 2
Previous Hash: 78f2e9364a7c8e1d7f2369e8654eed4c984a59b34fb5c533a94a91b520446ff2
Hash: bbebbaaf140206930b320de7e5d01f7b9f685f537b9d0005fa37ee5a78a72ecd
Dados: {'amount': 200, 'operation': 'withdraw'}
🔹 Bloco 3
Previous Hash: bbebbaaf140206930b320de7e5d01f7b9f685f537b9d0005fa37ee5a78a72ecd
Hash: aa9c4d1e73b44ba5ad0a7ed79dbda067d2e1c85c8e4edfdf891a05a1b0c064d9
Dados: {'amount': 100, 'operation': 'deposit'}
===========================
🚨 Tentando adulterar valor de uma transação...
✅ Detecção de adulteração bem-sucedida!
🚨 Tentando alterar previousHash de um bloco...
✅ Detecção de alteração de encadeamento bem-sucedida!
🚨 Tentando saque com saldo insuficiente...
✅ Exceção esperada: Saque de 999999 maior que o saldo disponível (1400). Operação bloqueada.
🚨 Tentando adicionar bloco em blockchain inválida...
✅ Bloqueio esperado: Blockchain inválida. Não é possível adicionar um novo bloco.
=== 📜 Blockchain Atual ===
🔹 Bloco 0
Previous Hash: None
Hash: b5767239d6ebe0be193bdb8733fad837b73c38cac47bb476598bb0a6247ed900
Dados: {'amount': 123456, 'operation': 'deposit', 'acc_owner': 'Alice', 'creation_acc_date': '2025-11-13 11:28:46'}
🔹 Bloco 1
Previous Hash: b5767239d6ebe0be193bdb8733fad837b73c38cac47bb476598bb0a6247ed900
Hash: 78f2e9364a7c8e1d7f2369e8654eed4c984a59b34fb5c533a94a91b520446ff2
Dados: {'amount': 500, 'operation': 'deposit'}
🔹 Bloco 2
Previous Hash: 78f2e9364a7c8e1d7f2369e8654eed4c984a59b34fb5c533a94a91b520446ff2
Hash: bbebbaaf140206930b320de7e5d01f7b9f685f537b9d0005fa37ee5a78a72ecd
Dados: {'amount': 200, 'operation': 'withdraw'}
🔹 Bloco 3
Previous Hash: bbebbaaf140206930b320de7e5d01f7b9f685f537b9d0005fa37ee5a78a72ecd
Hash: aa9c4d1e73b44ba5ad0a7ed79dbda067d2e1c85c8e4edfdf891a05a1b0c064d9
Dados: {'amount': 100, 'operation': 'deposit'}
===========================
Ele usa a biblioteca unittest do Python para verificar sistematicamente
se a classe Blockchain está funcionando como o esperado. O objetivo é "atacar" a lógica
de todas as formas para garantir que ela seja robusta.
Arquivo: unity_test.py.txt
......
----------------------------------------------------------------------
Ran 6 tests in 0.000s
OK