Criar uma blockchain de raiz a partir do zero parece um projeto saído de um manual utópico. Mas quando decides que o “Nó A” vai correr num PC com Windows (via WSL) e o “Nó B” vai correr num Raspberry Pi 5 na tua secretária, a teoria choca de frente com a realidade das arquiteturas de hardware.
Este é o diário de construção da Rabbitcoin, uma blockchain baseada no Polkadot SDK (Substrate), e de todos os “glitches”, becos sem saída e monstros de memória que enfrentei até ver o glorioso log: 🏆 Imported #1.
1. O Ponto de Partida: A “Tabula Rasa”
A ideia inicial era compilar o nó da Rabbitcoin no Windows (x86_64), colocar numa imagem Docker e correr essa mesma imagem em todo o lado, incluindo no Raspberry Pi (ARM64).
Primeiro Erro Fatal: Diferenças de versões (BabeApi). Tentar usar um binário antigo e incompatível no Pi resultou num erro de consenso imediato. Descobri da pior forma que não podes misturar códigos de versões diferentes (ex: 0.0.0 vs 3.0.0-dev). A solução? Uma “Tabula Rasa”. Apaguei tudo e decidi compilar a exata mesma versão do código-fonte nativamente em cada máquina.
Utilizei o repositório moderno oficial da Parity:
Bash
git clone https://github.com/paritytech/polkadot-sdk-solochain-template.git rabbitcoin
2. Compilação no WSL: O Glitch do rust-src
No meu ambiente Windows (Ubuntu via WSL2), o processo parecia simples. Instalei as ferramentas de compilação em C++ e a toolchain do Rust com o alvo WebAssembly (Wasm), que é obrigatório para o Substrate.
No entanto, ao correr cargo build --release, o compilador gritou: Cannot compile the WASM runtime: no standard library sources found
A Solução: O Rust, por defeito, não instala o código-fonte da biblioteca standard, o que impede a compilação do Wasm. Um simples comando resolveu o problema:
Bash
rustup component add rust-src
Após 8 minutos de compilação, o Bob (o meu primeiro nó validador) estava vivo. Gerei o ficheiro rabbitcoin-spec-raw.json (as regras do universo da rede) e coloquei-o à escuta.
3. O Desafio do Raspberry Pi e o Monstro do mmap
Com o Bob a correr, passei para a Alice, o nó que ia viver no Raspberry Pi 5. No início, tentei forçar a imagem Docker de x86 no Pi. O Docker usou o emulador QEMU por trás dos panos, o que nos levou ao pior erro de todo este projeto:
mmap failed to allocate 0x6080000000 bytes: Cannot allocate memory (os error 12)
O motor Wasmtime do Substrate estava a tentar alocar um bloco contínuo absurdo de 384 GB de memória virtual. O emulador do Docker colapsou instantaneamente.
Decidi então compilar o código nativamente no Pi. Foram quase 40 minutos de processamento intenso em ARM64. O binário ficou perfeito. Fui executar a Alice e… o erro do mmap voltou a aparecer!
Como derrotar o erro 12 no Raspberry Pi 5
Descobri que as versões mais recentes do Substrate usam um “Pooling Allocator” no Wasmtime. Ele pré-aloca um latifúndio de memória virtual para ser mais rápido. Num servidor Cloud, o Kernel aceita isso; no Raspberry Pi 5, o Kernel recusa terminantemente (mesmo forçando vm.overcommit_memory=1 no sysctl).
A Bala de Prata: Adicionei uma flag oculta ao script de arranque da Alice para forçar o Wasmtime a instanciar a memória de forma modular, desligando o alocador gigante:
Bash
--wasmtime-instantiation-strategy recreate-instance-copy-on-write
Problema resolvido. A Alice arrancou nativamente no Pi!
4. O Labirinto da Rede: O IP Dinâmico do WSL
A Alice (Pi) e o Bob (WSL) estavam vivos, tinham o mesmo hash no bloco Génesis (0x0edd…e987), mas não comunicavam. Os logs da Alice mostravam um deprimente 💤 Idle (0 peers).
Fiz um teste com o nc -zv do Pi para o IP do meu Windows (na porta 30333) e o túnel estava aberto. Qual era o problema? O WSL2 altera o seu IP interno sempre que o Windows reinicia.
O PortProxy do Windows estava a encaminhar o tráfego da Alice para um IP “fantasma” do WSL.
A Correção Final: Fui ao WSL, corri hostname -I para descobrir o novo IP interno (ex: 172.30.220.98), e abri o PowerShell do Windows como Administrador para atualizar a rota:
PowerShell
netsh interface portproxy set v4tov4 listenport=30333 listenaddress=0.0.0.0 connectport=30333 connectaddress=172.30.220.98
Segundos depois, o ecrã iluminou-se: 🙌 Starting consensus session... 🏆 Imported #1
A Rabbitcoin estava oficialmente viva, com consenso a ser gerado entre um processador Intel (via virtualização) e um chip ARM num micro-computador.
🚀 Como ligar-se à rede Rabbitcoin
Este laboratório não é um condomínio fechado. Se quiseres ligar um nó à minha testnet e sincronizar os blocos, podes fazê-lo de qualquer parte do mundo.
Deixei as especificações da rede (o ficheiro chain spec) alojadas publicamente. Precisas apenas de compilar o teu nó Substrate (usando o polkadot-sdk-solochain-template) e arrancar com o teu nó apontando para o meu servidor.
Instala o Rust e as dependências:
Copia e cola este comando no teu terminal (Linux ou Mac):
Bash
curl https://getsubstrate.io -sSf | bash -s -- --fast
(Este script instala o Rust e todos os componentes necessários para compilar nós de blockchain).
Clona o Template e Compila:
Bash
git clone https://github.com/paritytech/polkadot-sdk-solochain-template.git
cd polkadot-sdk-solochain-template
cargo build --release
(Aviso: Isto pode demorar 10 a 20 minutos dependendo do teu PC – é o tempo de “mineração” do binário).
Comando para arrancar um Nó Cliente Remoto:
- Faz o download do JSON da rede:
Bash
curl -O https://files.pedrocoelho.com/rabbitcoin-spec-raw.json
- Executa o teu nó ligando-te aos meus bootnodes:
Bash
./target/release/solochain-template-node \
--base-path ./meu-dado-local \
--chain ./rabbitcoin-spec-raw.json \
--bootnodes /dns4/rbbt.pedrocoelho.com/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp \
--name "O_Teu_Nome_Aqui"
(Nota: O ficheiro JSON já inclui os multiaddrs dos meus nós para o peer-to-peer. Certifica-te de que a porta 30333 está aberta na tua firewall para participares ativamente na rede!)
Podes criar uma carteira da nova Crypto RBBT, simplesmente indo a:
https://polkadot.js.org/apps/?rpc=wss://rbbt.pedrocoelho.com#/explorer
Bem-vindos à toca do coelho. 🐇✨
[…] artigo anterior, vimos como um Raspberry Pi e um ambiente WSL deram vida à Rabbitcoin Testnet. Vimos os blocos a […]