[몰라도 해보는 cryptoZombie] Lesson2. 좀비가 희생물을 공격하다 – 3

in #kr6 years ago

image.png

https://cryptozombies.io/ko/course

챕터 7: storage vs memory

image.png

storage와 memory다! 여기서 제대로 설명해준다. Storage는 영구적으로 블록체인 상에 기록, memory는 임시 저장이라고 생각하면 된다. Storage는 하드디스크, memory는 ram에 비유했는데 적절한 비유라고 생각한다.
일반적으로 solidity에서 알아서 처리해주지만 구조체(struct)와 배열을 다룰 때는 storage와 memory의 선언이 필요하다. 지금은 선언하는 방식과 이런게 있구나만 알면 될 듯.

요구사항대로 작성하면 다음과 같다.

pragma solidity ^0.4.19;

import "./zombiefactory.sol";

contract ZombieFeeding is ZombieFactory {

    function feedAndMultiply(uint _zombieId, uint _targetDna) public {
             require(msg.sender == zombieToOwner[_zombieId]);
             Zombie storage myZombie = zombies[_zombieId];
    }
}

여태 다루었던 내용의 총집합 같다. 함수의 public 선언, require 구문, 구조체 선언과 대입. 추가된부분은 storage에 myZombie를 새긴다는 것! Zobie라는 struct 변수를 선언하고 그 안에 zombies 배열에 _zombieId 에 있는 데이터를 넣는다.

챕터 8: 상속

image.png

이제 좀비가 누군가를 물었을떄 좀비로 변하는 녀석의 DNA를 구현해 본다. 크립토좀비에서는 내 좀비 DNA와 먹이의 DNA의 평균값이 새로운 좀비의 DNA값이 되게끔 정했다.

function feedAndMultiply(uint _zombieId, uint _targetDna) public {
    require(msg.sender == zombieToOwner[_zombieId]);
    Zombie storage myZombie = zombies[_zombieId];

    _targetDna = _targetDna % dnaModulus;

    uint newDna = (myZombie.dna + _targetDna) / 2;
    _createZombie("NoName", newDna); 
}

feedAndMultiply 함수를 완성해 보면 위와 같다. 먼저 _targetDna를 16자리만 남도록 정리해주고, 새로운 dna를 newDna로 선언하고 계산해 값을 채워넣는다. 그 다음 _createZombie 함수를 호출해 새로운 좀비를 만든다.

가만.. 그런데 _createZombie함수는 private 선언을 해두지 않았나? 이렇게 호출해서 써도 작동하는거야???

챕터 9: 함수 접근 제어자 더 알아보기

image.png

의문을 품자마자 크립토좀비가 private 선언을 해놨기 때문에 앞에서 처럼 쓰면 안된다고 가르쳐준다. 그래서 새로운 접근 제어자인 internal과 external을 배우는데.. 우리가 쓰는 함수 접근 제어자를 정리하면 다음과 같다.

  • external : 외부에서만 접근 가능. (다른 컨트랙트나 트랜잭션에서만 호출 가능)
  • public: 어디서나 접근 가능.
  • internal : 내부에서만 접근 가능(상속된 컨트랙트에서 호출 가능)
  • private: 내부에서만 접근 가능(상속된 컨트랙트에서 호출 불가능)

아하. 그러면 _createZombie에 선언된 private을 internal로 바꿔주면 zombiefeeding 컨트랙트에서도 _createZombie를 사용할 수 있다. (왜냐면 zombiefeeding 컨트랙트는 zombiefactory 컨트랙트를 상속하니까!)

function _createZombie(string _name, uint _dna) internal {
    uint id = zombies.push(Zombie(_name, _dna)) - 1;
    zombieToOwner[id] = msg.sender;
    ownerZombieCount[msg.sender]++;
    NewZombie(id, _name, _dna);
}

참고문헌
https://d2fault.github.io/2018/03/19/20180319-about-solidity-1/

코어 이더리움 프로그래밍 – 박재현, 오재훈, 박혜영

Sort:  

음? 뭐죠이걶ㅎ 흥미로운데요?!

cryptoZombie라는 이더리움 Solidity 기본 문법을 가르쳐주는 콘텐츠에요ㅎㅎ 포스팅해가며 완주를 목표로 도전중입니다! 흥미롭게 봐주셔서 감사합니당 ㅎㅎ

화이팅!!

힘내겠습니다!!

짱짱맨 출석부 호출로 왔습니다.

짱짱맨 짱!

Coin Marketplace

STEEM 0.20
TRX 0.12
JST 0.028
BTC 61841.74
ETH 3420.69
USDT 1.00
SBD 2.47