[크립토좀비] Lesson.1 정리

hskim_·2022년 5월 30일
0

크립토 좀비 학습

목록 보기
1/1
post-thumbnail

Lesson.1 키워드 정리

  • 컨트랙트
    이더리움 어플리케이션의 기본적인 구성 요소, 모든 변수와 함수는 어느 한 컨트랙트에 속하게 되어있음.
    모든 프로젝트의 시작 지점.

  • Version Pragma
    pragma solidity ^0.4.19; 의 형식으로 솔리디티 코드가 시작하기 전, 필히 선언하는 코드. 이를 통해 이후 새로운 버전이 나와도 기존의 코드가 깨지지 않고 유지될 수 있음.

  • 상태 변수와 정수
    상태 변수는 컨트랙트 저장소에 영구적으로 저장됨. 그리고 이 상태 변수를 선언할 때, 변수 앞에는 변수의 자료형이 붙음. 그리고 정수를 뜻하는 uintint 가 있음. 앞에꺼는 부호가 없는, 뒤에꺼는 부호가 있는

  • 구조체
    여러 특성을 가진 복잡한 자료형을 하나로 묶어서 생성할 수 있음.

  • 배열
    솔리디티에는 정적 배열과 동적 배열이 존재함.
    각각의 선언 방식은 아래와 같음(위에가 정적, 아래가 동적), 차이는 배열의 크기를 지정하느야 마느냐.

 	uint[2] fixedArray;
	uint[] dynamicArray;
  • 구조체와 배열의 혼합
    여러 자료형을 가지는 구조체를 이용하여 배열을 만들어낼 수 있음.ㅊ
    예시는 해당 글의 마지막 부분에 정리한 코드에서 Zombie[] public zombies; 부분을 확인할 것.
    미리 설명하자면, Zombie 구조체 형태의 배열을 만들고 그 이름을 zombies라고 선언함.

  • 함수
    함수의 선언은 javascript와 비슷함. 다만, 인자 값을 넣을 때 인자 앞에 자료형을 붙여주고 의무는 아니지만, 관례처럼 인자 앞에는 _ 언더바를 붙여주어 상태변수가 아닌 인자라는 것을 구분해줌.

  • 구조체에 값 넣기

	// 아래 Person 구조체를 이용하여 새로운 사람의 변수를 생성한다면
	struct Person {
  		uint age;
  		string name;
	}
	// 다음과 같은 코드가 작성된다.
    // Person 객체 형식에 맞추어 satoshi라는 사람의 나이와 이름을 변수에 저장.
	Person satoshi = Person(172, "Satoshi");
  • Private와 Public 함수 선언
    함수를 선언할 때, 따로 명시가 안되면 기본적으로 Public 상태에서 선언 됨.
    Public은 현재 컨트랙트 함수를 다른 컨트랙트가 호출 및 실행할 수 있지만, Private로 선언할 경우 불가능함.

  • 반환값
    javascript에서 함수에 return값이 존재하는 것과 같음. 다만, 표현하는 방법이 다름.
    아래 보다시피 returns 뒤에 return값의 타입을 지정해줌. 아래는 string으로 지정.

	string greeting = "What's up dog";

	function sayHello() public returns (string) {
    	return greeting;
	}
  • 함수 제어자 view, pure
    함수 제어자로 view를 설정하면 해당 함수가 데이터를 보기만 하고 변경하지 않는 다는 것을 의미함.
    pure로 설정하면 함수의 인자로 전달된 요소 외에 함수 외부의 값을 가져와서 사용하지 않도록 해줌.
    즉, 함수 외부에 존재하는 변수 등을 가져와서 쓰지 않는다는 말.

  • Keccak256를 이용한 해시값 변환
    Keccak256를 이용하면 임의의 문자열을 알아볼 수 없는 해시 값으로 변경할 수 있음.

  • event
    컨트랙트는 블록체인 상에서 특정 이벤트가 발생하는지를 예의주시하고 발생한다면 그에 맞는 행동을 취하게 됨.
    이벤트를 선언하고 해당 이벤트를 함수 안에 넣은 상태에 함수를 실행시키면, 이벤트는 해당 함수가 실행됬음을 앱에게 알린다.

Lesson.1 코드 해석

pragma solidity ^0.4.19;

contract ZombieFactory {
    // 여기에 이벤트 선언

    uint256 dnaDigits = 16;
    uint256 dnaModulus = 10**dnaDigits;

    // Zombie 구조체 선ㅓ
    // 문자열 타입의 name과 uint256 정수 타입에 256비트 자릿수를 가는 dna를 선언.
    struct Zombie {
        string name;
        uint256 dna;
    }

    // Zombie 구조체의 배열을 생성하고 이름을 zombies이라고 지정.
    // public 이라고 적어주었기 때문에 다른 컨트랙트들이 읽을 수 있는 배열이 됨.
    Zombie[] public zombies;

    // 좀비를 생성하는 함수.
    // 좀비의 이름과 좀비의 dna를 입력하면 Zombie 구조체의 형태로 zombies 배열에 push.
    // 함수의 인자명은 _ 언더스코어로 시작하여 전역변수와 구분해주는 것이 약속임.
    function _createZombie(string _name, uint256 _dna) private {
        zombies.push(Zombie(_name, _dna));
        // 여기서 이벤트 실행
    }

    // 랜덤한 dna 값을 생성하기 위한 함수
    // 여기서는 returns를 작성해주어서 함수의 리턴 값이 uint256타입이도록
    // unit256 타입의 변수 rand를 선언해주는데, 인자로 전달된 값을 keccak256 해시함수로 변환하여 저장
    // 함수 제어자 view를 사용하면 해당 함수가 데이터를 보기만 하고 변경하지 않는 다는 것을 의미함.
    // 추가로 pure 함수는 함수의 인자로 전달된 요소 외에 함수 외부의 값을 가져와서 사용하지 않도록 해줌.
    // 마지막 리턴하는 값은 변환된 해시 값을 16진수로 매핑하기 위해 dnaModulus, 즉 10의 16승 값으로 나누어줌.
    // 이렇게 하면 결과적으로 리턴되는 값은 16자리의 dna값이 됨.
    function _generateRandomDna(string _str) private view returns (uint256) {
        uint256 rand = uint256(keccak256(_str));
        return rand % dnaModulus;
    }

    // 좀비의 이름을 넣으면 새로운 dna를 가지는 좀비를 만드는 함수 생성, 종합 버전이라고 볼 수 있음.
    // 좀비의 이름을 입력 받으면, 해당 이름을 _generateRandomDna함수에 넣어서 16자리의 랜덤한 해시 결과 값을 반환하게 되고 그 값을 randDna에 넣어줌.
    // 그리고 그 값을, dna를 _createZombie 함수에 인자로 전달해주면서 새로운 좀비의 탄생을 알림.
    function createRandomZombie(string _name) public {
        uint256 randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }
}
profile
열심히, 꾸준히, 그리고 정확히

0개의 댓글