Пример запуска тестнета
Автор: @ropox
Порой для писателей скриптов, ботов для голоса требуется отладить работу программ в тишине и спокойствии и в контролируемой среде. Не хочется, что бы бот к примеру перевел внезапно 10000 голосов неизвестно кому из-за глупой ошибки. Как это случилось однажды с доброботом. Опять же для регрессионных тестов, нужна возможность повторения сценариев с одинаковыми исходными данными, чтобы получить повторяемые, ожидаемые результаты. Ну и конечно тестирование ХФ, новой версии сети голоса. У нас сейчас актуальная версия сети 0.16.4, а новая версия будет 0.17.0. Если кто-то захочет протестировать новую версию, подключившись к реальной сети, то возможно нода с “неправильной” версией будет “саботировать” сеть.
Вот для этого и запускается testnet. С тестовыми пользователями уже имеющими на балансе средства, с измененными настройками, позволяющими ускорить тестирование.
К примеру можно установить уменьшение силы голоса не раз в неделю как в настоящей сети, а раз в 15 минут. Иначе бы пришлось ждать результатов теста неделями, а в тестнете всего 15 минут. Окно авторских вознаграждений можно сократить с недели, до получаса. Выгоды очевидны.
Тестнет не связан с рабочей сетью и не мешает работе действующей сети. Так же можно тестировать свой секретный проект так, что бы до поры до времени никто про него не узнал.

Сборка образ докера

В официальном репозитории golos уже есть готовые файлы для docker, и предпочтительно использовать их, чтобы не городить свои скрипты для компиляции, бороться с зависимостями. Все для вас сделает docker. Как работать с докером я расписывать сильно не буду. Инструкций полно в интернете.

Подготовка исходников

