В режиме regtest bitcoind можно создать частный биткойн-кластер с произвольным количеством узлов. Это может быть очень полезно для целей тестирования, поскольку дает вам возможность добывать блоки вручную.

Создайте очень простую сеть с двумя узлами regtest

> bitcoind -regtest -port=1111 -datadir=... -rpcport=1234 --daemon
> bitcoind -regtest -port=2222 -datadir=... -rpcport=5467 --daemon

Убедитесь, что datadir ссылается на существующую папку и что каждый узел имеет собственный каталог данных. Например:

-datadir=/home/USERNAME/regtest/node1
-datadir=/home/USERNAME/regtest/node2

В противном случае вы столкнетесь со следующей (или аналогичной) ошибкой:

Error: Cannot obtain a lock on data directory [...]. Bitcoin Core is probably already running.

Затем создайте псевдоним для каждого вызова bitcoin-cli для конкретного узла, чтобы нам не приходилось каждый раз повторять datadir и rpcport :

> node1="bitcoin-cli -regtest -datadir=... -rpcport=1234"
> node2="bitcoin-cli -regtest -datadir=... -rpcport=5467"

Вызовите RPC-метод на обоих узлах, чтобы убедиться, что они работают:

> $node1 getblockchaininfo
> $node2 getblockchaininfo

Не забудьте передний $ -знак!

Представляйте узлы друг другу и добывайте блоки.

Зарегистрируйте node2 как одноранговый узел на node1:

> $node1 addnode "127.0.0.1:2222" "add"

Найдите блок генезиса на node1:

> $node1 generate 1

Проверить баланс счета:

> $node1 getbalance

Почему баланс пуст, даже если node1 добыл последний блок? Потому что транзакция coinbase добытого блока может быть потрачена только после получения 100 подтверждений!

Позвольте node1 добыть еще 100 блоков, чтобы потратить награды от блока g enesis:

> $node1 generate 100

getbalance теперь должен отображать 50 BTC, потому что он имеет более 100 подтверждений:

> $node1 getbalance

Автоматизируйте процесс майнинга с помощью сценария оболочки

Создайте новый файл сценария и сделайте его исполняемым:

> touch script.sh
> chmod +x script.sh

Вставьте следующий код, который добывает блок каждые x секунд, в файл сценария и соответственно настройте параметры datadir и rpcport:

#!/bin/bash
# create an alias for each node
node1="bitcoin-cli -regtest -datadir=... -rpcport=..."
node2="bitcoin-cli -regtest -datadir=... -rpcport=..."
# the mining interval in seconds
blockTime=5
while true
do
    # each node has a 50% chance of mining the next block
    rnd=$(($RANDOM%2))
if [ "$rnd" = "0" ];
    then
        echo node1 generated the next block:
        $node1 generate 1
    else
        echo node2 generated the next block:
        $node2 generate 1
    fi
sleep $blockTime
done

Выполните его для добычи нового узла каждые 5 секунд:

> ./script.sh

Выполните следующую команду, чтобы убить все запущенные экземпляры bitcoind с помощью одной команды:

> kill $(pidof bitcoind)

Образ Docker с кластером из двух узлов

Вы можете создать свой собственный образ докера с предустановленным биткойном, используя Dockerfile и entrypoint.sh ниже :

Перед выполнением команды build убедитесь, что оба файла находятся в одном каталоге:

> docker build .

Запустите созданное изображение в интерактивном режиме:

> docker run -it <image hash>

Теперь вы должны войти в оболочку контейнера. Вы можете взаимодействовать с обоими узлами, используя их псевдонимы в Linux (см. entrypoint.sh):

> node1 getblockchaininfo

а также

> node2 getblockchaininfo

Что дальше?

Проявите творческий подход и исследуйте Биткойн API!