Gas limit

트랜잭션에서 사용할 수 있는 가스의 한도를 지정한다. 유저가 컨트랙트콜을 할 때 지정할 수 있다. 가스 리밋만큼 가스를 사용했는데도 트랜잭션이 완료되지 않았다면 해당 트랜잭션은 실패한다.

Gas limit과 DoS

체인 별로 하나의 트랜잭션/블록에서 사용할 수 있는 최대 가스 리밋이 정해져있다. 따라서 한 트랜잭션에서 이를 넘기게 할 수 있다면 DoS 문제로 이어질 수 있다. 일반적으로 view 함수는 온체인에서 호출하는 게 아니라면 제한은 없지만, 노드 별 쿼리 가능한 제한을 둔다. view 함수의 DoS 문제를 보고할 것이라면 노드 별 제한을 근거로 하자.

다음은 체인 별 max gas limit이다. 변경될 수도 있으니 확인 후 사용하자.

chainmax gas limitview
Ethereum30,000,000geth의 디폴트 제한: 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