Данная инструкция написана на основе множества других инструкций по установке нод и является наиболее полной, т.к. тут учтены все нюансы, собранные по крупицам из других руководств, а так же все это дополнено собственным опытом. Предназначена эта инструкция для максимально широкого круга лиц, которые осознали необходимость в установке собственной ноды в сети Голос.
Также хочу отметить, что я не даю никаких гарантий, что все приведенные здесь действия и доводы абсолютно корректные, поэтому если вы нашли ошибку или неточность, пожалуйста, напишите об этом в комментариях.
Часть 1: Требования для ноды Голоса.
Самое главное требование - стабильность и надежность оборудования, интернета и электричества. Нода должна работать круглосуточно и без выходных. Конечно, от редких и кратковременных сбоев ничего криминального, скорее всего, не произойдет, но все же этого лучше избегать.
Программные требования:
Операционная система Linux Ubuntu. На момент написания данной статьи я рекомендую версию Ubuntu Server 16.04 - это самый простой и нетребовательный к ресурсам сервера вариант. Без графического интерфейса и прочих архитектурных излишеств. Для удобства управления из дополнительных модулей понадобится только OpenSSH - можно будет удаленно подключаться к консоли операционной системы.
Аппаратные требования для ноды делегата:
Процессор - желательно не ниже Core2Duo или аналог. Мощность влияет на скорость синхронизации блокчейна. После синхронизации процессор используется крайне мало. Многоядерный процессор на делегатской ноде смысла не имеет, т.к. процесс идет в 1 поток.
Оперативная память - для ноды делегата желательно иметь не менее 5Gb RAM (это на март 2018 года, со временем это требование будет расти), в этом случае файл подкачки или swap использоваться практически не будут. ДопустИм и меньший объем памяти, при условии использования SSD накопителя, на котором хранится файл/раздел подкачки (swap). Иначе, если процесс ноды не уместится в оперативной памяти, а swap будет на обычном HDD, то синхронизация очень значительно растянется по времени. Тут важно отметить, что нода делегата - это самый простой вариант ноды голоса, другие конфигурации потребуют значительно больше памяти.
Накопитель, жесткий диск - как было указано выше, при недостатке RAM настоятельно рекомендуется использовать SSD накопитель на сервере. Вполне допустимо использовать совместно HDD и SSD. На HDD можно будет хранить сам блокчейн, а на SSD все оперативные данные, в т.ч. и swap. Что касается объема, то, например 256Гб, хватит на пару лет, но это не точно)))). Сегодня “делегатский” блокчейн голоса умещается в 14Гб.
Интернет - скорость передачи напрямую влияет на скорость синхронизации, т.к. блокчейн будет скачиваться. Например, при скорости интернета 10Мбит, только лишь скачивание блокчейна займет около 4х часов. В процессе работы ноды скорость не нужна, хватит и 100кбит. Желательно, чтобы пинг с большей частью мира не превышал 500мс.
Сам сервер можно получить несколькими способами:
Арендовать виртуальный сервер VDS (самый доступный вариант и тут важно убедиться в наличии административного (root) доступа)
Арендовать выделенный физический сервер
Купить свой и разместить в дата центре
Купить свой и разместить где-нибудь у себя
В моем случае сервер приобретен собственный и работает в качестве обогревателя ног:
AMD Ryzen 5 1600
RAM 8Gb
SSD 256Gb
ОС: Ubuntu Server 16.04 + OpenSSH
Интернет: 40 Мбит
И установлен он серверном помещении одной организации.
Часть 2: Предварительная настройка ОС Ubuntu.
Большая часть установки по этой инструкции будет проходить методом “скопировать из этого документа команду и вставить в окно консоли и нажать Enter”, поэтому для совсем новичков предупрежу сразу, в консоли, “вставить” методом ctrl+v не работает. Я использую щелчок правой кнопки мыши.
Итак, мы успешно подключены к нашему серверу и авторизованы, теперь начинаем!
Перед установкой ноды, нужно настроить систему так, чтобы нам на все хватало памяти. Процесс ноды делегата сегодня может занимать примерно до 5Гб памяти. Поэтому нам нужно убедиться, что выделенной памяти (shared memory) нам хватит, чтобы туда поместился процесс ноды. По умолчанию в Ubuntu 16.04, shared memory установлен как 50% от оперативной памяти. Т.е. если у вас 8Gb RAM, то настройки в 50% вам скорее всего не хватит. Если же RAM меньше, то без изменения настройки shared memory вообще ничего не заработает.
Проверим сколько памяти выделено сейчас:
df -h | grep /dev/shm
Смотрим первое число, это и есть размер выделенной памяти. Памяти лучше выделить с запасом - желательно не менее 8Gb для делегатской ноды (для полнофункциональной ноды нужно ставить не менее 32Gb).
Итак, если имеющееся значение меньше 8Gb, то нужно внести некоторые правки в настройку системы. Переназначим размер выделенной памяти, для этого в файл /etc/fstab добавим запись:
echo 'none /dev/shm tmpfs defaults,size=8G 0 0' | sudo tee -a /etc/fstab
В дальнейшем, исправления этого размера (если потребуется) делать только через правку файла, командой: sudo nano /etc/fstab
Далее, нужно убедиться, что размер RAM + SWAP больше либо равен Shared memory. Это особенно важно, если у вас совсем мало RAM, например, 2Гб. Размер RAM нам известен, размер SWAP можно посмотреть командой:
free -h
Размер указан в столбце total. В случае, если у вас получилось RAM+SWAP меньше Shared Memory, то нужно скорректировать размер SWAP, создадим дополнительный SWAP файл и укажем нужный размер (в примере 8Gb):
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Теперь сервер нужно перезагрузить и можно приступать к установке.
sudo shutdown -r now
Часть 3: Установка ноды Голоса.
Переходим к основной части. Первое, что нам нужно сделать в профилактических целях - это обновить основные компоненты системы.
Проверим наличие обновлений:
sudo apt-get update
Затем установим обновления:
sudo apt-get -y upgrade
Далее для установки и работы ноды голоса потребуется целый ряд программных пакетов, вот их установка одной строкой:
sudo apt-get -y install git cmake g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev libboost-all-dev libssl-dev libncurses5-dev doxygen libreadline-dev dh-autoreconf screen
Теперь скачаем исходники ноды на свой сервер. В данной инструкции мы будем скачивать и устанавливать ноду в домашнюю папку:
cd && git clone https://github.com/goloschain/golos
Далее перейдем в скачанную папку, выберем версию ноды (перед этим шагом, вам нужно точно знать, какую версию ноды вы будете ставить) и скачаем необходимые субмодули (обратите внимание на выбранную версию, в данном примере это 0.16.4):
cd golos && git checkout tags/v0.16.4 && git submodule update --init --recursive
Теперь запускаем сборку/компиляцию/установку, кому как больше нравится, но запускаем её не просто, а с определенными параметрами. Во-первых установка должна быть в режиме “релиза”, а не “отладки”. А во-вторых, т.к. мы ставим делегатскую ноду, то можем выбрать режим экономии памяти, при котором на нашей ноде не будут использоваться и храниться данные, которые не являются обязательными для консенсуса, т.е. для подписания блоков, а также включим опцию удаления старых данных о голосованиях, которые уже не влияют на консенсус.
Обозначаем параметры (и да, точка тоже входит в команду!)
cmake -DCMAKE_BUILD_TYPE=Release -DLOW_MEMORY_NODE=ON -DCLEAR_VOTES=ON .
Запускаем сборку (не просто, а так, чтобы использовать все дцать ядер процессора)
make -j$(nproc)
Установка даже на мощном железе занимает несколько минут, это нормально. Наблюдаем и ждем.
Часть 4. Настройка ноды Голоса и синхронизация
В работе с консолью Ubuntu есть одна особенность - пока есть консоль, есть и запущенный процесс, как только закрыли консоль, процесс тоже закрылся, чтобы этого избежать, в консоли есть “окна”, да да, почти как в windows :) когда мы отключаемся от окна, оно продолжает работать вместе с запущенными в нем процессами. Так вот, нам потребуется три окна, в первом будет работать сама нода, во втором будет работать кошелек голоса (через него мы будем отправлять команды в блокчейн), а в третьем окне будет работать скрипт, который автоматизирует одну из обязанностей делегата - публикацию рыночной цены соотношения golos / миллиграмм золота.
Вот краткая инструкция по созданию “окон”:
Создать окно (тут важно соблюдать регистр):
screen -S имя_окна
Подключиться к окну:
screen -x имя_окна
Отключиться от окна:
На клавиатуре Ctrl + A потом D
Посмотреть список окон:
screen -ls
Этих команд нам достаточно, при желании более подробно вы сможете почитать в мануале по команде.
Итак, создаем первое окно, в котором будет работать нода:
screen -S noda
В окне ноды перейдем в папку: golos/programs/golosd/
cd && cd golos/programs/golosd/
И впервые запустим приложение ноды. При первом запуске создаются необходимые конфигурационные файлы.
./golosd
Через несколько секунд после запуска, когда приложение напишет, “No witnesses configured” и “No miner configured”, можно нажимать Ctrl+C для остановки ноды.
Файл конфигурации создан и чуть позже мы его отредактируем.
Выйдем из этого окна при помощи комбинации Ctrl + A потом D и создадим второе окно - для кошелька: (выходить из окна не обязательно, в случае, если вы подключаетесь к консоли удаленно, например из под windows, вам достаточно просто запустить параллельно вторую консоль)
screen -S wal
Перейдем в папку с кошельком golos/programs/cli_wallet/
cd && cd golos/programs/cli_wallet/
запустим программу кошелька, с подключением к чужой рабочей ноде, т.к. наша еще не готова, а чтобы настроить нашу ноду, нам понадобится приватный ключ, который можно узнать через кошелек:
./cli_wallet --server-rpc-endpoint="wss://ws.golos.io"
при удачном запуске появится строка new>>>
создание нового кошелька
придумываем пароль для доступа в наш кошелек командой:
set_password ваш_пароль
после чего открываем свой кошелек командой
unlock ваш_пароль
далее нужно скопировать со своей страницы голоса приватный активный ключ и в консоли с кошельком выполнить команду:
import_key вашприватныйактивный_ключ
далее, для получения нужных нам ключей, в кошельке введем команду
suggest_brain_key
и получим ответ:
{
“brain_priv_key” : “тут будет мнемоническая фраза кошелька”,
“wif_priv_key” : “тут ваш приватный ключ для подписания блоков”,
“pub_key” : “тут ваш публичный ключ для прочих нужд”
}
Скопируйте ключи, они нам дальше понадобятся. Все эти ключи надо надежно сохранить, особенно приватные и ни в коем случае приватные ключи нельзя разглашать - это доступ к вашему аккаунту.
Теперь отключим кошелек от чужой ноды клавишами Ctrl + C, а затем Enter.
Отключаемся от консоли кошелька Ctrl + A потом D и возвращаемся в окно ноды:
screen -x noda
Теперь нам нужно настроить конфигурационный файл ноды config.ini, для этого воспользуемся текстовым редактором “nano”:
cd && nano golos/programs/golosd/witness_node_data_dir/config.ini
К настройке отнеситесь максимально внимательно, иначе одна очепятка и ничего работать не будет.
Добавляем список сидирующих нод, т.е. откуда наша нода может скачать блокчейн:
seed-node = 5.9.18.213:4243
seed-node = 52.32.75.69:4243
seed-node = 52.57.156.202:4243
seed-node = 88.99.13.48:4243
seed-node = golos-seed.arcange.eu:4243
seed-node = golos-seed.esteem.ws:4243
seed-node = golosnode.com:4243
seed-node = 138.68.101.115:4243
seed-node = golos.imcoins.org:2001
seed-node = 178.62.224.148:4242
Список нод может меняться со временем, актуальный список доступен по ссылке: https://github.com/GolosChain/golos/blob/master/documentation/seednodes
Найдите параметр shared-file-dir - он отвечает за то, где будут обрабатываться оперативные данные ноды. Вполне логично, чтобы оперативные данные обрабатывались в оперативной памяти. Однако, по умолчанию, оперативные данные почему-то размещаются в папке, куда скачано ПО ноды, если нода скачана на обычный жесткий диск, то синхронизация займет несколько месяцев, если на SSD, дело пойдет, конечно, быстрее, но износ SSD будет явно повышенный, т.к. операций ввода вывода будет ну очень много. Именно поэтому очень важно засунуть эти данные в оперативную память, а в ubuntu самый простой доступ к оперативной памяти очень удобно представлен в виде раздела /dev/shm, вот там мы и будем хранить все оперативные данные.
shared-file-dir = /dev/shm
Далее параметр shared-file-size - определяет максимальный размер оперативных данных. По умолчанию 32Гб. Не важно, что в системе оперативной памяти всего 8Гб, как только RAM закончится, дальше данные будут писаться в раздел подкачки swap. Опытным путем определено, что если фактический размер оперативных данных ноды достигает значения этого параметра, нода просто отваливается. Поэтому, для делегатской ноды можно оставить значение по умолчанию, а можно поставить с запасом побольше.
shared-file-size = 64G
Следующий раздел rpc-endpoint, точка подключения к нашей ноде. В случае ноды делегата подключаться к ней будем только мы сами и только кошельком и скриптом, поэтому пишем сюда строки:
rpc-endpoint = 127.0.0.1:9090
rpc-http-endpoint = 127.0.0.1:9091
rpc-http-allowip = 127.0.0.1
Параметр enable-plugin определяет функционал нашей ноды и, соответственно, сколько она будет потреблять ресурсов. Нам нужен только один плагин - witness, т.е. делегатство, поэтом удаляем все лишнее и оставляем только:
enable-plugin = witness
В конфигурационном файле нам нужно менять далеко не все параметры, но значение параметра witness - самое важное, это ваше имя на голосе, писать значение нужно в кавычках и без @:
witness = "amalinavia"
В параметр private-key, нужно вписать ваш приватный ключ для подписывания блоков, который мы недавно получили в окне кошелька wif_priv_key (писать без кавычек):
private-key = ваш_wif_priv_key
Следующие два параметра только для тех, кто еще и майнером хочет быть (сразу скажу, что на процессоре это бессмысленно, только риск перегрева повысите, поэтому не рекомендую указывать эти параметры):
miner = ["amalinavia","ваш_wif_priv_key"]
И число потоков/ядер вашего процессора, которое будет использоваться под майнинг:
mining-threads = 6
На этом настройка конфигурации ноды завершена, можно сохранять все изменения клавишами Ctrl + O, потом Enter и затем выходим из текстового редактора Ctrl + X.
Начинаем синхронизацию, процесс это небыстрый, если у вас супер сервер и супер интернет, то минут 30 будет длиться синхронизация, на среднем железе и среднем интернете может длиться даже несколько дней. Для информации на AMD Ryzen 1600, 8Gb RAM, 256Gb SSD, 40Mbit синхронизация занимает 2 - 4 часа, на Celeron E3400, 4Gb RAM, 60Gb SSD, 40Mbit синхронизация занимает около 10 часов.
cd golos/programs/golosd
./golosd
В случае каких-либо сбоев, повторный запуск ноды нужно выполнять командой:
./golosd --replay
Остановка ноды выполняется клавишами Ctrl + C.
Синхронизация закончится, когда в консоли начнут появляться строки, содержащие: “Got N transactions from network on block…”
Последний этап в настройке ноды - после завершения синхронизации нужно объявить себя делегатом.
Подключаемся к нашему окну с кошельком:
screen -x wal
Подключаем кошелек к нашей работающей ноде:
./cli_wallet --server-rpc-endpoint=ws://127.0.0.1:9090 --rpc-http-endpoint=127.0.0.1:9091 --rpc-http-allowip 127.0.0.1
Еще раз создадим пароль для кошелька:
set_password ваш_пароль
и затем открываем кошелек:
unlock ваш_пароль
Теперь нужно подготовить команду для объявления себя делегатом: нужно вписать свой ник на голосе, ссылку на свой пост делегата и ваш ПУБЛИЧНЫЙ ключ pub_key, который мы получили ранее в кошельке, не промахнитесь, т.к. это увидят все участники сети голоса.
Пример команды (все это одной строкой):
update_witness "amalinavia" "https://golos.io/ru--delegaty/@amalinavia/delegat" GLS6aXcMoUavuQFv5VueaDzcacwHFEPbDsrSix3CgQa48wfgYGRya {"account_creation_fee":"1.000 GOLOS", "maximum_block_size":65536, "sbd_interest_rate":1000} true
Если все прошло удачно, то на странице https://golos.id/~witnesses вы можете проверить успешность проголосовав за себя, набрав свой ник внизу страницы. Если голосование не выдаст ошибку, то у вас все получилось.
Не выключая программу кошелька, отключаемся от окна: Ctrl+A потом D
Часть 5. Автоматизация публикации рыночной цены соотношения golos / миллиграмм золота.
Публикация, так называемого price_feed - регулярная обязанность делегата, обновлять ставку нужно не реже 1 раза в сутки, а лучше чаще. Ежедневный ручной труд нам ни к чему, поэтому автоматизируем это.
Создадим третье окно под работу скрипта:
screen -S price
Теперь установим компоненты, необходимые для работы скрипта:
sudo apt-get -y install libffi-dev libssl-dev python3 python3-dev python3-pip python3-dateutil python3-websocket
sudo pip3 install golos
Далее скачаем к себе готовый скрипт от @roelandp
cd && wget https://raw.githubusercontent.com/roelandp/golospricefeed/master/golospricefeed.py
Сразу скажу, что скрипт устарел, у многих бирж уже поменялись API, но минимально необходимый функционал все еще работает, поэтому можем использовать данный скрипт без исправлений.
Прежде, чем мы запустим скрипт, его нужно настроить, поэтому откроем его в текстовом редакторе.
nano golospricefeed.py
В нем нужно настроить несколько параметров в верхней части файла, если не хотите заморачиваться, просто сделайте их такими:
discount = 0
interval_init = 60602
rand_level = 0.10
freq = 60
min_change = 0.01
max_age = 60301
manual_conf = 5.25
use_telegram = 0
telegram_token = ""
telegram_id = 1
bts_ws = ["wss://bitshares.openledger.info/ws", "wss://valen-tin.fr:8090/ws"]
rpc_host = "127.0.0.1"
rpc_port = 9091
witness = "amalinavia"
walletpassword = "вашпарольот_кошелька"
Сохраняем изменения клавишами Ctrl+O и выходим Ctrl+X
Все готово, можно запускать скрипт:
python3 ./golospricefeed.py
Если вы увидите надпись 120 minutes to next update, то скрипт запустился успешно и, если API оставшихся источников не поменяется, то скрипт будет обновлять вам ставку раз в 2 часа.
На этом всё и надеюсь, у вас все получилось.
Уважаемые делегаты. Если вы видите ошибку в данном посте - я с удовольствием ее исправлю с вашей помощью:
@arcange @on0tole @vitaly-lvov @vik @primus @smailer @dmilash @litvintech @on1x @goloscore @lehard @dr2073 @kuna @creator @testz @ropox @litrbooh @blockchained @yudina-cat @anyx @phenom @aleksandraz @vvk @xanoxt @steepshot @roelandp @xtar @dark.sun @semasping @good-karma @cheetah @kulturagolosa @stakepool @asuleymanov @captain @golosio @golos.loto @jesta @dreamer @someguy123 @serejandmyself @erikkartmen @amalinavia @golosboard @pfunk @hipster @yaski @stihi-io @qqc @gtg @alcotester @synergen @egorsv @pmartynov @upvote50-50 @anasya @dobryj.kit @konti @steemychicken1 @alex-firsov @smooth.witness @aizensou @dervish0 @penguin @del137 @misha @an0nym0us @celeste @smolalit @randowhale @steem-id @sept @golos-api @misiano @cats @yushkov @kiwi @boatymcboatface @kst.krv @steve-walschot @stone @komandante @kental @kushed @densmirnov @robot @tolstoy @jackpot @kazna @proctologic @picokernel @azzot88 @die.hard @instructor2121 @chitty @field @bitcoinparadise @littleboo @s-g-m-00 @s-g-m-01
P.S. В рамках конкурса от @ivelon я открываю интернет-магазин своих картин.
Хотели бы, чтобы я нарисовала вас? Пишите в Телеграм.
Обратите внимание! Если вы выкладываете фотографии в своих блогах, и чем-то зацепите мое внимание, то я приду к вам!)) И нарисую то, что вижу! =)
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
andrvik, niiu, archibald116, tymba, galina1, tinochka, tasha, vadbars, arsar, yourlastwinter, lira, ladynazgool, karusel1, snaryaga, zivchakh, ovtretya, arhangel, fyyf, vika-teplo, sterh, virt, dmitrijv, olgaborisova, mr-nikola, vladsm, bds1988, mp42b, onegin, magformers, kakachaca, karmoputnik, naiger, amalinavia, verdon, evgeniy73, kito-boy, gogirotsky, mamatata, konstab, katarinka, blog.experta, leonid96, morrigan, valen-tina, osra111, makssib, anykeycheg, delectat, zolotova1703, peterstoro, kinoshka
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
А простую, не делегатскую ноду поднять по этой же инструкции так же можно или там по другому как-то?
Так же, только без объявления себя делегатом и всеми вытекающими...)))
Хоть и было не раз это уже, но повторение - мать учения!)))
параметр sbd_interest_rate лучше указывать меньше чем 1000(10%), так как это есть годовые проценты на хранение GBG. 10% очень много, особенно сейчас!
Ну...не зря у меня всё намайненное в гбг на аккаунте лежит.
Есть мелкие неточности, но это ерунда. В целом, такой вариант мне не нравится, и вот почему:
fallocate
. Хотя, с точки зрения ядра такой swapfile то же самое, что и отдельный раздел, т.к. при этом происходит bypass слоя VFS (когда-то раньше было не так, и swapfile был более тормозной, чем отдельный раздел).Лично я гоняю ноду и сопутствующую кухню в docker-е, с автозапуском/автоперезапуском контейнеров. Вот когда-то статью писал.
Спасибо за комментарий! Обо всем по порядку: