pragma solidity >=0.5.0 <0.6.0; /// solidity의 버전을 지정해줌.
contract ZombieFactory { //모든 코드는 contract안에서 이루어져야함.
event NewZombie(uint zombieId, string name, uint dna); //event를 정의함.(알림같은거)(함수가 호출 됐음을 알려주는데 사용)
uint dnaDigits = 16; //uint는 uint256과 같은 뜻으로, unsigned int 256-bit를 뜻함. uint8, uint16 등 다양함. 웬만해선 uint
uint dnaModulus = dnaDigits ** 10; //**(제곱)연산자 지원함
struct Zombie { //구조체 자료형을 지원함
string name;
uint dna;
}
Zombie[] public zombies; // public은 다른 contract들이 read O but write X
// type[(size)] (authority) variable; 이런식으로 선언을 하며, size를 쓰면 고정된 크기의 array, 안쓰면 가변적 array. 접근
// 범위도 써도되고 안써도 됨.
function createZombie (string memory _name, uint _dna) public { //function 정의
//function function_name (type (memory) argument_name) (public/private) // memory는 call-by-reference라는 뜻.
//memory라고 안쓰면 call-by-value가 됨.
//인자들의 이름은 관례적으로 맨 앞에 underscore(_)가 붙음
//public으로 선언되면 누구나 함수를 호출해서 사용이 가능하고, private이면 임의 호출 불가함.
zombies.push(Zombie(_name,_dna)); //push는 Array의 맨 뒤에 원소를 추가함.
//구조체를 하나 만들때는 struct_name(변수 내용(','로 순서대로 나열))
}
function _createZombie (string memory _name, uint _dna) private {
//public으로 선언되면 누구나 함수를 호출해서 사용이 가능하고, private이면 임의 호출 불가함.
//이때, 관례적으로 private으로 선언된 함수의 이름 앞에는 underscore(_)가 붙음
uint id = zombies.push(Zombie(_name,_dna))-1;//push는 현재 array의 크기를 return함. index는 0부터 시작하므로 -1
emit NewZombie(id,_name,_dna); //emit는 event를 발동(fire)시킴.
}
function _generateRandomDna (string memory _string) private view returns (uint) {
//함수가 외부에 영향을 주는 것에 따라 (view/pure)로 선언을 나눌 수 있으며,
//view는 외부의 값을 변경하거나 write하는 것이 없다는 뜻
//pure은 외부의 state를 read하지도 않는다는 뜻. 오직 parameter만 이용해서 동작.
//returns (타입)의 선언을 통해서 어떤 종류의 값을 return할건지 선언함.
uint random = uint(keccak256(abi.encodePacked(_str)));
return random % dnaModulus; //dna는 16자리이므로 16자리로 잘라줌.
//keccak256라는 hash function은 byte type의 input을 256 비트짜리 random한 16진수 숫자로 바꿔줌(mapping).
//이때, byte type로의 변환을 위해 abi.encodePacked를 이용하면 input을 byte type으로 바꿔줌.
}
function createRandomZombies(string memory _name) public {
uint rand = _generateRandomDna(_name);
_createZombie(_name,rand);
//name을 input받아 새로운 Zombie를 만들어서 zombie Array에 push함.
}
}
'프로그래밍 > Solidity' 카테고리의 다른 글
Solidity - CryptoZombies - Lesson #2 (0) | 2022.09.18 |
---|