본문 바로가기

Solidity

[ 솔리디티 이더리움 , 크립토좀비 ] mapping

mapping은 키,value(값:데이터 타입)저장소로. 데이터를 저장하거나 검색하는데 이용한다.

 

매핑 선언 구문

mapping(key=>value)매핑선언이름

예) mapping( string => uint ) test;

 

일단 저장먼저.

 

매핑은 솔리디티에서 데이터를 저장하는 또 다른 방법이다.

파이선의 해싱에서 해시함수와 비슷한 개념으로, 키 값과 발유 값을 저장하는 함수로써 그 값들의 데이터 타입을 먼저 선언해 둔 것이다.

 

예를들어 학생 출석부를 만들고 싶을때 출석부를 만들 테이블을 먼저 만들어 놓는 느낌이다.

쿼리문이랑도 비슷한 것 같다. CREATE문이랑 SELECT WHERE문을 같이 사용할 수 있는 함수느낌?

 

아래 테이블을 생성한다고 할때 :

 

studentNum(INT) studentName(STRING)
1 유명
2 무명
3 우멍

 

쿼리문으로 작성시 -

CREATE TABLE studentTable (studentNum INT, studentName STRING);

 

mapping 으로 작성시 -

mapping ( uint => string ) studentTable;

 

이것또한 public과 private으로 오픈여부를 결정할 수 있다.

 

 

테이블에 키값과 발유값들을 넣을때 : 

 

쿼리문으로 작성시 -

INSERT INTO studentTable (studentNum,studentName) VALUES (1,"유명");

 

mapping으로 작성시 -

studentTable[1] = "유명";

 

 

테이블에서 키값으로 발유값을 가지고 올때 :

 

쿼리문으로 작성시 -

SELECT studentName FROM studentTable WHERE studentNum=3;

// return값 : "우멍"

 

mapping으로 작성시 -

studentTable[1];

// return값 : "유명"

 

 

이렇게 테이블을 만들었고 만약 학생번호 2의 이름을 바꾸고 싶다면 이 테이블 전체를 다시 짜야하는데 mapping을 사용한다면 특정 번호를 지적해서 바꾸는게 가능하다.

 

 

이제 크립토 좀비의 Lession2, 챕터3를 기준으로 문제를 풀어보자.

 

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

 

일단 나에게는 두가지 mapping, 위의 글로 보자면 두가지의 table(또는 객체)이 있다.

 

일단 내 아이디를 구하는 함수를 만든다.

 

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        // 여기서 시작
        NewZombie(id, _name, _dna);
    }

 

이 함수에서 mapping으로 키값에는 id를, address값에는 내 현재 주소를 넣어보자.

 

 

솔리디티에는 모든 함수에서 사용할 수 있는 전역 변수들이 있는데 그중에 하나가 msg.sender이다.

msg.sender는 현재 함수를 호출한 사람이나 스마트 컨트렉터의 주소를 가리킨다.

 

그럼 이 msg.sender를 통해 내 주소를 알아냈으니 mapping으로 ZombieToOwner에 저장해보자.

 

ZombieToOwner[id] = msg.sender;

 

Query문으로 친다면 INSERT INTO ZombieToOwner (id,address) VALUES (id,msg.sender);

 

그 다음 저장된 주소(msg.sender)를 고려해서 ownerZombieCount를 증가시킨다.

 

 

일단 mapping으로 현재 주소의 count값을 가지고 온다.

 

ownerZombieCount[msg.sender];

 

query로 쳤을때는 SELECT int FROM ownerZombieCount WHERE address=msg.sender;

 

그럼  이제 증가시켜주기위해 ++를 사용한다.

 

ownerZombieCount[msg.sender]++;