Перейти к основному содержанию
eth_simulateV1 является стандартным методом мультиблочной симуляции из спецификации Ethereum execution APIs. Он симулирует последовательность блоков, каждый из которых содержит пакет вызовов, поверх базового блока, ничего не отправляя в сеть. Вызовы внутри блока выполняются последовательно и разделяют состояние, а каждый симулируемый блок строится поверх предыдущего. Метод работает на Node RPC и Virtual Environments; полный справочник JSON-RPC содержит все методы и сети. Небольшой набор сетей его не поддерживает; см. раздел Доступность в сетях. Используйте eth_simulateV1, когда нужна переносимая, соответствующая спецификации симуляция, возвращающая результаты в формате блоков. Для декодированных логов, трассировки вызовов, изменений активов и балансов используйте tenderly_simulateTransaction для одной транзакции или tenderly_simulateBundle для последовательности транзакций.

eth_simulateV1

Симулирует последовательность блоков поверх заданного базового блока. Каждый блок содержит пакет вызовов: вызов N видит изменения состояния вызова N-1, а каждый блок после первого строится на предыдущем. Параметры
  1. Simulation payload OBJECT
    • blockStateCalls ARRAY из Block state call OBJECT: последовательность блоков для симуляции, по порядку
      • blockOverrides (опционально) OBJECT: набор полей заголовка для переопределения в этом блоке
        • number (опционально) STRING: hex, переопределяет номер блока
        • difficulty (опционально) STRING: hex, переопределяет сложность блока
        • time (опционально) STRING: hex, переопределяет временную метку блока
        • gasLimit (опционально) STRING: hex, переопределяет лимит газа
        • coinbase (опционально) STRING: hex, переопределяет майнера блока
        • random (опционально) STRING: hex, переопределяет значение, которое подаётся в опкод PREVRANDAO
        • baseFee (опционально) STRING: hex, переопределяет базовую комиссию блока
        • excessBlobGas (опционально) STRING: hex, переопределяет избыточный blob-газ
        • blobGasUsed (опционально) STRING: hex, переопределяет использованный blob-газ
      • stateOverrides (опционально) MAP: сопоставление учётной записи (адреса) со спецификацией переопределения. Задавайте переопределения состояния на первой записи блока; см. Особенности реализации Tenderly
        • key STRING: учётная запись, к которой применяется переопределение
        • value OBJECT: спецификация переопределения
          • balance (опционально) STRING: hex-кодированное переопределение баланса учётной записи в wei
          • nonce (опционально) STRING: hex-кодированное переопределение nonce для учётной записи
          • code (опционально) STRING: данные переопределения кода для учётной записи
          • stateDiff (опционально) MAP: сопоставление ключа хранилища со значением переопределения
            • key STRING: ключ хранилища
            • value STRING: переопределяемое значение для указанного ключа хранилища
      • calls ARRAY из Transaction call OBJECT: выполняются по порядку; каждый вызов видит изменения состояния предшествующих ему вызовов
        • from (опционально) STRING: адрес в hex; по умолчанию нулевой адрес
        • to (опционально) STRING: адрес в hex
        • gas (опционально) STRING: hex-кодированный лимит газа для вызова
        • gasPrice (опционально) STRING: hex, цена газа, которую отправитель готов заплатить, в wei
        • maxFeePerGas (опционально) STRING: hex, максимальная суммарная комиссия за газ, которую отправитель готов заплатить (включает сетевую / базовую комиссию и комиссию майнера / приоритетную), в wei
        • maxPriorityFeePerGas (опционально) STRING: hex, максимальная комиссия за газ, которую отправитель готов заплатить майнерам, в wei
        • value (опционально) STRING: hex-кодированное значение в wei; по умолчанию 0x0
        • input (опционально) STRING: hex-кодированные данные вызова; data принимается как устаревший псевдоним, при одновременном указании приоритет имеет input
        • nonce (опционально) STRING: hex-кодированный nonce
        • type (опционально) STRING: hex-кодированный тип транзакции
        • accessList (опционально) ARRAY из записей access list OBJECT
          • address STRING: адрес в hex
          • storageKeys ARRAY из STRING: представление 32-байтовых hex-кодированных ключей хранилища
        • maxFeePerBlobGas (опционально) STRING: hex, максимальная комиссия за blob-газ в wei
        • blobVersionedHashes (опционально) ARRAY из STRING: 32-байтовые hex-кодированные версионированные хеши blob
        • authorizationList (опционально) ARRAY: кортежи авторизации EIP-7702
    • returnFullTransactions (опционально) BOOLEAN: если true, блоки результата содержат полные объекты транзакций вместо хешей транзакций
  2. Base block number (опционально) Блок, поверх которого выполняется симуляция. По умолчанию latest. Одно из:
    • STRING номер блока
    • ENUM тег блока earliest|finalized|safe|latest|pending
