Construindo a Rabbitcoin: Do WSL ao Raspberry Pi 5 (e os Monstros pelo Caminho)

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:

  1. Faz o download do JSON da rede:

Bash

curl -O https://files.pedrocoelho.com/rabbitcoin-spec-raw.json
  1. 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. 🐇✨

Um comentário

Deixe um comentário