자주나오는패턴

[Common Vulnerabilities] DoS With Block Gas Limit

0xperiagoge 2024. 1. 3. 23:36

스마트 계약이 배포되거나 그 안의 기능들이 호출될 때, 이러한 작업들의 실행은 항상 필요한 계산량에 따라 일정량의 가스를 필요로 한다. 이더리움 네트워크는 블록 가스 한도를 지정하고 블록에 포함된 모든 거래의 합은 이 한도를 초과할 수 없다. 

 

시간이 지남에 따라 커지는 큰 배열이 있을 것으로 예상된다면 주의가 필요하다. 전체 데이터 구조를 통해 루핑하는 작업은 피해야 한다.

크기가 불확실한 배열을 반드시 사용해야 하는 경우에는, 이 작업이 여러 블록에 걸쳐 이루어질 수 있으며, 따라서 여러 거래가 필요할 수 있다.

 

function ifillArray() public returns (bool){
        if(listAddresses.length<1500) {

            for(uint i=0;i<10000;i++) {
                listAddresses.push(msg.sender);
            }
            return true;

        } else {
            listAddresses = new address[](0);
            return false;
        }
    }

10,000개를 한 번에 배열에 넣으려고 했을 때

같은 코드에서 2000개로 했을 때는 성공은 하지만 gas를 많이 사용한다. 

 

[ 참고 및 추가자료 ]

https://swcregistry.io/docs/SWC-128/