EIP-7825 트랜잭션 가스 한도 상한 (Transaction Gas Limit Cap)

최종 확정 · 수수료·가스 · 원문 상태 Final · 2024-11-23 작성

트랜잭션 하나가 쓸 수 있는 가스를 프로토콜 차원에서 16,777,216(2^24)으로 제한합니다. 이 상한은 블록 가스 한도와 무관하게 적용됩니다.

왜 필요한가

지금은 트랜잭션 하나가 이론상 블록의 가스 한도 전체를 혼자 쓸 수 있습니다. 이런 초대형 트랜잭션에는 세 가지 위험이 따릅니다. 첫째, 한 트랜잭션이 블록 처리 부담을 독차지해 네트워크를 흔드는 서비스 거부(DoS) 공격의 통로가 될 수 있습니다. 둘째, 가스를 많이 쓰는 트랜잭션은 보통 큰 상태 변경을 일으켜 노드가 저장해야 할 데이터를 빠르게 불립니다. 셋째, 블록 검증 시간이 길어져 사용자 경험과 네트워크 탈중앙화에 나쁜 영향을 줍니다. 블록 가스 한도를 올리는 흐름에서는 이 위험이 더 커집니다. 트랜잭션 하나가 쓸 수 있는 가스에 상한을 두면 단일 트랜잭션 DoS 위험이 줄고 블록 안에서 가스가 더 고르게 배분되며 극단적인 블록 검증 시간을 막아 노드 간 동기화가 안정됩니다.

무엇이 바뀌나

지금

EIP-7825 이후

누구에게 영향이 있나

심층 설명

상한 값과 적용 범위

어떤 트랜잭션도 16,777,216(2^24) 가스를 넘는 가스 한도를 지정할 수 없습니다. 이 상한은 채굴자나 검증자가 정하는 블록 가스 한도와 독립적으로 적용되며 블록 가스 한도가 이 값보다 높아도 개별 트랜잭션에는 그대로 상한이 걸립니다. 상한을 넘는 gasLimit을 지정한 트랜잭션은 MAX_GAS_LIMIT_EXCEEDED 같은 적절한 오류 코드와 함께 거부됩니다. 클라이언트 구현에서는 트랜잭션의 GAS_LIMIT 파라미터가 16,777,216으로 캡핑됩니다.

두 단계 검증: 트랜잭션풀과 블록

집행 지점은 두 곳입니다. 먼저 트랜잭션 검증 단계에서, 발신자가 지정한 gasLimit이 16,777,216을 넘으면 그 트랜잭션은 무효 처리되어 트랜잭션풀에 포함되지 않습니다. 다음으로 블록 검증 단계에서, 처리 전 검증의 일부로 gasLimit이 16,777,216을 넘는 트랜잭션을 하나라도 담은 블록은 블록 자체가 무효로 판정되어 거부됩니다. 트랜잭션풀을 우회해 블록에 직접 담는 경로까지 막는 구조입니다.

왜 16,777,216(2^24)인가

2의 거듭제곱 경계값이라 구현이 단순해지면서도 컨트랙트 배포나 복잡한 디파이(DeFi) 상호작용을 포함한 대부분의 복잡한 트랜잭션을 수용할 만큼 큽니다. 이 값은 통상적인 블록 크기(3,000만~4,000만 가스)의 약 절반에 해당하므로, 블록 하나에 여러 트랜잭션이 들어갈 수 있게 보장합니다.

하위 호환성과 영향 범위

16,777,216을 넘는 가스 한도를 지정하는 트랜잭션과는 하위 호환되지 않습니다. 그런 트랜잭션은 더 작은 작업 여러 개로 나눠야 합니다. 다만 오늘날 대부분의 트랜잭션은 제안된 상한보다 훨씬 아래에 있어서 영향받는 사용자와 디앱은 극히 적을 것으로 예상됩니다. 가스 사용량이 상한 아래인 트랜잭션은 영향이 없고 기존 도구와 디앱은 새 상한을 반영하는 소규모 업데이트만 하면 됩니다. 잠재 영향을 평가하는 실증 분석도 수행되었습니다.

보안 관점의 효과와 남는 과제

고정 상한은 과도하게 큰 가스를 쓰는 트랜잭션이 일으키는 DoS 공격 위험을 줄입니다. 개별 트랜잭션에 상한이 걸리면 블록 검증이 더 예측 가능하고 균일해집니다. 극단적인 사례는 과제로 남습니다. 대형 컨트랙트 배포처럼 매우 복잡한 일부 트랜잭션은 16,777,216 가스 상한 안에 맞도록 설계를 다시 해야 할 수 있습니다.

EIP 원문 · ← EIPs