State Sync доступен на платном тарифе. Чтобы включить его для вашего аккаунта, свяжитесь с отделом продаж.
Режим синхронизации сети фиксируется при создании и остаётся неизменным на всю жизнь Virtual Environment. Его нельзя включить, выключить или переключить впоследствии — ни из панели, ни через API. Чтобы работать в другом режиме, создайте новую Virtual Environment.
Когда активировать State Sync
Эта опция полезна в нескольких сценариях:- Контракты и транзакции Virtual Environment могут обращаться к актуальным значениям оракулов, присутствующим в оригинальной цепочке.
- Доступ к пулам Uniswap из Virtual Environments при тестировании контрактов и построении proof-of-concept транзакций.
- Построение subgraph без устаревших данных.
- Тестирование поведения и производительности ваших dapp и протоколов в один-к-одному соответствии с реальными сетевыми условиями.
Как State Sync разрешает коллизии записи
State sync позволяет получать доступ к последним значениям слотов хранилища и балансам аккаунтов в mainnet по мере их обновления. При записи в конкретный слот хранилища в Virtual Environment синхронизация останавливается для этого слота, но остаётся активной для всех неизменённых. Подробнее о state sync:- Начальный номер блока совпадает с последним блоком оригинальной цепочки в момент создания.
- Каждый раз, когда вы отправляете транзакцию в Virtual Environment через
eth_sendTransactionилиeth_sendRawTransaction, майнится блок и номер блока увеличивается на 1 независимо от оригинальной сети. - До записи в переменную в Virtual Environment Virtual Environment отслеживает текущее значение из оригинальной сети.
- После записи в переменную контракта в Virtual Environment (например,
C.X=100), любое последующее чтение вернёт это значение (100). - Все неизменённые переменные состояния контракта (
C.Y) будут отражать значение из оригинальной сети. - Перед тем как в Virtual Environment майнится новый блок, последний виртуальный блок синхронизируется с последним блоком в родительской цепочке.
- Virtual Environment майнит блок после каждой модификации состояния (
sendTransaction,setBalanceи т. д.). - Номера блоков в Virtual Environment и оригинальной сети будут меняться с разной скоростью.

Какое состояние родительской сети отражает latest?
В Virtual Environment со State Sync состояние аккаунтов на latest (хранилище, балансы, nonce и код контрактов) отражает последний синхронизированный блок родительской сети плюс любые изменения, внесённые вашими собственными транзакциями Virtual Environment. Блоки синхронизируются непрерывно, поэтому в синхронизированном состоянии нет пропусков.
Высота блока Virtual Environment не является индикатором свежести состояния. Блоки майнятся только тогда, когда Virtual Environment обрабатывает модификацию состояния, поэтому её номер блока растёт независимо от родительской цепочки. Virtual Environment, чей головной блок сильно отстаёт от родительской сети, всё равно отдаёт последнее синхронизированное состояние родительской сети на latest. Чтобы судить об устаревании, сравнивайте с синхронизированным состоянием родительской сети, а не с номерами блоков.
Синхронизированное состояние включает код контрактов. Контракт, задеплоенный в родительской сети после создания Virtual Environment, возвращает байткод из eth_getCode(address, "latest") в Virtual Environment, даже если там не существует ни транзакции деплоя, ни логов событий, ни блоков для него. Чтения, привязанные к более раннему блоку, например eth_getCode(address, "<creation block>"), по-прежнему возвращают состояние на момент этого блока.
Синхронизируется только состояние. Транзакции, логи событий и блоки родительской сети никогда не появляются в Virtual Environment; см. Почему я не вижу транзакции Mainnet при State Sync?
Для лучшего понимания разберём пример:
Пример
Пример демонстрирует следующее:- Virtual Environment (Virtual Sepolia) обращается к последнему состоянию из оригинальной сети (Sepolia).
- После
writeв Virtual Environment изменённая переменная отсоединяется от её аналога в Sepolia.
Пример State Sync
0xd01dF6d2354c5A869265dC9a9561E3544ac53262. Тестовый скрипт взаимодействует и с Sepolia, и с Virtual Environment на основе
Sepolia — Virtual Sepolia.
Скрипт берёт случайную запись в отображении счётчика и затем:
- Устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читается одно и то же значение.
- Устанавливает значение в Virtual Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читаются разные значения.
- Снова устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что модификация в Sepolia невидима в её виртуальном аналоге.