June 3, 2022

Subspace | Gemini | Incentivized Testnet

Реліз gemini-1b-2022-jun-18

Зміст

  1. Про проект
  2. Polkadot wallet
  3. Нода
    1. Вимоги до сервера
  4. Установка ноди (Спосіб 1)
    1. Установка
    2. Створення перемінних
    3. Створення сервісних файлів
    4. Телеметрия и TSSC
    5. Корисні команди
    6. Оновлення
    7. Перенос і бекап
    8. Видалення
  5. Установка ноди через docker
    1. Установка
    2. Створення перемінних
    3. Створення сервісних файлів
    4. Оновлення
    5. Корисні команди
  6. Посилання автора

Про проект

Зміст

Medium | GitHub | WebSite | Twitter | Discord | Telegram | Ru_Telegram

Subspace Network - мережа, що дозволяє розробникам дуже просто і швидко розгортати децентралізовані Web3-програми, які, у свою чергу, можуть автоматично масштабуватися за необхідності.

Повна інтеграція з Polkadot & Kusama, у найближчому майбутньому та з EVM.

Subspace працює на блокчейні першого рівня, створеного для вирішення таких фундаментальних проблем, як: екологія, централізація та відсутність масштабованості.

Ці проблеми дозволяє вирішити нову реалізацію proof-of-capacity (PoC). Знайомі нам аналоги на PoC: Chia, Spacemesh, Filecoin.

Subspace працює на основі консенсусу proof-of-archive-storage (PoAS) або "доказ зберігання архівної історії блокчейну".

Фермери сабспейса (не майнери, до речі) зберігають стільки унікальних сегментів історії блокчейну, скільки дозволяє їх дисковий простір. зберігають історію колективно, що дозволяє їм працювати як єдиний розподілений архівний вузол.

Фермеру не обов'язково утримувати 2 тонни ССД, щоб зберігати всю історію блокчейну. Фермер може зберігати лише сегменти.

Чим більше фермер виділяє пам'яті, то більший шанс він має бути обраним для створення блоку.

Тут працює цікавий механізм нагород: більше фермерів у мережі > дорожча транзакція > більший прибуток для фермера. Зумовлено це тим, що нова інформація має зберігатися на більшій кількості дисків.

Кожен може стати фермером та збирати блоки, надавши свій вільний дисковий простір. Але для того, щоб підписувати та завершувати їх, потрібно бути обраним виконавцем.

Інвестори: більше $37kk від Coinbase, IOSG, Republic, Crypto.com, Alameda, Pantera, Hypersphere, Bixin, Vendetta, NGC, Gate та інших.

Polkadot wallet

Зміст

Тепер нам потрібний гаманець. Переходимо в дашборд Subspace Gemini 1 та копіюємо адресу нашого гаманця. На цю адресу ми будемо фармити TSSC токени, як доказ участі у тестеті.

Якщо з якихось причин у вас ще немає гаманця полькусами, потрібно завантажити polkadot.js розширення та згенерувати гаманець там.

Пропустити створення гаманця

Нода

Зміст

Вимоги до сервера:

Зміст

Вимоги: 4 CPU x 8 GB RAM x 200 GB SSD - Ubuntu 20.04.

Важлива зауваження: існує велика залежність між потужностями сервера і швидкістю синхронізації та фармом токенів.
На мінімалках не бачу сенсу запускати, імхо: ви просто відставатимете і дуже рідко підписуватимете блоки.
Чим більше пам'яті тим краще

Установка ноди (Спосіб 1)

Зміст

