> ## 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.

# FAQ: Виртуальные окружения

> Ответы на распространённые вопросы о создании, форкинге и управлении виртуальными окружениями, включая chain ID, временные метки, State Sync и командную работу.

<div className="flex flex-col gap-4 mt-8">
  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="do-i-need-a-paid-plan-to-use-virtual-environments" className="text-xl font-semibold">Нужен ли платный тарифный план для использования виртуальных окружений?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Да. Виртуальные окружения доступны на платном тарифе. Чтобы включить их для вашей учётной записи, [свяжитесь с нашим отделом продаж](https://tenderly.co/contact-us), чтобы запланировать звонок и обсудить обновление тарифа.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-can-i-create-virtual-environments" className="text-xl font-semibold">Как создать виртуальные окружения?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Вы можете создать виртуальное окружение двумя способами:

        * Из [UI Dashboard](/virtual-environments/overview#quickstart)
        * Используя [REST API виртуальных окружений](/api-reference#/operations/createVnet).
        * Через [форк существующего виртуального окружения](/virtual-environments/develop/fork-testnet).
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="why-should-i-set-a-unique-chain-id" className="text-xl font-semibold">Почему следует задавать уникальный chain ID?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Устанавливайте пользовательский chain ID, отличный от chain ID родительской сети.

        Рекомендация: добавьте префикс **`7357`** (*test*) к оригинальному Chain ID сети. Например, если
        вы создаёте виртуальное окружение, форкая Ethereum Mainnet (chain ID: 1), установите chain ID вашего виртуального
        окружения примерно в `73571`.

        Это рекомендуется по нескольким причинам:

        * Поскольку сеть виртуального окружения независима от сети Mainnet, у неё должен быть независимый и уникальный chain ID.
        * Использование уникального chain ID — **мера безопасности**, которая защищает ваш dapp от
          [**атак повторного воспроизведения транзакций**](https://quantstamp.com/blog/preventing-replay-attacks-post-ethereum-merge).
        * Кошельки, такие как MetaMask, распознают, что **оригинальный chain ID уже используется**, и могут
          ошибочно принять ваше виртуальное окружение за родительскую сеть, если оно не использует уникальный chain ID.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-virtual-environments-resolve-timestamps" className="text-xl font-semibold">Как виртуальные окружения разрешают временные метки?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Когда транзакция или `eth_call` обращается к **`block.timestamp`** внутри контракта, значение будет зависеть от того, направлена ли транзакция к блоку `latest` или `pending`.

        * Для блока `pending` значение — это текущее время, скорректированное на смещение корректировки: `block.timestamp == time.now() + adjustment_offset`.
        * Для блока `latest` значение — это временная метка последнего блока: `block.timestamp == latest_block.timestamp`

        `adjustment_offset` берётся из методов корректировки времени [`evm_setNextBlockTimestamp`](/virtual-environments/admin-rpc/#evm_setnextblocktimestamp) и [`evm_increaseTime`](/virtual-environments/admin-rpc/#evm_increasetime).

        [Узнать больше →](/virtual-environments/develop/timestamps)
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-mining-works" className="text-xl font-semibold">Как работает майнинг?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Каждый раз, когда вы отправляете транзакцию в виртуальное окружение через `eth_sendRawTransaction` и `eth_sendRawTransaction`, майнится блок и номер блока увеличивается на 1. **Начальный номер блока** берётся из последнего блока оригинальной сети на момент создания.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-does-state-sync-work" className="text-xl font-semibold">Как работает State Sync?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        [State Sync](/virtual-environments/state-sync) позволяет виртуальному окружению отслеживать живое состояние оригинальной
        сети.

        * Пока транзакция виртуального окружения не изменит слот хранилища, виртуальное окружение отслеживает текущее значение из
          оригинальной сети.
        * После того как транзакция виртуального окружения изменит слот `X` в контракте `C`, любое последующее чтение вернёт это
          значение. Неизменённое `C.Y` будет отражать значение из оригинальной сети.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="why-can-t-i-see-mainnet-transactions-with-state-sy" className="text-xl font-semibold">Почему я не вижу транзакции Mainnet при State Sync?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        State Sync отслеживает состояние, но не синхронизирует и не отображает из оригинальной сети:

        * транзакции
        * логи событий
        * блоки
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="are-there-issues-with-state-sync" className="text-xl font-semibold">Есть ли проблемы с State Sync?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Поведение контрактов Mainnet, кэширующих `block.number`, непредсказуемо при выполнении транзакций виртуального
        окружения, поскольку номер блока [растёт с разной
        скоростью](/virtual-environments/state-sync#how-state-sync-works) в Mainnet и виртуальном окружении.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-can-i-speed-up-passage-of-time" className="text-xl font-semibold">Как ускорить течение времени?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Чтобы обеспечить более быстрое тестирование кода, зависящего от текущей временной метки (например, расчёты доходности и вознаграждений), вы можете использовать [`tenderly_increaseTime`](/virtual-environments/admin-rpc#evm_increasetime).
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="do-testnets-support-websockets" className="text-xl font-semibold">Поддерживают ли виртуальные окружения WebSockets?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Да, виртуальные окружения поддерживают WebSockets. Просто используйте `wss://` вместо `https://` в URL.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="when-would-i-fork-a-testnet" className="text-xl font-semibold">Когда стоит форкать виртуальное окружение?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Вы можете [форкнуть существующее виртуальное окружение](/virtual-environments/develop/fork-testnet) после деплоя контрактов и
        настройки состояния виртуального окружения посредством [пополнения аккаунтов](/virtual-environments/unlimited-faucet),
        [отправки транзакций](/virtual-environments/interact/send-transactions) или использования [Admin RPC](/virtual-environments/admin-rpc).

        * **Нетронутая стартовая точка**: используя форкнутое виртуальное окружение для разработки или экспериментов, вы сохраняете стартовую точку
          чистой от изменений.
        * **Рабочая копия на каждого члена команды**: после [подготовки смарт-контрактов](/virtual-environments/ci-cd/stage-contracts)
          члены вашей команды могут работать со своей собственной рабочей копией сети.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-testnets-help-team-collaboration" className="text-xl font-semibold">Как виртуальные окружения помогают командной работе?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        При использовании виртуальных окружений для деплоя смарт-контрактов участники вашей [**организации
        Tenderly**](/platform/account/organizations/overview) будут иметь прямой доступ к виртуальному окружению.

        После деплоя в виртуальное окружение вы можете распространять конфигурацию сети и контракта, чтобы разработчики других
        компонентов, таких как UI, API и индексация данных, могли подключаться к подготовленным контрактам.

        Вот некоторые рекомендации:

        <ol className="list-decimal ml-6">
          <li> [Подготовьте контракты](/virtual-environments/ci-cd/stage-contracts) в виртуальном окружении.</li>
          <li> [Форкните staging-виртуальное окружение](/virtual-environments/develop/fork-testnet) для каждой команды (фронтенд,
          бэкенд и т. д.), чтобы обеспечить границы между командами и уменьшить шум от тестовых данных в
          разработке.</li>
          <li> Обновите все релевантные git-репозитории конфигурацией виртуального окружения и информацией о контрактах:</li>

          <ul className="list-disc ml-3">
            <li> Конфигурация сети: поделитесь chain ID и Admin RPC (чтобы другие разработчики могли управлять состоянием сети)</li>
            <li> ABI контрактов</li>
            <li> Адреса деплоя контрактов</li>
          </ul>

          <li>При локальной разработке (UI, бэкенд) переключайтесь на виртуальное окружение.</li>
          <li>Делитесь неудачными транзакциями с разработчиками смарт-контрактов</li>
        </ol>
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-to-stage-a-dapp-for-external-demos-and-communi" className="text-xl font-semibold">Как подготовить dapp для внешних демо и тестирования сообществом?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        При подготовке dapp'а для внешнего и демо-тестирования убедитесь, что:

        * Вы подготовили контракты в виртуальном окружении.
        * Вы подготовили все офф-чейн компоненты (бэкенд, решения индексации данных и т. д.) и подключили их к виртуальному окружению.
        * Подключили ваш подготовленный dapp через [**Public RPC**](/virtual-environments/overview#admin-rpc) (не Admin RPC) и подключили его к другим офф-чейн компонентам.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-can-i-revert-testnet-state" className="text-xl font-semibold">Как откатить состояние виртуального окружения?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Вместо отката состояния рекомендуется [форкнуть существующее
        виртуальное окружение](/virtual-environments/develop/fork-testnet) и проводить тестирование на одноразовой рабочей
        копии.

        Вы можете [откатить состояние виртуального окружения](/virtual-environments/develop/revert-state), если этапы тестирования иначе не
        воспроизводимы.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-should-i-name-my-testnet" className="text-xl font-semibold">Как назвать моё виртуальное окружение?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Для более удобного различения добавляйте к вашим виртуальным окружениям префикс **`virtual`** (например, `virtualMainnet`). Это
        особенно полезно для интеграций, таких как [Viem](/virtual-environments/libraries/viem),
        [HardHat](/virtual-environments/develop/deploy-contracts) и
        [другие](/virtual-environments/integrations).

        Альтернативно включайте **назначение** в имя виртуального окружения:

        * **`internalTestingMainnet`**
        * **`demoMainnet`**
        * **`dataInsightsMainnet`**
        * **`ciMainnet`**
        * **`bugBountyBase`**
        * **`frontEndDevOptimism`**
        * **`communityTestingAvalanche`**
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="what-s-verification-visibility-in-testnets" className="text-xl font-semibold">Что такое видимость верификации в виртуальных окружениях?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        [Публичный обозреватель](/virtual-environments/explorer) виртуального окружения соблюдает **видимость верификации для
        контрактов**, которые вы деплоите и верифицируете в виртуальном окружении:

        * **Full**: публичный обозреватель блоков будет отображать весь исходный код всех функций
        * **ABI-only**: публичный обозреватель блоков показывает только имена и сигнатуры функций и событий,
          включая имена аргументов. Так ваш исходный код остаётся невидимым за пределами вашего проекта.
        * **None**: показывает только итоговые результаты транзакций, не раскрывая исходный код или имена
          методов.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-do-i-run-foundry-scripts-on-virtual-environments" className="text-xl font-semibold">Как запускать Foundry-скрипты в виртуальных окружениях?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Используйте флаг `--slow` при запуске Foundry-скриптов, чтобы предотвратить пакетирование транзакций. С ним транзакция отправляется только после подтверждения предшествующей транзакции.

        ```bash lines={2} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
        forge script script/Counter.s.sol:CounterScript \
        --slow
        --verify \
        --verifier-url $TENDERLY_VERIFIER_URL \
        --rpc-url $TENDERLY_VIRTUAL_TESTNET_RPC_URL \
        --private-key $PRIVATE_KEY  \
        --etherscan-api-key $TENDERLY_ACCESS_TOKEN \
        --broadcast \
        ```
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="when-i-fund-accounts-should-i-input-the-amount-in" className="text-xl font-semibold">При пополнении аккаунтов нужно ли вводить сумму в wei?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        При использовании Unlimited Faucet в Dashboard `1` означает `1 ETH` — как для **нативного, так и для ERC-20
        баланса**.
        В случае токенов ERC-20 Tenderly автоматически рассчитывает точное количество в wei, используя количество знаков после запятой ERC-20.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="what-s-the-difference-between-the-admin-rpc-and-pu" className="text-xl font-semibold">В чём разница между Admin RPC и Public RPC?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        **Public RPC** обеспечивает стандартное взаимодействие через JSON-RPC. Это RPC, который вы будете использовать для интеграции в
        UI или бэкенд вашего dapp'а, когда будете готовы к внешней демонстрации своего dapp'а.

        **Admin RPC** поддерживает [дополнительные RPC-методы](/virtual-environments/admin-rpc), обеспечивающие более высокий контроль
        над состоянием и хранилищем сети, а также балансами аккаунтов. Это RPC, который вы будете использовать в своих
        скриптах деплоя для программного управления сетью.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="can-i-impersonate-a-sender-on-testnets" className="text-xl font-semibold">Могу ли я имитировать отправителя в виртуальных окружениях?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Вы можете успешно отправлять транзакции, используя **любой адрес отправителя** [через
        Dashboard](/virtual-environments/interact/send-transactions#sendnig-from-the-dashboard). Tenderly будет запускать
        эти транзакции в виртуальных окружениях без проверки подписей.
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="how-can-i-get-accurate-gas-estimations" className="text-xl font-semibold">Как получить точные оценки газа?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        Использование газа отражает точный расход газа всех OPCODES оригинальной сети. Вы можете получить расход газа:

        * в Transaction Overview через Dashboard,
        * через [**tenderly\_estimateGas**](/node-rpc/rpc-reference?network=ethereum-mainnet\&method=tenderly_estimateGas) для оценки одиночных транзакций со 100% точностью
        * через [**tenderly\_estimateGasBundle**](/node-rpc/rpc-reference?network=ethereum-mainnet\&method=tenderly_estimateGasBundle) для оценки нескольких транзакций со 100% точностью
      </div>
    </div>
  </Card>

  <Card>
    <div className="flex flex-col gap-2">
      <h2 id="will-verification-work-if-i-use-tenderly-setcode" className="text-xl font-semibold">Будет ли работать верификация, если я использую `tenderly_setcode`?</h2>

      <hr className="dark:border-neutral-800" />

      <div>
        При деплое изменённого байткода на адрес информация о верификации больше не будет соответствовать, и получить доступ к трейсам и debugger'у для целевых адресов будет невозможно.
      </div>
    </div>
  </Card>
</div>
