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 |