본문 바로가기
공부/Blockchain

Cryptozombies_Lesson1. 좀비 공장 만들기

by IT공부방 2023. 11. 7.

https://cryptozombies.io/

 

#1 Solidity Tutorial & Ethereum Blockchain Programming Course | CryptoZombies

CryptoZombies is The Most Popular, Interactive Solidity Tutorial That Will Help You Learn Blockchain Programming by Building Your Own Fun Game with Zombies — Master Blockchain Development with Web3, Infura, Metamask & Ethereum Smart Contracts and Become

cryptozombies.io

 

 

상태변수 & 정수

상태변수 :

  • 컨트랙트 저장소에 영구적으로 저장됨
  • 이더리움 블록체인에 기록 됨
  • 데이터베이스에 데이터를 쓰는 것과 동일

부호없는 정수 :

  • uint
pragma solidity ^0.4.19;

contract ZombieFactory {

   uint dnaDigits = 16; //dnaDigits 라는 변수는 블록체인에 영구적으로 저장된다.

}

 

 

수학 연산 

  • 덧셈/뺄셈/곱셈/나눗셈
  • 나머지 : %
  • 지수 연산 : **
pragma solidity ^0.4.19;

contract ZombieFactory {

  uint dnaDigits = 16;
  uint dnaModulus = 10 ** dnaDigits;

}

 

 

구조체 

  • struct 구조체 이름 {}
pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
     string name;
     uint dna;
  }

}

 

 

배열

  • 정적배열 : 고정길이 배열
  • 동적배열 : 가변적으로 크기 변화
  • 구조체 배열
  • public 배열 :
    • 솔리디티는 해당 배열을 위해 getter 메소드를 자동적으로 생성한다.
    • 쓸 수는 없지만 다른 컨트랙트들이 이 배열들을 읽을 수 있게 된다.
    • 결과적으로 컨트랙트에 공개 데이터를 저장할 때 유용한 패턴이다.
*정적배열*
uint[2] fixedArray;

*동적배열*
uint[] dynamicArray;

*구조체 배열*
Person[] people; // 계속 원소 추가 가능

*Public 배열*
Person[] public people;

pragma solidity ^0.4.19;

contract ZombieFactory {

   uint dnaDigits = 16;
   uint dnaModulus = 10 ** dnaDigits;

   struct Zombie {
    string name;
    uint dna;
 }

   Zombie[] public zombies; // Zombie 구조체의 public 배열을 생성하고, 이름은 zombies라고 설

}


 

 

함수선언

  • function 함수명(매개변수) { }
pragma solidity ^0.4.19;

contract ZombieFactory {

   uint dnaDigits = 16;
   uint dnaModulus = 10 ** dnaDigits;

   struct Zombie {
   string name;
   uint dna;
}

   Zombie[] public zombies;

   function createZombie(string _name, uint _dna){   
   
   }   //함수선언

}

 

 

구조체와 배열 활용하기

struct Zombie { //앞서 생성한 구조체인 Zombie
   string name;
   uint dna; }

 

Zombie[] public zombies; //Zombie 구조체 배열의 이름은 zombies

 

Zombie z1 = Zombie("k", 123456) // z1이라는 Zombie를 생성

zombies.push(z1); //push함수를 사용해서 z1을 zombies라는 배열에 추가

-->위 두 문장 합쳐서 표현하면, z1.push(Zombie("k", 123456));

 

 

private / public 함수

  • 솔리디티에서 함수는 기본적으로 public으로 선언된다.
  • 하지만, 공격에 취약할 수 있기 때문에 공개할 함수만 public으로 선언하고 기본 함수를 private로 선언하는 것이 좋다.
  • private는 컨트랙트 내의 다른 함수들만이 해당 함수를 호출할 수 있다.
  • private 키워드는 함수명 다음에 적는다. 즉, function _함수명() private {}
  • 또한 private 함수명도 _(언더바)로 시작하는 것이 관례이다.
function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}

 

 

 

함수 더 알아보기

  • 함수 반환값

string greeting = "hello";

function sayhello() public returns (string) {

    return greeting;

}

  • 함수 제어자
    • 함수가 데이터를 보기만하고 변경하지 않을 경우(어떤 값을 변경하거나 무언가를 쓰지 않을 경우), "view"키워드를 사용한다.
    • funtion sayhello() public view returns (string) {}
    • 함수가 앱에서 어떤 데이터도 접근하지 않을 경우 "pure"키워드를 사용한다. 앱에서 읽는 것을 하지 않고 반환값이 함수에 전달된 인자값에 따라서 달라진다.
      • 참고로, pure를 쓸 지 view를 쓸 지 헷갈리는데 솔리디티 컴파일러는 어떤 제어자를 써야 하는지 경고 메시지를 통해 잘 알려준다.

function _multiply(uint a, uint b) private pure returns(uint) {

  return a*b;

}

 

 

Keccak256과 형 변환

  • 이더리움은 keccak256를 내장 함수로 가지고 있다.
  • 해시 함수는 기본적으로 입력 스트링을 랜덤 256비트 16진수로 매핑한다.
  • 형변환
uint8 a = 5;
uint b = 6;
uint8 c = a * b; (x)
uint8 c = a * uint8(b); //형변환

 

pragma solidity ^0.4.19;

contract ZombieFactory {

uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;

struct Zombie {
string name;
uint dna;
}

Zombie[] public zombies;

function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}

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

}

 

 

이벤트

  • 컨트랙트가 블록체인 상에서 앱의 사용자 단에 액션이 발생했을 때, 의사소통하는 법이다.
  • 즉, 컨트랙트는 특정 이벤트가 일어나는지 귀를 기울이고, 그 이벤트가 발생하면 행동을 취한다.
  • 선언 : event 함수이름();
    • 예 : event IntegersAdded(uint x, uint y uint result);
    • 자바스트립트로 구현 : YourContract.IntegersAdded(function(error, result){}
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; //Zombie형태의 zombies 배열

function _createZombie(string _name, uint _dna) private { //좀비 생성함수
uint id = zombies.push(Zombie(_name, _dna)) - 1; // 매개변수로 _name, _dna를 받아 zombies배열에 좀비 생성함
NewZombie(id, _name, _dna); //NewZombie 이벤트 실행
}

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

}

 

 

Web3.js

  • 이더리움에서는 컨트랙트와 상호작용하는 사용자 단의 자바스크립트 라이브러리를 Web3.js라고 한다.