May 26, 2022

Setup Ethereum Node

Материал подготовлен эксклюзивно для сообщества tern.crypto Plus

⚠️ UPD 18.09.2022: Статья обновлена. Добавлена инструкция после Merge ⚠️

В этой статье я расскажу как каждому поднять свою Эфир ноду, но давайте для начала я расскажу для чего это может быть нужно

1. Преимущества собственной ноды

  • Отсутствие рейтлимита
    Вы сможете слать сколько угодно запросов и не бояться о лимитах в секунду и общих. К примеру:
    QuickNode дает вам 60 миллионов запросов за 299$
    Alchemy разрешает слать 10 запросов в секунду
  • Максимальная скорость Вы можете запускать софты локально с своего же сервера ноды и иметь пинг 0. Маст-хев при фронтране
  • Поддержка безопасности сети Посредственный, но все же плюс. Также вы поддерживаете и свою безопасность если взламываете контракт на 100М$ и отправляете транзакцию на свою приватную ноду, а не на частную

2. Сравнение всех популярных вариантов

  • QuickNode. от 49$ до 299$/месяц. Если вы активный смотритель пендингов, то даже максимального варианта вам может не хватить. Однако ноды у них быстрые
  • Alchemy. Бесплатная. Есть хорошие методы, например:
    alchemy_newFullPendingTransactions - Позволяет смотреть сразу пендинги из txData, а не txHash. Однако имеет рейтлимит на 10 запросов/секунда
  • Moralis, GetBlock. ~50$/месяц. Есть рейтлимиты на ~10 запросов/секунда. Также у Moralis есть удобное API для NFT
  • Своя нода. ~60$/месяц. Плюсы были описаны выше

3. Аренда сервера и системные требования

Системные требования:

  • RAM: 16 GB (Лучше хотя бы 32)
  • CPU: 8 core/16 threads (По-моему можно еще хуже)
  • SSD: 1TB NVMe, хватит ненадолго, лучше брать 2TB
  • Network Speed: В принципе должно хватить и 100mbps
Характеристики моего сервера
Сервер я брал на Hetzner, т.к. там самые хорошие цены. Брал с запасом, т.к. еще не знал сколько конкретно потребляет нода
Также из хороших хостеров - Vultr, AWS

4. Подключение к серверу

Для подключению к серверу я использую MobaXterm

После того как установили, вам нужно создать SSH ключи и сохранить их

Жмем Tools -> MobaKeyGen

Жмем кнопку Generate, во время генерации двигайте мышкой по окну.

Сохраняем ключи, публичный ключ указываем на сайте, где мы арендовали сервер.

После того, как купили сервер выбираем ОС. Я использую Ubuntu 22.04

На Hetzner: Server -> Linux -> Выбираем ОС

Ждем пока изменения вступят в силу

Далее нам нужно добавить сессию в MobaXTerm

Вводим IP нашего сервера, указываем путь до приватного ключа и жмем OK

Авторизуемся на сервер. Ваш логин по умолчанию скорее всего будет root

5. Установка ноды

5.1 Установка Geth (Executor Client)

Прописываем данные команды

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum

После этого пропишите geth в консоли, чтобы проверить все ли правильно вы установили. Должно выглядеть вот так:

Выходим, нажимая ctrl + C

5.2 Установка Prysm (Consensus Client)

Актуальные файлы проверяйте тут, возможно ссылка изменится!

Прописываем данные команды

curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
mv prysm.sh /usr/bin/prysm
prysm beacon-chain

Соглашаемся на установку, пишем accept

Если вы сделали все правильно, то ваш терминал будет выглядеть так

Выходим, нажимая ctrl + C

6. Создание сервисов

6.1 Сервис для geth

Теперь нам нужно настроить сервисы, чтобы наша нода работала бесперебойно и в фоновом режиме

Прописываем следующие команды:

Создаем файл сервиса geth:

nano /etc/systemd/system/geth.service

Вставляем в него такой конфиг:

[Unit]
Description=Geth Full Node
After=network-online.target
Wants=network-online.target

