KoreanFoodie's Study

Solidity 튜토리얼 #1 : 기본 문법 본문

Tutorials/Solidity

Solidity 튜토리얼 #1 : 기본 문법

GoldGiver 2022. 9. 20. 18:06

크립토 좀비(https://cryptozombies.io/) 에서 제공하는 튜토리얼을 통해 배우는 Solidity 문법을 정리하고 있습니다!


먼저, Solidity 는 코드가 contract 단 아래에서 작성되어야 한다. 이게 가장 기초적인 항목으로, 아래 예제 코드에서는 ZombieFactory 라는 contract 내부에서 코드를 작성했다.

// 어떤 버전을 쓸 것인지 명시. 0.5.0 이상, 0.6.0 미만
pragma solidity >=0.5.0 <0.6.0;

contract ZombieFactory {

    // Javascript 에서의 이벤트와 거의 동일한 문법이다
    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    // 제곱을 ** 로 표현
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    // 접근 지정자를 지정할 수 있다
    // 아래는 dynamic array 이고, [2] 같은 식으로 쓰면 fixed array 이다
    Zombie[] public zombies;

    // private function 앞에는 '_' 를 붙이는 것이 관례이다
    // 매개변수 전달 시 string, arrays, structs, mappings 에는 memory 가 붙는다
    function _createZombie(string memory _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        emit NewZombie(id, _name, _dna);
    }

    // 함수는 view 또는 pure 로 설정할 수 있다
    // view 는 app 내의 변수를 읽되, 변경하지 않는다는 뜻이고,
    // pure 는 app 내의 변수를 사용조차 안한다는 뜻이다
    function _generateRandomDna(string memory _str) private view returns (uint) {
        uint rand = uint(keccak256(abi.encodePacked(_str)));
        return rand % dnaModulus;
    }

    // 반환 값이 없으면 returns 를 안 써도 된다
    function createRandomZombie(string memory _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

위의 코드는 주어진 이름으로 난수를 생성하고, 좀비 객체를 만드는 기능을 수행한다.

 

추가적으로 배운 점 / 느낀 점을 적어보자면 다음과 같다.

  • function 밖에 선언된 변수는 State Variable 이라고 하며, 블록체인에 영구히 저장된다(진짜?)
  • 다음과 같이 쓰면 자동으로 getter 가 만들어 진다 : Zombie[] public zombies;
  • uint8, uint16, uint... 사이의 암시적 변환이 이루어지지 않아 명시적 캐스팅을 잘 해줘야 하는 것 같다(이건 추측임)

 

Comments