본문 바로가기
솔리디티/크립토좀비

레슨2 챕터2, 3, 4 - 매핑, 주소 / msg.sender / require

by 멸치김밥 2022. 2. 12.
  • 주소(address)

이더리움 블록체인에는 은행계좌처럼 계정들이 있다.

'주소'는 특정 계정을 가리키는 고유 식별자 역할을 한다.

 

  • 매핑(mapping)

데이터를 저장하거나 검색해서 접근하는데에 사용된다

매핑에는 키-값(key-value) 이 들어가고 사용방법은 다음과 같다

//          키       값          사용할이름
mapping (address => uint) public abcd;

public은 함수처럼 다른 컨트랙트에서도 사용할 수 있게 만들어준다

 

  • msg.sender

msg.sender는 솔리디티 자체에 있는 내장변수같은것이다.

msg.sender는 해당 컨트랙트, 함수 등에 접근하는 외부 호출자(사용자)를 의미한다

 

msg.sender와 매핑을 활용하는 예시

// favoriteNumber라는 이름으로 address를 받아 uint를 찾는다
mapping (address => uint) favoriteNumber;

function setMyNumber(uint _myNumber) public {
  // 사용자의 주소에 대해 _myNumber가 저장되도록 favoriteNumber 매핑을 업데이트한다
  favoriteNumber[msg.sender] = _myNumber;
  // 데이터를 저장하는 구문은 배열로 데이터를 저장할 때와 동일하다 
}

function whatIsMyNumber() public view returns (uint) {
  // sender의 주소에 저장된 값을 불러온다 
  // sender가 `setMyNumber`을 아직 호출하지 않았다면 반환값은 `0`이 될 것이다
  return favoriteNumber[msg.sender];
  // 사용자의 주소를 통해 찾은 uint값을 찾아준다. 
}

 

  • require

솔리디티의 require는 JS에서의 require와는 다르다

require() 안에는 조건이 들어가고 조건에 따른 결과가 참이면 코드를 계속 읽어 내려가고

거짓이면 실행이 중지되고 트랜잭션이 롤백(rollback)된다고 한다.

(롤백은 트랜잭션이 실행되지 않은것처럼 되돌아가는데, 실행으로 소비된 이더는 원계정에서 차감된다고 한다)

if문과는 달라서 서로 바꿔서 사용할 수 없다고 한다.

 


챕터 2 답

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

챕터 3 답

        // zombieToOwner매핑에 id에 대해 사용자 주소가 저장되게 한다
        zombieToOwner[id] = msg.sender;
        // ownerZombieCount매핑에 주소에 대해 들어있는 값에 +1 해준다/초기값은 0
        ownerZombieCount[msg.sender]++;

챕터 4 답

// 사용자의 주소를 가지고 ownerZombieCount매핑되어있는 값이 0이면
// (좀비가 한마리도 없다는 뜻)
require(ownerZombieCount[msg.sender] == 0);

댓글