트랜잭션 시뮬레이션 이야기: 드라이 런(Dry Run)은 서명된 결과가 아니다
요약
트랜잭션 시뮬레이션 시 드라이 런(Dry Run)의 한계와 올바른 활용법을 다룹니다. 단순한 결과 예측을 넘어 Ethereum 실행 API와 시뮬레이션 영수증을 통해 상태 변화와 로그를 정확히 검증하는 기술적 접근을 제안합니다.
핵심 포인트
- 드라이 런은 미래의 블록 순서나 최종 결과를 보장하지 않음
- AI 및 에이전트 지갑에서 시뮬레이션 오류의 위험성 경고
- eth_call과 eth_simulateV1의 차이 및 활용법 설명
- 시뮬레이션 결과는 추정치로서의 출처와 한계를 명시해야 함
트랜잭션 시뮬레이션 이야기
공개 사항: 소스 수집 및 편집 검토를 위해 AI 도구가 사용되었습니다. 이 기사는 인간 저자에 의해 작성되었으며, 저자가 사실, 코드 및 결론을 확인했습니다.
암호화폐 위험 고지: 이 기사는 기술적인 설명이며 투자 조언이 아닙니다. 이는 어떠한 암호화폐 자산의 매수, 매도 또는 보유를 권장하는 것이 아닙니다.
트랜잭션 시뮬레이션 이야기(Transaction Simulation Story)는 미리보기(preview)가 시뮬레이션한 내용을 정확하게 말할 때만 서명 전 유용합니다. 드라이 런(dry run)은 선택된 상태(state)에 대한 결과를 보여줄 수 있지만, 미리보기는 그 결과가 미래의 블록, 최종 순서(ordering) 또는 사용자의 전체 의도인 것처럼 가장해서는 안 됩니다.
이러한 실수는 AI 지갑(AI wallets)과 에이전트 지갑(agent wallets)에서 저지르기 쉽습니다. 트랜잭션 미리보기는 단일한 안전 계층처럼 들리지만, 실제 증거는 Ethereum 실행 API (Ethereum execution APIs), 클라이언트 디버그 메서드 (client debug methods), 프로바이더 시뮬레이션 API (provider simulation APIs), ABI 디코딩 (ABI decoding), 그리고 지갑 경고 UX (wallet warning UX)와 같은 서로 다른 계층에서 나옵니다.
시뮬레이션 영수증 (Simulation Receipt)
드라이 런은 약속(promise)을 하기 전에 영수증(receipt)이 필요합니다. 아래의 영수증은 의도적으로 프로바이더 범위(provider-scoped)로 설정되었습니다. 이는 표준 호출(standard call) 결과와 클라이언트 또는 프로바이더가 제공할 때만 존재하는 트레이스(trace), 로그(logs), 자산 변경 사항을 분리합니다.
{
"request": {
"from": "0xUser",
...
해당 영수증은 이 기사의 핵심 산출물입니다. 트랜잭션 시뮬레이션 이야기는 각 필드에 출처와 한계가 있을 때 더 안전해집니다. 왜냐하면 지갑이 "이것은 발생할 것입니다" 대신 "이것은 프로바이더의 추정치입니다"라고 보여줄 수 있기 때문입니다.
표준 호출 (Standard Call)
표준 호출 계층은 많은 미리보기가 암시하는 것보다 더 좁습니다. eth_call을 위한 Ethereum 실행 API (Ethereum Execution APIs for eth_call)는 온체인 트랜잭션을 생성하지 않고 선택된 상태에 대해 호출을 실행하는 것을 지원합니다.
이는 가치가 있지만, 전체 트레이스(full trace)는 아닙니다. 서명 전 미리보기는 eth_call 출력을 선택된 블록 컨텍스트에 대한 반환 데이터(return data) 또는 오류(error)로 취급해야 하며, 미래의 자산 변경, 호출 트리(call tree) 또는 로그에 대한 증거로 취급해서는 안 됩니다.
시뮬레이션 상태 (Simulation State)
가장 직접적인 공식 시뮬레이션 언어는 Ethereum Execution APIs eth_simulateV1에서 제공됩니다. 이 메서드는 호출을 시뮬레이션하고, 시뮬레이션된 호출 간의 상태를 누적하며, 블록 또는 상태 오버라이드 (state overrides)를 사용할 수 있습니다.
그 강력함이 곧 경고이기도 합니다. 영수증 (receipt)은 사용된 상태를 명시해야 합니다: latest, safe, finalized, pending, 특정 블록 번호, 또는 제공자 오버라이드 (provider override)입니다. 하나의 상태에서 성공적인 결과가 나왔다고 해서, 나중에 서명된 트랜잭션 (signed transaction)이 동일한 상태를 보게 될 것이라는 보장은 없습니다.
제공자 트레이스 (Provider Trace)
트레이스 (trace) 계층은 제공자 (provider) 또는 클라이언트 (client)마다 다릅니다. Geth debug_traceCall은 Geth 디버그 네임스페이스 (debug namespace)에 속하는 반면, Tenderly 시뮬레이션 및 Alchemy 시뮬레이션 API는 제공자 API를 통해 더 풍부한 트레이스, 자산 (asset)
가스(Gas) 및 수수료(fee) 미리보기에는 고유한 경계가 있습니다. Ethereum eth_estimateGas는 완료를 위한 가스를 추정하는 반면, EIP-1559는 0x02 타입 트랜잭션에 대해 최대 수수료(max fee) 및 최대 우선순위 수수료(max priority fee)와 같은 수수료 필드를 정의합니다.
그렇다고 해서 표시된 비용이 최종적인 것은 아닙니다. 기본 수수료(base fee), 우선순위 수수료(priority fee), 대기 중인 블록 제약 조건(pending block constraints), 그리고 상태 변화(state changes)는 포함(inclusion)되기 전에 변동될 수 있으므로, 지갑은 "이 상태 및 수수료 컨텍스트 하에서 추정됨"이라고 명시해야 합니다.
서명 컨텍스트 (Signature Context)
구조화된 서명(Structured signing)은 디스플레이 레이어(display layer)에는 도움이 되지만, 사용자의 이해를 증명하지는 못합니다. EIP-712는 도메인 분리(domain separation)를 포함한 타입화된 구조적 데이터 해싱(typed structured data hashing) 및 서명을 정의하며, 이는 요청을 불투명한 바이트(opaque bytes)보다 검사하기 쉽게 만들어 줄 수 있습니다.
하지만 해당 디스플레이 레이어에는 여전히 시뮬레이션 영수증(simulation receipt)이 필요합니다. 잘 타입화된 서명이라 할지라도, 사용자가 최종적인 자산 이동(asset movement), 제공자 트레이스(provider trace), 또는 MEV/주문 위험(order risk)을 확인했다는 증거는 아닙니다.
지갑 경고 (Wallet Warning)
지갑 경고는 사용자 인터페이스(UI) 레이어이지, 합의(consensus) 레이어가 아닙니다. MetaMask 트랜잭션 인사이트(transaction insights)는 Snap이 서명되지 않은 트랜잭션 요청을 검사할 수 있게 하며, MetaMask 보안 알림(security alerts)은 MetaMask 자체 시스템의 경고 동작 및 제한 사항을 문서화합니다.
이러한 특성은 AI x 크립토(crypto) 시스템에 유용한 패턴을 제공합니다. 에이전트(agent)가 영수증을 준비할 수는 있지만, 지갑은 서명 전에 여전히 메서드(method), 상태(state), 제공자(provider), 디코딩된 변경 사항(decoded change), 경고, 그리고 불확실성을 보여주어야 합니다.
순서 위험 (Ordering Risk)
마지막 경계는 순서(ordering)입니다. Flash Boys 2.0은 지갑 시뮬레이션 매뉴얼은 아니지만, 트랜잭션 순서(transaction ordering)와 우선순위 역학(priority dynamics)이 Ethereum 스타일의 시스템에서 매우 중요하다는 강력한 증거입니다.
그렇기 때문에 드라이 런 (dry-run) 이야기는 과도한 약속을 거부하는 것으로 마무리되어야 합니다. 드라이 런은 서명 (signature) 전의 많은 실수를 잡아낼 수 있지만, 멤풀 (mempool), 미래 상태 (future state), 블록 빌더 (block builder)의 동작, 또는 모든 제공자 (provider)의 디코딩 가정 (decoding assumption)을 동결할 수는 없습니다.
최종 영수증 (Final Receipt)
이 패턴은 지갑이나 에이전트 (agent)가 다음과 같이 말할 때 효과를 발휘합니다: "이것은 이 상태 (state), 이 제공자 메서드 (provider method), 그리고 이 디코딩된 필드 (decoded fields)를 사용하여 드라이 런이 확인한 내용입니다." 불확실성이 가시화되기 때문에 서명 결정은 더 나은 방향으로 이루어집니다.
이것이 바로 유지할 가치가 있는 개발자의 습관입니다. 시뮬레이션 트레이스 (simulation trace)는 예언이 아닙니다. 그것은 사용자나 에이전트가 서명하기 전의, 라벨이 붙은 증거 조각일 뿐입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기