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. Аренда сервера и системные требования
Сервер я брал на Hetzner, т.к. там самые хорошие цены. Брал с запасом, т.к. еще не знал сколько конкретно потребляет нода
Также из хороших хостеров - Vultr, AWS
4. Подключение к серверу
Для подключению к серверу я использую MobaXterm
После того как установили, вам нужно создать SSH ключи и сохранить их
Жмем кнопку 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
в консоли, чтобы проверить все ли правильно вы установили. Должно выглядеть вот так:
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
Если вы сделали все правильно, то ваш терминал будет выглядеть так
6. Создание сервисов
6.1 Сервис для 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
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
6. Вы можете добавить собственные API-эндпоинты себе в RPC
Пример увидел вот тут. Как идея можно добавить метод, для подписки на txData по пендингам, а не только на txHash
Если у вас остались вопросы, вы можете оставить их в чате/лс.
Поднять ноду — намного легче, чем кажется. И стоимость намного дешевле, нежели покупки на частных ресурсах
Материал подготовлен эксклюзивно для сообщества tern.crypto Plus