크립토좀비 솔리디티 #8 - Private / Public 함수

    본 포스팅은 크립토좀비(Crypto Zombies)의 레슨1 챕터9 (Private / Public 편)의 내용들을 비개발자를 대상으로 설명하고 풀이 하였습니다. 크립토좀비는 룸 네트워크(Loom Network)라는 블록체인 기반의 게임 스타트업이 만든 게임을 만들어보는 이더리움 개발 강의로서 매우 재미있고 쉽게 솔리디티(Solidity)를 배울 수 있는 가이드를 제공합니다.



    Private과 Public의 개념


    함수의 성격은 기본적으로 Private과 Public으로 나뉘어져 있습니다. Private은 해당 컨트랙트 내에서만 사용이 되는 것이며, Public은 다른 컨트랙트에서도 호출이 가능한 열려져 있는 성격을 지닙니다.


    어떤 건물이 있다고 할 때, Public은 사람들이 건물을 들어올 수 있게 만드는 현관 같은 것이라 한다면, Private은 건물 안에서만 존재하는 화장실 문 같은 것입니다. 


    일반 가정집의 화장실 문을 현관문처럼 외부에서 열 수 있게 하면 당연히 안될 것입니다



    즉 이와 같이 Private은 외부에 노출이 되면 안되는 함수를 선언합니다. 내부의 알고리즘에서만 사용하고 민감한정보를 가지고 있다고 한다면 더더욱 Private으로 선언을 하게 될 것입니다. 예를 들어서, 회원 정보를 조회하는 컨트랙트가 있는데 다른 컨트랙트에서 접근을 해서 사용한다면 사용자의 정보를 함수로 취득할 수 있는 위험성이 있을 것입니다.



    Private 선언 예시

    uint[] numbers;


    function _addToArray(uint _number) private {

      numbers.push(_number);

    }


    위 함수는 어떤 번호를 배열에 넣는 것인데 외부에서 이 함수를 호출하게 된다면 예상치 못한 값들이 들어가는 불상사가 일어날 것입니다. 이럴 경우 private으로 생성하면 이러한 문제점들이 사라지게 됩니다. Private으로 선언하는 순간 해당 함수는 같은 컨트랙트 영역에 있는 곳에서만 호출 할 수 있습니다.


    private 선언은 위의 예시처럼 함수명 다음에 적으며, 솔리디티 내의 관례로, private으로 선언된 함수는 언더바(_)를 선언하게 됩니다.



    문제 및 문제풀이


    pragma solidity ^0.4.19;

    contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
    string name;
    uint dna;
    }

    Zombie[] public zombies;

    function createZombie(string _name, uint _dna) {
    zombies.push(Zombie(_name, _dna));
    }

    }


    문제

    우리 컨트랙트의 createZombie 함수는 현재 기본적으로 public으로 선언되어 있네. 즉, 누구나 이 함수를 호출해서 새로운 좀비를 컨트랙트에서 만들 수 있다는 뜻이지! 이 함수를 private로 선언해 보세.


    createZombie 함수를 변경하여 private 함수로 만든다. 함수명에 대한 관례를 잊지 말 것!



    문제풀이

    function _createZombie(string _name, uint _dna) private {
    zombies.push(Zombie(_name, _dna));
    }



    크립토좀비 원본 링크


    댓글

    Designed by JB FACTORY