С режима на 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блока genesis:

> $node1 generate 100

getbalanceтрябва да показва 50 BTC сега, защото има 100+ потвърждения:

> $node1 getbalance

Автоматизирайте процеса на копаене с помощта на shell скрипт

Създайте нов файл със скрипт и го направете изпълним:

> 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

Какво следва?

Бъдете креативни и изследвайте Bitcoin API!