[Service]
WorkingDirectory=/root
User=root
ExecStart=/usr/bin/geth --syncmode snap --ws --http --http.vhosts '*' --http.corsdomain '*' --ws.origins '*' --cache 40960 --rpc.txfeecap 0 --rpc.gascap 0 --maxpeers 100
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Жмем ctrl + X и сохраняем файл

6.2 Сервис для Prysm

Создаем файл сервиса prysm:

nano /etc/systemd/system/prysm.service
[Unit]
Description=Prysm Consensus Client
After=network-online.target
Wants=network-online.target

[Service]
WorkingDirectory=/root
User=root
ExecStart=/usr/bin/prysm beacon-chain --execution-endpoint=$HOME/.ethereum/geth.ipc
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Жмем ctrl + X и сохраняем файл

6.3 Запуск/Мониторинг сервисов

Запускаем наши сервисы:

systemctl start geth
systemctl start prysm

Смотрим за нашими сервисами:

journalctl -f -u geth

Мы должны увидеть +- такое:

journalctl -f -u prysm

Мы должны увидеть +- такое:

7. Настройка nginx

Для того чтобы защитить нашу ноду от спама, не выводить ее в глобальную сеть мы воспользуемся nginx.
Он будет принимать весь трафик и перенаправлять его на нашу ноду

Прописываем следующие команды:

sudo apt update
sudo apt install nginx apache2-utils
sudo ufw allow 'Nginx Full'

После этого переходим через браузер на наш IP и мы должны увидеть такую страницу

Теперь настраиваем наш сервер.

Открываем конфиг:

nano /etc/nginx/sites-enabled/default

Удаляем оттуда все и вставляем следующее:

server {
   server_name example.com;
   auth_basic "Restricted Access";
   auth_basic_user_file /etc/nginx/htpasswd.users;
   location / {
       proxy_pass http://localhost:8545/;
       proxy_set_header Host $host;
   }
   location /ws {
       proxy_pass http://localhost:8546;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_cache_bypass $http_upgrade;
   }
}

Добавляем авторизацию:

sudo htpasswd -c /etc/nginx/htpasswd.users <username>
Вы можете добавить несколько пользователей.

Чтобы удалить пользователей, откройте файл и удалите нужные строки:

nano /etc/nginx/htpasswd.users

Теперь проверяем корректность нашего конфига:

sudo nginx -t

И перезапускаем наш nginx, чтобы применить изменения

sudo service nginx restart

Теперь, если обновить страницу в браузере увидим такое:

8. Немного слов в конце

1. Для мониторинга за нодой вводите команды:

journalctl -f -u prysm
journalctl -f -u geth
Данные от geth хранятся в папке .ethereum
Данные от prysm хранятся в папке .eth2

Чтобы остановить сервисы:

systemctl stop geth
systemctl stop prysm

2. Вы можете включить Remote Monitoring чтобы видеть сколько потребляет ваш сервер:

3. Для максимально быстрого взаимодействия с нодой лучше всего работать с IPC провайдером, который лежит в папке /root/.ethereum

Этот протокол работает только локально

4. Во время синхронизации вы можете видеть такую ошибку, что является нормой, т.к. скорость скачивания > максимальной скорости записи в БД

WARN [05-25|10:56:57.847] Database compacting, degraded performance database=/root/.ethereum/geth/chaindata

5. Вы можете добавить вашу ноду в Metamask/Ваши Софты

HTTP: http://username:password@ip:80

WS: ws://username:password@:ip80/ws

IPC: /root/.ethereum/geth.ipc

6. Вы можете добавить собственные API-эндпоинты себе в RPC

Пример увидел вот тут. Как идея можно добавить метод, для подписки на txData по пендингам, а не только на txHash


Если у вас остались вопросы, вы можете оставить их в чате/лс.

Поднять ноду — намного легче, чем кажется. И стоимость намного дешевле, нежели покупки на частных ресурсах


Материал подготовлен эксклюзивно для сообщества tern.crypto Plus