# Göndermeden önce simüle edin: eth_simulateV1 ile işlemleri test çalıştırması (dry-run)

> Source: https://docs.blockvectra.com/tr/guides/simulate-transactions/

İşlemleri bir blokzincir ağına yayınlamadan önce test çalıştırması (dry-run) yapmak, geliştiricilerin yürütme sonuçlarını incelemesine, sözleşme durum geçişlerini doğrulamasına ve olay log'larını önceden gözlemlemesine olanak tanıyarak sözleşme iptallerinin (revert) neden olduğu gereksiz gas ücretlerini önler.

Ethereum yürütme katmanı, işlemleri göndermeden önce değerlendirmek için çeşitli yollar sunar:

* `eth_call`: Ardışık çağrılar arasında durum kalıcılığı olmadan tek bir salt okunur mesaj çağrısı yürütür.
* `eth_estimateGas`: Yürütme için gereken gas limitini hesaplar, ancak çoklu işlem sıralı durum geçişleri veya tam olay log'ları sağlamaz.
* `eth_simulateV1`: Ethereum Execution APIs standart belirtiminde tanımlanan bu yöntem, bloklar arasında birden fazla işlemin sıralı simülasyonuna izin verir, işlemler arasındaki durum değişikliklerini biriktirir ve blok parametreleri ile hesap durumunun geçersiz kılınmasını destekler.

## Desteklenen zincirler ve yöntem politikası

Ağ yetenekleri `GET /v1/chains` aracılığıyla dinamik olarak yayınlanır. Hangi zincirlerin `eth_simulateV1` yöntemine izin verdiğini görmek için bu yanıttan `methods.allow` alanını okuyun; bu yöntemin listelenmediği bir zincir, çağrıyı `-32601` JSON-RPC hatasıyla (`method not available`, faturalandırılmaz) reddeder.

### Düğüm durumu koşulları

`eth_simulateV1` bir durum sorgulama yöntemidir:

* **Eşitleme geçidi (`-32010`)**: Hedef zincirin düğümü eşitleniyorsa ve henüz hazır değilse, çağrı `-32010` (`node is syncing`, faturalandırılmaz) döndürür.
* **Durum penceresi (`-32011`)**: Robinhood Chain'de, zincirin `state_window_blocks` (`GET /v1/chains`) değerinden daha eski blokları hedefleyen veya `safe`, `finalized` ya da `earliest` blok etiketlerini belirten istekler `-32011` döndürür (faturalandırılmaz). Varsayılan blok etiketi `latest` değeridir.

## İstek yapısı ve temel örnek

Yürütme katmanı belirtimine göre ([Ethereum Execution APIs eth\_simulateV1 tanımı](https://ethereum.github.io/execution-apis/api/methods/eth_simulateV1)), `eth_simulateV1` iki konumsal parametre kabul eder:

1. **Yük (payload) nesnesi**:
   * `blockStateCalls` (zorunlu dizi): Simüle edilen blok nesnelerinden oluşan bir dizi. Her nesne bir işlem çağrıları dizisi `calls`, isteğe bağlı blok başlığı geçersiz kılmaları `blockOverrides` ve isteğe bağlı hesap durumu geçersiz kılmaları `stateOverrides` içerir.
   * `validation` (isteğe bağlı boolean, varsayılan `false`): `false` olduğunda `eth_call` gibi davranır; `true` olduğunda imza kontrolleri hariç tüm EVM doğrulamasını çalıştırır.
   * `traceTransfers` (isteğe bağlı boolean): `true` olduğunda yerel token transferleri için olay log'larını döndürür.
2. **Blok etiketi** (isteğe bağlı dize, varsayılan `'latest'`): Blok numarası, blok karması veya blok etiketi.

### Temel örnek: bir ERC-20 transferini test çalıştırma

Aşağıdaki örnek, Robinhood Chain üzerinde bir ERC-20 `transfer(address,uint256)` çağrısını test amaçlı simüle eder. `$BLOCKVECTRA_API_KEY` değerini gerçek API key'inizle değiştirin:

**cURL**

```bash
export BLOCKVECTRA_API_KEY=rgw_your_api_key

curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_simulateV1",
    "params": [
      {
        "blockStateCalls": [
          {
            "calls": [
              {
                "from": "0x1111111111111111111111111111111111111111",
                "to": "0x2222222222222222222222222222222222222222",
                "data": "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
                "value": "0x0"
              }
            ]
          }
        ]
      },
      "latest"
    ]
  }'
```


  **TypeScript (viem)**

```ts
import { createPublicClient, http } from "viem";

const apiKey = process.env.BLOCKVECTRA_API_KEY!;
const client = createPublicClient({
  transport: http(`https://api.blockvectra.com/v1/robinhood_mainnet/${apiKey}`),
});

// Call eth_simulateV1 directly via viem's client.request
const simulationResult = await client.request({
  method: "eth_simulateV1" as any,
  params: [
    {
      blockStateCalls: [
        {
          calls: [
            {
              from: "0x1111111111111111111111111111111111111111",
              to: "0x2222222222222222222222222222222222222222",
              data: "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
              value: "0x0",
            },
          ],
        },
      ],
    },
    "latest",
  ],
});

