Relatório da Moeda Virtual: Minicoin

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:

minicoin.py

servidor.py

cliente.py


Como funciona (passo a passo)

  1. Inicialização: o 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.
  2. Conexão do cliente: o 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.
  3. Protocolo de eventos: a comunicação é baseada em um protocolo que usa a tag [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.
  4. Criação da conta: O cliente envia "1". O servidor chama 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.
  5. Validação e Transações: Para qualquer outra operação, o servidor primeiro executa validações de segurança:
  6. Robustez: O servidor é robusto a falhas, para que, se um cliente desconectar abruptamente, o servidor não quebre, mantenha o histórico correto da blockchain e possa atender ao próximo cliente.

Código fonte

O código comentado está disponível nos seguintes links abaixo (salvos como .txt para visualização no navegador).

Diagramas

Diagrama de Execução

Diagrama Estrutural da Blockchain

Diagrama de Classes

Diagrama de Classes da Blockchain

Testes de execução e resultado

Os testes a seguir são scripts montados para cobrir operações corretas e casos de erro.

Teste 1: Teste de Robustez (Script Procedural)

Esse teste simula ataques e cenários de erro para garantir que a classe Blockchain é segura e funciona corretamente.

Arquivo: robustness_test.py.txt

LOG:

❯ 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'}
===========================
    

Teste 2: Testes de Unidade (Unittest)

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

LOG:

......
----------------------------------------------------------------------
Ran 6 tests in 0.000s

OK