챕터 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);
'Language > Solidity' 카테고리의 다른 글
solidity 기본 문법 5. 상속, Interface, 다수 return 값 처리 with 크립토좀비 (0) | 2021.05.31 |
---|---|
solidity 기본 문법 4. 상속, Import, Storage, Memory with 크립토좀비 (0) | 2021.05.31 |
solidity 기본 문법 2. return, view, pure, Keccak256, event with 크립토좀비 (0) | 2021.05.31 |
solidity 기본 문법 1. contract, variable, struct, private, public with 크립토좀비 (0) | 2021.05.31 |