이더리움 거래가 실패(Failed)로 끝났는데도 ETH가 줄었다면, 블록 탐색기에서 실패 사유와 실제 사용 가스를 확인하세요. 블록에 포함된 거래가 가스 부족이나 컨트랙트 조건 불일치로 실패하면 실행 중의 상태 변경은 되돌아가도 이미 사용한 가스의 수수료는 지불합니다. 가스를 모두 소진한 실패와 남은 가스를 보존하는 REVERT는 구분해야 합니다. 반대로 아직 대기(Pending) 상태라면 이번 글의 ‘실패 거래’ 절차가 아니라, 이전에 다룬 대기 거래 확인 절차를 따라야 합니다.
가장 먼저 할 일은 지갑의 알림 문구만 보고 다시 보내는 것이 아니라, 해당 거래 해시를 신뢰하는 블록 탐색기에서 열어 상태, 실제 사용 가스, 가스 한도, 실패 사유를 확인하는 일입니다. ‘가스비를 올리면 무조건 해결된다’거나 ‘실패한 수수료는 되찾을 수 있다’는 식의 안내는 정확하지 않습니다. 같은 컨트랙트라도 호출 기능, 당시 상태, 입력 값에 따라 필요한 계산량이 달라집니다.
실패와 대기는 전혀 다른 상태입니다
지갑에서 거래가 보이지 않거나 오래 멈춰 있으면 모두 ‘실패’라고 부르기 쉽습니다. 하지만 블록체인에서는 구분이 중요합니다. 대기 거래는 아직 블록에 들어가지 않았거나 노드가 처리하지 않은 상태입니다. 반면 실패 거래는 보통 블록에 포함된 뒤 실행되었지만, 컨트랙트가 요구한 조건을 만족하지 못했거나 실행 중 가스가 부족해 결과가 반영되지 않은 상태입니다.
이 차이는 다음 행동을 바꿉니다. 대기 거래는 같은 nonce를 사용하는 교체·취소 여부처럼 전송 대기열을 다루는 문제입니다. 실패 거래는 이미 실행 결과가 확정되었으므로 이전 거래를 취소해서 수수료를 되돌리는 문제가 아닙니다. 새 거래를 보내기 전에 실패 원인을 읽고 조건을 바로잡는 문제입니다.
| 확인 항목 | 대기(Pending) | 실패(Failed) |
|---|---|---|
| 블록 포함 여부 | 아직 포함 전일 수 있음 | 보통 포함·실행 결과가 기록됨 |
| 우선 확인할 값 | nonce, 수수료 설정, 네트워크 상태 | 실패 사유, gas used, gas limit, 컨트랙트 조건 |
| 다음 행동 | 지갑의 공식 안내에 따라 대기 상태 처리 검토 | 원인을 확인한 뒤 필요한 경우에만 새 거래 준비 |
| 피해야 할 행동 | 원인을 모른 채 여러 번 전송 | 수수료 환급을 약속하는 링크·지원자 접촉 |
가스 한도는 ‘최대로 낼 금액’과 다릅니다
가스는 이더리움에서 계산 작업의 양을 나타내는 단위입니다. 가스 한도(gas limit)는 한 거래가 실행에 사용할 수 있도록 정한 작업량의 상한입니다. 복잡한 스마트컨트랙트 호출은 단순 ETH 전송보다 더 많은 계산을 요구할 수 있습니다. 이더리움 공식 문서는 일반적인 ETH 전송에 21,000 단위의 가스 한도가 쓰인다고 설명하지만, 이를 토큰 전송·스왑·NFT·예치 같은 모든 거래에 그대로 적용하면 안 됩니다.
수수료 화면에는 가스 한도 외에도 기본 수수료(base fee), 우선 수수료(priority fee), 최대 수수료(max fee)처럼 서로 다른 값이 보입니다. 가스 한도를 크게 잡았다고 그 한도 전체를 자동으로 내는 것은 아닙니다. 실행이 정상 종료되면 사용하지 않은 가스는 청구되지 않습니다. 그러나 실행 도중 가스가 바닥나면 EVM은 지금까지의 상태 변경을 되돌리고, 이미 계산에 쓴 가스는 남습니다. 이것이 ‘거래는 실패했는데 ETH가 줄었다’고 느끼는 이유입니다.
따라서 가스 한도와 가스 가격 계열의 설정을 같은 것으로 취급하면 오판하기 쉽습니다. 가스 한도는 계산량의 상한이고, 수수료 가격은 그 계산 단위에 대해 얼마를 지불할 의사가 있는지와 관련됩니다. 대기 문제는 수수료 가격·네트워크 혼잡과 연결될 수 있지만, out of gas는 한도 자체가 실행량보다 작았다는 신호일 수 있습니다.
먼저 블록 탐색기에서 네 가지를 확인하세요
- 상태가 Failed인지 Pending인지 확인합니다. 지갑의 표시가 늦을 수 있으므로 거래 해시로 공개 탐색기를 열어 상태를 봅니다. Pending이면 새 거래를 보내기 전에 지갑의 공식 대기 거래 안내를 확인합니다.
- Gas Used와 Gas Limit을 나란히 봅니다. 사용 가스가 한도까지 닿았고 out of gas라는 사유가 보이면 한도가 부족했을 가능성이 큽니다. 다만 한도에 닿았다는 사실만으로 모든 실패 원인이 확정되지는 않습니다.
- 실패 사유와 호출 대상(To)을 읽습니다. ‘execution reverted’처럼 표시되면 가스 부족이 아니라 잔액, 허용량, 슬리피지, 판매 종료, 컨트랙트의 검증 조건 등 다른 원인일 수 있습니다. 이 경우 가스 한도만 올려 다시 보내면 같은 실패를 반복할 수 있습니다.
- 네트워크와 토큰·컨트랙트 주소를 대조합니다. 같은 이름의 토큰과 유사한 사이트가 있으므로, 지갑에서 처음 열었던 링크가 아니라 프로젝트 또는 지갑의 공식 문서에 있는 주소와 비교합니다. 익숙하지 않은 에어드롭 토큰을 발견했다면 상호작용하지 않습니다.
다음 거래의 가스 한도는 어떻게 판단할까
자동으로 제안된 값은 대부분의 일반적인 거래에서 출발점이 됩니다. 임의로 낮추어 수수료를 아끼려 하면 실행 자체가 끝나지 않을 수 있습니다. 반대로 실패할 때마다 매우 큰 숫자를 넣는 것도 해답이 아닙니다. 컨트랙트가 요구한 조건이 틀렸다면 한도를 키워도 실패할 수 있고, 실제로 필요한 수준보다 과도한 설정은 사용자가 무엇을 승인하는지 파악하기 어렵게 만듭니다.
MetaMask의 공식 안내는 out of gas 오류가 난 뒤 같은 컨트랙트의 최근 성공한 거래를 탐색기에서 확인해 가스 한도를 비교하는 방법을 제시합니다. 여기서 비교 대상은 같은 컨트랙트라는 이유만으로 충분하지 않습니다. 호출한 기능과 입력 값이 비슷한지, 네트워크가 같은지, 성공 거래가 실제로 성공 상태인지 함께 봐야 합니다. 확신이 없으면 지갑 또는 해당 서비스의 공식 지원 문서에서 그 기능의 요구 조건을 먼저 확인하는 편이 낫습니다.
특히 DeFi 서비스에서 수수료 설정을 바꾸라는 팝업이나 메신저의 안내를 받았다면 바로 따라 하지 마세요. 지갑 확장 프로그램의 공식 업데이트와 서비스의 공식 도메인을 먼저 확인합니다. ‘복구를 위해 재서명해야 한다’는 요청은 새 권한을 주거나 자산을 옮기게 할 수 있으므로, 실패 원인 확인과 별개로 취급해야 합니다.
가스 한도를 올려도 해결되지 않는 경우
실패 사유가 out of gas가 아니라면 원인을 다르게 찾아야 합니다. 예를 들어 토큰 전송에 필요한 토큰 잔액이 부족하거나, 컨트랙트에 준 허용량(allowance)이 모자라거나, 특정 기능이 일시 정지되었거나, 가격 조건·마감 조건이 맞지 않으면 실행이 되돌아갈 수 있습니다. 실패 사유가 짧거나 비어 있어도 ‘가스가 부족했을 것’이라고 단정하지 않는 이유입니다.
스왑이나 브리지처럼 외부 상태에 따라 결과가 달라지는 기능은 특히 주의가 필요합니다. 화면을 열어 둔 사이 가격 조건이나 유동성이 바뀔 수 있고, 브리지의 출발·도착 단계가 서로 다른 거래로 나뉠 수도 있습니다. 실패한 한 건만 보고 출발 자산이 사라졌다고 판단하지 말고, 각 거래 해시와 해당 서비스의 공식 상태 페이지를 분리해서 확인합니다. 낯선 탐색기 링크나 광고 검색 결과를 통해 ‘복구 도구’를 설치하지 않는 것도 기본입니다.
재시도 전 짧은 점검표
- 거래 해시의 상태가 Pending이 아니라 Failed로 확정되었는가
- 네트워크가 의도한 체인과 일치하는가
- 실패 사유가 정말 out of gas인지, 다른 revert 조건인지 확인했는가
- 지갑의 자동 제안값을 임의로 낮추지 않았는가
- 비슷한 성공 거래는 공식 탐색기에서 확인했는가
- 새 링크·메신저·원격 제어·시드 문구 요청을 거절했는가
- 재시도할 기능의 잔액, 허용량, 조건을 다시 확인했는가
마무리
이더리움 거래의 실패는 곧바로 자산이 사라졌다는 뜻도, 가스 한도를 올리면 반드시 해결된다는 뜻도 아닙니다. 실패한 거래가 블록에서 어떤 이유로 끝났는지 확인한 뒤, 가스 한도 문제와 컨트랙트 조건 문제를 나누어 보는 것이 출발점입니다. 이해되지 않는 실패 사유가 남으면 같은 거래를 연속으로 보내지 말고, 사용한 지갑과 서비스의 공식 지원 문서만 통해 다음 절차를 확인하세요.