블록체인 스터디 [11주차]

개발새발·2021년 7월 26일
0

블록체인 스터디

목록 보기
7/25

블록체인 스터디 [11주차]

이번주는 저번주에 못다한 Cryptozombies lesson4 학습을 끝냈다. 난수 생성에 대한 개념 외에는 딱히 새로운 문법적인 내용은 없었고 지금까지 배운 개념을 가지고 좀비 전투 시스템을 구현했다.

keccak256을 통한 난수 생성

솔리디티에서 난수를 만들기에 가장 좋은 방법은 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을 가볍게 읽기 시작했는데 앞으로 시간 날때마다 틈틈히 조금씩 읽고 블로그로도 짧게나마 정리해볼 생각이다.

profile
블록체인 개발 어때요

0개의 댓글