# 전송 전 시뮬레이션: eth_simulateV1으로 트랜잭션 사전 실행하기

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

블록체인 네트워크에 트랜잭션을 브로드캐스트하기 전에 이를 사전 실행(dry-run)하면 개발자가 실행 결과를 검사하고, 컨트랙트 상태 전이를 확인하며, 이벤트 로그를 미리 관찰하여 컨트랙트 revert로 인한 불필요한 가스비 낭비를 방지할 수 있습니다.

이더리움 실행 레이어는 전송 전에 트랜잭션을 평가하는 몇 가지 방법을 제공합니다:

* `eth_call`: 연속 호출 간 상태 지속성 없이 단일 읽기 전용 메시지 호출을 실행합니다.
* `eth_estimateGas`: 실행에 필요한 가스 한도를 계산하지만, 다중 트랜잭션 순차 상태 전이나 전체 이벤트 로그는 제공하지 않습니다.
* `eth_simulateV1`: 이더리움 실행 API 표준 사양에 정의된 이 메서드는 여러 블록에 걸쳐 여러 트랜잭션을 순차적으로 시뮬레이션할 수 있으며, 트랜잭션 간 상태 변경을 누적하고, 블록 파라미터 및 계정 상태 오버라이드를 지원합니다.

## 지원 체인 및 메서드 정책

네트워크 기능은 `GET /v1/chains`를 통해 동적으로 게시됩니다. 해당 응답의 `methods.allow`를 확인하여 어떤 체인이 `eth_simulateV1`을 허용하는지 확인하세요. 목록에 없는 체인은 JSON-RPC 오류 `-32601`(`method not available`, 과금되지 않음)과 함께 호출을 거부합니다.

### 노드 상태 조건

`eth_simulateV1`은 상태 쿼리 메서드입니다:

* **동기화 게이트 (`-32010`)**: 대상 체인의 노드가 동기화 중이고 아직 준비되지 않은 경우 호출은 `-32010`(`node is syncing`, 과금되지 않음)을 반환합니다.
* **상태 윈도우 (`-32011`)**: Robinhood Chain에서 체인의 `state_window_blocks`(`GET /v1/chains`)보다 오래된 블록을 대상으로 하거나 `safe`, `finalized`, `earliest` 블록 태그를 지정하는 요청은 `-32011`(과금되지 않음)을 반환합니다. 기본 블록 태그는 `latest`입니다.

## 요청 구조 및 기본 예제

