Gas limit
트랜잭션에서 사용할 수 있는 가스의 한도를 지정한다. 유저가 컨트랙트콜을 할 때 지정할 수 있다. 가스 리밋만큼 가스를 사용했는데도 트랜잭션이 완료되지 않았다면 해당 트랜잭션은 실패한다.
Gas limit과 DoS
체인 별로 하나의 트랜잭션/블록에서 사용할 수 있는 최대 가스 리밋이 정해져있다. 따라서 한 트랜잭션에서 이를 넘기게 할 수 있다면 DoS 문제로 이어질 수 있다. 일반적으로 view 함수는 온체인에서 호출하는 게 아니라면 제한은 없지만, 노드 별 쿼리 가능한 제한을 둔다. view 함수의 DoS 문제를 보고할 것이라면 노드 별 제한을 근거로 하자.
다음은 체인 별 max gas limit이다. 변경될 수도 있으니 확인 후 사용하자.
| chain | max gas limit | view |
|---|---|---|
| Ethereum | 30,000,000 | geth의 디폴트 제한: 50,000,000 |
Gas limit DoS 테스트 스크립트
Foundry 테스트 스크립트이다. 소모된 가스가 max gas limit보다 많음을 보인다.
function test_gaslimit_dos() public {
uint256 gasBefore = gasleft();
Contract.test();
assert(gasBefore - gasleft() > 30_000_000);
gasBefore = gasleft();
Contract.test();
assert(gasBefore - gasleft() > 50_000_000); // for view function
}tags: blockchain, gas