require 와 assert 는 Solidity 에서 조건을 확인하고 예외를 처리하기 위해 사용되며, 용도와 작동 방식에서 큰 차이를 가집니다. 


require

 

용도

  • 사용자 입력 검증: 함수의 입력 값이 적합한지 확인
  • 상태 검증: 실행 전에 계약 상태가 적절한지 확인
  • 외부 호출 성공 여부 확인: 외부 컨트랙트 호출이 성공했는지 확인

작동방식

  • 조건이 false 인 경우, 예외를 발생시키고, 현재 실행 중인 트랜잭션을 되돌립니다. 
  • 모든 변경된 상태는 롤백되며, 사용된 가스는 소비되지 않은 부분이 환불됩니다. 

사용 예

function transfer(uint256 amount) public {
	require(amount > 0, "Amount must be greater than 0");
}

 


assert

 

용도

  • 논리적 불변성 검사: 절대 변하지 않아야 할 상태르 ㄹ확인
  • 개발자 실수 방지: 코드의 논리적 오류를 확인

작동방식

  • 조건이 false 인 경우, 예외를 발생시키고 트랜잭션을 되돌립니다.
  • 상태를 롤백하지만, 사용된 가스는 환불되지 않습니다. 
  • assert의 실패는 코드에 치명적인 버그가 있음을 나타냅니다. 
  • Solidity 0.8.0 부터는 언더플로우 및 오버플로우 검사에도 사용됩니다. 

 

function calculate(uint256 x, uint256 y) public pure returns (uint256) {
	uint256 result = x + y;
    assert(result >= x); //오버플로우 확인
    return result;
}

 


사용시 주의점

  1. require 는 사용자이 잘못된 입력 또는 외부 호출 오류에 대응하기 위해 사용됩니다. 예를 들어, 잘못된 토큰 송금 요청을 처리할 때 적합합니다. 
  2. assert 는 절대적으로 보장되어야 하는 논리를 확인하기 위해 사용됩니다. 개발자의 논리적 실수 또는 코드의 중요한 결함이 발생했을 때 사용합니다. 
  3. 가스 처리 차이를 이해하고, 사용자 입력 검증에는 반드시 require 를 사용해야 합니다. 

 


레퍼런스

Solidity 공식 문서 - Error Handling

Ethereum Best Practices - Assert vs Require

OpenZeppelin Contracts - Error Handling

+ Recent posts