В режиме 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!