Cute Bow Tie Hearts Blinking Pink Pointer

블록체인/솔리디티

[Solidity] 솔리디티 View 와 Pure

청포도 에이드 2022. 7. 18. 16:47
728x90

 

솔리디티로 스크립트를 작성할 때, 아래와 같이 contract 정의를 할 때 view<<<<를 많이 보았을 것이다.

대체 얘가 무엇인지 알아보자.  

 

아래 코드는 내 블로그에서 가져온 일부 코드이다.

contract Counter{
    uint256 private _count;
    event Count(uint256 count);

    function current() public view returns(uint256){
        return _count;
    }

    function increment() public{
        _count += 1;
        emit Count(_count);
        
    }

        function decrement() public{
        _count -= 1;
        emit Count(_count);
    }
}

 

view의 위치는 접근제한자(public, private등) 앞, 뒤  어디든 붙여도 상관이없다.

 

    function current() public view returns(uint256){
        return _count;
    }
    function current()  view public returns(uint256){
        return _count;
    }

 

둘다 가능하며, 저 위치에는 view말고도 pure 또한 들어갈 수 있다.

 

자, 이제 어떤 경우에 view가 들어가고, pure가 들어가는지 알아보자.(안 들어가는 경우도 있음. 아래에서 따로 설명하겠다.)

 

1. View

storage state 를 읽을 수 있지만, 그 state 값을 변경할 수 없다.

 

이 설명을 처음 봤을 때 내가 가장 먼저 했던 생각은 이게 무슨 소리지?였다.

 

쉽게 설명하자면, function 밖의 것들은 storage state에 저장이 된다는 말이다.

 

아래의 코드를 보자.

 

contract Counter{
    uint256 private _count;
    event Count(uint256 count);

    function current() public view returns(uint256){
        return _count;
    }
}

 

function 밖에 있는 _count는 storage state에 저장한다는 얘기이다.

 

그런데 함수 안에서는 storage state 값을 읽어, _count를 return해야하니 view를 붙여야하는 것이다.

 

 

만약, _count 값을 바꾸고 싶다면 어떻게 해야할까?

 

    function increment() public{
        _count += 1;
        emit Count(_count);
        
    }

위처럼 그냥 아무것도(view, pure 둘다 x) 안 써주면 된다.

 

2. pure : storage state 를 읽으면 안되고, 그 state값을 변경할 수 도 없다.

 

pure는 storage state를 읽지 못하고, 변경도 불가하니 당연히, 함수 밖의 외부의 값을 가져올 수 없다.

그러니 함수 내에 정의된 로컬변수들과 논다.

 

예시 코드이다.

contract Pure_example{
    
    function read_a() pure public returns(uint256){
        uint256 a2 = 3;
        return a+2;
    } 
}

함수 안에 정의된 변수들과 놀고 있다.

 

 

정리

 

view : function 밖의 변수들을 읽을수 있으나 변경 불가능

pure : function 밖의 변수들을 읽지 못하고, 변경도 불가능

viwe 와 pure 둘다 명시 안할때: function 밖의 변수들을 읽어서, 변경을 해야함.

728x90