> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# State Sync

> Держите Virtual Environment в реальном времени синхронизированной с её родительской сетью с помощью State Sync, чтобы читать живые цены оракулов, данные пулов и балансы.

State Sync поддерживает ваше окружение в реальном времени синхронизированным с состоянием родительской сети. Это помогает гарантировать, что вы можете обращаться ко всем блокам, произведённым после создания Virtual Environment.

<Note>
  State Sync доступен на платном тарифе. Чтобы включить его для вашего аккаунта, [свяжитесь с отделом продаж](https://tenderly.co/contact-us).
</Note>

Вы включаете State Sync при создании Virtual Environment, выбирая режим синхронизации сети **State only sync**.

<Note>
  Режим синхронизации сети фиксируется при создании и остаётся неизменным на всю жизнь Virtual Environment. Его нельзя включить, выключить или переключить впоследствии — ни из панели, ни через API. Чтобы работать в другом режиме, создайте новую Virtual Environment.
</Note>

<Tip>
  Нужно поблочное соответствие родительской сети и видимый mempool? См. [Network Mirror Mode](/virtual-environments/network-mirror-mode) — это более сильная гарантия, чем State Sync, с управлением временем и линзой отклонения состояния для сравнения вашей Virtual Environment с mainnet.
</Tip>

<Warning>
  Поведение mainnet-контрактов, кэширующих `block.number`, непредсказуемо при выполнении транзакций Virtual Environment, поскольку [номер блока растёт с разной скоростью](#how-state-sync-works) в mainnet и Virtual Environment.
</Warning>

## Когда активировать State Sync

Эта опция полезна в нескольких сценариях:

* Контракты и транзакции Virtual Environment могут **обращаться к актуальным значениям оракулов**, присутствующим в оригинальной цепочке.
* Доступ к пулам Uniswap из Virtual Environments при тестировании контрактов и построении proof-of-concept транзакций.
* Построение subgraph без устаревших данных.
* Тестирование поведения и производительности ваших dapp и протоколов в один-к-одному соответствии с реальными сетевыми условиями.

## Как State Sync разрешает коллизии записи

State sync позволяет получать доступ к последним значениям слотов хранилища и балансам аккаунтов в mainnet по мере их обновления. При записи в конкретный слот хранилища в Virtual Environment синхронизация останавливается для этого слота, но остаётся активной для всех неизменённых.

Подробнее о state sync:

* Начальный номер блока совпадает с последним блоком оригинальной цепочки в момент создания.
* Каждый раз, когда вы отправляете транзакцию в Virtual Environment через `eth_sendRawTransaction` и `eth_sendRawTransaction`, майнится блок и номер блока увеличивается на 1 независимо от оригинальной сети.
* *До записи в переменную* в Virtual Environment Virtual Environment отслеживает текущее значение из оригинальной сети.
* *После записи в переменную* контракта в Virtual Environment (например, `C.X=100`), любое последующее чтение вернёт это значение (`100`).
* Все *неизменённые переменные состояния* контракта (`C.Y`) будут отражать значение из оригинальной сети.
* Перед тем как в Virtual Environment майнится новый блок, последний виртуальный блок синхронизируется с последним блоком в родительской цепочке.
* Virtual Environment *майнит блок после каждой модификации состояния* (`sendTransaction`, `setBalance` и т. д.).
* Номера блоков в Virtual Environment и оригинальной сети будут *меняться с разной скоростью*.

<img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/testnets/state-sync.png?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=1be8389e63eee964e42290d9f28dafb5" alt="" width="1920" height="1312" data-path="images/testnets/state-sync.png" />

Для лучшего понимания разберём пример:

## Пример

Пример демонстрирует следующее:

* Virtual Environment (Virtual Sepolia) обращается к последнему состоянию из оригинальной сети (Sepolia).
* После **`write`** в Virtual Environment изменённая переменная отсоединяется от её аналога в Sepolia.

Пример можно найти на GitHub:

<Card title="Пример State Sync" href="" />

Пример использует модифицированный [Counter-контракт](https://github.com/Tenderly/tenderly-examples/tree/master/virtual-environments-state-sync/contracts/src/Counter.sol), содержащий отображение счётчиков. Он задеплоен в Sepolia по адресу `0xd01dF6d2354c5A869265dC9a9561E3544ac53262`. [Тестовый скрипт](https://github.com/Tenderly/tenderly-examples/tree/master/virtual-environments-state-sync/src/index.ts) взаимодействует и с Sepolia, и с Virtual Environment на основе
Sepolia — `Virtual Sepolia`.

Скрипт берёт случайную запись в отображении счётчика и затем:

* Устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читается одно и то же значение.
* Устанавливает значение в Virtual Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читаются разные значения.
* Снова устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что модификация в Sepolia невидима в её виртуальном аналоге.

<Steps>
  ### Создайте Virtual Environment

  Создайте [новую Virtual Environment](/virtual-environments/quickstart) на основе Sepolia, используя `735711155111` в качестве
  пользовательского Chain ID.

  ### Настройка окружения

  Скопируйте шаблон `.example.env` и замените следующее:

  * **`TENDERLY_VIRTUAL_TESTNET_CHAIN_ID`** — chain ID Virtual Environment. Используйте `735711155111`
  * **`TENDERLY_VIRTUAL_TESTNET_RPC_URL_SEPOLIA`** — RPC URL Virtual Environment
  * **`PRIVATE_KEY`** — для подписи тестовых транзакций

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  cp .example.env .env
  vi .env # modify environment variables
  ```

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  cd virtual-environments-state-sync
  source .env
  yarn install
  npx ts-node src/index.ts
  ```

  ### Результаты

  Ключевые моменты, которые следует заметить о **`write`**-операциях:

  1. После записи в Sepolia (`1`) и Sepolia, и virtualSepolia читают значение `1` — последнее состояние оригинальной
     сети.
  2. После записи в Virtual Sepolia (`10`) чтение из Sepolia возвращает ранее установленное значение (`1`), а чтение из
     virtualSepolia — недавно установленное значение (`10`).
  3. После повторной записи в Sepolia (`100`) чтение из Sepolia возвращает последнее установленное значение (`100`), а чтение из
     virtualSepolia — ранее установленное значение (`10`).

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  Playing with Counter(0xd01dF6d2354c5A869265dC9a9561E3544ac53262).numbers[3788720642447205]
  State:
    sepolia: 0
    virtualSepolia: 0

  ================================================================================================
  Write: Counter(0xd01dF6d2354c5A869265dC9a9561E3544ac53262)@Sepolia.numbers[3788720642447205] = 1
  Tx hash: 0xe57c5da70c68d55f86957f7a2fc2644670b032fe5f972b9e9ccc2774cd2ba352
  State:
    sepolia: 1
    virtualSepolia: 1

  ================================================================================================
  Write: Counter(0xd01dF6d2354c5A869265dC9a9561E3544ac53262)@Virtual Sepolia.numbers[3788720642447205] = 10
  Tx hash: 0x56099d89c1d6fd001a1e9a0cecca13e13c04013b473acb6a48cd61a4b988696c
  State:
    sepolia: 1
    virtualSepolia: 10

  ================================================================================================
  Write: Counter(0xd01dF6d2354c5A869265dC9a9561E3544ac53262)@Sepolia.numbers[3788720642447205] = 100
  Tx hash: 0xc3c37e912bfa4fca9b980339fa2c95dbef75d6c605f0df831ca985b0ef3b61ec
  State:
    sepolia: 100
    virtualSepolia: 10
  ```
</Steps>
