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

eth_simulateV1을 사용하여 온체인에 트랜잭션을 전송하기 전에 여러 트랜잭션을 사전에 실행하고 상태 변경을 검사하세요. 지원되는 체인 메서드 정책, 실행 사양 요청 페이로드, CU 요금 가중치 및 AI 에이전트 MCP 연동을 알아봅니다.

블록체인 네트워크에 트랜잭션을 브로드캐스트하기 전에 이를 사전 실행(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 정의)에 따르면 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로 교체하세요:

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"
    ]
  }'

응답 구조 확인

이더리움 실행 사양에 따라 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_simulateV120
eth_call15
eth_estimateGas20

단위 환산 공식 및 충전 세부 정보는 요금 페이지를 참조하세요.

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

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 도구 호출 페이로드 예시:

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

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

다음 단계

최종 수정일:

이 페이지의 내용