a) Instalando as dependências:
sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3 libevent-dev libboost-dev libsqlite3-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev libqrencode-dev python3-zmq shellcheck -y
b) Clonando o projeto:
git clone https://github.com/bitcoin/bitcoin.git
c) Verificar a última release e efetuar o checkou para a última versão:
cd bitcoin
git tag | sort -V
git checkout v23.0
d) Verificar a assinatura da release:
Se necessário, importar a chave do mantenedor do projeto:
gpg --keyserver keyserver.ubuntu.com --recv 9DEAE0DC7063249FB05474681E4AED62986CD25D
Validar a assinatura:
git verify-tag v23.0
e) Mantendo a compatibilidade com legacy wallets
Definindo o local para o Berkeley DB 4.8
export BDB_PREFIX='/dados/bitcoin/db4'
Instalando o banco legado
./contrib/install_db4.sh `pwd`
f) Preparando a instalação
./autogen.sh
g) Configurando
./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include"
h) Compilando
make -j $(nproc)
i) Instalando
sudo make install
a) Criando um ambiente virtual para Python
OBS: Com o virtualenv e virtualenvwrapper instalados e configurados...
mkvirtualenv devbitcoin
b) Atualizando pip e instalando dependências
pip install --upgrade pip setuptools wheel
pip install flake8 mypy pyzmq vulture codespell
c) Executando todos os testes
test/functional/test_runner.py --extended
Teremos como saída algo como:
Temporary test directory at /tmp/test_runner_₿_🏃_20220917_171328
Running Unit Tests for Test Framework Modules
..........
----------------------------------------------------------------------
Ran 10 tests in 0.574s
OK
1/240 - wallet_hd.py --legacy-wallet skipped
2/240 - wallet_backup.py --legacy-wallet skipped
3/240 - wallet_hd.py --descriptors passed, Duration: 4 s
...
238/240 - feature_config_args.py passed, Duration: 14 s
239/240 - feature_blockfilterindex_prune.py passed, Duration: 6 s
240/240 - feature_dbcrash.py passed, Duration: 1866 s
Após execução dos testes, será apresentado o relatório informando os testes que passaram e os que por ventura falharam, conforme:
TEST | STATUS | DURATION
example_test.py | ✓ Passed | 1 s
feature_abortnode.py | ✓ Passed | 31 s
feature_addrman.py | ✓ Passed | 3 s
...
wallet_txn_clone.py --segwit | ✓ Passed | 1 s
wallet_txn_doublespend.py --descriptors | ✓ Passed | 1 s
wallet_txn_doublespend.py --mineblock | ✓ Passed | 3 s
feature_backwards_compatibility.py --descriptors | ○ Skipped | 1 s
feature_backwards_compatibility.py --legacy-wallet | ○ Skipped | 0 s
feature_bind_port_discover.py | ○ Skipped | 0 s
...
wallet_watchonly.py --legacy-wallet | ○ Skipped | 0 s
wallet_watchonly.py --usecli --legacy-wallet | ○ Skipped | 0 s
mining_prioritisetransaction.py | ✖ Failed | 0 s
ALL | ✖ Failed | 3554 s (accumulated)
Runtime: 1866 s
Se as dependências do projeto forem satisfeitas, os testes unitários serão automaticamente compilados junto com o projeto.
Desta forma, também podemos executá-los, no diretório do projeto, conforme:
make check
Teremos algo como:
...
PASS: minisketch/test
PASS: univalue/test/object
PASS: univalue/test/unitester
PASS: univalue/test/no_nul
===========================================================================
Testsuite summary for Bitcoin Core 23.0.0
===========================================================================
# TOTAL: 4
# PASS: 4
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
===========================================================================
...
PASS: tests
PASS: exhaustive_tests
===========================================================================
Testsuite summary for libsecp256k1 0.1
===========================================================================
# TOTAL: 2
# PASS: 2
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
===========================================================================
3. Analisar o arquivo example_test.py no diretório dos testes funcionais e tentar fazer com que o node 1 minere um novo bloco, envie para o node 2 e verifique se o node 2 recebeu o bloco.
a) Fiz uma cópia do arquivo example_test.py como p2p_vinteum_test.py
b) Alterações realizadas no arquivo:
Pelo que entendi deste arquivo, ele já fazia praticamente tudo o que pedia no desafio.
A única diferença é que estava sendo gerado 10 novos blocos e o desafio pediu para minerar 1 bloco.
Então, praticamente só tirei o loop for para que não gerasse/minerasse 10 blocos mas sim apenas 1 novo bloco.
Adicionei também mais alguns logs.
De resto, o novo bloco está sendo propagado para o segundo e o segundo confirma o recebimento.
c) Executei o teste funcional individual criado conforme:
test/functional/p2p_vinteum_test.py
Como resultado tive:
2022-09-17T17:52:43.788000Z TestFramework (INFO): Initializing test directory /tmp/bitcoin_func_test_dnkyqshq
2022-09-17T17:52:44.195000Z TestFramework (INFO): Starting mining vinteum test!
2022-09-17T17:52:44.322000Z TestFramework (INFO): Actual block height: 1
2022-09-17T17:52:44.322000Z TestFramework (INFO): Creating a new block
2022-09-17T17:52:44.322000Z TestFramework (INFO): Mining the new block
2022-09-17T17:52:44.323000Z TestFramework (INFO): Wait for node1 to reach current tip (height 2) using RPC
2022-09-17T17:52:44.328000Z TestFramework (INFO): Connect node2 and node1
2022-09-17T17:52:44.393000Z TestFramework (INFO): Wait for node2 to receive all the blocks from node1
2022-09-17T17:52:44.407000Z TestFramework (INFO): Add P2P connection to node2
2022-09-17T17:52:44.514000Z TestFramework (INFO): Test that node2 propagates all the blocks to us
2022-09-17T17:52:44.565000Z TestFramework (INFO): Check that each block was received only once
2022-09-17T17:52:44.615000Z TestFramework (INFO): Stopping nodes
2022-09-17T17:52:44.770000Z TestFramework (INFO): Cleaning up /tmp/bitcoin_func_test_dnkyqshq on exit
2022-09-17T17:52:44.770000Z TestFramework (INFO): Tests successful
That's it.