Workshops

Running Bitcoin

with edil & jaonoctus

Este workshop convida os participantes a vivenciarem o Bitcoin de forma prática e direta. Inspirado na famosa mensagem de Hal Finney, o encontro propõe que cada estudante configure e rode seu próprio nó Bitcoin em uma rede de testes (signet), sincronize com um nó minerador do instrutor e realize transações utilizando as ferramentas de linha de comando do Bitcoin Core. A proposta é oferecer uma introdução técnica ao protocolo do Bitcoin por dentro, explorando seus principais conceitos por meio da interação com a rede e com a estrutura interna de blocos e transações.

Tarefas preparatórias

Para garantir que todos possam aproveitar ao máximo as atividades práticas, os participantes devem realizar as seguintes tarefas antes do workshop.
Durante o evento, utilizaremos a interface de linha de comando, portanto, a familiaridade básica com o terminal do sistema operacional é recomendada.

1. Instalar o Docker

Instale o Docker via o script oficial

Terminal
curl -fsSL https://get.docker.com | sh

Verifique a instalação do Docker

Terminal
docker run --rm hello-world
Você verá algo como:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
198f93fd5094: Pull complete 
Digest: sha256:a0dfb02aac212703bfcb339d77d47ec32c8706ff250850ecc0e19c8737b18567
Status: Downloaded newer image for hello-world:latest

Hello from Docker!

2. Baixar a imagem container do Bitcoin Core

Clone o repositório do workshop

Terminal
git clone https://github.com/vinteum-bdl/infra-signet-docker

Acesse o diretório do repositório

Terminal
cd infra-signet-docker

Builde a imagem do container

Terminal
docker compose build --no-cache bitcoin-node

Inicie o container em modo detached

Terminal
docker compose up bitcoin-node -d

Acesse o terminal do container

Terminal
docker compose exec --user student -it bitcoin-node bash

Leituras recomendadas

Formato

  • Configuração de um nó Bitcoin na rede signet
  • Sincronização com um nó minerador
  • Execução de transações reais entre participantes
  • Análise e construção de transações manualmente via bitcoin-cli
  • Discussões guiadas sobre os fundamentos técnicos explorados em cada etapa

Perguntas motivadoras

  • O que é um full node? Quais funções ele realiza?
  • O que é uma wallet? Quais funções ela realiza?
  • Quais são os componentes de uma transação de Bitcoin? Qual a função de cada um?
  • O que é um UTXO? Como ele se relaciona com o saldo de uma carteira?
  • O que define a propriedade de uma moeda no Bitcoin?
  • Como ocorre a autorização para gastar uma moeda? Qual é o papel das assinaturas digitais?
  • Qual a função da blockchain? Ela serve apenas como histórico?
  • O que é o cabeçalho de um bloco? Que informações ele contém e para que servem?
  • O que é e como funciona a prova de trabalho?
  • O que impede que um agente malicioso altere o histórico da blockchain?
  • O que significa “rodar um nó” em termos de soberania e verificação individual?
  • É possível participar da rede Bitcoin sem depender de terceiros? O que isso exige?

Comandos

Iniciar o nó

Terminal
bitcoind

Exibe informações sobre o estado atual da blockchain

Terminal
bitcoin-cli getblockchaininfo

Lista todos os comandos disponíveis no bitcoin-cli

Terminal
bitcoin-cli help

Exibe detalhes sobre o comando getblockchaininfo

Terminal
bitcoin-cli help getblockchaininfo

Cria uma nova carteira com o nome especificado

Terminal
bitcoin-cli createwallet "<name>"

Mostra o saldo da carteira ativa

Terminal
bitcoin-cli getbalance

Importa um descriptor para a carteira

Terminal
bitcoin-cli importdescriptors '[{"desc": "<descriptor>", "timestamp": 0}]'

Exibe informações sobre os peers conectados ao nó

Terminal
bitcoin-cli getpeerinfo

Conecta a um node específico

Terminal
bitcoin-cli addnode <node IP> onetry

Gera um novo endereço de recebimento

Terminal
bitcoin-cli getnewaddress

Envia bitcoins para um endereço especificado

Terminal
bitcoin-cli -named sendtoaddress address="<address>" amount=<amount> fee_rate=1

Mostra os saldos detalhados da carteira

Terminal
bitcoin-cli getbalances

Exibe os detalhes de uma transação pelo txid

Terminal
bitcoin-cli getrawtransaction "<txid>" 1

Lista todas as transações pendentes no mempool

Terminal
bitcoin-cli getrawmempool

Retorna o hash do bloco na altura especificada

Terminal
bitcoin-cli getblockhash <height>

Exibe o cabeçalho de um bloco pelo hash

Terminal
bitcoin-cli getblockheader "<block hash>"

Exibe o cabeçalho de um bloco em formato bruto

Terminal
bitcoin-cli getblockheader <block hash> false

Exibe os detalhes de uma transação pelo txid

Terminal
bitcoin-cli getrawtransaction <txid> 1

Descriptor

Um descriptor é uma string que descreve como derivar endereços e chaves públicas/privadas em uma carteira de Bitcoin. Ele define a estrutura e o formato dos endereços, bem como os tipos de scripts que podem ser usados para gastar os fundos associados a esses endereços.