# Оновлюємо пакети
sudo apt-get update && sudo apt-get upgrade -y
# Качаємо необхідні залежності
sudo apt-get install wget jq -y
# Качаємо потрібні файли однією командою
mkdir $HOME/subspace >/dev/null 2>&1 && \
cd $HOME/subspace && \
VER=$(wget -qO- https://api.github.com/repos/subspace/subspace/releases | jq '.[] | select(.prerelease==false) | select(.draft==false) | .html_url' | grep -vE "runtime|chain-spec" | grep -Eo "gemini-[0-9]*[a-zA-Z]-[0-9]*-[a-zA-Z]*-[0-9]*" | head -n 1) && \
wget https://github.com/subspace/subspace/releases/download/${VER}/subspace-farmer-ubuntu-x86_64-${VER} -qO farmer; \
wget https://github.com/subspace/subspace/releases/download/${VER}/subspace-node-ubuntu-x86_64-${VER} -qO subspace; \
sudo chmod +x * && \
if [[ $(./farmer --version) == "" || $(./subspace --version) == "" ]]; then
  echo -e "\n\ndat sh*t is broken, ping @cyberomanov.\n\n"
else
  sudo mv * /usr/local/bin/ && \
  FARMER_V=$(echo $(farmer --version) | grep -ow '[0-9]*.[0-9]*.[0-9]*') && \
  SUBSPACE_V=$(echo $(subspace --version) | grep -ow '[0-9]*.[0-9]*.[0-9]*') && \
  echo -e "\n\nrelease >> ${VER}.\nfarmer >>> v${FARMER_V}.\nsubspace > v${SUBSPACE_V}.\n\n"
fi && \
cd $HOME && \
rm -Rvf $HOME/subspace >/dev/null 2>&1

Створення перемінних

Зміст

Перевіряємо перемінні однією командою

source $HOME/.bash_profile && \
echo -e "\nmoniker > ${NICKNAME}.\naddress > ${SUBSPACE_ADDRESS}.\n"

Якщо у виводі не відображаються адреса або монікер, необхідно змінити ці змінні. Якщо вивід адекватний – переходимо сюди.

Додаємо наш нікнейм, який буде надалі використовуватися як назва ноди, і адресу гаманця в систему, як змінні.

# наприклад, "export NICKNAME="aspirine07"" 
echo "export NICKNAME="nickname"" >> ~/.bash_profile
# например, "export SUBSPACE_ADDRESS="st6g9CwbHsEAYn35nfWda4r89MJd2y9QZqnEGWZcmh5fTPkSF"" 
echo "export SUBSPACE_ADDRESS="address"" >> ~/.bash_profile
# щоб перемінні завантажились, необхідно перезавантажити '.bash_profile' 
source ~/.bash_profile

Знову перевіряємо значення перемінних

echo -e "\nmoniker > ${NICKNAME}.\naddress > ${SUBSPACE_ADDRESS}.\n"

Створення сервісних файлів

Зміст

# Фіксимо журнал
sudo tee <<EOF >/dev/null /etc/systemd/journald.conf
Storage=persistent
EOF
# Перезавантажуємо журнал
sudo systemctl restart systemd-journald
# Створюємо файл сервісу для запуску ноди
sudo tee <<EOF >/dev/null /etc/systemd/system/subspaced.service
[Unit]
Description=Subspace Node
After=network.target
[Service]
Type=simple
User=$USER
ExecStart=$(which subspace) \\
$(wget -qO- https://raw.githubusercontent.com/cyberomanov/subspace/main/reserved.txt) \\
--chain="gemini-1" \\
--execution="wasm" \\
--pruning=1024 \\
--keep-blocks=1024 \\
--validator \\
--reserved-only \\
--name="${NICKNAME}"
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
# Запускаємо ноду
sudo systemctl daemon-reload && \
sudo systemctl enable subspaced && \
sudo systemctl restart subspaced
# Перевіряємо логи
sudo journalctl -u subspaced -f -o cat

Тут все ок, йдемо далі

# проверяємо статус синхронізації
sudo journalctl -fu subspaced -o cat | grep -Eo "best: #[0-9]*"
Синхронізація може зупинятися на певних блоках і не йти далі, доки фармер не обробить попередні блоки.
Оскільки фармер ми ще не запускали, синхронізація може зупинитися на першому блоці – не панікуємо.

Створюємо тимчасову змінну з максимальним місцем, яке хочете надати фармеру.

Маючи диск розміром 400Gb, я б зробив так:
- 100Gb на ноду;
- 20Gb на систему;
- 280Gb на фармер.
SPACE="280G"
# створюємо файл сервісу для запуску фармера
sudo tee <<EOF >/dev/null /etc/systemd/system/farmerd.service
[Unit]
Description=Subspace Farmer
After=network.target
[Service]
Type=simple
User=$USER
ExecStart=$(which farmer) farm \\
--reward-address=${SUBSPACE_ADDRESS} \\
--plot-size=${SPACE}
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
# Перезапускаємо сервіси
sudo systemctl daemon-reload && \
sudo systemctl enable subspaced farmerd && \
sudo systemctl restart subspaced farmerd
# Перевіряємо логи
sudo journalctl -u farmerd -f -o cat

Якщо у логах виникнуть помилки - перезапустіть сервіси повторно

# пезапуск фармера та ноди
sudo systemctl restart farmerd subspaced

Телеметрия и TSSC

Зміст

# Перевірити синхронізацію
sudo journalctl -fu subspaced -o cat | grep "best"

Або переходимо в телеметрію.

Актуальну висоту можна переглянути в експлоуері

Після завершення синхронізації ноди фармер почне продукувати блоки і отримувати за це нагороду. Якщо баланс гаманця збільшується – все працює чудово.

Інший спосіб

sudo journalctl -u farmerd -o cat | grep "Successfully"

Якщо дана команда нічого не виводить - значить, жодного блоку вона ще не підписала, спробуйте через пару годин знову.

От і все. Фармимо TSSC та чекаємо закінчення інсентивайзу.

Корисні команди

Зміст

# перезапуск фармера та ноди
sudo systemctl restart farmerd subspaced
# зупинка фармера та ноди
sudo systemctl stop farmerd subspaced
# перевіряємо логи фармера
sudo journalctl -u farmerd -f -o cat
# перевіряємо логи ноди
sudo journalctl -u subspaced -f -o cat
# Перевірити синхронізацію
sudo journalctl -fu subspaced -o cat | grep "best"

Оновлення

Зміст

# одна команда
mkdir $HOME/subspace >/dev/null 2>&1 && \
cd $HOME/subspace && \
VER=$(wget -qO- https://api.github.com/repos/subspace/subspace/releases | jq '.[] | select(.prerelease==false) | select(.draft==false) | .html_url' | grep -vE "runtime|chain-spec" | grep -Eo "gemini-[0-9]*[a-zA-Z]-[0-9]*-[a-zA-Z]*-[0-9]*" | head -n 1) && \
wget https://github.com/subspace/subspace/releases/download/${VER}/subspace-farmer-ubuntu-x86_64-${VER} -qO farmer; \
wget https://github.com/subspace/subspace/releases/download/${VER}/subspace-node-ubuntu-x86_64-${VER} -qO subspace; \
sudo chmod +x * && \
if [[ $(./farmer --version) == "" || $(./subspace --version) == "" ]]; then
  echo -e "\n\ndat sh*t is broken, ping @cyberomanov.\n\n"
else
  sudo mv * /usr/local/bin/ && \
  FARMER_V=$(echo $(farmer --version) | grep -ow '[0-9]*.[0-9]*.[0-9]*') && \
  SUBSPACE_V=$(echo $(subspace --version) | grep -ow '[0-9]*.[0-9]*.[0-9]*') && \
  echo -e "\n\nrelease >> ${VER}.\nfarmer >>> v${FARMER_V}.\nsubspace > v${SUBSPACE_V}.\n\n"
fi && \
cd $HOME && \
rm -Rvf $HOME/subspace >/dev/null 2>&1 && \
sudo systemctl daemon-reload && \
sudo systemctl restart subspaced farmerd
# перевіряємо висоту
sudo journalctl -fu subspaced -o cat | grep -Eo "best: #[0-9]*"
# перевіряємо логи фармера
sudo journalctl -fu farmerd -o cat

Перенос і бекап

Зміст

В якості бекапу викачуємо файл по шляху, який виведе команда:

find / -iname secret_ed25519 | grep subspace

Також зберігаємо json та мнемоніку від гаманця, куди капають нагороди.

При переїзді ми встановлюємо ноду та фармер як завжди, але після першого запуску здійснюємо заміну secret_ed25519 файлу з нового сервера на старий. І перезапускаємо ноду із фармером.

Видалення

Зміст

# зупиняємо та відключаємо сервіс однією командою
sudo systemctl stop subspaced farmerd && \
sudo systemctl disable subspaced farmerd
# видаляємо файли
rm -Rvf $HOME/.local/share/subspace*
sudo rm -v /etc/systemd/system/subspaced.service \
/etc/systemd/system/farmerd.service && \
sudo systemctl daemon-reload

Установка ноди через docker

Зміст

# Оновлюємо пакети
sudo apt update && sudo apt upgrade -y
# Ставимо утиліти
sudo apt install curl ncdu htop git wget -y
# Встановлюємо docker
cd $HOME
apt update && apt purge docker docker-engine docker.io containerd docker-compose -y
rm /usr/bin/docker-compose /usr/local/bin/docker-compose
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# Перевірка версії docker-compose
docker-compose --version

Створення перемінних

Зміст

# Створюємо перемінні
NODENAME="Ім'я ноди"
ADDRESS="Адреса гаманця починається на st"
PLOT_SIZE="Виділена пам'ять під фармер"
# Перевіряємо кількість вільного місця
df -h

Віднімаємо близько 80-100Gb та решто віддаємо під фармер

# Записуємо перемінні в баш
echo "export NODENAME=$NODENAME" >> $HOME/.bash_profile
echo "export ADDRESS=$ADDRESS" >> $HOME/.bash_profile
echo "export PLOT_SIZE=$PLOT_SIZE" >> $HOME/.bash_profile
source $HOME/.bash_profile
# Перевіряємо перемінні
cat $HOME/.bash_profile

При виводі повинні відображатись ваші актуальні дані

Створення сервісних файлів

Зміст

# Створюємо дерикторію
mkdir $HOME/subspace && cd $HOME/subspace
# Створюємо docker-compose, повністю та без змін
tee $HOME/subspace/docker-compose.yml > /dev/null <<EOF
version: "3.7"
services:
  node:
    # For running on Aarch64 add '-aarch64' after 'DATE'
    image: ghcr.io/subspace/node:gemini-1b-2022-jun-18
    volumes:
# Instead of specifying volume (which will store data in '/var/lib/docker'), you can
# alternatively specify path to the directory where files will be stored, just make
# sure everyone is allowed to write there
      - node-data:/var/subspace:rw
#      - /path/to/subspace-node:/var/subspace:rw
    ports:
# If port 30333 is already occupied by another Substrate-based node, replace all
# occurrences of '30333' in this file with another value
      - "0.0.0.0:30333:30333"
    restart: unless-stopped
    command: [
      "--chain", "gemini-1",
      "--base-path", "/var/subspace",
      "--execution", "wasm",
      "--pruning", "1024",
      "--keep-blocks", "1024",
      "--port", "30333",
      "--rpc-cors", "all",
      "--rpc-methods", "safe",
      "--unsafe-ws-external",
      "--validator",
# Replace 'INSERT_YOUR_ID' with your node ID (will be shown in telemetry)
      "--name", "$NODENAME"
    ]
    healthcheck:
      timeout: 5s
# If node setup takes longer then expected, you want to increase 'interval' and 'retries' number.
      interval: 30s
      retries: 5

  farmer:
    depends_on:
      node:
        condition: service_healthy
# For running on Aarch64 add '-aarch64' after 'DATE'
    image: ghcr.io/subspace/farmer:gemini-1b-2022-jun-18
# Un-comment following 2 lines to unlock farmer's RPC
#    ports:
#      - "127.0.0.1:9955:9955"
# Instead of specifying volume (which will store data in '/var/lib/docker'), you can
# alternatively specify path to the directory where files will be stored, just make
# sure everyone is allowed to write there
    volumes:
      - farmer-data:/var/subspace:rw
#      - /path/to/subspace-farmer:/var/subspace:rw
    restart: unless-stopped
    command: [
      "--base-path", "/var/subspace",
      "farm",
      "--node-rpc-url", "ws://node:9944",
      "--ws-server-listen-addr", "0.0.0.0:9955",
# Replace 'WALLET_ADDRESS' with your Polkadot.js wallet address
      "--reward-address", "$ADDRESS",
# Replace 'PLOT_SIZE' with plot size in gigabytes or terabytes, for instance 100G or 2T (but leave at least 10G of disk space for node)
      "--plot-size", "$PLOT_SIZE"
    ]
volumes:
  node-data:
  farmer-data:
EOF
# Запускаємо docker
cd $HOME/subspace && docker-compose up -d
# Перевіряємо логи
cd $HOME/subspace && docker-compose logs --tail=100 -f
# Шукаємо зловлені блоки
cd $HOME/subspace && docker-compose logs | grep "signed"

Оновлення

Зміст

cd $HOME/subspace
nano docker-compose.yml

Керуємо курсором за допомогою стрілок та змінюємо назву релізу на gemini-1b-2022-jun-18.

Після редагування тиснемо ctrl+o, enter, ctrl+x

tee $HOME/subspace/docker-compose.yml > /dev/null <<EOF
version: "3.7"
services:
  node:
    # For running on Aarch64 add '-aarch64' after 'DATE'
    image: ghcr.io/subspace/node:gemini-1b-2022-jun-18
    volumes:
# Instead of specifying volume (which will store data in '/var/lib/docker'), you can
# alternatively specify path to the directory where files will be stored, just make
# sure everyone is allowed to write there
      - node-data:/var/subspace:rw
#      - /path/to/subspace-node:/var/subspace:rw
    ports:
# If port 30333 is already occupied by another Substrate-based node, replace all
# occurrences of '30333' in this file with another value
      - "0.0.0.0:30333:30333"
    restart: unless-stopped
    command: [
      "--chain", "gemini-1",
      "--base-path", "/var/subspace",
      "--execution", "wasm",
      "--pruning", "1024",
      "--keep-blocks", "1024",
      "--port", "30333",
      "--rpc-cors", "all",
      "--rpc-methods", "safe",
      "--unsafe-ws-external",
      "--validator",
# Replace 'INSERT_YOUR_ID' with your node ID (will be shown in telemetry)
      "--name", "$NODENAME"
    ]
    healthcheck:
      timeout: 5s
# If node setup takes longer then expected, you want to increase 'interval' and 'retries' number.
      interval: 30s
      retries: 5

  farmer:
    depends_on:
      node:
        condition: service_healthy
# For running on Aarch64 add '-aarch64' after 'DATE'
    image: ghcr.io/subspace/farmer:gemini-1b-2022-jun-18
# Un-comment following 2 lines to unlock farmer's RPC
#    ports:
#      - "127.0.0.1:9955:9955"
# Instead of specifying volume (which will store data in '/var/lib/docker'), you can
# alternatively specify path to the directory where files will be stored, just make
# sure everyone is allowed to write there
    volumes:
      - farmer-data:/var/subspace:rw
#      - /path/to/subspace-farmer:/var/subspace:rw
    restart: unless-stopped
    command: [
      "--base-path", "/var/subspace",
      "farm",
      "--node-rpc-url", "ws://node:9944",
      "--ws-server-listen-addr", "0.0.0.0:9955",
# Replace 'WALLET_ADDRESS' with your Polkadot.js wallet address
      "--reward-address", "$ADDRESS",
# Replace 'PLOT_SIZE' with plot size in gigabytes or terabytes, for instance 100G or 2T (but leave at least 10G of disk space for node)
      "--plot-size", "$PLOT_SIZE"
    ]
volumes:
  node-data:
  farmer-data:
EOF
# Запускаємо docker
cd $HOME/subspace && docker-compose up -d

Корисні команди

Зміст

# Перезапустити docker
cd $HOME/subspace && docker-compose restart
# Зупинити docker
cd $HOME/subspace && docker-compose down -v
# Видалити
cd $HOME && rm -rf $HOME/subspace
# Запускаємо docker
cd $HOME/subspace && docker-compose up -d
# Перевіряємо логи
cd $HOME/subspace && docker-compose logs --tail=100 -f
# Шукаємо зловлені блоки
cd $HOME/subspace && docker-compose logs | grep "signed"

Посилання

Зміст