Перейти к основному содержанию
State Sync поддерживает ваше окружение в реальном времени синхронизированным с состоянием родительской сети. Это помогает гарантировать, что вы можете обращаться ко всем блокам, произведённым после создания Virtual Environment.
State Sync доступен на платном тарифе. Чтобы включить его для вашего аккаунта, свяжитесь с отделом продаж.
Вы включаете State Sync при создании Virtual Environment, выбирая режим синхронизации сети State only sync.
Режим синхронизации сети фиксируется при создании и остаётся неизменным на всю жизнь Virtual Environment. Его нельзя включить, выключить или переключить впоследствии — ни из панели, ни через API. Чтобы работать в другом режиме, создайте новую Virtual Environment.
Нужно поблочное соответствие родительской сети и видимый mempool? См. Network Mirror Mode — это более сильная гарантия, чем State Sync, с управлением временем и линзой отклонения состояния для сравнения вашей Virtual Environment с mainnet.
Поведение mainnet-контрактов, кэширующих block.number, непредсказуемо при выполнении транзакций Virtual Environment, поскольку номер блока растёт с разной скоростью в mainnet и 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_sendRawTransaction и eth_sendRawTransaction, майнится блок и номер блока увеличивается на 1 независимо от оригинальной сети.
  • До записи в переменную в Virtual Environment Virtual Environment отслеживает текущее значение из оригинальной сети.
  • После записи в переменную контракта в Virtual Environment (например, C.X=100), любое последующее чтение вернёт это значение (100).
  • Все неизменённые переменные состояния контракта (C.Y) будут отражать значение из оригинальной сети.
  • Перед тем как в Virtual Environment майнится новый блок, последний виртуальный блок синхронизируется с последним блоком в родительской цепочке.
  • Virtual Environment майнит блок после каждой модификации состояния (sendTransaction, setBalance и т. д.).
  • Номера блоков в Virtual Environment и оригинальной сети будут меняться с разной скоростью.
Для лучшего понимания разберём пример:

Пример

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

Пример State Sync

Пример использует модифицированный Counter-контракт, содержащий отображение счётчиков. Он задеплоен в Sepolia по адресу 0xd01dF6d2354c5A869265dC9a9561E3544ac53262. Тестовый скрипт взаимодействует и с Sepolia, и с Virtual Environment на основе Sepolia — Virtual Sepolia. Скрипт берёт случайную запись в отображении счётчика и затем:
  • Устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читается одно и то же значение.
  • Устанавливает значение в Virtual Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что читаются разные значения.
  • Снова устанавливает значение в Sepolia, затем читает значения и в Sepolia, и в Virtual Sepolia, показывая, что модификация в Sepolia невидима в её виртуальном аналоге.
1
Создайте Virtual Environment
2
Создайте новую Virtual Environment на основе Sepolia, используя 735711155111 в качестве пользовательского Chain ID.
3
Настройка окружения
4
Скопируйте шаблон .example.env и замените следующее:
5
  • TENDERLY_VIRTUAL_TESTNET_CHAIN_ID — chain ID Virtual Environment. Используйте 735711155111
  • TENDERLY_VIRTUAL_TESTNET_RPC_URL_SEPOLIA — RPC URL Virtual Environment
  • PRIVATE_KEY — для подписи тестовых транзакций
  • 6
    cp .example.env .env
    vi .env # modify environment variables
    
    7
    cd virtual-environments-state-sync
    source .env
    yarn install
    npx ts-node src/index.ts
    
    8
    Результаты
    9
    Ключевые моменты, которые следует заметить о write-операциях:
    10
  • После записи в Sepolia (1) и Sepolia, и virtualSepolia читают значение 1 — последнее состояние оригинальной сети.
  • После записи в Virtual Sepolia (10) чтение из Sepolia возвращает ранее установленное значение (1), а чтение из virtualSepolia — недавно установленное значение (10).
  • После повторной записи в Sepolia (100) чтение из Sepolia возвращает последнее установленное значение (100), а чтение из virtualSepolia — ранее установленное значение (10).
  • 11
    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