블록체인 TIL) 크립토좀비 lesson1 complete

2022. 5. 27. 00:08BlockChain/크립토좀비

pragma solidity ^0.4.25;

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;
        emit NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(abi.encodePacked(_str)));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

알게된 내용 

1. 모든 solidity 코드는 버전 선언으로 시작한다. 

2. 상태변수 (state Variable) 컨트랙트 저장소에 영구 저장된다 = 블록체인에 기록된다. 

uint 부호 없는 정수, int 부호 있는 정수 

부호 없다는 말은 값이 음수가 되면 안된다라는 의미이다. 

uint는 실제로 uint256을 뜻하며, uint8/uint16/uint32 등과 같이 uint를 더 적은 비트로 선언할 수도 있다. 

특별한 경우가 아니라면 uint만 사용 ! 

3. 복잡한 자료형을 다루기 위해서 struct 구조체를 사용한다. 여러 특성을 가진 자료형들을 struct 안에 한 번에 선언할 수 있다. 

4. string은 임의의 길이를 가진 UTF-8 데이터를 위해 활용된다. 

5. 함수 인자명 앞에 _(언더바)를 기입하는 것은 전역변수와 구별하기 위하는데, 이것은 관례이다. (의무는 아님) 

6. 구조체 배열 생성하고 활용하는 법 

 

struct Person { 
	uint age;
    string name; 
} 

Person[] public people; 

// Person 구조체를 통해 새로운 Person을 생성하고 people 배열에 추가 
// 새로운 사람 생성
Person JeongHoon = Person(31,"JeongHoon"); 

// JeongHoon을 배열에 추가한다. 
people.push(JeongHoon); 

//위의 두 줄을 조합하여 people.push(Person(31,"JeongHoon"));

* array.push()는 무언가의 배열 끝에서 모든 원소가 순서를 유지하도록 한다. 

ex) uint[] numbers; 

numbers.push(5); 

numbers.push(10); 

numbers.push(15); 

// numbers 배열은 [5,10,15]와 같다.

 

위의 코드에서는 아래 부분이다. 

   struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        emit NewZombie(id, _name, _dna);
    }

7. view() , pure() 함수 

view 속성을 가진 함수는 Storage 레벨에 있는 자료를 읽어서 보여줄 수는 있지만, 수정할 수는 없다. 

pure() 함수는 Storage 레벨에 있는 자료를 읽어오지도 못한다. 함수가 앱에서 어떤 데이터도 접근하지 못한다. 

> solidity 컴파일러에서 어떤 제어자를 써야하는지 경고 메시지를 통해 알려준다. 

 

8. keccak-256 

SHA-1,SHA-2에 내재하는 보안 취약점을 개선하고자 개발된 해시화 알고리즘. 

고정 길이의 해시값(메시지 다이제스트)을 출력하고 256비트 16진수로 변환하여 반 랜덤인 반환값 출력. 기본적으로 같은 문자가 입력되면 동일한 결과값이 출력되므로 반 랜덤. 

 

9. solidity 이벤트 

solidity의 모든 코드들은 컨트랙트를 통해 클라이언트와 통신한다.

ex) 메타마스크로 누군가에게 1 ETH 전송하며, 이 때 금액을 전송하는 행위는 '전송' 버틈을 누름과 동시에 진행된다.

이 전송 버튼이 눌려졌을 때 컨트랙트의 실행 내용이 일어나는 것이고, 전송 버튼은 항상 클라이언트의 요청에 귀기울이고 있는 이벤트이다. 

 

// 이벤트 선언 
event IntegersAdded(uint x,uint y,uint result); 
function add(uint _x,uint _y) public { 
	uint result = _x + _y; 
 
// 이벤트를 실행하여 앱에게 add 함수가 실행되었음을 알린다 
	IntegersAdded(_x,_y,result); 
    return result; 
}
// 클라이언트 측의 결과 
YourContract.IntegersAdded(function(error,result){ 
 // 결과와 관련된 행동 
}