본문 바로가기
블록체인교육/솔리디티

[솔리디티] 7. 에러(error), 함수수정자(modifier)

by Danny_Kim 2022. 6. 8.

[NEW] 누구나 쉽게 따라하는 솔리디티 강의(솔리디티 버전 0.8.13)

1. Helloworld, 카운터컨트랙트, 데이터타입

2. 변수, 상수, 불변, 상태변수 읽고 쓰기

3. 이더 단위, 가스와 가스가격

4. 조건문, 반복문, 맵핑(mapping)

5. 배열, 열거형(enum), 구조체(calldata,memory) 

6. 데이터 저장공간, 함수(view,pure 속성)

7. 에러(error), 함수수정자(modifier)

8. 이벤트(events), 생성자(constructor), 상속

9. 상속, 섀도잉,super키워드 함수 속성들

10. 인터페이스(interface), payable, 이더전송,받기 관련

11. Fallback, Call, Delegate(솔리디티 업그레이드 기법)

12. 함수 선택자(function selector), 다른 컨트랙트 사용 및 생성기법

13. Try Catch, Import(임포트), Library(라이브러리)

14. ABI 디코드, hash 함수, 서명검증, 가스최적화

* 블록체인 전문가들도 놓치기 쉬운 비트코인, 이더리움의 핵심가치 강의

 

블록체인 전문가들도 놓치기 쉬운 비트코인, 이더리움의 핵심 가치 - 인프런 | 강의

블록체인 기획자,개발자,회사 대표라면 반드시 한번은 봐야 하는 강의입니다. 따로 공부할 시간이 없었다면, 이 요약본 강의를 통해서 비트코인,이더리움 백서의 핵심을 이해할 수 있습니다., -

www.inflearn.com

 

1. 에러(error)

 - 에러가 발생하면 트랜잭션 중에 발생하는 모든 상태변화를 취소(undo) 합니다.

 - require, revert, assert 를 사용할 수 있음

 - require : 실행 전에 조건과 입력값을 확인하는데(검증하는데) 사용됨

 - revert : require와 유사함, 예제코드에서 확인, 가스비가 더 발생 (좀 더 엄격한 상황에서 사용)

 - assert : 코드가 절대로 false가 되어서는 안되는 상황을 체크, assert 결과가 실패이면 코드에 아마도 버그가 있음을 의미

 

1.1 require()

  - 입력값

  - 실행 전 조건 체크

 - 다른 함수의 호출에 대한 값 반환

 

1.2 revert()

 - 조건이 복잡한 경우에 유용하게 사용할 수 있음 (여러 조건의 상황)

1.3 assert()

 - assert는 내부 오류 테스트를 위해서 사용 (추가적으로 불변량을 체크하기 위해서 사용)

 - 아래 예제에서 num은 항상 0이어야 하는 상황에서 assert로 검증가능

 

1.4 사용자 정의 에러

   - 아래 예제와 같이 사용자 정의 에러를 만들 수 있음.

전체소스파일

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Error {
    function testRequire(uint _i) public pure {
        // Require should be used to validate conditions such as:
        // - inputs
        // - conditions before execution
        // - return values from calls to other functions
        require(_i > 10, "Input must be greater than 10");
    }

    function testRevert(uint _i) public pure {
        // Revert is useful when the condition to check is complex.
        // This code does the exact same thing as the example above
        if (_i <= 10) {
            revert("Input must be greater than 10");
        }
    }

    uint public num;

    function testAssert() public view {
        // Assert should only be used to test for internal errors,
        // and to check invariants.

        // Here we assert that num is always equal to 0
        // since it is impossible to update the value of num
        assert(num == 0);
    }

    // custom error
    error InsufficientBalance(uint balance, uint withdrawAmount);

    function testCustomError(uint _withdrawAmount) public view {
        uint bal = address(this).balance;
        if (bal < _withdrawAmount) {
            revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});
        }
    }
}

 

1.5 Deposit와 withdraw 예제

 

 

소스파일

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Account {
    uint public balance;
    uint public constant MAX_UINT = 2**256 - 1;

    function deposit(uint _amount) public {
        uint oldBalance = balance;
        uint newBalance = balance + _amount;

        // balance + _amount does not overflow if balance + _amount >= balance
        require(newBalance >= oldBalance, "Overflow");

        balance = newBalance;

        assert(balance >= oldBalance);
    }

    function withdraw(uint _amount) public {
        uint oldBalance = balance;

        // balance - _amount does not underflow if balance >= _amount
        require(balance >= _amount, "Underflow");

        if (balance < _amount) {
            revert("Underflow");
        }

        balance -= _amount;

        assert(balance <= oldBalance);
    }
}

 

2. 함수 수정자(function modifier)

 - 수정자는 함수 호출 전후에 실행할 수 있는 코드

 - 수정자를 사용하여, 엑세스 제한, 유효한 입력값 확인, 재진입 해킹으로부터 보호 가능

 

 - owner, x, locked 상태변수 설정. 그리고 오너의 주소를 생성자를 통해서 저장.

- 수정자(modifier)를 사용하여 owner만 사용, 유효한 주소에 대해서 체크.

- 수정자(modifier)의 경우에 문법 마지막에 _; 를 사용. (솔리디티에서의 수정자 문법)

- 위 수정자 정의 후, 아래의 함수 실행시 owner 변경에 대해서 사전 체크함.

 

- 수정자는 함수가 사용되기 전, 후에 호출될 수 있음

- 이 수정자는 함수가 실행되는 동안 호출되는것을 방지함.

- 재진입 해킹으로부터의 보호. (decrement에서 실행)

 

소스출처 : https://solidity-by-example.org/

 

블록체인 교육 문의는 아래 링크 참고 바랍니다. 

https://kimsfamily.kr/414

 

블록체인 교육 커리큘럼 및 프로필

안녕하세요 제 프로필을 간략하게 정리하였습니다. 비즈니스 문의는 dannykim@kakao.com 으로 연락주시기 바랍니다. 감사합니다. 프로필) 블록체인 강의 경력) 1. 블록체인 강의 (20년~현재) 2022년  -

kimsfamily.kr

 

반응형

댓글0