> For the complete documentation index, see [llms.txt](https://surftest.gitbook.io/axelar-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://surftest.gitbook.io/axelar-wiki/russian/cosmos-sdk-state-sync.md).

# Cosmos SDK State Sync

Для чего нужен. Как создать. Как использовать.

Snapshot-ы делаются на базе [State-sync](https://medium.com/tendermint/tendermint-core-state-sync-for-developers-70a96ba3ee35) - это встроенная в Cosmos SDK функция, которая дает валидаторам возможность быстро засинхронизироваться, скачав снимок состояния сети с RPC ноды.&#x20;

Преимущество State Sync синхронизации заключается в том, что снимок очень мало весит, по сравнению с базой данных полностью синхронизированного блокчейна. Синхронизации с помощью **снимка состояния синхронизации** сокращает до нескольких минут время, необходимое валидатору или sentry nodes, чтобы засинхронизироваться с сетью. К тому же, этот метод экономит очень много места на диске. Синхронизируясь с сетью с помощью state-sync, узел избегает прохождения всех процедур обновления и может синхронизироваться только с самым последним обновлением бинарного файла.&#x20;

Для синхронизации в папке data должен быть только один файл private-validator-state.json. Снимки состояния не рекомендуется производить на ноде с валидатором, так как для snapshots требуется работа узла в публичной сети блокчейна, тогда как Валидатора это подвергает опасности DDoS атак. Дополнительный RPC с поддержкой snapshots - это самое приемлимое решение для промощи комьюнити.&#x20;

Минус такого варианта синхронизации, в том, что вместо полной истории транзакций, имеется снимок последнего состояния сети, которое сохранил RPC с включенным state-sync. Поэтому **для нод, запущенных для передачи данных сайтам и dapps**, в которых требуется информация о всех транзакциях, синхронизация с помощью Snapshot **не подходит**.&#x20;

Официальные ресурсы:

* Информация по [RPC нодам](https://docs.tendermint.com/master/tendermint-core/rpc.html)
* Теория по теме [Snapshot](https://docs.tendermint.com/master/spec/abci/apps.html#snapshot-connection)
* [State Sync](https://docs.tendermint.com/master/tendermint-core/state-sync/)
* Статья [State Sync Snapshotting](https://pkg.go.dev/github.com/cosmos/cosmos-sdk/snapshots) на сайте Go
* Еще одна статья от Erik Grinaker "[Tendermint Core State Sync](https://medium.com/tendermint/tendermint-core-state-sync-for-developers-70a96ba3ee35)"&#x20;
* Статья от Erik Grinaker, опубликованная в блоге Космоса [Cosmos SDK State Sync Guide](https://blog.cosmos.network/cosmos-sdk-state-sync-guide-99e4cf43be2f)

## Настройка параметров RPC для State-sync snapshots

{% hint style="success" %}
You have to configure in your app.toml snapshot-interval and snapshot-keep-recent.
{% endhint %}

### Настройка app.toml

Надо поменять определенные параметры, которые требуется для создания Snapshot. Их мы зададим в файле app.toml

#### Snapshot-interval and snapshot-keep-recent

```python
sudo nano ~/.axelar/config/app.toml
```

Для создания снепшотов, надо установить параметр `snapshot-interval` .  Это параметр, который задаёт интервал блоков, через который будут создаваться снимки.&#x20;

К примеру, установим его равным 1000. \
Спускаемся в конец файла в раздел <mark style="color:green;">State Sync Configuration</mark>. Выставляем значения ниже:

```python
# snapshot-interval specifies the block interval at which local state sync snapshots are
# taken (0 to disable). Must be a multiple of pruning-keep-every.
snapshot-interval = 1000

# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 2
```

Рекомендуется сохранять как минимум 2 последних снэпшота, чтобы снэпшот не удалялся нодой-донором, в то время, пока нода-приемник пытается скачать файл снэпшота.  Для этого ставим `snapshot-keep-recent=2`.

{% hint style="info" %}
`snapshot-interval` должен быть кратным параметру `pruning-keep-every` чтобы защитить снэпшот от того, что в момент записи снимка произойдет prunning и в snapshot запишется не верная высота блока.
{% endhint %}

#### Pruning

Если раньше вы уже настраивали pruning для экономии места на диске, то теперь надо изменить, подставив `pruning-keep-every = "1000"` ( так как snapshot-interval = 1000):

```python
pruning = "custom"
pruning-keep-recent = "100"
pruning-keep-every = "1000"
pruning-interval = "10"
```

### Настройка config.toml

{% hint style="success" %}
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 )
{% endhint %}

#### Порт и ip

```python
sudo nano ~/.axelar/config/config.toml
```

и поменяем параметр как написано ниже

```python
#######################################################################
###                 Advanced Configuration Options                  ###
#######################################################################

#######################################################
###       RPC Server Configuration Options          ###
#######################################################
[rpc]

# TCP or UNIX socket address for the RPC server to listen on
laddr = "tcp://0.0.0.0:26657"


```

Настройка  laddr = "tcp\://0.0.0.0:26657" позволяет слушать все адреса с порта 26657

### Настройка видимого RPC

{% hint style="success" %}
Also you have to open the p2p too . Clients needs it to check snapshots . add your rpcaddress:port on peers of clients
{% endhint %}

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

```python
sudo nano ~/.axelar/config/config.toml
```

выставляем параметр для разрешения нашей RPC работать в публичной сети

```python
###################################
###  P2P Configuration Options  ###
###################################
...

pex = true
```

Теперь наша RPC является открытой и с неё могут подгружаться другие ноды?

**Вопрос остается открытым!**

### Restart и ожидание

{% hint style="success" %}
restart yoru service and wait for your node create the snapshots in data/snapshots
{% endhint %}

Теперь перезапускаем ноду, чтобы изменения вступили в силу.

Ждем производства snapshots. По настройкой выше, снапшоты будут производиться один раз в каждые 1000 блоков.

Снепшоты будут сохраняться в директорию `~/.axelar/data/snapshots/`

### Применение

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

```python
SNAP_RPC="http://<your_RPC_Snapshot_ip>:26657"

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH
```

В строчке `BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \` надо подставить вместо 1000 число равное `snapshot-interval,` если этот параметр на RPC выставлен по другому.
