이녀석을 해 볼꺼에요~

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);
    }

}

 

 

복사했습니다!