본문 바로가기
블록체인/WEB3 개발

솔리디티 기본 문법 - 이벤트 및 에러 핸들링

by 제이제이_은재 2022. 7. 8.
반응형

 

💡솔리디티 기본 문법 - 이벤트 및 에러 핸들링

 

✓ 이벤트

 

이벤트는 어떤 결과가 발생했을 때 해당 컨트랙트에서 dApp 클라이언트 또는 다른 컨트랙트에게 전달한다. 컨트랙트는 event 키워드를 사용해 이벤트를 설정하고, 경우에 따라 emit 키워드를 사용해 이벤트를 실행한다. 이벤트가 실행된 경우, 트랜잭션에 기록된다.

 

contract coinTransfer {
    // event 이벤트명(파라미터 유형1 파라미터1, 파라미터 유형2 파라미터2, ...)
    event Transfer(address from, address to, uint256 value);
    function transfer(address to, address amount) {
        // ...

        // emit 이벤트명(인자1, 인자2, ...)
        emit Transfer(msg.sender, to, amount);
        }
}

 

 

✓ 에러 핸들링

 

솔리디티에서 에러를 처리할 때는 assert, require, revert 함수를 사용한다.

 

* revert: 해당 함수를 종료하고 에러를 리턴한다.

* require, assert: 설정한 조건이 참인지 확인하고, 조건이 거짓이면 에러를 리턴한다.

 

revert는 다음과 같이 사용할 수 있다.

contract VendingMachine {
    address owner;

    function buy(uint amount) public payable {
        if (amount > msg.value / 2 ether){
            revert("Not enough Ether provided."); // 에러를 리턴하면서 에러메시지를 지정할 수 있다.

            // 송금 진행
        }
    }
}

 

require 는 그 자체로 if...revert 처럼 사용되는 게이트키퍼 역할을 한다.

 

* 게이트키퍼(gatekeeper) : 조건을 만족하면 특정 동작을 실행하고, 조건을 만족하지 않으면 실행하지 못하도록 하는 역할

 

가령, 위의 VendingMachine 컨트랙트의 buy 함수를 아래의 코드와 완전히 동일하게 작동한다.

 

contract VendingMachine {
    address owner;

    function buy(uint amount) public payable {
        require(
            amount <= msg.value / 2 ether, // 주어진 조건이 참이면 넘어가고, 거짓이면 에러 리턴
            "Not enough Ether provided." // 에러 메시지를 지정할 수 있다.
        );

        // 송금 진행
    }
}

 

assert 는 require 와 사용법이 동일하나, 사용하지 않은 가스를 호출자에게 반환하지 않고 공급된 가스를 모두 소모하여 상태를 원래대로 되돌린다.

반응형

댓글