Для начала скачаем исходники golos. Для этого воспользуемся git-ом.
1
$ git clone https://github.com/GolosChain/golos.git
2
3
Клонирование в «golos»…
4
remote: Counting objects: 22425, done.
5
remote: Compressing objects: 100% (150/150), done.
6
remote: Total 22425 (delta 132), reused 177 (delta 76), pack-reused 22152
7
Получение объектов: 100% (22425/22425), 13.47 MiB | 4.58 MiB/s, готово.
8
Определение изменений: 100% (15314/15314), готово.
Copied!
У нас создастся папка golos с исходниками. Перейдем в нее и последующие комманды будет запускать в ней.
Нам нужно будет переключить на нужную нам ветку. В настоящий момент меня интересует версия 0.17.0.
Как видно на скриншоте, есть branch под названием golos-v0.17.0. Вот на нее нам и надо переключиться. Для этого в корне папки с исходниками выполним следующую команду
1
$ git checkout golos-v0.17.0
2
Ветка golos-v0.17.0 отслеживает внешнюю ветку golos-v0.17.0 из origin.
3
Переключено на новую ветку «golos-v0.17.0»
Copied!
И теперь нам надо обновить локальные файлы до версий в репозитории на гитхабе
1
$ git submodule update --init --recursive
2
Подмодуль «libraries/chainbase» (https://github.com/GolosChain/chainbase.git) зарегистрирован по пути «libraries/chainbase»
3
Подмодуль «libraries/fc» (https://github.com/GolosChain/fc.git) зарегистрирован по пути «libraries/fc»
4
Подмодуль «libraries/libcds» (https://github.com/khizmax/libcds.git) зарегистрирован по пути «libraries/libcds»
5
Клонирование в «/hom...
Copied!
Теперь можно поменять нужные нам для теста параметры. К примеру я хочу тестировать скрипт, который должен запускаться после понижения силы голоса. Чтобы не ждать неделями, я сокращу интервал вывода СГ до 10 минут. Для этого открываю файл с настройками сети в редакторе.
1
$ nano libraries/protocol/include/steemit/protocol/config.hpp
Copied!
И ищу переменные со словам withdraw и почти сразу нахожу нужные мне.
Меня интересует конкретно вот эта строка
1
#define STEEMIT_VESTING_WITHDRAW_INTERVAL_SECONDS (60*60*24*7) // 1 week per interval
Copied!
Я исправляю, чтобы интервал был 10 минут и сохраняю файл
1
#define STEEMIT_VESTING_WITHDRAW_INTERVAL_SECONDS (60*10) // 1 week per interval
Copied!

Сборка образа

В папке docker лежит файл для докера с инструкциями по сборке образа.
1
$ ls docker/*
2
docker/Dockerfile-testnet
Copied!
Все, что нам требуется, это запустить сборку
1
$ docker build . -f docker/Dockerfile-testnet -t testnet-17
Copied!
Спустя какое то время мы имеем готовый образ докера

Запуск

Для начального запуска воспользуемся командой run докера
1
$ docker run -it -p 127.0.0.1:9090:8090 -d --name testnet -t testnet-17
Copied!
Собственно все понятно. -it включает интерактивность. “-p 127.0.0.1:9090:8090” включает переадресацию порта 8090 изнутри контейнера наружу, на порт 9090. Это дает возможность подключаться скриптами к тестнету используя URL вида ws://localhost:9090. Опция -d запускает контейнер отключенным от консоли в фоне. --name testnet задет простое имя контейнеру. -t testnet-17 задает имя образа, который будет использоваться для создания контейнера.
Если все нормально, после запуска контейнера докер распечатает ID контейнера и вернет управление в консоль.
Как я писал выше, в тестнете уже созданы пара тестовых пользователей. Самый важный cyberfounder. Естественно, чтобы можно было этим аккаунтом пользоваться, нужны ключи. Приватный и публичный. При запуске, golos распечатывает пару ключей в самом начале. Посмотреть их можно распечатав лог голоса.
1
$ docker logs testnet
Copied!
1
initminer public key: GLS58g5rWYS3XFTuGDSxLVwiBiPLoAyCZgn6aB9Ueh8Hj5qwQA3r6
2
initminer private key: 5JVFFWRLwz6JoP9kguuRFfytToGU6cLgBVTL9t6NB3D3BQLbUBS
3
chain id: 5876894a41e6361bde2e73278f07340f2eb8b41c2facd29099de9deef6cdb679
4
blockchain version: 0.17.0
Copied!

Конфигурационный файл

Чтобы сеть заработала, нужен хотя бы один делегат, подписывающий блоки. Этим и будет заниматься аккаунт cyberfounder. Чтобы это заработало, нужно отредактировать конфигурационный файл.
Сначала зайдем в образ
1
$ docker exec -it testnet bash
Copied!
Конфигурационный файл config.ini лежит в папке /etc/golosd.
1
vi /etc/golosd/config.ini
Copied!
Изменим следующие параметры
1
witness = "cyberfounder"
2
private-key = 5JVFFWRLwz6JoP9kguuRFfytToGU6cLgBVTL9t6NB3D3BQLbUBS
3
enable-stale-production = true
4
required-participation = 0
Copied!
После чего перезапускаем контейнер
1
$ docker stop testnet
2
$ docker start testnet
Copied!
И видим, что сеть заработала и cyberfounder начал генерировать блоки
1
$ docker logs testnet
Copied!
Дождемся 17-го хардфорка, после чего можно пользоваться тестнетом
1
1551001ms th_a database.cpp:4890 apply_hardfork ] HARDFORK 17 at block 36
2
1551002ms th_a witness.cpp:205 block_production_loo ] Generated block #36 with timestamp 2017-07-29T15:25:51 at time 2017-07-29T15:25:51 by cyberfounder
Copied!
Запускаем cli_wallet, задаем пароль, и импортируем приватный ключ cyberfounder аккаунта
1
$ docker exec -it testnet cli_wallet
2
3
Please use the set_password method to initialize a new wallet before continuing
4
new >>> set_password 123
5
set_password 123
6
null
7
locked >>> unlock 123
8
unlock 123
9
null
10
unlocked >>> import_key 5JVFFWRLwz6JoP9kguuRFfytToGU6cLgBVTL9t6NB3D3BQLbUBS
11
import_key 5JVFFWRLwz6JoP9kguuRFfytToGU6cLgBVTL9t6NB3D3BQLbUBS
12
2152613ms th_a wallet.cpp:534 save_wallet_file ] saving wallet to file wallet.json
13
true
14
unlocked >>>
Copied!
На аккаунте cyberfounder есть уже некая сумма голосов
1
unlocked >>> list_account_balances cyberfounder
2
3
[
4
"43306208.000 GOLOS"
5
]
Copied!
Можно создать нового пользователя и перевести ему GOLOS
1
unlocked >>> create_account cyberfounder ropox "{}" true
2
unlocked >>> transfer cyberfounder ropox "200000.000 GOLOS" "для тестов" true
3
{
4
"ref_block_num": 338,
5
"ref_block_prefix": 853465515,
6
"expiration": "2017-07-29T15:41:27",
7
"operations": [[
8
"transfer",{
9
"from": "cyberfounder",
10
"to": "ropox",
11
"amount": "200000.000 GOLOS",
12
"memo": "для тестов"
13
}
14
]
15
],
16
"extensions": [],
17
"signatures": [
18
"20491f45c3f3f8d67f3a5c62f934c7c22312ddf392edde2f78a9962634a0ed7b4e4d2f6428282e0d0837893013c04e9e5e0057974c43a490b4abb4416091d5a18b"
19
],
20
"transaction_id": "7d155661801e3b5a450d5c1f97378ee5a94a54b6",
21
"block_num": 339,
22
"transaction_num": 0
23
}
Copied!
Ну и вишенка на торт, создаем свой, персональный токен
1
unlocked >>> create_asset cyberfounder ROPOX 3 {"description": "Золото царя Гороха", "core_exchange_rate":{"base":"1.000 ROPOX","quote":"1.000 GOLOS"}} null true
Copied!
1
{
2
"ref_block_num": 380,
3
"ref_block_prefix": 3346277100,
4
"expiration": "2017-07-29T15:43:33",
5
"operations": [[
6
"asset_create",{
7
"issuer": "cyberfounder",
8
"asset_name": "ROPOX",
9
"precision": 3,
10
"common_options": {
11
"max_supply": "1000000000000000",
12
"market_fee_percent": 0,
13
"max_market_fee": "1000000000000000",
14
"issuer_permissions": 79,
15
"flags": 0,
16
"core_exchange_rate": {
17
"base": "1.000 ROPOX",
18
"quote": "1.000 GOLOS"
19
},
20
"whitelist_authorities": [],
21
"blacklist_authorities": [],
22
"whitelist_markets": [],
23
"blacklist_markets": [],
24
"description": "Золото царя Гороха",
25
"extensions": []
26
},
27
"is_prediction_market": false,
28
"extensions": []
29
}
30
]
31
],
32
"extensions": [],
33
"signatures": [
34
"20225a9ce260f8434f3e83cf8e48c4e16557f38e5540fa9a9a53126c685b70f16b3619a95b50c7f7a611e9c26261fd669c4ad8496cdc45d95ea9d3ef12c5cc5e33"
35
]
36
}
Copied!
Инстанциируем немного монет и переводим их тестовому пользователю
1
unlocked >>> issue_asset cyberfounder "1000.000 ROPOX" "Акции" true
2
unlocked >>> transfer cyberfounder ropox "20.000 ROPOX" "Подарок" true
3
unlocked >>> list_account_balances ropox
4
[
5
"0.000 GBG",
6
"200000.000 GOLOS",
7
"20.000 ROPOX"
8
]
Copied!
Удачных вам экспериментов!
По материалам статьи
Last modified 1yr ago