solidity

21.07.15 mapping, msg.sender, require

슈팅스타제제 2021. 7. 16. 01:11

CryptoZombies chap.2-01~04

✔mapping ( key => value ) data명; 

(뭘로 찾을 건지 => 뭘 찾을 건지)

//얘 지갑 주소가 이건데 얘의 계좌에 얼마 있는지 찾아줄래
mapping(address => uint) public accountBalance;
//userId가 이건데 얘의 이름이가 어떻게 되니
mapping(uint => string) userIdToName;
//좀비 ID가 이건데 얘 주소가 어떻게 되니 
mapping (uint => address) public zombieToOwner;
//좀비 주소가 이건데 현재 좀비 몇 마리니
mapping (address => uint) ownerZombieCount;

✔msg.sender : 함수를 호출한 주소 / 스마트 컨트랙트 자체 주소

this같은건가?

//좀비 생성 함수!
function _createZombie(string _name, uint _dna) private {
    uint id = zombies.push(Zombie(_name, _dna)) - 1;

>>zombies 배열에 좀비 구조체를 하나 넣는다. 여기서 zombies.push(Zombie(_name, _dna))는 배열에 새로운 구조체 하나를 넣고 난 배열의 최종 길이를 반환한다. 인덱스 값은 배열의 길이보다 1씩 작기 때문에 1을 뺀 값을 id에 저장한다. 

    zombieToOwner[id] = msg.sender;
    ownerZombieCount[msg.sender]++;

>>ZombieToOwner라는 mapping으로 검색하면 반환하는 값인 Owner address를 msg.sender에 저장한다. 

ownerZombieCount라는 mapping에서 다음 주소로 검색하고 반환하는 값에 +1씩 해준다. 좀비 한마리 탄생~

     NewZombie(id, _name, _dna);
}

>>새로운 Zombie 가 나타났다! 는 이벤트 호출한다. 인자로는 id, _name, _dna를 넘겨준다.

//랜덤 Dna를 생성하는 함수!
function _generateRandomDna(string _str) private view returns (uint) {
    uint rand = uint(keccak256(_str)); 
    return rand % dnaModulus;
}

>>keccack256 해시 함수로 string을 해싱한 값을 uint로 형변환한다.

 

✔require(조건식) : 함수를 완전히 실행시키기 전에 조건을 만족하는지 확인하는 작업에 사용

    function createRandomZombie(string _name) public {
        require(ownerZombieCount[msg.sender] == 0);
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

>>msg.sender로 매핑한 좀비가 몇마리인지에 대한 값이 0이다? 그러면 함수 실행!

 

전체 코드는 다음과 같다.

//컴파일러 버전 설정
pragma solidity ^0.4.19;

//Contract in solidity is simillar as class in C++
contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

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

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        zombieToOwner[id] = msg.sender;
        ownerZombieCount[msg.sender]++;
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        require(ownerZombieCount[msg.sender] == 0);
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

'solidity' 카테고리의 다른 글

21.07.28 diamond problem  (0) 2021.07.28
21.07.27 ERC-20 Token Contract  (0) 2021.07.28
21.07.23 Token Role  (0) 2021.07.26
21.07.22 Mint & Burn Token  (2) 2021.07.24
21.07.15 import, inheritance, storage, memory  (0) 2021.07.16