보안 및 블록체인/블록체인

솔리디티(Solidity) 기본 언어/문법 정리 #3, 이더리움 Dapp개발을 위해 - [블록체인]

1Seok 2022. 1. 21. 15:45

※ 기본적인 프로그래밍 지식이 있다는 전제하에 작성함.

'★'은 처음 접할 수 있는 내용

Solidity

- library

- modifier


Library

솔리디티에서 라이브러리는 특정 주소에 한번 배포되어 다양한 컨트랙트에서 재사용하기 위한 코드

Using x for y : x 라이브러리의 Y함수 or 구조체등을 사용한다는 의미

더보기
더보기

★ 이더리움에서의 라이브러리는 계약 상태를 변경하기 위한 것이 아니라 입력 및 반환 결과에 따른 단순 작업을 수행하는 데에만 사용해야 함

@openzeppelin의 Counters.sol의 Counters라이브러리를 사용하고 싶을 때

@openzeppeliz의 Counters.sol

예제)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Counters.sol";

contract nft_721{
    using Counters for Counters.Counter;
    // Default : 0 선언
    Counters.Counter public _tokenIds;

    function get_val2() public view returns(Counters.Counter memory){
        // Counters.Counter memory me = _tokenIds;
        return _tokenIds;
    }
    
    function val_incre() public{
        _tokenIds.increment();
    }

    function val_decre() public{
        _tokenIds.decrement();
    }
}


★ Modifier

모듈을 동기화시켜 Modifier 명령어 내부에 _; 에서 부터 선언한 함수 명령어를 실행하라는 의미

※ _;는 큐(Quque) 처럼 쌓을 수 있음 (예제보면 단번에 이해할 수 있음)

 

fuinction 함수명(get_a()) public Modifier명(onlytest) returns (uint) 식으로 만들기

pragma solidity >=0.7.0 <0.9.0;

contract er_tetst{

    uint a = 0;
    
    modifier onlytest{
        a += 500;
        require(a < 1500, "higer");

        // _; 이부분에 함수 넣겠다는 의미
        _;
        
    }
    
    function get_a() public onlytest returns(uint){
        return a;
    }
}

 

아래처럼 실행됨

    modifier onlytest{
        a += 500;
        require(a < 1500, "higer");


        _; <------- 여기서 부터 다른 함수 호출
        get_a()   <-------- 이런 느낌으로 실행됨
    }

require 함수 조건식으로 인해 1500 넘어가니 에러남

 

 


★ assert, revert, require

- Gas환불 X, 조건식 O -

assert : gas를 다 소비한후, 특정한 조건에 부합하지 않으면 에러를 발생

        assert (a <= 1500);   

// 조건 False일 때 에러출력 즉, a = 1550이면   1,550 <= 1500(False) 에러출력

 

- Gas환불 O, 조건식 X -

revert: 조건없이 에러를 발생시키고, Gas소모 후 에러나면 gas를 환불 

        revert("higer");

 

- Gas환불 O, 조건식 O -

require: 특정한 조건에 부합하지 않으면 에러를 발생시키고, Gas소모 후 에러나면 gas를 환불

        require(a < 1500, "higer");