console.log(simulationResult);
```


### Yanıt yapısını inceleme

Ethereum yürütme belirtimi uyarınca, `result` alanı aşağıdaki şemaya sahip simüle edilmiş blok sonuçları dizisi içerir:

#### Blok düzeyindeki alanlar

* `number`: Simüle edilen bloğun blok numarası (onaltılık dize).
* `hash`: Simüle edilen blok karması (32 baytlık onaltılık dize).
* `parentHash`: Üst bloğun karması.
* `timestamp`: Blok zaman damgası (onaltılık dize).
* `gasLimit`: Blok gas limiti.
* `gasUsed`: Bu bloktaki tüm simüle edilmiş çağrılarda tüketilen toplam gas.
* `baseFeePerGas`: Blok için gas başına taban ücret.
* `miner`: Blok ücretlerini alan coinbase adresi.
* `calls`: Simüle edilen her çağrı için yürütme sonuçları dizisi.

#### Çağrı düzeyindeki alanlar (`calls` dizi öğeleri)

* `status`: Onaltılık dize olarak çağrı durumu. `0x1` başarıyı, `0x0` ise başarısızlığı veya iptali gösterir.
* `gasUsed`: Bu çağrı tarafından fiilen tüketilen gas (onaltılık dize).
* `maxUsedGas` (isteğe bağlı): İadelerden önce yürütme sırasında kullanılan en yüksek gas miktarı.
* `returnData`: Onaltılık kodlanmış dönüş verisi. Başarılı bir ERC-20 transferinde bu alan boolean `true` içerir; iptal durumunda hata seçicisini veya revert verisini içerir.
* `logs`: Çağrı tarafından yayımlanan olay log'ları dizisi. Başarılı olduğunda `Transfer` gibi olay log'larını içerir:
  * `address`: Olayı yayımlayan sözleşme adresi.
  * `topics`: 32 baytlık topic karmaları dizisi (`topics[0]`, `Transfer` olay imzası gibi olay imzasının karmasıdır).
  * `data`: Onaltılık kodlanmış indekslenmemiş olay verisi.
  * `blockNumber`, `blockHash`, `transactionHash`, `transactionIndex`, `logIndex`, `removed`.
* `error` (başarısızlık durumunda bulunur): `code` (revert için `3`, bir VM hatası için `-32015`) ve `message` (örneğin `execution reverted`) içeren bir nesne.

## Fiyatlandırma ve CU ağırlıkları

BlockVectra, tüketimi Compute Unit (CU) cinsinden ölçer. Her JSON-RPC yönteminin ağırlığı `GET /v1/plans` tarafından dinamik olarak yayınlanır:

**Çağrı başına CU ağırlığı**

| Yöntem | Çağrı başına CU |
| --- | --- |
| `eth_simulateV1` | 20 |
| `eth_call` | 15 |
| `eth_estimateGas` | 20 |

Birim dönüştürme formülleri ve bakiye yükleme ayrıntıları için [Fiyatlandırma sayfasını](https://blockvectra.com/tr/pricing/) ziyaret edin.

Düğüm eşitlemesi (`-32010`), durum penceresi dışı (`-32011`) veya yöntemin kullanılamaması (`-32601`) dahil olmak üzere reddedilen istekler faturalandırılmaz. Eksiksiz faturalandırma kuralları için [Hangi istekler ücretsizdir](https://docs.blockvectra.com/tr/guides/billing-rules/) sayfasına bakın.

## Yapay zeka ajanları (AI Agent) ve MCP ile kullanma

Otonom Yapay Zeka Ajanları (AI Agent), BlockVectra'nın Model Context Protocol (MCP) sunucusu aracılığıyla `eth_simulateV1` yöntemini doğrudan çağırabilir.

Kimlik doğrulamalı `rpc_call` aracı, desteklenen zincirlerde JSON-RPC yöntemlerinin yürütülmesine olanak tanır. API key, MCP istemcisi HTTP başlıklarında (`x-api-key: {api_key}` veya `Authorization: Bearer {api_key}`) yapılandırılmalıdır; araç parametreleri veya konuşma istemleri içinde asla iletilmemelidir.

Robinhood Chain üzerinde örnek `rpc_call` aracı çağırma yükü:

```json
{
  "chain": "robinhood_mainnet",
  "method": "eth_simulateV1",
  "params": [
    {
      "blockStateCalls": [
        {
          "calls": [
            {
              "from": "0x1111111111111111111111111111111111111111",
              "to": "0x2222222222222222222222222222222222222222",
              "data": "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
              "value": "0x0"
            }
          ]
        }
      ]
    },
    "latest"
  ]
}
```

Ajanlar, ham işlemleri göndermeden önce sözleşme etkileşiminin geçerliliğini doğrulamak ve gas tüketimini değerlendirmek için `status === "0x1"` kontrolü yapabilir. Kurulum ve kullanım talimatları için [AI Agent entegrasyon rehberi](https://docs.blockvectra.com/tr/guides/ai-agents/) sayfasına bakın.

## Sonraki adımlar

* Hesabınızın neleri içerdiğini kontrol etmek için [ücretsiz planı ve fiyatlandırmayı inceleyin](https://blockvectra.com/tr/pricing/#free).
* Bir API key oluşturmak için [konsolda oturum açın](https://console.blockvectra.com/login/?next=%2Fkeys%2F).
