본문 바로가기
전공공부/블록체인공학

Solidity 함수의 타입제어 : view와 pure

by 으노으뇨 2021. 11. 11.
728x90
반응형
SMALL

함수의 호출범위

public 내부 계약 또는 외부 계약 호출 시 사용 가능
internal 내부 계약 또는 상속 계약에서 호출 가능
V 아무것도 적지 않으면 기본적으로 internal임 (default)
private 계약 안에서만 호출 가능
external 외부 계약 호출 시에만 사용 가능, 같은 함수 내부에서는 호출 불가
함수의 호출 범위를 Visibility 라고 한다. Visibility를 설정하지 않으면, "경고" 가 나오면 internal로 처리됨!
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Callsize {
    uint a = 1;
    uint b = 2;

    function test() view returns (uint) {
        return a; // 스토리지에 저장된 변수
    }
}


//실행은 되지만, 
//함수 호출범위를 적지 않아 경고가 발생한다.

a와 b를 상태변수로 선언했고, 상태변수는 스토리지라는 곳에 저장된다. 스토리지는 영구적인 것이라. 우선 저장은되어

실행은되지만, 호출범위를 적지않아 경고가 발생한다. 그래서 함수명 옆에 반드시 함수 호출 범위를 입력해야한다.

실제 컴파일단에서 알려준다! 호출범위를 선언하니 바로 빨간줄이 사라진 모습(이클립스)


이제 함수호출범위에 대해 알아보았으니 읽고쓰기에 관한 view와 pure 에 대해 공부해보자

1) view

  • 스토리지에 저장된 변수를 읽어올 수만 있음 - 수정불가
  • 상태변수만 사용할 경우 사용
  • 상태변수와 지역변수를 함께 사용할 경우 사용

 

view라고 하는 것은 스토리지에 저장된 변수를 읽어올 수만 있고, 상태변수만 사용할 때는  view를 사용한다. 

그리고 상태변수하고 지역변수를 함께 사용할 때도 view를 사용한다.  보편적으로 타입 제어를 하려면 view를

많이 사용한다. 지역변수만 사용하는 경우에는 pure를 사용하고 그렇지 않은 경우에는 view를 많이 사용한다.,

view라고 하는 것은,  view라고 하는 타입 제어가 붙은 그런 함수를 호출했을 때는 가스를 소모하지 않는다.

왜냐하면 지금 여기에 변수를 읽어만 오고 수정하지 않는다고 했기떄문이다.

이 로컬 노드에서 데이터만 조회하고 따로 어떤 수정하거나 거래하거나 그런 것들이 없기 때문에 가스를 소모하지 않는

것이다.

즉 기존에 있는 걸 읽어만 오는 경우에는 가스를 소모하지 않는다

2)pure

  • 스토리지에 저장된 변수를 사용할 수 없다. - 읽거나 수정을 할 수 없다....
  • 지역변수만 활용할 경우 pure 사용이 권장된다. (view 를 사용하여도 error는 없지만, 경고메시지가 나온다.)

pure 같은 경우에는 어떤 데이터에도 접근하지 않는 걸 의미한다.

 pure 같은 경우, pure라고 하는 타입 제어를 쓰면 스토리지에 저장된 변수를 사용할 수 없다.

즉 읽어오거나 수정하거나 그런 작업을 전혀 할 수 없다. 어떤 데이터에도 접근하지 않는다고 하는 그런 내용인것이다.

 지역변수만 활용할 경우 pure를 사용할 것을 권장한다. 만약 view를 사용하는 경우에 앞서도 이제 비슷한 사례가 있었

던 것 같은 view를 사용해도 에러는 없어요. 하지만 경고메시지가 나온다. 이 경고메시지는 향후 다른 코드를 사용해

이 함수를 여러 번 참조할 경우 잘못하면 에러가 나올 수 있다는 소지가 있다고 하는 것을 경고하는 것이다.

그러기에 경고메시지가 나오면 조금 주의깊게 봐야함.

지역변수만 사용할 경우에는 pure를 사용한다. 그리고 입력 매개변수만 사용할 경우에도 역시 pure를 사용하는 게 옳다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract View {

    uint a = 1;
    uint b = 2;

    function test() public view {
        a;
    }
}
//상태변수만 사용, view 사용해야함

상태변수만 사용하므로 뷰를 사용하고 있느 옳은 예이다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Localview {

    function test() public view {
        uint c= 3;
    }

}

현재 지역변수만 사용했지만 view를 사용했다.

에러는 없지만 경고메시지가 나타났다. pure  사용을 권장하고있다.

이클립스에서도 경고창이 나타난다.

이후 대충 실행은 되지만 향후 미래 에러의 소지가 될 수 있으므로 계속 경고창을 내주는 것이다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Stutspure {
    uint a = 1;
    uint b = 2;

    function test() public pure {
        a;
    }

}

상태변수만 사용했는데 pure를 썼다. 그럼 오류가 난다. 오류의 내용은 pure말고 view를 쓰라는 얘기이다.

이클립스에서도 에러창이뜬다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Localpure {
    uint a = 1;
    uint b = 2;

    function test() public pure {
        uint c = 3;
        c;
    }

}​

상태변수인 a,b를 안쓰고  지역변수 c만 사용했다. 그리고 pure를 쓰니 경고도없이 잘 사용된다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Pure {
    uint a = 1;
    uint b = 2;

    function test() public pure returns (uint) {
        return a;
    }
}

a는 상태변수인데 pure를 사용했으니 오류가 뜨는 것이 당연하다. 이젠 외울법해진다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Purereturn {
    uint a= 3;
    uint b= 3;

    function test() public pure returns (uint) {
        uint c = 3;
        return c;
    }
}

지역변수만 사용했고 지역변수만 리턴한다. 이럼 오류가 없고 정상적으로 반환값이 나온다.


예제
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Inputvaluepurereturn {
    uint a= 1;
    uint b= 2;

    function test(uint c, uint d) public pure returns (uint) {
        return c + d;
    }
}

입력 매개변수를 받았다. 이걸 받아서 반환값으로 보내는 것이다. 

이때 입력매개변수도 "지역변수"로 인지하고 사용해야한다. 그래서 pure가 옳으며, 에러가 없다.

728x90
반응형
LIST

댓글