커버 이미지의 출처는 다음과 같습니다 : https://cryptozombies.io/ko/

크립토좀비 사이트 내용을 정리하였으며, 컨텐츠 관련 모든 권리는 Loom Network에 있습니다.

1) Solidity 기초

1. 컨트랙트

컨트랙트

Version Pragma

2. 상태 변수와 정수

부호 없는 정수: uint

string

예시

contract Example {
    // 이 변수는 블록체인에 영구적으로 저장된다
    uint myUnsignedInteger = 100;
}

3. 수학 연산

종류

4. 구조체

예시

struct Person {
    uint age;
    string name;
}

5. 배열

// 2개의 원소를 담을 수 있는 고정 길이의 배열:
uint[2] fixedArray;

// 또다른 고정 배열으로 5개의 스트링을 담을 수 있다:
string[5] stringArray;

// 동적 배열은 고정된 크기가 없으며 계속 크기가 커질 수 있다:
uint[] dynamicArray;

Public 배열

6. 함수 선언

예시

// 함수 선언
function eatHamburgers(string _name, uint _amount) {

}

// 함수 호출
eatHamburgers("vitalik", 100);

7. 구조체와 배열 활용하기

새로운 구조체 생성하기

struct Person {
    uint age;
    string name;
}

Person[] public people;

// 1) 새로운 사람을 생성한다:
Person satoshi = Person(172, "Satoshi");

// 2) 이 사람을 배열에 추가한다:
people.push(satoshi);

// 1 + 2) 한 줄로 표현 가능
people.push(Person(16, "Vitalik"));

array.push()

uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// numbers 배열은 [5, 10, 15]와 같다.

8. Private / Public 함수

uint[] numbers;

function _addToArray(uint _number) private {
    numbers.push(_number);
}

9. 함수 더 알아보기

반환값

string greeting = "What's up dog";

//returns (string) : 반환값
function sayHello() public returns (string) {
    return greeting;
}

함수 제어자

// view 함수로 선언
function sayHello() public view returns (string) {

}

// pure 함수로 선언
function _multiply(uint a, uint b) private pure returns (uint) {
    return a * b;
}

10. Keccak256과 형 변환

해시 함수

해시 값 예시

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");

//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

형 변환

uint8 a = 5;
uint b = 6;

// a * b가 uint8이 아닌 uint를 반환하기 때문에 에러 메시지가 난다:
uint8 c = a * b;

// b를 uint8으로 형 변환해서 코드가 제대로 작동하도록 해야 한다:
uint8 c = a * uint8(b);

11. 이벤트

예시

// 이벤트를 선언한다
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) {
  // 결과와 관련된 행동을 취한다
}

12. Web3.js

예시: Web3.js와 구축된 컨트랙트와의 상호작용

// 여기에 우리가 만든 컨트랙트에 접근하는 방법을 제시한다:
var abi = /* abi generated by the compiler */
var ZombieFactoryContract = web3.eth.contract(abi)
var contractAddress = /* our contract address on Ethereum after deploying */
var ZombieFactory = ZombieFactoryContract.at(contractAddress)
// `ZombieFactory`는 우리 컨트랙트의 public 함수와 이벤트에 접근할 수 있다.

// 일종의 이벤트 리스너가 텍스트 입력값을 취한다:
$("#ourButton").click(function(e) {
  var name = $("#nameInput").val()
  // 우리 컨트랙트의 `createRandomZombie`함수를 호출한다:
  ZombieFactory.createRandomZombie(name)
})

// `NewZombie` 이벤트가 발생하면 사용자 인터페이스를 업데이트한다
var event = ZombieFactory.NewZombie(function(error, result) {
  if (error) return
  generateZombie(result.zombieId, result.name, result.dna)
})

// 좀비 DNA 값을 받아서 이미지를 업데이트한다
function generateZombie(id, name, dna) {
  let dnaStr = String(dna)
  // DNA 값이 16자리 수보다 작은 경우 앞 자리를 0으로 채운다
  while (dnaStr.length < 16)
    dnaStr = "0" + dnaStr

  let zombieDetails = {
    // 첫 2자리는 머리의 타입을 결정한다. 머리 타입에는 7가지가 있다. 그래서 모듈로(%) 7 연산을 하여
    // 0에서 6 중 하나의 값을 얻고 여기에 1을 더해서 1에서 7까지의 숫자를 만든다.
    // 이를 기초로 "head1.png"에서 "head7.png" 중 하나의 이미지를 불러온다:
    headChoice: dnaStr.substring(0, 2) % 7 + 1,
    // 두번째 2자리는 눈 모양을 결정한다. 눈 모양에는 11가지가 있다:
    eyeChoice: dnaStr.substring(2, 4) % 11 + 1,
    // 셔츠 타입에는 6가지가 있다:
    shirtChoice: dnaStr.substring(4, 6) % 6 + 1,
    // 마지막 6자리는 색깔을 결정하며, 360도(degree)까지 지원하는 CSS의 "filter: hue-rotate"를 이용하여 아래와 같이 업데이트된다:
    skinColorChoice: parseInt(dnaStr.substring(6, 8) / 100 * 360),
    eyeColorChoice: parseInt(dnaStr.substring(8, 10) / 100 * 360),
    clothesColorChoice: parseInt(dnaStr.substring(10, 12) / 100 * 360),
    zombieName: name,
    zombieDescription: "A Level 1 CryptoZombie",
  }
  return zombieDetails
}
at4am의 프로필 이미지

at4am

2019년 06월 13일

글쓴이의 더 많은 글 읽어보기