- Solidity v0.8.4부터 Custom Error 문법이 추가됨.
- 지금까지는 require(..., "에러메시지") 나 revert("문자열") 을 썼는데, 문자열은 가스 비용이 크고, 동적 데이터 넣기가 어려웠음.
- 이제는 error 키워드로 커스텀 에러 타입을 정의하고, revert 에러명() 형태로 호출 가능.
- 장점: 가스 절약, 의미 명확화, NatSpec 문서화 가능.
예제 1: 파라미터 없는 에러
error Unauthorized();
function withdraw() public {
if (msg.sender != owner)
revert Unauthorized();
// ...
}
- revert Unauthorized(); 하면 트랜잭션이 되돌아가고, 에러 시그니처(4바이트)가 호출자에게 반환됨.
- 문자열 기반 revert("Unauthorized") 보다 훨씬 저렴함.
예제 2: 파라미터 있는 에러
error InsufficientBalance(uint256 available, uint256 required);
function transfer(address to, uint256 amount) public {
if (amount > balance[msg.sender])
revert InsufficientBalance({
available: balance[msg.sender],
required: amount
});
}
- 파라미터를 포함해 revert 가능.
- ABI 인코딩은 일반 함수 호출과 동일 (abi.encodeWithSignature(...)).
- Ethers.js 같은 라이브러리로 에러 데이터를 디코딩해, 실제 값(available, required)을 확인할 수 있음.