![]() |
![]() |
#1 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Near | Testnet - установка ноды
Выполняем команды по очереди, внимательно все копируя! Требования к серверу
Лично я арендовала сервер на Hetzner CX51 и добавила 200 гб памяти (буду следить за использованием ресурсов) по стоимости вышло 40 евро. Первое задание Код:
sudo apt update && sudo apt upgrade -y curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install build-essential nodejs PATH="$PATH" node -v #хороший ответ - v18.x.x npm -v #хороший ответ - 8.x.x sudo npm install -g near-cli npm install -g [email protected] export NEAR_ENV=shardnet echo 'export NEAR_ENV=shardnet' >> ~/.bashrc echo 'export NEAR_ENV=shardnet' >> ~/.bash_profile source $HOME/.bash_profile Второе задание Код:
lscpu | grep -P '(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )' > /dev/null \ && echo "Supported" \ || echo "Not supported" #правильный вывод команды - Supported sudo apt install -y git binutils-dev libcurl4-openssl-dev zlib1g-dev libdw-dev libiberty-dev cmake gcc g++ python3 docker.io protobuf-compiler libssl-dev pkg-config clang llvm cargo Код:
sudo apt install python3-pip USER_BASE_BIN=$(python3 -m site --user-base)/bin export PATH="$USER_BASE_BIN:$PATH" Код:
sudo apt install clang build-essential make Код:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh #нажимаем y и потом 1 source $HOME/.cargo/env Код:
git clone https://github.com/near/nearcore cd nearcore git fetch Код:
git checkout <commit> #заменить <commit> на значение из файла, по ссылке ниже Компилируем бинарники nearcore Код:
cargo build -p neard --release --features shardnet Код:
./target/release/neard --home ~/.near init --chain-id shardnet --download-genesis
Находятся эти файлы по такому пути: cd /root/.near/ Перемещаем config.json Удаляем старый конфиг файл и выкачиваем с гитхаба актуальный: Код:
rm ~/.near/config.json wget -O ~/.near/config.json https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json Код:
sudo apt-get install awscli -y Код:
cd ~/nearcore ./target/release/neard --home ~/.near run #Из важного - должны подцепиться пиры (>0) и загрузиться хедеры (ждем 100%) #Только потом идем дальше по гайду! #выходим - Ctrl+C Код:
sudo tee /etc/systemd/system/neard.service > /dev/null <<EOF Код:
[Unit] Description=NEARd Daemon Service [Service] Type=simple User=$USER #Group=near WorkingDirectory=/root/.near ExecStart=/root/nearcore/target/release/neard run Restart=on-failure RestartSec=30 KillSignal=SIGINT TimeoutStopSec=45 KillMode=mixed [Install] WantedBy=multi-user.target EOF Запускаем сервисный файл: Код:
sudo systemctl daemon-reload sudo systemctl enable neard sudo systemctl restart neard sudo systemctl status neard ![]() Теперь устанавливаем "ccze", тулза, необходимая для красивого отображения логов: Код:
sudo apt install ccze Код:
journalctl -n 100 -f -u neard | ccze -A |
![]() |
![]() |
![]() |
#2 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Теперь нам необходимо создать кошелек, валидатора и застейкать монет:
Останавливаем сервис: Код:
sudo systemctl stop neard sudo systemctl disable neard Идем в терминал: Код:
near login ![]() Нам среди прочего текста выдаст ссылку - копируем ее и вставляем во вкладку браузера, где вы залогинились в свой кошелек, даем доступ, перекинет на пустую страницу - отлично, идем в терминал - вписываем имя кошелька (выглядит так: ХХ.shardnet.near). Далее я буду называть "ХХ" - именем! Создаем файл validator_key.json Генерируем ключ: Код:
near generate-key <pool_id>.factory.shardnet.near #заменить <pool_id> на имя ХХ Код:
cp ~/.near-credentials/shardnet/<pool_id>.factory.shardnet.near.json ~/.near/validator_key.json #заменить <pool_id> на имя ХХ Код:
vi ~/.near/validator_key.json Меняем private_key на secret_key Вот так будет выглядеть Ваш файл: Код:
{ "account_id": "xx.factory.shardnet.near", "public_key": "ed25519:HeaBJ3xLgvZacQWmEctTeUqyfSU4SDEnEwckWxd92W2G", "secret_key": "ed25519:****" } Код:
cat ~/.near/validator_key.json |
![]() |
![]() |
![]() |
#3 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Задание 3
Создаем стейкинг пул Код:
near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "<pool name>", "owner_id": "<accountId>", "stake_public_key": "<public key>", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="<accountId>" --amount=30 --gas=300000000000000 #<pool name> - XX #<accountId> - XX.shardnet.near #<public key> - берем из файла validator_key.json Код:
near call <pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000 #<pool_id> - XX.factory.shardnet.near #<amount> - количество токенов, которое хотите застейкать #<accountId> - XX.shardnet.near Задание 4 В этом задании нам необходимо познакомится с мониторингом ноды и установить RPC на порт 3030. Проверка логов: Код:
journalctl -n 100 -f -u neard | ccze -A Обычно RPC используется для проверки статистики валидатора, версии узла и просмотра доли делегатора, хотя его можно использовать для взаимодействия с блокчейном, учетными записями и контрактами в целом. Подробнее о многих командах и о том, как их использовать, можно узнать здесь: https://docs.near.org/api/rpc/introduction Для работы RPC необходимо открыть порт 3030 (сразу откроем еще несколько, которые могут Вам понадобиться для дальнейших заданий) Сервис должен быть остановлен (или его потом нужно будет перезапустить для правильной работы): Код:
sudo ufw allow 22 sudo ufw allow 3030 sudo ufw allow 9090 sudo ufw allow 3000 sudo ufw allow 24567 sudo ufw enable Идем на любой сайт из гугла по запросу "проверить открыты ли порты на сервере", например этот, вводим свой айпи и нужный порт. Устанавливаем вспомогательную тулзу JQ Код:
sudo apt install curl jq Код:
curl -s http://127.0.0.1:3030/status | jq .version Код:
near view <your pool>.factory.shardnet.near get_accounts '{"from_index": 0, "limit": 10}' --accountId <accountId>.shardnet.near Код:
curl -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.prev_epoch_kickout[] | select(.account_id | contains ("<POOL_ID>"))' | jq .reason #<POOL_ID> - заменить на XX.factory.shardnet.near Код:
curl -r -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.current_validators[] | select(.account_id | contains ("<POOL_ID>"))' Задание 5 В этом задании необходимо написать свой собственный гайд, в котором детально описать как выполнять задания 1-4. Разместить свою статью на популярном ресурсе, например Медиум. Это задание нужно отправить на проверку, заполнив форму. В нее нужно прикрепить ссылку на Вашу статью. Задание 6 В этом задании нужно создать скрипт, который будет подавать Ваш пул в активный сет валидаторов, а так же настроить джобу. Для начала создаем папку/директорию, в которой будет храниться файл со скриптом и директорию для логов: Код:
mkdir /root/scripts mkdir /root/logs Код:
vi /root/scripts/ping.sh Код:
#!/bin/sh # Ping call to renew Proposal added to crontab export NEAR_ENV=shardnet export LOGS=/root/logs export POOLID=<YOUR_POOL_ID> export ACCOUNTID=<YOUR_ACCOUNT_ID> echo "---" >> $LOGS/all.log date >> $LOGS/all.log near call $POOLID.factory.shardnet.near ping '{}' --accountId $ACCOUNTID.shardnet.near --gas=300000000000000 >> $LOGS/all.log near proposals | grep $POOLID >> $LOGS/all.log near validators current | grep $POOLID >> $LOGS/all.log near validators next | grep $POOLID >> $LOGS/all.log Код:
#<YOUR_POOL_ID> - заменить на имя ХХ #<YOUR_ACCOUNT_ID> - заменить на имя ХХ Код:
chmod +x root/scripts/ping.sh Код:
crontab -e Код:
0 */2 * * * sh /root/scripts/ping.sh Код:
cat root/logs/all.log Задание 7 В этом задании нужно провести работу с данными, которые генерирует блокчейн. Тут нет строгих критериев, лично я попробую выполнить это задание, используя прометеус и графану. Постараюсь написать гайд по этому заданию отдельно. А пока даю Вам ссылку на оф доки с описанием задания, если у Вас есть идеи и навыки - дерзайте! Удачи!) |
![]() |
![]() |
![]() |
#4 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Задание 8
В этом задании необходимо развернуть смарт-контракт, который позволит разделить награды на два аккаунта. Устанавливаем wasm32-unknown-unknow: Код:
rustup target add wasm32-unknown-unknown Код:
git clone https://github.com/zavodil/near-staking-pool-owner Код:
cd near-staking-pool-owner/contract cargo build --target wasm32-unknown-unknown --release При необходимости измените путь к файлу .wasm Код:
NEAR_ENV=shardnet near deploy <OWNER_ID>.shardnet.near --wasmFile target/wasm32-unknown-unknown/release/contract.wasm #<OWNER_ID> - заменить на имя ХХ Код:
CONTRACT_ID=<OWNER_ID>.shardnet.near #<OWNER_ID> - заменить на имя ХХ NEAR_ENV=shardnet near call $CONTRACT_ID new '{"staking_pool_account_id": "<STAKINGPOOL_ID>.factory.shardnet.near", "owner_id":"<OWNER_ID>.shardnet.near", "reward_receivers": [["<SPLITED_ACCOUNT_ID_1>.shardnet.near", {"numerator": 3, "denominator":10}], ["<SPLITED_ACCOUNT_ID_2>.shardnet.near", {"numerator": 70, "denominator":100}]]}' --accountId $CONTRACT_ID #<STAKINGPOOL_ID> - заменить на имя ХХ #<OWNER_ID> - заменить на имя ХХ #<SPLITED_ACCOUNT_ID_1> - заменить на имя первогокошелька #<SPLITED_ACCOUNT_ID_2> - заменить на имя нового 2го кошелька #поменяйте значения numerator/denomitor, если хотите изменить процент распределения наград между кошельками Код:
CONTRACT_ID=<OWNER_ID>.shardnet.near #<OWNER_ID> - заменить на имя ХХ NEAR_ENV=shardnet near call $CONTRACT_ID withdraw '{}' --accountId $CONTRACT_ID --gas 200000000000000 ![]() Задание 9 Для этого задания необходимо пробраться в активный сет валидаторов, производить блоки и иметь аптайм не менее 70%. Убедитесь, что порт 3030 открыт на Вашем сервере Для того, что бы отчитаться за задние нужно заполнить форму, в которую прикрепить ссылку http://<IP Address>:3030/status (заменить на свой айпи) и скрин с этого сайта, где видно, что Ваш аптайм выше 70% Задание 10 Тут нам делать ничего не нужно, это просто делегация токенов от команды тем нодам, у которых аптайм выше 60% за последние эпохи. |
![]() |
![]() |
![]() |
#5 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Задание 11
Тут нужно сделать бэкап ноды, ставим 2ю ноду либо в другую папку, либо на новый сервис, потом идем в старую ноду: ЕСЛИ она на другом сервере: заходим через файловую сессию, качаем себе файлы validator_key.json и node_key.json (папка .near) и копируем их в папку root на новом сервере ЕСЛИ она та том же сервере: находим файлы validator_key.json и node_key.json (папка .near) и просто запоминаем к ним путь Теперь в терминал новой ноды(выполняем команды внимательно, так как нужно будет отправить скрин в отчет выполнения всех этих команд подряд): Код:
cd .near cat node_key.json | grep public_key sudo systemctl stop neard rm node_key.json cp <PATH>/node_key.json /root/.near cp <PATH>/validator_key.json /root/.near #заменить <PATH> на путь к файлу #пример(если вы положили в папку рут файл): cp /root/node_key.json /root/.near cat node_key.json | grep public_key sudo systemctl start neard journalctl -n 100 -f -u neard | ccze -A ![]() ![]() Отчет: вот такой скрин, желательно одной фоткой)) форма другая тут Задание 12 Написать скрипт для авто бэкапа ноды Идем в терминал: создаем директорию: Код:
mkdir /root/reserve Код:
vi backup.sh #откроется вим Код:
#!/bin/bash DATE=$(date +%Y-%m-%d-%H-%M) DATADIR=/root/.near/data BACKUPDIR=/root/reserve/near_${DATE} rm -rf /root/reserve/* mkdir $BACKUPDIR sudo systemctl stop neard wait 5 echo "NEAR node was stopped" if [ -d "$BACKUPDIR" ]; then echo "Backup started" cp -rf $DATADIR ${BACKUPDIR}/ tar -cvf /root/reserve/near_${DATE}.tar $BACKUPDIR rm -rf /root/reserve/near_${DATE} curl -fsS -m 10 --retry 5 -o /dev/null <URL> echo "Backup completed" else echo $BACKUPDIR is not created. Check your permissions. exit 0 fi sudo systemctl start neard echo "NEAR node was started" #заменить <URL> на свой #сохраняем и выходим из вима В этом задании мы должны настроить джобу, которая будет выполнять скрипт бекапа раз в определенное время, в скрипте есть строка, которая отправляет информацию в сервис https://healthchecks.io/ , он в свою очередь умеет оповещать Вас по почте в том случае, если он не получил нужную информацию. Получается такая схема:
Идем на сайт https://healthchecks.io/ Регистрируемся, вписываем почту, на почту прийдет письмо, переходим по ссылке из него, видим такое: ![]() Ссылка посередине скрина - необходимая Вам, копируем ее и вставляем в скрипт вместо <URL> Теперь нужно настроить крон табу (для отчета это не требуется, но если вы хотите, что бы скрипт бекапа работал на вашем сервере - делайте) Код:
crontab -e #откроется вим, добавляем туда строку ниже 0 12 * * * sh /root/backup.sh >> /root/backup.log 2>&1 Задание 13 Настроить NEAR Validator kuutamo Задание 14 В этом задании нам предлагают настроить оповещения на почту, со следующим текстом: "Баланс Вашего валидатора "имя валидатора" на данный момент "кол-во" ниаров" Пометка: будет работать этот скрипт в том случае, если у вас на сервере настроены нод экспрортеры и прометеус. Для начала идем в дискорд проекта Notifi, ветка #integration-requests, заполняем форму на получение креденций, они прийдут Вам на почту, когда менеджер обработает запрос. Создаем директорию для будущего скрипта, я ее создала в папке /root/scripts: Код:
mkdir notifi cd notifi Код:
npm init -y Код:
npm install typescript --save-dev npm install @types/node --save-dev Код:
npx tsc --init --rootDir src --outDir build \ --esModuleInterop --resolveJsonModule --lib es6 \ --module commonjs --allowJs true --noImplicitAny true Код:
mkdir src touch src/index.ts Код:
vi tsconfig.json ![]() Теперь берем скрипт (у меня в телеграмме) и кладем его в директорию /root/scripts/notifi/src Заходим в него через вим и меняем на свои значения: Код:
cd /root/scripts/notifi/src vi index.ts #меняем <NAME> на свое значение XX.factory.shardnet.near #меняем <URL> на свое значение #меняем <SID> на свое значение #меняем <SECRET> на свое значение #меняем <TOPIC> на свое значение Код:
cd /root/scripts/notifi vi package.json #в итоге должен выглядеть так, как на скрине ниже ![]() Устанавливаем доп тулзы: Код:
sudo npm i @notifi-network/notifi-node Код:
npm run start Отчет: заполняем эту форму, в нее отправляем скрин присланного письма от Notifi Задание 15 Тут нужно доработать нашу графану вот такими показателями:
А так же показатели вашего "железа" Отчет: форма вот тут |
![]() |
![]() |
![]() |
#6 |
Member
Регистрация: 20.07.2022
Сообщений: 99
|
![]()
Команды
Посмотреть proposals: Код:
near proposals #A proposal by a validator indicates they would like to enter the validator set, in order for a proposal to be accepted it must meet the minimum seat price. Код:
near validators current #This shows a list of active validators in the current epoch, the number of blocks produced, number of blocks expected, and online rate. Used to monitor if a validator is having issues. Код:
near validators next #This shows validators whose proposal was accepted one epoch ago, and that will enter the validator set in the next epoch. Код:
near call <pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000 Количество указывается в yoctoNEAR. Код:
near call <pool_id> unstake '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000 Код:
near call <pool_id> unstake_all --accountId <accountId> --gas=300000000000000 Анстейкинг занимает 2-3 эпохи Код:
near call <pool_id> withdraw '{"amount": "<amount yoctoNEAR>"}' --accountId <accountId> --gas=300000000000000 Код:
near call <pool_id> withdraw_all --accountId <accountId> --gas=300000000000000 Код:
near view <pool_id> get_account_total_balance '{"account_id": "<accountId>"}' Код:
near view <pool_id> get_account_unstaked_balance '{"account_id": "<accountId>"}' Код:
near view <pool_id> is_account_unstaked_balance_available '{"account_id": "<accountId>"}' Код:
near call <pool_id> pause_staking '{}' --accountId <accountId> Код:
near call <pool_id> resume_staking '{}' --accountId <accountId> Код:
near call <pool_id> update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, |
![]() |
![]() |