from minicoin import Blockchain def print_chain(bc): print("\n=== 📜 Blockchain Atual ===") for i, block in enumerate(bc.chain): print(f"\n🔹 Bloco {i}") print(f"Previous Hash: {block.previousHash}") print(f"Hash: {block.hash}") print(f"Dados: {vars(block.data)}") print("===========================\n") # === Cenário base === print("🔧 Criando conta de teste...") bc = Blockchain() genesis = bc.createGenesisBlock(acc_owner="Alice", amount=1000) print("✔️ Bloco gênesis criado!\n") # Operações válidas bc.addBlock(500, "deposit") bc.addBlock(200, "withdraw") bc.addBlock(100, "deposit") print_chain(bc) # === Teste 1: adulterar o valor de uma transação existente === print("🚨 Tentando adulterar valor de uma transação...") bc.chain[1].data.amount = 9999 if bc.isValid(): print("❌ ERRO: Blockchain deveria estar inválida após adulteração!") else: print("✅ Detecção de adulteração bem-sucedida!") # Restaurar o bloco original (para testes seguintes) bc.chain[1].data.amount = 500 bc.chain[1].hash = bc.chain[1].calculateBlockHash() # === Teste 2: adulterar o hash anterior de um bloco === print("\n🚨 Tentando alterar previousHash de um bloco...") bc.chain[2].previousHash = "00000000000000000000000000000000" if bc.isValid(): print("❌ ERRO: Blockchain deveria estar inválida após alteração do previousHash!") else: print("✅ Detecção de alteração de encadeamento bem-sucedida!") # Restaurar o valor correto bc.chain[2].previousHash = bc.chain[1].hash # === Teste 4: tentar saque com saldo insuficiente === print("\n🚨 Tentando saque com saldo insuficiente...") try: bc.addBlock(999999, "withdraw") print("❌ ERRO: Saque de valor inválido foi aceito!") except Exception as e: print(f"✅ Exceção esperada: {e}") # === Teste 5: tentar adicionar bloco a uma blockchain já corrompida === print("\n🚨 Tentando adicionar bloco em blockchain inválida...") # Forçar corrupção bc.chain[0].data.amount = 123456 try: bc.addBlock(50, "deposit") print("❌ ERRO: Blockchain inválida deveria bloquear novos blocos!") except Exception as e: print(f"✅ Bloqueio esperado: {e}") # === Estado final === print_chain(bc)