Lezioni online Bitcoin-only
This project is maintained by valerio-vaccaro
Officine Bitcoin Lição Bitcoin-only Este projeto é mantido por valerio-vaccaro
🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto
Ter um nó Bitcoin é fundamental, pois permite, com a máxima privacidade:
Um computador antigo pode ser reciclado como nó. No caso de um laptop, recomenda-se remover a bateria, que, estando sempre em carga, poderia representar um risco. A grande vantagem é o custo igual a zero ou limitado apenas ao disco de maior capacidade.
Raspberry pi é uma placa ARM muito usada para criar sistemas IoT e nós. No entanto, o custo excessivo e a necessidade de um disco ligado por USB fazem com que não seja a melhor escolha possível em termos de desempenho e estabilidade.
Odroid-M1 é uma placa ARM potente e com um slot interno para adicionar armazenamento extra.
Com um orçamento muito reduzido, 30-100 euros, é possível comprar um Thin Client usado, no ebay, que combina baixo consumo com desempenho suficiente para executar o nó.
Como exemplos de Thin Client, foram testados os seguintes modelos:
Instalar o mínimo possível de software num nó limita os possíveis ataques e torna o sistema mais simples de manter.
Online encontram-se soluções prontas, como Umbrel, Mynode e outras, que mascaram as verificações de segurança e acrescentam software e scripts, por exemplo docker, difíceis de controlar. Nestas lições vamos focar-nos na criação de um nó manualmente, ou seja, instalando manualmente todo o software necessário.
A primeira escolha a fazer é o sistema operativo. A recomendação é usar Linux numa versão LTS, ou seja, com suporte garantido por um número suficientemente longo de anos. A minha escolha pessoal recai sobre Debian 12.
O sistema operativo escolhido deve então ser instalado no computador e todos os pacotes devem ser atualizados. A atualização será algo que nos acompanhará durante toda a vida do nó.
Também se recomenda instalar tor, e/ou outra VPN se necessária, e ssh, para permitir a manutenção remota do nó.
Por fim, uma UPS poderia salvar o nó de quedas bruscas de corrente, evitando deixar bitcoin e os outros softwares num estado inconsistente.
Descarregamos core, os hashes e as assinaturas.
wget https://bitcoincore.org/bin/bitcoin-core-28.1/bitcoin-28.1-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS.asc
Caso se utilize uma board com arquitetura arm, o pacote deverá ser corrigido para bitcoin-28.1-aarch64-linux-gnu.tar.gz, isto é, o mesmo pacote mas compilado para a arquitetura arm de 64 bits, aarch64, que é precisamente a usada pela odroid.
Neste ponto podemos verificar se um dos hashes em SHA256SUMS corresponde ao arquivo descarregado.
sha256sum --ignore-missing --check SHA256SUMS
O resultado indica que foi encontrada uma correspondência para o arquivo descarregado.
bitcoin-28.1-x86_64-linux-gnu.tar.gz: OK
Agora verificamos as assinaturas do ficheiro SHA256SUMS. Antes, se necessário, obtemos as chaves e importamo-las.
git clone https://github.com/bitcoin-core/guix.sigs
gpg --import guix.sigs/builder-keys/*
E por fim verificamos as assinaturas.
gpg --verify SHA256SUMS.asc
Se virmos várias vezes a mensagem gpg: Good signature from ..., significa que encontrámos assinaturas válidas.
Procedemos à descompactação e instalação.
tar xzvf bitcoin-28.1-x86_64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-28.1/bin/*
E pronto: agora temos bitcoind, bitcoin-cli e as outras utilidades prontas para serem lançadas.
Por agora lançamos bitcoind e veremos algum log. O Bitcoin começa a sincronizar-se e agora existirá um diretório com a blockchain e todas as configurações em ~/.bitcoin/.
A partir de outro terminal podemos verificar o funcionamento do bitcoind executando o comando tail -f ~/.bitcoin/debug.log.
Como já vimos anteriormente, o diretório em que o Bitcoin Core guarda as configurações e a blockchain no Linux é ~/.bitcoin/. Caso se queira alterar a localização de armazenamento, podem usar-se diferentes abordagens:
ln -s,datadir, especificando o diretório de destino.O Bitcoin Core suporta três tipos diferentes de redes às quais se pode ligar:
mainnet, a rede clássica a que todos estamos habituados e que é o padrão do core,testnet, uma rede análoga à mainnet, mas cujos tokens não têm valor; o mining continua a ser efetuado, mas se não houver blocos durante 20 minutos a dificuldade cai drasticamente; sofre frequentemente reorg importantes,regtest, neste modo tem-se uma pequena blockchain privada que começa sempre do zero e onde é possível minerar com dificuldade mínima; serve para testes locais.Outro comando útil é daemon, que, se definido, não mantém o log do Bitcoin Core ligado à consola atual. Para ver o funcionamento, será sempre possível usar o comando tail -f ~/.bitcoin/debug.log.
Todas as configurações podem ser lançadas pela linha de comando ou através do ficheiro ~/.bitcoin/bitcoin.conf. Um ficheiro compatível com uma configuração doméstica, isto é, em que quero manter o consumo de recursos no mínimo, poderia ser o seguinte.
ficheiro de configuração
daemon=1
blocksonly=1
maxconnections=20
maxuploadtarget=500
txindex=1
blockfilterindex=1
rpcallowip=0.0.0.0/0
rpcallowip=0.0.0.0/0
rpcuser=username
rpcpassword=password
Onde:
daemon=1blocksonly=1txindex=1maxuploadtarget=500txindex=1blockfilterindex=1rpcallowip=0.0.0.0/0rpcallowip=0.0.0.0/0rpcuser=username, obviamente a substituirrpcpassword=password, obviamente a substituirA lista completa das funcionalidades pode ser encontrada em https://jlopp.github.io/bitcoin-core-config-generator
Também se pode fazer tudo com um único comando de terminal.
cat >bitcoin.conf <<EOL
daemon=1
blocksonly=1
maxconnections=20
maxuploadtarget=500
txindex=1
blockfilterindex=1
rpcallowip=0.0.0.0/0
rpcbind=0.0.0.0
rpcuser=username
rpcpassword=password
EOL
Caso se tenha disponível outro nó já sincronizado, pode usar-se a opção connect para se ligar SÓ E EXCLUSIVAMENTE a esse nó. Se esse nó estiver na rede local, ganha-se tempo e largura de banda com esta configuração simples.
Desde a release 26, o core suporta cifragem das comunicações entre os nós com a opção v2transport.
Todas as configurações mostradas dizem respeito à clearnet; as configurações para tor serão objeto de outra lição.
Lançamos Bitcoin criando um ficheiro de arranque para systemd.
sudo sh -c "cat > /etc/systemd/system/bitcoind.service <<EOL
[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
User=bitcoin
Group=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
ExecStart=/usr/local/bin/bitcoind -pid=/home/bitcoin/.bitcoin/bitcoind.pid
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
EOL"
Atenção: neste caso estamos a usar o utilizador bitcoin para iniciar o software.
Podemos então registar o script criado e lançá-lo.
sudo systemctl enable bitcoind
sudo systemctl start bitcoind
Sempre que se quiser verificar o estado do software, pode usar-se o seguinte comando.
systemctl status bitcoind
Instalamos Electrs, que é um servidor electrum baseado em Rust; o primeiro passo é, portanto, instalar essa linguagem.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Instalamos também clang e o pacote build-essential.
apt update
apt install clang cmake build-essential -y
Descarregamos a última versão, atualmente a 0.10.5, do Github.
VERSION="0.10.5"
git clone --branch v$VERSION https://github.com/romanz/electrs.git
cd electrs
Importamos a chave do programador de Electrs e verificamos a assinatura dos commits Github.
curl https://romanzey.de/pgp.txt | gpg --import
git verify-tag v$VERSION
Se a assinatura estiver correta, podemos passar à compilação …
cargo build --locked --release
e depois à instalação.
sudo install -m 0755 -o root -g root -t /usr/local/bin ./target/release/electrs
Para configurar Electrs, criamos o ficheiro config.toml com o seguinte conteúdo.
# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"
# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"
Também se pode fazer tudo com um único comando de terminal.
cat >config.toml <<EOL
# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"
# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"
EOL
Podemos lançar Elects com o comando
electrs --conf config.toml
e esperar que electrs termine de indexar todos os blocos.
Como no Bitcoin, podemos lançar o software criando um script para systemd.
sudo sh -c "cat > /etc/systemd/system/electrs.service <<EOL
[Unit]
Description=Electrs daemon
After=bitcoind.target
[Service]
User=bitcoin
Group=bitcoin
Type=forking
ExecStart=/usr/local/bin/electrs --conf /home/bitcoin/electrs_config.toml
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
EOL"
Atenção: neste caso estamos a usar o utilizador bitcoin para iniciar o software.
Podemos então registar o script criado e lançá-lo.
sudo systemctl enable electrs
sudo systemctl start electrs
Sempre que se quiser verificar o estado do software, pode usar-se o seguinte comando.
systemctl status electrs
A completar
A completar
Instalamos mariadb.
sudo apt-get install mariadb-server mariadb-client
E criamos db e utilizador.
sudo mysql -e "drop database mempool;"
sudo mysql -e "create database mempool;"
sudo mysql -e "grant all privileges on mempool.* to 'mempool'@'%' identified by 'mempool';"
sudo mysql -e "flush privileges;"
Clonamos o código
git clone https://github.com/mempool/mempool
cd mempool
latestrelease=$(curl -s https://api.github.com/repos/mempool/mempool/releases/latest|grep tag_name|head -1|cut -d '"' -f4)
git checkout $latestrelease
Certifiquemo-nos de usar node 20.x e a última versão do npm.
sudo npm i -g npm
sudo npm i -g node@20
Tratamos de compilar e testar o backend
cd backend
npm install --no-install-links # npm@9.4.2 and later can omit the --no-install-links
npm run build
cp mempool-config.sample.json mempool-config.json
npm run start
Verificar atentamente as configurações de mempool-config.json.
Passamos ao frontend.
cd ..
cd frontend
npm install
npm run serve:local-prod
A configuração do backend encontra-se no ficheiro mempool-config.json.
Podemos lançar Mempool com pm2, que deve ser instalado.
sudo npm i -g pm2
pm2 startup
Lançamos o backend.
cd ..
cd backend
pm2 start "npm run start"
Depois lançamos o frontend.
cd ..
cd frontend
pm2 start "npm run serve:local-prod"
Guardamos tudo.
pm2 save
Começamos por instalar tor.
sudo apt install tor
e configuramos o ficheiro de configuração do tor para criar um novo hidden service exportando a porta 8333 do nó.
cat > /etc/tor/torrc <<EOL
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 8333 127.0.0.1:8333
EOL
Podemos reiniciar o tor para aplicar as alterações; isto permite exportar a porta 8333 do nosso nó, mas não limitar o acesso ao nó apenas e exclusivamente via tor.
sudo systemctl restart tor
e obter o endereço onion do nó.
cat /var/lib/tor/hidden_service/hostname
Feito isso, podemos limitar o acesso ao nó apenas e exclusivamente via tor, modificando a configuração de bitcoin.conf deste modo:
proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1:8333=onion
externalip=tor_url.onion
onlynet=onion
Onde tor_url.onion é o endereço onion do nó obtido anteriormente.
Ao reiniciar o nó, podemos verificar que o nó é acessível apenas e exclusivamente via tor.
sudo systemctl restart bitcoind
bitcoin-cli getnetworkinfo
Aqui deveríamos ver que o nó é acessível apenas e exclusivamente via tor, ou seja, que só a rede onion está reachable.
Além disso, todos os nossos peer serão identificados por endereços onion.
bitcoin-cli getpeerinfo
Atenção: tor é extremamente lento; tenham isso em conta quando quiserem sincronizar o nó a partir do zero.
Uma rede útil para ganhar prática é testnet, que difere de mainnet porque:
Muitos wallets, green, electrum, specter, sparrow e outros, suportam testnet e podem ser usados para:
Algumas ferramentas úteis, autopromoção, para testnet:
Existem muitos outros tools e sites web que suportam testnet, além dos block explorer mais importantes.
Bitcoin-cli é a utilidade de linha de comando para interagir com Bitcoin Core.
Os comandos têm o formato:
bitcoin-cli [options] <command> [params]
e pode-se sempre usar help para obter a lista dos comandos ou informações sobre um comando específico.
Um curso completo sobre o uso de Bitcoin pela linha de comando pode ser encontrado em Learning-Bitcoin-from-the-Command-Line.
A instalação do nó está dividida em várias lições; aqui está uma lista das já realizadas:
| Data | Notas |
|---|---|
| 240108-2100 | Seleção do hardware |
| 240115-2200 | Instalação do core e verificação das assinaturas |
| 240122-2200 | Configuração mínima |