https://cryptozombies.io/en/lesson/1/chapter/9
https://velog.io/@dogfootbirdfoot/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EC%8A%A4%ED%84%B0%EB%94%94-11%EC%A3%BC%EC%B0%A8
9장: 프라이빗/퍼블릭 함수
Solidity에서는 public기본적으로 기능이 있습니다. 이것은 누구나(또는 다른 계약)이 계약의 기능을 호출하고 해당 코드를 실행할 수 있음을 의미합니다.
분명히 이것이 항상 바람직한 것은 아니며 계약을 공격에 취약하게 만들 수 있습니다. 따라서 private기본적으로 함수를 표시한 다음 public세상에 노출하려는 함수만 만드는 것이 좋습니다.
개인 함수를 선언하는 방법을 살펴보겠습니다.
uint[] numbers;
function _addToArray(uint _number) private {
numbers.push(_number);
}
이는 계약 내의 다른 함수만 이 함수를 호출하고 numbers배열에 추가할 수 있음을 의미합니다.
보시다시피 private함수 이름 뒤에 키워드를 사용합니다. 그리고 함수 매개변수와 마찬가지로 개인 함수 이름은 밑줄( _)로 시작하는 것이 관례입니다.
이번주는 저번주에 못다한 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);
}
}
}