이 부분은 크립토 좀비를 통해 솔리디티를 학습하면서 배운 내용을 정리하는 것이다.
과거 블록체인을 처음 알게 되었을떄 크립토 좀비에 대한 강의를 수강하면서 알게 되었는데
이때 너무 어려워서 잘 따라가지 못했던 기억이 나서 이번에 시간을 내서 솔리디티를 다시 심화적으로 공부할 것이다.
pragma solidity ^0.4.19;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
내용은 전체적은 진행 사항을 한번에 올린뒤에 천천히 알아보는 방식으로 진행 할 것이다.
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
별다른 것은 없다.
간단하게 변수들을 선언하였고 그리고 구조체를 만들어 주었다.
그후 구조체에 맞춰서 배열을 만들어 주었다.
dnaModulus
는 일종의 해시값을 처리하기 위함이다.
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
새롭게 안 사실은 함수를 private로 선언을 하게 될 떄에는 함수명에 _
를 추가한다.
_createZombie
이떄 솔리디티는 push를 하게 되면 해당 배열의 길이가 반환이 된다고 한다.
이러한 값을 id로 취급하여 이벤트를 발동 시킨다.
_generateRandomDna
keccak256을 통해서 해시화 시키고 형을 맞춰주기 위해서 uint로 형변환 시켜주는 것이다.
그후 그 값을 return해준다.
createRandomZombie
_generateRandomDna
에서 만들어진 Dna해시 값을 활용한다.그 값을 활용하여 _createZombie
를 호출하게 되는 것이다.
일단 사용자들은 바로 createRandomZombie
에 접근을 할 수가 없다.
반드시 다른 함수를 통해서 접근이 가능하다.
기본적으로 랜덤 Dna를 생성함으로써 랜덤한 좀비를 만들어 낼 수가 있다.
그러기 때문에 흐름도는
createRandomZombie
->_generateRandomDna
->_createZombie
이렇게 진행이 되게 된다.