Aplicação do hackathon CoreCraft (Bitcoin Coders) que usa Bitcoin Core como backend real para operações de troca/pagamento com UX de cliente e operação administrativa.
O objetivo é simples: provar um fluxo utilizável, auditável e rápido, com:
- Bitcoin Core (JSON-RPC + ZMQ)
- FastAPI (orquestração de negócio)
- React (cliente e admin)
- MariaDB (persistência operacional)
- Caddy (HTTPS/proxy)
Demo em vídeo (hackathon): YouTube — gravação da apresentação
- Criar ordem de envio on-chain
- Criar swap Lightning via Boltz
- Criar compra via Bitrefill
- Ver progresso da ordem, status externo, timeline BRT e dados técnicos (em signet)
- Node tools: chain/wallet/ZMQ + painel de saúde + diagnóstico 1-clique
- Histórico de trocas + logs
- Resgate de fundos travados por UTXO
- Realização de lucro (saque administrativo com senha master e trilha RPC)
docker-compose.yml(raiz): serviçobitcoinde redebitcoin-coder-netinfra/bitcoin/bitcoin.conf: config do Core (RPC + ZMQ + prune)stack/docker-compose.yml: backend, frontend, MariaDB, Caddystack/backend/: API e lógica de negóciostack/frontend/: aplicação web cliente/adminstack/infra/caddy/Caddyfile: TLS interno + reverse proxy
cp .env.example .env
cp stack/.env.example stack/.envPreencha no mínimo:
- raiz
.env:BITCOIN_RPC_USER,BITCOIN_RPC_PASSWORD, host/porta de bitcoind stack/.env:SECRET_KEYADM_BOOTSTRAP_PASSWORDBITCOIN_OPERATOR_WALLETADM_MASTER_WITHDRAW_PASSWORD(saque lucro)- (opcional)
BITREFILL_*eBOLTZ_*
docker compose up -dcd stack
docker compose up -d --buildcurl http://localhost:8200/health- Público/cliente:
https://localhost:9443/cliente - Admin:
https://localhost:9443/adm
Certificado é
tls internalno Caddy; aceite o aviso no browser em ambiente local.
getnewaddress: gera endereço único de depósito por ordemlistunspent: detecta fundos no endereço da ordemwalletcreatefundedpsbt+walletprocesspsbt+finalizepsbt: monta/assina tx de payoutsendrawtransaction: transmite payoutgettransaction: atualiza estado de confirmação
- Core faz a perna on-chain do swap:
- endereço de depósito local via
getnewaddress - detecção de depósito via
listunspent/ZMQ - envio para lockup da Boltz via PSBT +
sendrawtransaction
- endereço de depósito local via
- Boltz retorna status externo (
status_raw) e preimage; estado local é sincronizado.
- Core recebe depósito do cliente e financia pagamento on-chain da invoice Bitrefill:
- detecção de depósito
- construção/assinatura/envio da tx
- confirmação de conclusão no estado da ordem
O ZMQ do Bitcoin Core é usado como canal de evento em tempo real (principalmente hashtx e hashblock) para reduzir latência operacional.
- Quando uma transação entra na mempool e toca a wallet do operador, o relay ZMQ publica evento.
- O backend (
SwapOrderProcessor) reage ao evento para casar a ordem e iniciar o processamento do payout mais cedo. - Resultado prático: o sistema costuma sair de
awaiting_depositpara estados seguintes sem esperar ciclos longos de polling.
- ZMQ é o caminho preferencial para velocidade.
- Polling continua existindo (
listunspentvia watcher/recovery) como fallback para:- perda de evento
- reconexão de serviço
- cenários de rede instável
Ou seja: não é “ZMQ ou polling”; é ZMQ first + polling safety net para robustez.
getblockchaininfo: estado da chain, blocks/headers/laggetmempoolinfo: mempool size e mempoolminfeegetwalletinfo+listwallets/loadwallet/createwallet: estado da carteira operacional- Snapshot de ZMQ relay (último evento, conectado/desconectado)
listunspent: identifica UTXOs presos no endereço de depósito da ordemwalletcreatefundedpsbt+walletprocesspsbt+finalizepsbt+sendrawtransaction- Retorno inclui detalhe RPC para auditoria operacional
- Escopo: somente UTXOs do endereço índice 0 (
fee-index-0) - Regra: envia 90% para destino, taxa 3 sat/vB, troco no índice 0
- Pipeline RPC:
validateaddresslistunspent(fee-index-0)walletcreatefundedpsbtwalletprocesspsbtfinalizepsbtsendrawtransaction
flowchart TD
A[Cliente cria ordem] --> B[Backend persiste ordem MariaDB]
B --> C[Bitcoin Core gera endereco de deposito]
C --> D[Cliente envia BTC on-chain]
D --> E[ZMQ hashtx + fallback listunspent]
E --> F[SwapOrderProcessor detecta deposito]
F --> G[Backend monta PSBT via RPC]
G --> H[walletprocesspsbt/finalizepsbt]
H --> I[sendrawtransaction]
I --> J[Ordem em confirming/provider_processing]
J --> K[Concluida paid_out]
J --> L[Provedor externo Boltz/Bitrefill]
L --> K
M[Admin /adm/node] --> N[Health summary + diagnostico]
M --> O[Historico e logs]
M --> P[Resgate de fundos]
M --> Q[Realizacao de lucro]
docker compose -f stack/docker-compose.yml restart backend
docker compose -f stack/docker-compose.yml restart frontendcd stack
docker compose up -d --buildcd stack
docker compose exec -T backend pip install -r requirements-dev.txt
docker compose exec -T backend sh -lc 'PYTHONPATH=/app pytest tests/'- Não expor RPC do Bitcoin Core na internet pública sem proteção.
- Não commitar segredos (
SECRET_KEY, senhas admin, chaves API, master password). - Use carteira operacional dedicada (
BITCOIN_OPERATOR_WALLET). - Em produção, usar TLS válido e
COOKIE_SECURE=1.
- Métricas e alertas externos (Prometheus/Grafana ou Datadog)
- Retentativa com fila para integrações externas (Boltz/Bitrefill)
- Jobs assíncronos com backoff persistente
- RBAC admin (perfis e trilha de auditoria completa por usuário)
- Testes e2e de fluxos críticos com cenários de falha RPC
- Política explícita de fees dinâmica por ambiente/rede
Este repositório já entrega um MVP operacional completo para demo técnica:
Atualmente, a aplicação está funcional e rodando com um node Bitcoin Core em mainnet em https://zconfcore.duckdns.org/. Gravação da demo: YouTube.
- Fluxo cliente utilizável
- Operação administrativa real
- Integração Bitcoin Core ponta a ponta
- Observabilidade mínima com diagnóstico e workers internos