Solidity에서 예외 처리를 위해 주로 사용되는 함수는 require()revert()입니다. 이 두 함수는 조건이 충족되지 않을 경우 트랜잭션을 되돌리고 상태 변경을 취소하는 데 사용됩니다. 그러나 사용 목적과 상황에 따라 차이가 있습니다.

require() 함수:

  • 용도: 주로 입력 값 검증, 함수 전제 조건 확인, 외부 계약 호출의 반환 값 검증 등에 사용됩니다. 예를 들어, 함수가 실행되기 전에 특정 조건이 만족되는지 확인할 때 사용합니다.
  • 동작: 조건이 false일 경우, 트랜잭션을 되돌리고 남은 가스를 호출자에게 반환합니다. 또한, 오류 메시지를 제공하여 문제의 원인을 설명할 수 있습니다.
  • 예시:
  function transfer(address recipient, uint amount) public {
      require(balance[msg.sender] >= amount, "Insufficient balance");
      balance[msg.sender] -= amount;
      balance[recipient] += amount;
  }

 

위 코드에서 require는 송신자의 잔액이 전송하려는 금액보다 크거나 같은지 확인합니다. 조건이 만족되지 않으면 트랜잭션이 되돌려집니다.

revert() 함수:

  • 용도: 보다 복잡한 조건을 처리하거나 특정 분기에서 트랜잭션을 명시적으로 되돌리고자 할 때 사용됩니다. if 문과 함께 사용되어 특정 조건에서 트랜잭션을 중단시킬 수 있습니다.
  • 동작: revert()가 호출되면, 트랜잭션이 즉시 되돌려지고 남은 가스는 호출자에게 반환됩니다. 또한, 오류 메시지를 포함시켜 문제의 원인을 전달할 수 있습니다.
  • 예시:
  function withdraw(uint amount) public {
      if (balance[msg.sender] < amount) {
          revert("Insufficient balance to withdraw");
      }
      balance[msg.sender] -= amount;
      payable(msg.sender).transfer(amount);
  }

 

위 코드에서 revert는 조건이 만족되지 않을 경우 트랜잭션을 되돌리고 오류 메시지를 제공합니다.

require()revert()의 비교:

  • 사용 시점: require()는 주로 함수의 초반에 전제 조건을 확인할 때 사용되며, revert()는 함수 실행 중 특정 조건에서 트랜잭션을 중단시킬 때 사용됩니다.
  • 가스 반환: 두 함수 모두 조건이 만족되지 않을 경우 트랜잭션을 되돌리고 남은 가스를 호출자에게 반환합니다.
  • 오류 메시지: 두 함수 모두 오류 메시지를 제공할 수 있지만, require()는 간단한 조건 검증에, revert()는 보다 복잡한 로직이나 조건에 적합합니다.

요약하면, require()는 함수 실행 전에 입력 값이나 상태를 검증하는 데 사용되며, revert()는 함수 실행 중 특정 조건에서 트랜잭션을 명시적으로 되돌리고자 할 때 사용됩니다. 적절한 상황에 맞게 이들 함수를 활용하여 스마트 컨트랙트의 안정성과 신뢰성을 높일 수 있습니다.

+ Recent posts