code4rena-2022-08-nounsdao-g13
[G‑13] Optimize names to save gas
Summary
함수의 이름을 최적화하면 함수 콜 시 함수를 더 빨리 찾을 수 있다. 이를 통해 자주 사용하는 함수의 가스를 줄이라 제안했다.
Keyword
gas optimization, method id
Vulnerability
- contracts/base/ERC721Checkpointable.sol#L39
- contracts/governance/NounsDAOLogicV1.sol#L65
- contracts/governance/NounsDAOLogicV2.sol#L57
- contracts/governance/NounsDAOProxy.sol#L40
각 함수는 methodId를 기준으로 소팅되고, 함수 콜을 할 시 낮은 methodId부터 차례대로 함수를 찾는다. 즉, methodId가 낮을수록 더 빨리 찾아지고, 순서가 하나 밀릴수록 22 gas를 추가로 소비한다. 따라서 가장 자주 호출되는 public/external 함수의 methodId가 낮도록하면 이를 호출하는 gas를 절약할 수 있다.
어떻게 methodId를 조작하는가? methodId는 기본적으로 함수 이름과 파라미터 타입을 해시하여 생성된다. 즉, 함수 이름을 bruteforce하여 낮은 methodId를 찾아볼 수 있다.
특히나 methodId에 0이 포함되면 가스가 더 절약된다. input 데이터의 바이트가 0이면 4 gas를, 0이 아니면 68 gas를 소모한다. 위 툴로 methodId의 앞 두 바이트가 0x00 인 함수 이름을 찾아내면, 함수 호출 시 전체 바이트가 0x00이 아닌 경우보다 128 gas를 절약할 수 있다.
자세한 내용은 다음 글을 참고하자.
Impact
자주 사용되는 함수의 순서가 밀려 gas가 나간다.
Mitigation
자주 사용되는 함수의 methodId를 낮게 하여 빠르게 찾을 수 있게 한다.
tags: bughunting, nouns dao, smart contract, solidity, gas optimization, gas, solidity function signature, severity gas