챕터 7: Public 함수 & 보안
복습이다! 우리 함수를 검토해본 결과 feedAndMultiply 함수가 public으로 선언되어 있다는게 문제다. 아무나 접근하면 안되는데ㅠ 그래서 internal 선언을 해준다.
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) internal {
require(msg.sender == zombieToOwner[_zombieId]);
Zombie storage myZombie = zombies[_zombieId];
require(_isReady(myZombie));
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) / 2;
if (keccak256(_species) == keccak256("kitty")) {
newDna = newDna - newDna % 100 + 99;
}
_createZombie("NoName", newDna);
_triggerCooldown(myZombie);
}
그리고 쿨타임 기능을 추가한다. 먼저 쿨타임이 아니여야 먹이를 먹을 수 있으므로 쿨타임인지 확인하는 _isReady함수에 myZombie를 넣는다. return으로 bool타입을 받으므로 그냥 require 안에 집어넣으면 된다. 이제 쿨타임이라면 함수실행이 멈추게 된다.
함수가 끝까지 실행된 경우 _triggerCooldown(myZombie)를 호출해 쿨타임이 설정되게 만든다.
흠.. 그러면 쿨타임이 시간에 지남에 따라 줄어들어야하는데 그건 또 어떻게 구현한담..
챕터 8: 함수제어자 톺아보기
톺아보기라는 표현을 쓰다니… 번역하신 분의 한국어 능력이 좋으신 것 같다. 톺아보기는 샅샅이 살펴본다는 순우리말 표현이다. 즉.. 복습해본다는 이야기. modifier를 복습해보면서.. 사실 인자도 받을수 있지롱! 하는 챕터.
그렇다. 인자를 받을 수 있다. modifier선언시 함수 인자 받을 때처럼 받으면 되고, 함수에 modifer를 달 때 인자 값을 넣어주면 된다. 참 쉽다.
요구사항대로 코드를 짜면 아래와 같다.
modifier aboveLevel(uint _level, uint _zombieId) {
require(zombies[_zombieId].level >= _level);
_;
}
훗…
챕터 9: 좀비 제어자
이제 아까 만든 modifier를 사용해보자. 그러기 위해서 새로운 함수를 선언해야한다. 까짓꺼 정리하면 아래와 같다.
function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) {
require(msg.sender == zombieToOwner[_zombieId]);
zombies[_zombieId].name = _newName;
}
function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) {
require(msg.sender == zombieToOwner[_zombieId]);
zombies[_zombieId].dna = _newDna;
}
생각보다 엄청 단순하다. 레벨2때 사용할 수 있는 changeName 함수와 레벨 20때 사용가능한 changeDna를 작성하면 된다. 해당 함수의 사용 조건은 modifier에 선언시 정의된 인수값들을 통해 결정되고.. require를 사용해 좀비주인과 함수사용요청자가 같은 사람인지 확인하는 구문을 넣는다. (어차피 확인할꺼 modifier에 넣어도 되지 않을까싶다.. 난 반복되는 코드가 싫으니까..)
참고문헌
https://d2fault.github.io/2018/03/19/20180319-about-solidity-1/
코어 이더리움 프로그래밍 – 박재현, 오재훈, 박혜영