Uma blockchain simplificada escrita em Rust, servida por uma API REST com Actix Web. Atualmente com suporte a:
- Faucet para criar UTXOs de teste
- Transações assinadas com ECDSA secp256k1 (modelo UTXO)
- Validação real de entradas com verificação de assinatura
- Geração de carteiras (chave privada, chave pública e endereço)
- Mempool para transações pendentes
- Mineração com coinbase + mempool
- Ajuste automático de dificuldade para alvo de ~60s/bloco
- Endpoint de estatísticas da rede (
/stats/) - Logging detalhado para debug
- Estrutura de pastas organizada (
mod.rsem cada módulo) - Endpoints padronizados em
/api/v1/.../(com barra final)
src/
├── api/
│ ├── chain.rs # Endpoints relacionados à blockchain (get, validate, mine, difficulty)
│ ├── health.rs # Health check
│ ├── mod.rs # Registro das rotas
│ ├── models.rs # Modelos de request/response + AppState
│ ├── stats.rs # Estatísticas da blockchain
│ ├── tx.rs # Faucet, transações e mempool
│ └── wallet.rs # Endpoints de geração de carteiras
├── blockchain/
│ ├── block.rs # Estrutura de bloco + PoW
│ ├── mod.rs # Módulo principal da blockchain
│ └── ...
├── transaction/
│ ├── model.rs # Transaction, TxInput, TxOutput
│ ├── utxo.rs # UTXO set + OutPoint
│ └── mod.rs # Reexporta submódulos
├── wallet/
│ └── mod.rs # Lógica de geração/validação de chaves e assinaturas
└── main.rs # Inicializa servidor e AppState
- Rust >= 1.70
cargoinstalado
# Clone e entre no diretório do projeto
git clone <repo-url>
cd <repo>
# Instale dependências e rode
cargo runOu com script de hot reload:
./start_server.shCom logs de debug:
RUST_LOG=debug,actix_web=info cargo runServidor sobe por padrão em:
http://127.0.0.1:8080
GET /api/v1/health/
Verifica se a API está online.
curl http://127.0.0.1:8080/api/v1/health/POST /api/v1/wallet/new/
Gera chave privada, chave pública e endereço.
Response:
{
"private_key": "hex...",
"public_key": "hex...",
"address": "hex..."
}POST /api/v1/faucet/
Cria um UTXO diretamente para testes.
Request:
{ "address": "hex_pubkey", "amount": 100 }Response:
{ "txid": "hash..." }POST /api/v1/tx/
Request:
{
"inputs": [
{
"outpoint": { "txid": "hash...", "vout": 0 },
"pubkey": "hex_pubkey",
"signature": "hex_der_signature"
}
],
"outputs": [
{ "address": "hex_pubkey_dest", "amount": 60 },
{ "address": "hex_pubkey_troco", "amount": 39 }
]
}GET /api/v1/mempool/
Lista transações pendentes.
POST /api/v1/mine/
Mina um novo bloco, pagando coinbase + taxas ao minerador.
Request:
{ "miner_address": "hex_pubkey" }GET /api/v1/balance/{address}/
Consulta saldo e número de UTXOs.
GET /api/v1/stats/
Mostra altura, dificuldade, tempos de bloco, mempool e tamanho do UTXO.
- Criar wallet (
/wallet/new/) - Faucet para endereço gerado
- Criar outra wallet (destinatário)
- Montar payload assinado e enviar no
/tx/ - Minerar com
/mine/ - Conferir saldos e stats
- Múltiplos mineradores externos
- Propagação de blocos e transações entre nós
- Persistência de dados em disco
- Melhorias no formato de endereço
MIT License