# Simulasi transaksi sebelum dikirim dengan eth_simulateV1

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

Sebelum menyiarkan transaksi ke jaringan blockchain, simulasi memungkinkan pengembang memeriksa hasil eksekusi, memverifikasi transisi state kontrak, dan mengamati log peristiwa terlebih dahulu, sehingga menghindari biaya gas yang tidak perlu akibat revert kontrak.

Lapisan eksekusi Ethereum menyediakan beberapa cara untuk mengevaluasi transaksi sebelum dikirim:

* `eth_call`: Mengeksekusi satu panggilan pesan hanya-baca tanpa mempertahankan state di antara panggilan berturut-turut.
* `eth_estimateGas`: Menghitung batas gas yang diperlukan untuk eksekusi, tetapi tidak menyediakan transisi state berurutan untuk beberapa transaksi atau log peristiwa lengkap.
* `eth_simulateV1`: Didefinisikan dalam spesifikasi standar Ethereum Execution APIs, metode ini memungkinkan simulasi berurutan beberapa transaksi lintas blok, mengakumulasi perubahan state antartransaksi, dan mendukung penggantian parameter blok serta state akun.

## Chain yang didukung dan kebijakan metode

Kemampuan jaringan dipublikasikan secara dinamis melalui `GET /v1/chains`. Baca `methods.allow` dari respons tersebut untuk melihat chain mana yang mengizinkan `eth_simulateV1`; chain yang tidak mencantumkannya menolak panggilan dengan error JSON-RPC `-32601` (`method not available`, tidak ditagih).

### Kondisi state node

`eth_simulateV1` adalah metode kueri state:

* **Pemeriksaan sinkronisasi (`-32010`)**: Ketika node chain tujuan sedang melakukan sinkronisasi dan belum siap, panggilan mengembalikan `-32010` (`node is syncing`, tidak ditagih).
* **Jendela state (`-32011`)**: Pada Robinhood Chain, permintaan yang menargetkan blok lebih lama dari `state_window_blocks` chain (`GET /v1/chains`), atau menentukan tag blok `safe`, `finalized`, atau `earliest`, mengembalikan `-32011` (tidak ditagih). Tag blok default adalah `latest`.

## Struktur permintaan dan contoh dasar