Пример Запрос симулирует два блока. Первый блок пополняет баланс отправителя через переопределение состояния, затем отправляет ETH и оборачивает 1 ETH в WETH; второй блок задаёт пользовательскую временную метку и переводит WETH, созданный в первом блоке.
example.json
{
  "id": 0,
  "jsonrpc": "2.0",
  "method": "eth_simulateV1",
  "params": [
    {
      "blockStateCalls": [
        {
          "stateOverrides": {
            "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
              "balance": "0x3635c9adc5dea00000"
            }
          },
          "calls": [
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0x1111111111111111111111111111111111111111",
              "value": "0x1bc16d674ec80000"
            },
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
              "value": "0xde0b6b3a7640000",
              "input": "0xd0e30db0"
            }
          ]
        },
        {
          "blockOverrides": { "time": "0x6ae00000" },
          "calls": [
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
              "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
            }
          ]
        }
      ]
    },
    "latest"
  ]
}
Результат ARRAY из Block result OBJECT, по одному на каждую запись blockStateCalls, по порядку. Каждый результат блока содержит стандартные поля заголовка блока, возвращаемые eth_getBlockByNumber (number, hash, parentHash, timestamp, gasLimit, gasUsed, baseFeePerGas, logsBloom, miner и так далее), а также:
  • transactions ARRAY: хеши транзакций симулированных вызовов или полные объекты транзакций, если returnFullTransactions равно true
  • calls ARRAY из Call result OBJECT, по одному на вызов, по порядку:
    • returnData STRING: hex-кодированные возвращаемые данные вызова
    • logs ARRAY из Log OBJECT: события, эмитированные вызовом (address, topics, data, blockNumber, transactionHash, transactionIndex, blockHash, logIndex, removed); пустой массив для откатившихся вызовов
    • gasUsed STRING: hex-кодированное количество газа, потреблённого вызовом
    • status STRING: 0x1 при успехе, 0x0 при неудаче
    • error OBJECT: присутствует только при неудачном вызове
      • code NUMBER: код ошибки
      • message STRING: сообщение об ошибке, включая причину revert, когда она доступна

Особенности реализации Tenderly

Реализация Tenderly отличается от эталонной спецификации execution-apis следующим образом:
  • validation не поддерживается. Установка validation: true возвращает ошибку validation flag is not supported. Симуляция всегда выполняется в невалидирующем режиме: требования к nonce, балансу и комиссиям не применяются к вызовам.
  • traceTransfers не поддерживается. Установка traceTransfers: true возвращает ошибку traceTransfers flag is not supported. Синтетические логи переводов ETH не создаются.
  • Переопределения state не поддерживаются. Поле state (полная замена хранилища) в переопределении состояния возвращает ошибку not supported. Используйте stateDiff для переопределения отдельных слотов хранилища.
  • Переопределения состояния применяются с первого блока. Задавайте stateOverrides на первой записи blockStateCalls; stateOverrides на последующих записях не применяются.
  • gas на уровне вызова ограничивается сверху. Значение gas выше лимита газа блока плюс 600 000 000 усекается до этого потолка, а не отклоняется.
  • Нет лимитов на количество блоков и вызовов. Максимальное количество записей blockStateCalls и количество вызовов в одном блоке не ограничены.
  • Хеши транзакций синтетические. Хеши в блоках результата идентифицируют симулированные вызовы, но не являются хешами подписанных транзакций.
  • Продвижение блоков. Каждый симулируемый блок после первого получает number = предыдущий + 1 и parentHash, связанный с предыдущим результатом, при этом базовая комиссия и лимит газа пересчитываются. Автоматически генерируемая временная метка берётся из системных часов ноды, поэтому задавайте blockOverrides.time явно, когда временные метки важны. Переопределённые номера блоков и временные метки применяются как есть; монотонность не проверяется. Если первая запись блока содержит blockOverrides без number, номер блока по умолчанию равен номеру базового блока плюс 1.

Доступность в сетях

eth_simulateV1 доступен в сетях Node RPC и Virtual Environments, за исключением следующих сетей, где ноды базовой сети не поддерживают этот метод:
  • ApeChain
  • Avalanche C-Chain
  • Avalanche C-Chain Fuji
  • Blast
  • Curtis
  • Flare
  • Immutable
  • Immutable Testnet
  • Lens
  • Lens Testnet
  • Metis Andromeda
  • Metis Sepolia
  • Monad
  • Monad Testnet
  • Moonbase Alpha
  • Moonbeam
  • Moonriver
  • Scroll Mainnet
  • Scroll Sepolia
  • Sonic
  • Sonic Testnet
  • Stable
  • Stable Testnet
  • ZKsync
  • ZKsync Sepolia