본문 바로가기
Hack/Cryptocurrency

Solidity Visibility, 그리고 View와 Pure 속성

by Becoming a Hacker 2023. 7. 8.
반응형

Soliditiy에서는 함수 및 State Variable을 다른 Smart Contract에서 액세스 할 수 있도록 Visibility(가시성)를 설정할 수 있습니다.

 

Visibility 종류

구분 설명
public 모든 Smart Contract와 Account에서 접근 가능함
private 기능이 정의된 Smart Contract에서만 접근 가능함
internal 내부 기능을 상속받은 Smart Contract에서만 접근 가능함
external 외부 Smart Contract 및 Account에서만 접근 가능함

 

Sample Code (Solidity)

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

contract Base {
    // Private function can only be called
    // - inside this contract
    // Contracts that inherit this contract cannot call this function.
    function privateFunc() private pure returns (string memory) {
        return "private function called";
    }

    function testPrivateFunc() public pure returns (string memory) {
        return privateFunc();
    }

    // Internal function can be called
    // - inside this contract
    // - inside contracts that inherit this contract
    function internalFunc() internal pure returns (string memory) {
        return "internal function called";
    }

    function testInternalFunc() public pure virtual returns (string memory) {
        return internalFunc();
    }

    // Public functions can be called
    // - inside this contract
    // - inside contracts that inherit this contract
    // - by other contracts and accounts
    function publicFunc() public pure returns (string memory) {
        return "public function called";
    }

    // External functions can only be called
    // - by other contracts and accounts
    function externalFunc() external pure returns (string memory) {
        return "external function called";
    }

    // This function will not compile since we're trying to call
    // an external function here.
    // function testExternalFunc() public pure returns (string memory) {
    //     return externalFunc();
    // }

    // State variables
    string private privateVar = "my private variable";
    string internal internalVar = "my internal variable";
    string public publicVar = "my public variable";
    // State variables cannot be external so this code won't compile.
    // string external externalVar = "my external variable";
}

contract Child is Base {
    // Inherited contracts do not have access to private functions
    // and state variables.
    // function testPrivateFunc() public pure returns (string memory) {
    //     return privateFunc();
    // }

    // Internal function call be called inside child contracts.
    function testInternalFunc() public pure override returns (string memory) {
        return internalFunc();
    }
}

 

external로 선언된 externalFunc() 함수는 해당 함수를 선언한 Smart Contract에서 호출할 수 없으나, Account에서는 호출 가능함

선언된 Smart Contract에서 호출 불가
Accounts를 통한 실행 결과

 

private로 선언된 privateFunc() 함수는 해당 함수를 상속받은 Smart Contract에서 호출할 수 없으나, 해당 함수를 선언한 Smart Contract에서는 호출할 수 있음

상속 받은 Smart Contract에서 privateFunc 호출 불가
선언한 Smart Contract에서 호출 가능

 

위 코드를 보다보면, pure라는 속성을 볼 수 있는데요. view와 pure에 대해서도 알아보도록 하겠습니다.

구분 설명
view State Variable들을 읽을 수 있으나 변경하지 않을 때 부여함
(보통 get함수가 포함됨)
pure State Varaible들을 읽거나 변경하지 않고 함수에 전달된 매개 변수나 그 안에 있는 지역 변수만을 이용하여 값을 반환하는 경우 부여함

 

Sample Code (Soliditiy)

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

contract ViewAndPure {
    uint public x = 1;

    // Promise not to modify the state.
    function addToX(uint y) public view returns (uint) {
        return x + y;
    }

    // Promise not to modify or read from the state.
    function add(uint i, uint j) public pure returns (uint) {
        return i + j;
    }
}

 

Referecne 

 

Solidity by Example

 

solidity-by-example.org

 

Solidity by Example

 

solidity-by-example.org

 

Solidity - View and Pure Functions - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

댓글