이번주는 저번주에 못다한 Cryptozombies
lesson4 학습을 끝냈다. 난수 생성에 대한 개념 외에는 딱히 새로운 문법적인 내용은 없었고 지금까지 배운 개념을 가지고 좀비 전투 시스템을 구현했다.
솔리디티에서 난수를 만들기에 가장 좋은 방법은 keccak256
해시 함수를 쓰는 것이다.
다음과 같은 방식으로 난수를 만들어낼 수 있다 :
// Generate a random number between 1 and 100 :
uint randNonce = 0;
utin random = uint(keccak256(now, msg.sender, randNonce)) % 100;
randNonce++;
uint random2 = uint(keccack256(now, msg.sender, randNonce)) % 100;
keccak을 통한 난수 생성은 정직하지 않은 노드의 공격에 취약하다는 치명적인 단점이 있다. 난수를 생성하는 다른 방법은 이더리움 블록체인 외부의 난수 함수에 접근할 수 있도록 오라클
을 사용하는 것이다. 오라클
에 대한 자세한 내용은 향후 레슨에서 다룰 것이다.
pragma solidity >=0.5.0;
import "./zombiehelper.sol";
contract ZombieAttack is ZombieHelper {
uint randNonce = 0;
uint attackVictoryProbability = 70;
function randMod(uint _modulus) internal returns(uint) {
randNonce++;
return uint(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _modulus;
}
function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) {
Zombie storage myZombie = zombies[_zombieId];
Zombie storage enemyZombie = zombies[_targetId];
uint rand = randMod(100);
if (rand <= attackVictoryProbability) {
myZombie.winCount++;
myZombie.level++;
enemyZombie.lossCount++;
feedAndMultiply(_zombieId, enemyZombie.dna, "zombie");
} else {
myZombie.lossCount++;
enemyZombie.winCount++;
_triggerCooldown(myZombie);
}
}
}
금요일부터는 Mastering Ethereum
을 가볍게 읽기 시작했는데 앞으로 시간 날때마다 틈틈히 조금씩 읽고 블로그로도 짧게나마 정리해볼 생각이다.