Знакомая история: скрипт, который ловит on-chain события, отлично работает на ноутбуке — пока вы его не закроете. Публичные RPC-эндпоинты упираются в рейт-лимиты, а сам скрипт на ноутбуке перестаёт работать, как только машина уходит в сон.
Chainstack — это управляемая платформа блокчейн-инфраструктуры, которая дает вам приватные RPC-эндпоинты на 70+ сетях — без необходимости держать собственную ноду. Вместо синхронизации полной ноды Ethereum (а это 2+ ТБ на NVMe и недели синка) вы получаете выделенные HTTPS- и WSS-адреса, которые подключаются напрямую к инфраструктуре Chainstack. Ваше приложение общается с Chainstack, а Chainstack — с сетью.
В этом гайде мы разберем реальную установку на тарифе Start VPS от is*hosting: Python-бот подписывается на mempool Ethereum через WebSocket-эндпоинт Chainstack и работает непрерывно как systemd-сервис, отлавливая крупные переводы ETH круглосуточно.
Прежде чем начинать, убедитесь, что у вас есть все необходимое:
Скрипт монитора в простое использует меньше 50 МБ оперативной памяти. Любой тариф от Start и выше закрывает это требование с большим запасом. Если вы планируете держать на том же VPS другие сервисы рядом с ботом, на тарифе Medium будет больше свободных ресурсов.
|
Сценарий |
RAM |
CPU |
Тариф is*hosting при годовой оплате |
|
Только бот-монитор |
2 ГБ |
2 ядра |
Start от $10,19 в месяц |
|
Бот + другие сервисы |
4 ГБ |
3 ядра |
Medium от $21,24 в месяц |
Выделенный IPv4, еженедельные бэкапы и запаса от тарифа Start хватает, чтобы крутить бота 24/7 в 40+ локациях.
Все тарифы VPS is*hosting по умолчанию включают выделенный IPv4-адрес и бесплатные еженедельные бэкапы.
Залогиньтесь на console.chainstack.com. На дашборде Projects нажмите + Add project, введите имя проекта и нажмите Create.
Внутри проекта нажмите кнопку Ethereum в блоке «Join network». Chainstack развернет Global Node и сразу перекинет вас на страницу с деталями ноды. Статус ноды сменится на Running за несколько секунд.
Прокрутите страницу ноды вниз до секции Access and credentials. Вам нужны два значения:
Оба идут по шаблону https://ethereum-mainnet.core.chainstack.com/<your-api-key> и wss://ethereum-mainnet.core.chainstack.com/<your-api-key>. Скопируйте оба.
Обратите внимание: эндпоинты лежат в самом низу страницы, так что придется прокрутить до конца.
При оформлении заказа на is*hosting выберите Ubuntu, затем v. 24 для Ubuntu 24.04. После завершения провижининга подключитесь по SSH как root.
apt update && apt install -y python3-pip python3-venv
Команда ставит 63 пакета и занимает примерно 272 МБ на диске. Успех подтверждает вывод:
Setting up python3-venv (3.12.3-0ubuntu2.1) ...
Setting up python3-pip (24.0+dfsg-1ubuntu1.3) ...
Создайте каталог проекта и виртуальное окружение:
mkdir -p /root/eth-monitor
cd /root/eth-monitor
python3 -m venv venv
source venv/bin/activate
pip install web3
pip install web3 подтягивает 38 пакетов, включая web3-7.16.0 и websockets-15.0.1. Финальная строка подтверждает установку:
Successfully installed ... web3-7.16.0 websockets-15.0.1 ...
Замените два плейсхолдера эндпоинтов на свои реальные URL из Chainstack:
cat > /root/eth-monitor/monitor.py << 'EOF'
import asyncio
from web3 import AsyncWeb3, WebSocketProvider
WSS_ENDPOINT = "wss://ethereum-mainnet.core.chainstack.com/<your-api-key>"
HTTPS_ENDPOINT = "https://ethereum-mainnet.core.chainstack.com/<your-api-key>"
THRESHOLD_ETH = 100
SAMPLE_EVERY = 20 # проверяем 1 из 20 ожидающих tx, чтобы не выйти за RPS бесплатного плана
counter = 0
async def handle_transaction(w3, tx_hash):
try:
tx = await w3.eth.get_transaction(tx_hash)
if tx and tx['value'] >= w3.to_wei(THRESHOLD_ETH, 'ether'):
eth_value = w3.from_wei(tx['value'], 'ether')
print(f"[ALERT] Large transfer: {eth_value:.2f} ETH | tx: {tx_hash.hex()} | from: {tx['from']} -> to: {tx['to']}", flush=True)
except Exception as e:
print(f"[ERROR] {e}", flush=True)
async def main():
global counter
print(f"[INFO] Connecting to Ethereum via Chainstack...", flush=True)
async with AsyncWeb3(WebSocketProvider(WSS_ENDPOINT)) as w3:
connected = await w3.is_connected()
print(f"[INFO] Connected: {connected}", flush=True)
print(f"[INFO] Watching for transfers >= {THRESHOLD_ETH} ETH (sampling 1 in {SAMPLE_EVERY} pending txs)...", flush=True)
await w3.eth.subscribe("newPendingTransactions")
print(f"[INFO] Subscribed to pending transactions", flush=True)
async for payload in w3.socket.process_subscriptions():
counter += 1
if counter % SAMPLE_EVERY != 0:
continue
tx_hash = payload['result']
asyncio.create_task(handle_transaction(w3, tx_hash))
if __name__ == "__main__":
asyncio.run(main())
EOF
SAMPLE_EVERY = 20 — ключевой параметр для бесплатного плана. При примерно 200-300 ожидающих транзакциях в секунду на mainnet сэмплирование одной из двадцати держит частоту запросов в районе 10-15 RPS — заметно ниже потолка Developer в 25 RPS. Чтобы поднять порог алерта, увеличивайте THRESHOLD_ETH. На платном плане с более высокими лимитами можно снижать SAMPLE_EVERY.
Монитор делает только исходящие подключения к Chainstack, поэтому открывать входящие порты не нужно. Дефолтная политика UFW «разрешить исходящий трафик» это покрывает. Убедитесь, что доступ по SSH защищен, а файрвол активен:
ufw allow OpenSSH
ufw --force enable
ufw status verbose
Вывод подтверждает:
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
Юнит запускает монитор от root, перезапускает его при сбое с задержкой в 10 секунд и отправляет весь вывод в системный журнал:
cat > /etc/systemd/system/eth-monitor.service << 'EOF'
[Unit]
Description=Ethereum Large Transfer Monitor
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/eth-monitor
ExecStart=/root/eth-monitor/venv/bin/python /root/eth-monitor/monitor.py
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable eth-monitor
systemctl start eth-monitor
Подождите пару секунд и проверьте статус:
systemctl status eth-monitor --no-pager
Вывод подтверждает, что сервис запущен:
● eth-monitor.service - Ethereum Large Transfer Monitor
Active: active (running) since Sun 2026-06-28 11:55:47 UTC; 8s ago
Main PID: 52171 (python)
Memory: 42.9M (peak: 43.2M)
Посмотрите стартовую последовательность в журнале:
journalctl -u eth-monitor -n 10 --no-pager
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Connecting to Ethereum via Chainstack...
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Connected: True
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Watching for transfers >= 100 ETH (sampling 1 in 20 pending txs)...
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Subscribed to pending transactions
Jun 28 11:55:50 a240228623.local python[52171]: [ERROR] Transaction with hash: '0x105799...' not found.
Ошибки not found — ожидаемые и безвредные. Ожидающая транзакция может выйти из mempool раньше, чем сработает запрос: ее заменили версией с более высокой комиссией, отменил отправитель или ее вытеснило под нагрузкой. Монитор просто пропускает такую и продолжает работу. Строку [ALERT] дают только те транзакции, что резолвятся со значением выше вашего порога.
Сервис стартует автоматически при перезагрузке и перезапускается в течение 10 секунд, если скрипт неожиданно завершится.
Как только появляется ожидающая транзакция, попадающая под ваш порог, журнал логирует ее сразу:
[ALERT] Large transfer: 142.50 ETH | tx: 0xabc123... | from: 0xSender -> to: 0xReceiver
Следить за алертами в реальном времени можно так:
journalctl -u eth-monitor -f
Откройте /root/eth-monitor/monitor.py и отредактируйте две константы в самом верху:
THRESHOLD_ETH = 100 # минимальное значение ETH для срабатывания алерта
SAMPLE_EVERY = 20 # сэмплируем 1 из N ожидающих транзакций
После правок перезапустите сервис:
systemctl restart eth-monitor
На плане Chainstack Growth (250 RPS) можно поставить SAMPLE_EVERY = 1 и проверять каждую ожидающую транзакцию. На бесплатном Developer держите значение 20 или выше.
Chainstack поддерживает 70+ сетей. Чтобы мониторить переводы в BNB Smart Chain, разверните ноду BNB Smart Chain в своем проекте Chainstack, замените значения WSS и HTTPS эндпоинтов в monitor.py и перезапустите сервис.
Структура скрипта не зависит от конкретной сети: newPendingTransactions и eth_getTransaction работают одинаково во всех EVM-совместимых сетях.
Перед обновлением web3.py сделайте резервную копию списка пакетов виртуального окружения:
pip freeze > /root/eth-monitor/requirements-backup.txt
В тарифы is*hosting уже включены бесплатные еженедельные бэкапы на уровне всего сервера. Но точечный pip-бэкап восстанавливается гораздо быстрее, чем полный снапшот VPS.
Если обновление пакета сломает скрипт, вы воссоздадите точное рабочее окружение командой pip install -r requirements-backup.txt за пару минут — вместо того чтобы ждать восстановления снапшота.
Само обновление web3.py:
cd /root/eth-monitor
source venv/bin/activate
pip install --upgrade web3
systemctl restart eth-monitor
journalctl -u eth-monitor -n 10 --no-pager
Прежде чем закрывать сессию, убедитесь, что после рестарта в журнале появилась строка [INFO] Connected: True.
Бесплатные еженедельные бэкапы VPS на всех тарифах — страховочный пол под вашим списком pip-пакетов, чтобы сломавшееся обновление web3.py не выводило монитор из строя надолго.
У нас установка заняла около 4 минут на свежем инстансе Ubuntu 24.04.4 LTS на тарифе Start VPS от is*hosting: apt подтянул 63 пакета примерно за 2 минуты, pip install web3 добавил еще 38 пакетов меньше чем за минуту, а systemd поднял сервис менее чем за 5 секунд.
В простое монитор использует 42.9 МБ оперативной памяти против 2 ГБ на тарифе Start, так что остальные ресурсы сервера остаются свободными под другие задачи. Диск после полной установки занят на 8.2 ГБ из 30 ГБ NVMe.
Сервис подключается к Ethereum Global Node от Chainstack по WSS, подписывается на живой поток ожидающих транзакций и сэмплирует один хеш из двадцати, чтобы держаться в пределах лимита в 25 RPS бесплатного плана. Каждый подходящий перевод выше 100 ETH записывается в системный журнал, а сервис продолжает работать после перезагрузок и сбоев без вашего участия.
Дальше скрипт можно расширять: слать алерты в Telegram или Discord через их вебхуки, снизить THRESHOLD_ETH, чтобы ловить более мелкие переводы, или подставить эндпоинт BNB Smart Chain либо Base из своего проекта Chainstack. Тариф Start за $10,19 в месяц (при оплате за год) на is*hosting закрывает сервер, а бесплатный тариф Chainstack — доступ к ноде.
Что касается следующих шагов на стороне сервера: руководство по настройке Linux VPS разбирает харденинг SSH и первичную конфигурацию, а гайд по Uptime Kuma показывает, как добавить мониторинг аптайма — чтобы вы сразу узнавали, если сам VPS уйдет в офлайн.
Бесплатный план Developer включает один эндпоинт Global Node, 3 млн request units в месяц и лимит в 25 запросов в секунду. Этого хватает скриптам, которые выборочно сэмплируют mempool, а не запрашивают каждый хеш транзакции подряд.
Для нагрузок потяжелее — ботов, которым нужна каждая ожидающая транзакция, индексаторов, продакшн DeFi-бэкендов — есть план Growth за $49 в месяц: он поднимает лимит до 250 RPS и 20 млн request units.
Mempool Ethereum выдает несколько сотен хешей ожидающих (pending) транзакций в секунду. На 25 RPS бесплатного плана попытка вытащить каждую из них мгновенно упирается в ошибку -32005. Решение простое — сэмплирование, то есть проверять одну транзакцию из каждых двадцати. Так частота запросов держится заметно ниже лимита, но при этом вы все равно ловите большинство крупных переводов в пределах нескольких секунд после их появления в сети.
Собственная полная нода Ethereum на выделенном железе обходится в $80-150 в месяц только за сервер, требует 2-4 ТБ быстрого NVMe и постоянного обслуживания — цепочка растет примерно на 1 ТБ в год.
Бесплатный тариф Chainstack не стоит ничего при низкочастотных сценариях. Даже Growth за $49 в месяц дешевле самого бюджетного выделенного сервера, который дотягивает до требований Ethereum по объему хранилища.
В чем подвох собственной ноды? Ее выбирают ради двух вещей: суверенитета над данными и полного отсутствия рейт-лимитов.
Если приложение делает миллионы RPC-вызовов в день или требует архивные данные вплоть до генезиса, self-hosting в конце концов выигрывает по деньгам. Но для мониторинговых скриптов, ботов и разработки практичнее другая связка: управляемый эндпоинт плюс VPS с вашей логикой. Chainstack держит ноду, is*hosting держит always-on-сервер.