실행 레이어 사양([Ethereum Execution APIs eth\_simulateV1 정의](https://ethereum.github.io/execution-apis/api/methods/eth_simulateV1))에 따르면 `eth_simulateV1`은 두 개의 위치 파라미터를 받습니다:

1. **페이로드 객체**:
   * `blockStateCalls` (필수 배열): 시뮬레이션된 블록 객체의 배열입니다. 각 객체는 트랜잭션 호출 배열 `calls`, 선택적 블록 헤더 오버라이드 `blockOverrides`, 선택적 계정 상태 오버라이드 `stateOverrides`를 포함합니다.
   * `validation` (선택적 불리언, 기본값 `false`): `false`인 경우 `eth_call`처럼 작동하며, `true`인 경우 서명 확인을 제외한 모든 EVM 유효성 검사를 실행합니다.
   * `traceTransfers` (선택적 불리언): `true`인 경우 네이티브 토큰 전송에 대한 이벤트 로그를 반환합니다.
2. **블록 태그** (선택적 문자열, 기본값 `'latest'`): 블록 번호, 블록 해시 또는 블록 태그.

### 기본 예제: ERC-20 전송 사전 실행

다음 예제는 Robinhood Chain에서 ERC-20 `transfer(address,uint256)` 호출을 사전 실행합니다. `$BLOCKVECTRA_API_KEY`를 실제 API key로 교체하세요:

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


### 응답 구조 확인

이더리움 실행 사양에 따라 `result` 필드에는 다음 스키마를 갖는 시뮬레이션된 블록 결과 배열이 포함됩니다:

#### 블록 수준 필드

* `number`: 시뮬레이션된 블록의 블록 번호(16진수 문자열).
* `hash`: 시뮬레이션된 블록 해시(32바이트 16진수 문자열).
* `parentHash`: 부모 블록의 해시.
* `timestamp`: 블록 타임스탬프(16진수 문자열).
* `gasLimit`: 블록 가스 한도.
* `gasUsed`: 이 블록의 모든 시뮬레이션 호출에서 소비된 총 가스.
* `baseFeePerGas`: 블록의 가스당 기본 수수료.
* `miner`: 블록 수수료를 받는 코인베이스 주소.
* `calls`: 각 시뮬레이션 호출에 대한 실행 결과 배열.

#### 호출 수준 필드 (`calls` 배열 항목)

* `status`: 16진수 문자열 형태의 호출 상태입니다. `0x1`은 성공을 나타내고, `0x0`은 실패 또는 revert를 나타냅니다.
* `gasUsed`: 이 호출에서 실제로 소비된 가스(16진수 문자열).
* `maxUsedGas` (선택 사항): 환급 전 실행 중에 사용된 최대 피크 가스.
* `returnData`: 16진수로 인코딩된 반환 데이터입니다. ERC-20 전송이 성공하면 불리언 `true`가 포함되며, revert 시에는 오류 선택자 또는 revert 데이터가 포함됩니다.
* `logs`: 호출에서 발생한 이벤트 로그 배열입니다. 성공 시 `Transfer`와 같은 이벤트 로그가 포함됩니다:
  * `address`: 이벤트를 발생시킨 컨트랙트 주소.
  * `topics`: 32바이트 토픽 해시 배열(`topics[0]`은 `Transfer` 이벤트 서명과 같은 이벤트 서명 해시).
  * `data`: 16진수로 인코딩된 비색인 이벤트 데이터.
  * `blockNumber`, `blockHash`, `transactionHash`, `transactionIndex`, `logIndex`, `removed`.
* `error` (실패 시 존재): `code`(revert의 경우 `3`, VM 오류의 경우 `-32015`) 및 `message`(`execution reverted` 등)를 포함하는 객체.

## 요금 및 CU 가중치

BlockVectra는 사용량을 Compute Unit(CU) 단위로 측정합니다. 각 JSON-RPC 메서드의 가중치는 `GET /v1/plans`를 통해 동적으로 게시됩니다:

**호출당 CU 가중치**

| 메서드 | 호출당 CU |
| --- | --- |
| `eth_simulateV1` | 20 |
| `eth_call` | 15 |
| `eth_estimateGas` | 20 |

단위 환산 공식 및 충전 세부 정보는 [요금 페이지](https://blockvectra.com/en/pricing/)를 참조하세요.

노드 동기화 중(`-32010`), 상태 윈도우 외부(`-32011`), 메서드 미지원(`-32601`)을 포함하여 거부된 요청은 과금되지 않습니다. 전체 과금 규칙은 [과금되지 않는 요청: 오류 코드 및 과금 규칙](https://docs.blockvectra.com/en/guides/billing-rules/)을 참조하세요.

## AI 에이전트 및 MCP와 함께 사용

자율 AI 에이전트는 BlockVectra의 Model Context Protocol (MCP) 서버를 통해 `eth_simulateV1`을 직접 호출할 수 있습니다.

키 인증이 포함된 `rpc_call` 도구를 사용하면 지원되는 체인에서 JSON-RPC 메서드를 실행할 수 있습니다. API key는 도구 파라미터나 대화 프롬프트 내부가 아니라 반드시 MCP 클라이언트 HTTP 헤더(`x-api-key: {api_key}` 또는 `Authorization: Bearer {api_key}`)에 구성되어야 합니다.

Robinhood Chain에서의 `rpc_call` 도구 호출 페이로드 예시:

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

에이전트는 원시 트랜잭션을 제출하기 전에 `status === "0x1"`을 확인하여 컨트랙트 상호작용의 유효성을 검증하고 가스 소비량을 평가할 수 있습니다. 설정 및 사용 지침은 [AI 에이전트 연동 가이드](https://docs.blockvectra.com/en/guides/ai-agents/)를 참조하세요.

## 다음 단계

* [무료 플랜 및 요금 확인](https://blockvectra.com/en/pricing/#free): 내 계정에 포함된 혜택 확인.
* [콘솔 로그인](https://console.blockvectra.com/login/?next=%2Fkeys%2F): API key 생성.
