Vamos começar clonando o repositório do bitcoin-core (se você ainda não fez isso).
cd ~
git clone https://github.com/bitcoin/bitcoin.git
Se você quiser compilar a partir do código-fonte, instale as dependências (no mínimo boost
e sqlite
) e faça algo como:
cd bitcoin
git checkout v27.0
./configure --enable-wallet --with-gui=no
make
Nesse caso, os binários estarão na pasta ~/bitcoin/src/
.
É essencial que você compile o cliente bitcoin com suporte a carteira.
Para isso, certifique-se de que a saída do comando ./configure
indique que a carteira será compilada.
options used to compile and link:
...
with wallet = yes
with sqlite = yes
with bdb = no
Você também pode instalar os binários oficiais, mas ainda assim vamos precisar do código-fonte. Vamos precisar de um diretório para que o full node guarde seu estado.
mkdir bitcoin-datadir
Vamos configurar algumas variáveis de ambiente para encurtar alguns comandos.
# Diretório com os binários
export BTC_PATH=~/bitcoin/src
# Diretório para arquivos de estado do full node
export SIGNET_DATADIR=~/bitcoin-datadir
# Cliente bitcoin
alias btcd="$BTC_PATH/bitcoind -datadir=$SIGNET_DATADIR"
# Interface de linha de comando
alias bcli="$BTC_PATH/bitcoin-cli -datadir=$SIGNET_DATADIR"
BCLI="$BTC_PATH/bitcoin-cli -datadir=$SIGNET_DATADIR"
# Script de mineração da signet
alias miner="$BTC_PATH/../contrib/signet/miner"
# Bitcoin-util, que vai calcular a prova de trabalho
GRINDER="$BTC_PATH/bitcoin-util grind"
Vamos também precisar do jq
, instale com o gerenciador de pacotes da sua distribuição.
Criar o desafio da signet
Para criar o desafio da signet, vamos criar uma carteira na regtest e construir um script a partir de um novo endereço de bitcoin.
# Iniciar o node na regtest
btcd -regtest -daemon
# Criar uma nova carteira
bcli -regtest createwallet "signer"
Precisamos exportar as chaves privadas dessa carteira pois sem elas nào vamos conseguir assinar os blocos da nossa signet.
DESCRIPTORS=$(bcli -regtest listdescriptors true | jq -r .descriptors)
A seguir, vamos criar um novo endereço controlado pela nossa carteira. É a partir deste endereço que vamos criar o desafio da signet.
# Criar novo endereço
ADDR=$(bcli -regtest -named getnewaddress address_type="bech32")
Enfim, vamos criar o desafio da signet.
# Criar o desafi oda signet
SIGNET_CHALLENGE=$(bcli -regtest -named getaddressinfo $ADDR | jq -r .scriptPubKey)
Temos todas as informações necessárias nas variáveis de ambiente. Podemos parar o node e subir a signet.
bcli -regtest stop
Rodar a signet
Vamos criar um arquivo de configuração para o full node.
echo "signet=1
[signet]
daemon=1
signetchallenge=$SIGNET_CHALLENGE" > $SIGNET_DATADIR/bitcoin.conf
Iniciar o node.
btcd
Agora vamos importar nossas chaves privadas.
# Criar nova carteira
bcli createwallet "miner"
# Importar chaves privadas
bcli importdescriptors "$DESCRIPTORS"
Vamos criar um novo endereço para receber os bitcoins minerados na signet.
MINER_ADDR=$(bcli getnewaddress address_type="bech32")
Pronto, temos todas as informações que precisamos para minerar blocos. Para rodar o minerador continuamente, fazemos:
miner --cli $BCLI generate --address $MINER_ADDR --grind-cmd $GRINDER --min-nbits --ongoing
Brincando de signet
Utilize a seguinte configuração no seu bitcoin.conf
:
signet=1
[signet]
daemon=1
signetchallenge=00147ea677b054751d543541cd1149c5d20db5112d2f
Adicione o meu node fazendo:
bcli addnode "<ip>" "add"
Para minerar, importe esses descritores.