이녀석을 해 볼꺼에요~
1.버젼설정하고 컨트렉트 초기뼈대 만들기
pragma solidity ^0.4.19;
contract Zombiefactory {
}
컨트렉트 설정 방법임
2.좀비 DNA 설정하기
contract ZombieFactory {
uint dnaDigits = 16;
}
uint 자료형은 부호 없는 정수로, 값이 음수가 아니어야 한다는 의미네.
부호 있는 정수를 위한 int 자료형도 있음
참고: 솔리디티에서
- uint는 실제로 uint256,범위[0~2^256-1] 즉 256비트 부호 없는 정수의 다른 표현임
- int256 (=int)범위[-2^255~2^255-1] 즉 음수까지 포함한다는 말임.
3.좀비 구조체 만들기
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
}
구조체 만드는방법
struct 구조체이름{
type name;
}
참고)solidity에서는 연산이 다른것 코드처럼 사용할수있다.
4.정적 배열과 동적 배열
// 2개의 원소를 담을 수 있는 고정 길이의 배열:
uint[2] fixedArray;
// 또다른 고정 배열으로 5개의 스트링을 담을 수 있다:
string[5] stringArray;
// 동적 배열은 고정된 크기가 없으며 계속 크기가 커질 수 있다:
uint[] dynamicArray;
이걸이용해서
5.public설정을해보자
public이란?
다른컨트랙트들이 이배열을 읽을 수 있게됌(쓸수는없음)
컨트랙트에 공개 데이터를 저장할 때 유용한패턴임
Zombie[] public zombies;
좀비라는 구조체를 동적배열로 설정하고 이녀석을 zombies라는 이름으로저장
6.함수 선언
function createZombie(string _name, uint _dna) {
}
fuction 함수이름(타입 인자1,타입 인자2){}이런식으로 넣어줘서 설정해야됌
7.안에 새로운 구조체설정하기
새로운 Zomibie를 생성하고 zombies 배열에 추가하는 방법
zombies.push(Zombie(_name, _dna));
위에서 무한으로 넣을 수 있는 배열을 선언했었다 여기에넣는법임!
배열이름.push(구조체이름(data));
8.Private/Public 함수
솔리디티에서는 기본적으로 public으로 선언됌
누구나 함수를 호출하고 코드를 실행 시킬 수 있음.
하지만 컨트랙트를 공격에 취약하게 만들 수있기때문에
기본적으로 private로 설정하고 나중에 공개할 함수만 public으로 선언하는것이 좋음.
function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}
관례로 private는 _함수명으로 지어줘야함
9.함수 제어자
view, pure 두가지가있는데.
1.어떤값을 변경하거나 무언가를 쓰지않을때는
view
2.반환값이 함수에 전달된 인자값에 따라서 달라지지만
읽는것은 하지않을때
pure
함수에서 적용하는 방법은 아래와같다.
function _generateRandomDna(string _str) private view returns (uint) {
}
10.Keccak256과 형 변환
내좀비의 dna를 16자리의 긴 랜덤 16진수로 만들기위해서 내장되어있는 캐착스 256이라는 녀석을 사용하자
DNA의 반환값이 어느정도 랜덤인 uint가 되기를 원하면
이해시함수를 사용하면됌 256비트 16진수로 매핑됌
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
좀비의 dna를 16자리만 받기를 원하므로 해시값을 위에서선언한 모듈로 나머지값을 리턴해준다.
11.종합
좀비의 이름을 입력값으로 받아 랜덤 DNA를 가진 좀비를 만드는 public함수를 만들어보자
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
public으로 함수를 설정해주고
uint 변수 =좀비dna만드는함수호출(인자값);
좀비만드는함수호출(이름인자, dna인자);
12.이벤트를 추가하면서 lesson1 좀비공장만들기 전체 코드를 정리해보자
이벤트란
내 컨트랙트가 블록체인상에서 내앱의 사용자 단에서 무언가 액션이 발생했을때 의사소통하는방법임
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;//배열의 첫 원소가 0이라는 인덱스를 갖기 때문에 array.push() -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);
}
}