📸Cosmos SDK State Sync
Для чего нужен. Как создать. Как использовать.
Snapshot-ы делаются на базе State-sync - это встроенная в Cosmos SDK функция, которая дает валидаторам возможность быстро засинхронизироваться, скачав снимок состояния сети с RPC ноды.
Преимущество State Sync синхронизации заключается в том, что снимок очень мало весит, по сравнению с базой данных полностью синхронизированного блокчейна. Синхронизации с помощью снимка состояния синхронизации сокращает до нескольких минут время, необходимое валидатору или sentry nodes, чтобы засинхронизироваться с сетью. К тому же, этот метод экономит очень много места на диске. Синхронизируясь с сетью с помощью state-sync, узел избегает прохождения всех процедур обновления и может синхронизироваться только с самым последним обновлением бинарного файла.
Для синхронизации в папке data должен быть только один файл private-validator-state.json. Снимки состояния не рекомендуется производить на ноде с валидатором, так как для snapshots требуется работа узла в публичной сети блокчейна, тогда как Валидатора это подвергает опасности DDoS атак. Дополнительный RPC с поддержкой snapshots - это самое приемлимое решение для промощи комьюнити.
Минус такого варианта синхронизации, в том, что вместо полной истории транзакций, имеется снимок последнего состояния сети, которое сохранил RPC с включенным state-sync. Поэтому для нод, запущенных для передачи данных сайтам и dapps, в которых требуется информация о всех транзакциях, синхронизация с помощью Snapshot не подходит.
Официальные ресурсы:
Информация по RPC нодам
Теория по теме Snapshot
Статья State Sync Snapshotting на сайте Go
Еще одна статья от Erik Grinaker "Tendermint Core State Sync"
Статья от Erik Grinaker, опубликованная в блоге Космоса Cosmos SDK State Sync Guide
Настройка параметров RPC для State-sync snapshots
You have to configure in your app.toml snapshot-interval and snapshot-keep-recent.
Настройка app.toml
Надо поменять определенные параметры, которые требуется для создания Snapshot. Их мы зададим в файле app.toml
Snapshot-interval and snapshot-keep-recent
Для создания снепшотов, надо установить параметр snapshot-interval . Это параметр, который задаёт интервал блоков, через который будут создаваться снимки.
К примеру, установим его равным 1000. Спускаемся в конец файла в раздел State Sync Configuration. Выставляем значения ниже:
Рекомендуется сохранять как минимум 2 последних снэпшота, чтобы снэпшот не удалялся нодой-донором, в то время, пока нода-приемник пытается скачать файл снэпшота. Для этого ставим snapshot-keep-recent=2.
snapshot-interval должен быть кратным параметру pruning-keep-every чтобы защитить снэпшот от того, что в момент записи снимка произойдет prunning и в snapshot запишется не верная высота блока.
Pruning
Если раньше вы уже настраивали pruning для экономии места на диске, то теперь надо изменить, подставив pruning-keep-every = "1000" ( так как snapshot-interval = 1000):
Настройка config.toml
You have to open your rpc port and configure it in config.toml to listen the desire address ( 0.0.0.0 if you want to listen to all )
Порт и ip
и поменяем параметр как написано ниже
Настройка laddr = "tcp://0.0.0.0:26657" позволяет слушать все адреса с порта 26657
Настройка видимого RPC
Also you have to open the p2p too . Clients needs it to check snapshots . add your rpcaddress:port on peers of clients
Открываем конфиг:
выставляем параметр для разрешения нашей RPC работать в публичной сети
Теперь наша RPC является открытой и с неё могут подгружаться другие ноды?
Вопрос остается открытым!
Restart и ожидание
restart yoru service and wait for your node create the snapshots in data/snapshots
Теперь перезапускаем ноду, чтобы изменения вступили в силу.
Ждем производства snapshots. По настройкой выше, снапшоты будут производиться один раз в каждые 1000 блоков.
Снепшоты будут сохраняться в директорию ~/.axelar/data/snapshots/
Применение
Теперь, когда снапшот произведен на другой ноде проверим результат:
В строчке BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \ надо подставить вместо 1000 число равное snapshot-interval, если этот параметр на RPC выставлен по другому.
Last updated