본문 바로가기

Language/Solidity

solidity 기본 문법 3. mapping, Msg.sender, require with 크립토좀비

챕터 2-2: 매핑과 주소


** 데이터베이스에 저장된 좀비들에게 주인을 설정하여 게임을 멀티 플레이어 게임만들기 **

mapping은 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법

ex)

// 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장
    mapping (address => uint) public accountBalance;

    // 혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다 
    mapping (uint => string) userIdToName;




실습 시작

pragma solidity ^0.4.19;

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;
        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 {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}



챕터 2-3 Msg.sender


msg.sender

: 솔리디티에는 모든 함수에서 이용 가능한 특정 전역 변수들이 있다

그 중의 하나가 "현재 함수를 호출한 사람" (혹은 스마트 컨트랙트)의 주소를 가리키는 msg.sender


참고: 솔리디티에서 함수 실행은 항상 외부 호출자가 시작하기 때문에

컨트랙트는 누군가가 컨트랙트의 함수를 호출할 때까지 블록체인 상에서 덩그러니 존재

그러니 항상 호출자인 msg.sender가 있어야 함

msg.sender를 활용하면

이더리움 블록체인의 보안성을 이용할 수 있게 된다

즉, 누군가 다른 사람의 데이터를 변경하려면

해당 이더리움 주소와 관련된 개인키를 훔치는 것 밖에는 다른 방법이 없다



챕터 2-4 require



** 각 플레이어가 이 함수를 한 번만 호출할 수 있도록 만들어보자**

require를 활용하면 특정 조건이 참이 아닐 때 함수가 에러 메시지를 발생하고 실행을 멈추게 된다

ex)

require(ownerZombieCount[msg.sender] == 0);