Menurut spesifikasi lapisan eksekusi ([definisi Ethereum Execution APIs eth\_simulateV1](https://ethereum.github.io/execution-apis/api/methods/eth_simulateV1)), `eth_simulateV1` menerima dua parameter posisional:

1. **Objek payload**:
   * `blockStateCalls` (array wajib): Array objek blok simulasi. Setiap objek berisi array panggilan transaksi `calls`, penggantian header blok opsional `blockOverrides`, dan penggantian state akun opsional `stateOverrides`.
   * `validation` (boolean opsional, default `false`): Saat `false`, berperilaku seperti `eth_call`; saat `true`, menjalankan semua validasi EVM kecuali pemeriksaan tanda tangan.
   * `traceTransfers` (boolean opsional): Saat `true`, mengembalikan log peristiwa untuk transfer token native.
2. **Tag blok** (string opsional, default `'latest'`): Nomor blok, hash blok, atau tag blok.

### Contoh dasar: simulasi transfer ERC-20

Contoh berikut menyimulasikan panggilan ERC-20 `transfer(address,uint256)` pada Robinhood Chain. Ganti `$BLOCKVECTRA_API_KEY` dengan API key Anda yang sebenarnya:

**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);
```


### Memeriksa struktur respons

Dalam spesifikasi eksekusi Ethereum, bidang `result` berisi array hasil blok simulasi dengan skema berikut:

#### Bidang tingkat blok

* `number`: Nomor blok simulasi (string heksadesimal).
* `hash`: Hash blok simulasi (string heksadesimal 32 byte).
* `parentHash`: Hash blok induk.
* `timestamp`: Waktu blok (string heksadesimal).
* `gasLimit`: Batas gas blok.
* `gasUsed`: Total gas yang digunakan semua panggilan simulasi dalam blok ini.
* `baseFeePerGas`: Biaya dasar per gas untuk blok.
* `miner`: Alamat coinbase yang menerima biaya blok.
* `calls`: Array hasil eksekusi untuk setiap panggilan simulasi.

#### Bidang tingkat panggilan (elemen array `calls`)

* `status`: Status panggilan sebagai string heksadesimal. `0x1` menunjukkan keberhasilan, sedangkan `0x0` menunjukkan kegagalan atau revert.
* `gasUsed`: Gas aktual yang digunakan panggilan ini (string heksadesimal).
* `maxUsedGas` (opsional): Penggunaan gas puncak selama eksekusi sebelum pengembalian gas.
* `returnData`: Data kembalian berkode heksadesimal. Pada transfer ERC-20 yang berhasil, berisi boolean `true`; saat revert, berisi selector error atau data revert.
* `logs`: Array log peristiwa yang diterbitkan oleh panggilan. Jika berhasil, berisi log peristiwa seperti `Transfer`:
  * `address`: Alamat kontrak yang menerbitkan peristiwa.
  * `topics`: Array hash topic 32 byte (`topics[0]` adalah hash tanda tangan peristiwa, seperti tanda tangan peristiwa `Transfer`).
  * `data`: Data peristiwa yang tidak diindeks, berkode heksadesimal.
  * `blockNumber`, `blockHash`, `transactionHash`, `transactionIndex`, `logIndex`, `removed`.
* `error` (ada saat gagal): Objek berisi `code` (`3` untuk revert, `-32015` untuk error VM) dan `message` (seperti `execution reverted`).

## Harga dan bobot CU

BlockVectra mengukur konsumsi dalam Compute Units (CU). Bobot setiap metode JSON-RPC dipublikasikan secara dinamis oleh `GET /v1/plans`:

**Bobot CU per panggilan**

| Metode | CU per panggilan |
| --- | --- |
| `eth_simulateV1` | 20 |
| `eth_call` | 15 |
| `eth_estimateGas` | 20 |

Untuk rumus konversi unit dan detail top up, kunjungi [halaman Harga](https://blockvectra.com/id/pricing/).

Permintaan yang ditolak — termasuk node yang sedang sinkronisasi (`-32010`), di luar jendela state (`-32011`), atau metode yang tidak tersedia (`-32601`) — tidak ditagih. Lihat [Permintaan mana yang gratis](https://docs.blockvectra.com/en/guides/billing-rules/) untuk aturan penagihan lengkap.

## Penggunaan dengan AI Agent dan MCP

AI Agent otonom dapat memanggil `eth_simulateV1` secara langsung melalui server Model Context Protocol (MCP) BlockVectra.

Alat `rpc_call` dengan API key memungkinkan eksekusi metode JSON-RPC pada chain yang didukung. API key harus dikonfigurasi dalam header HTTP klien MCP (`x-api-key: {api_key}` atau `Authorization: Bearer {api_key}`), jangan pernah dikirim dalam parameter alat atau prompt percakapan.

Contoh payload pemanggilan alat `rpc_call` pada Robinhood Chain:

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

Agent dapat memeriksa `status === "0x1"` untuk memverifikasi validitas interaksi kontrak dan menilai konsumsi gas sebelum mengirim transaksi mentah. Untuk petunjuk pengaturan dan penggunaan, lihat [panduan integrasi AI Agent](https://docs.blockvectra.com/id/guides/ai-agents/).

## Langkah berikutnya

* [Lihat paket gratis dan harga](https://blockvectra.com/id/pricing/#free) untuk memeriksa apa saja yang tercakup dalam akun Anda.
* [Masuk ke konsol](https://console.blockvectra.com/login/?next=%2Fkeys%2F) untuk membuat API key.
