forked from CryptozombiesHQ/cryptozombie-lessons
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
19 changed files
with
1,384 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
title: 좀비 공장 만들기 | ||
header: 환영한다, 인간이여! | ||
roadmap: roadmap.jpg | ||
--- | ||
|
||
그러니까 자네가 **크립토 좀비**가 되기 위한 자질을 갖추었다고 생각한다 말이지? | ||
|
||
이 코스는 **이더리움 게임을 만드는** 방법을 가르쳐 줄 걸세. | ||
|
||
이 코스는 솔리디티 초보자를 위해 설계되었지만 학습자가 자바스크립트 같은 언어로 프로그래밍한 경험이 있다고 가정하지. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
--- | ||
title: 배열 | ||
actions: ['정답 확인하기', '힌트 보기'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
uint dnaModulus = 10 ** dnaDigits; | ||
struct Zombie { | ||
string name; | ||
uint dna; | ||
} | ||
// 여기서 시작 | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
uint dnaModulus = 10 ** dnaDigits; | ||
struct Zombie { | ||
string name; | ||
uint dna; | ||
} | ||
Zombie[] public zombies; | ||
} | ||
--- | ||
|
||
어떤 것의 모음집이 필요할 때 **_배열_**을 사용할 수 있네. 솔리디티에는 **_정적_** 배열과 **_동적_** 배열이라는 두 종류의 배열이 있지: | ||
|
||
``` | ||
// 2개의 원소를 담을 수 있는 고정 길이의 배열: | ||
uint[2] fixedArray; | ||
// 또다른 고정 배열으로 5개의 스트링을 담을 수 있다: | ||
string[5] stringArray; | ||
// 동적 배열은 고정된 크기가 없으며 계속 크기가 커질 수 있다: | ||
uint[] dynamicArray; | ||
``` | ||
|
||
**_구조체_**의 배열을 생성할 수도 있다. 이전 챕터의 `Person` 구조체를 이용하면: | ||
|
||
``` | ||
Person[] people; // 이는 동적 배열로, 원소를 계속 추가할 수 있다. | ||
``` | ||
|
||
상태 변수가 블록체인에 영구적으로 저장될 수 있다는 걸 기억하나? 그러니 이처럼 구조체의 동적 배열을 생성하면 마치 데이터베이스처럼 컨트렉트에 구조화된 데이터를 저장하는 데 유용하네. | ||
|
||
## Public 배열 | ||
|
||
`public`으로 배열을 선언할 수 있지. 솔리디티는 이런 배열을 위해 **_getter_** 메소드를 자동적으로 생성하지. 구문은 다음과 같네: | ||
|
||
``` | ||
Person[] public people; | ||
``` | ||
|
||
그러면 다른 컨트렉트들이 이 배열을 읽을 수 있게 되지 (쓸 수는 없네). 이는 컨트렉트에 공개 데이터를 저장할 때 유용한 패턴이지. | ||
|
||
# 직접 해보기 | ||
|
||
우리 앱에 좀비 군대를 저장하고 싶네. 그리고 우리 좀비들을 다른 앱에 자랑하고 싶네. 그러니 좀비 군대 저장소를 public으로 해야 하네. | ||
|
||
1. `Zombie` **_구조체_**의 public 배열을 생성하고 이름을 `zombies`로 한다. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
--- | ||
title: 구조체와 배열 활용하기 | ||
actions: ['정답 확인하기', '힌트 보기'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
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) { | ||
// 여기서 시작 | ||
} | ||
} | ||
answer: > | ||
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) { | ||
zombies.push(Zombie(_name, _dna)); | ||
} | ||
} | ||
--- | ||
|
||
### 새로운 구조체 생성하기 | ||
|
||
지난 예시의 `Person` 구조체를 기억하나? | ||
|
||
``` | ||
struct Person { | ||
uint age; | ||
string name; | ||
} | ||
Person[] public people; | ||
``` | ||
|
||
이제 새로운 `Person`를 생성하고 `people` 배열에 추가하는 방법을 살펴 보도록 하지. | ||
|
||
``` | ||
// 새로운 사람을 생성한다: | ||
Person satoshi = Person(172, "Satoshi"); | ||
// 이 사람을 배열에 추가한다: | ||
people.push(satoshi); | ||
``` | ||
|
||
이 두 코드를 조합하여 깔끔하게 한 줄로 표현할 수 있네: | ||
|
||
``` | ||
people.push(Person(16, "Vitalik")); | ||
``` | ||
|
||
참고로 `array.push()`는 무언가를 배열의 **끝**에 추가해서 모든 원소가 순서를 유지하도록 하네. 다음 예시를 살펴 보도록 하지: | ||
|
||
``` | ||
uint[] numbers; | ||
numbers.push(5); | ||
numbers.push(10); | ||
numbers.push(15); | ||
// numbers 배열은 [5, 10, 15]과 같다. | ||
``` | ||
|
||
# 직접 해보기 | ||
|
||
createZombie 함수가 무언가 할 수 있도록 만들어 보세! | ||
|
||
1. 함수의 몸체에 코드를 넣어 새로운 `Zombie`를 생성하여 `zombies` 배열에 추가하도록 한다. 새로운 좀비를 위한 `name`과 `dna`는 `createZombie`함수의 인자값이어야 한다. | ||
2. 코드를 한 줄로 간결하게 작성해 보자. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
--- | ||
title: "컨트렉트" | ||
actions: ['정답 확인하기', '힌트 보기'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity //1. 여기에 솔리디티 버전 적기 | ||
//2. 여기에 컨트렉트 생성 | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
} | ||
--- | ||
|
||
완전 기초부터 시작하기: | ||
|
||
솔리디티 코드는 **컨트렉트** 안에 싸여 있지. `컨트렉트`는 이더리움 애플리케이션의 기초 건축 블록으로, 모든 변수와 함수는 어느 한 컨트렉트에 속하게 마련이지. 컨트렉트는 자네의 모든 프로젝트의 시작 지점이라고 할 수 있지. | ||
|
||
비어 있는 `HelloWorld` 컨트렉트는 다음과 같네: | ||
|
||
``` | ||
contract HelloWorld { | ||
} | ||
``` | ||
|
||
## Version Pragma | ||
|
||
모든 솔리디티 소스 코드는 "version pragma"로 시작해야 하는데, 이는 해당 코드가 이용해야 하는 솔리디티 버전을 선언하는 것이지. 이를 통해 이후에 출시될 컴파일러 버전이 잠재적으로 코드를 깨뜨리는 변화를 가져올 수 있다는 문제를 예방하고자 하는 거지. | ||
|
||
선언은 다음과 같이 하면 되네: `pragma solidity ^0.4.19;` (이 코스 집필 시 최신 버전이 0.4.19임). | ||
|
||
종합하자면 컨트렉트 초기 뼈대는 다음과 같네. 새로운 프로젝트를 시작할 때마다 이 뼈대를 제일 먼저 작성해야 하지: | ||
|
||
``` | ||
pragma solidity ^0.4.19; | ||
contract HelloWorld { | ||
} | ||
``` | ||
|
||
# 직접 해보기 | ||
|
||
우리의 좀비 군대 생성을 시작하기 위해 `ZombieFactory`라는 기본 컨트렉트를 생성해 보세! | ||
|
||
1. 우측 박스에 우리 컨트렉트가 솔리디티 버전 `0.4.19`를 쓸 수 있도록 설정한다. | ||
|
||
2. `ZombieFactory`라는 빈 컨트렉트를 생성한다. | ||
|
||
다 마쳤으면 아래 "정답 확인하기"를 클릭하게. 막히는 부분이 있으면 "힌트 보기"를 클릭할 수도 있네. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
--- | ||
title: 상태 변수 & 정수 | ||
actions: ['정답 확인하기', '힌트 보기'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
// 여기서 시작 | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
} | ||
--- | ||
|
||
잘 했네! 이제 우리 컨트렉트를 위한 뼈대를 갖추게 되었네. 이제 솔리디티가 변수를 다루는 방법을 배워 보도록 하지. | ||
|
||
**_상태 변수_**는 컨트렉트 저장소에 영구적으로 저장되네. 즉, 이더리움 블록체인에 기록된다는 거지. 데이터베이스에 데이터를 쓰는 것과 동일하네. | ||
|
||
##### 예시: | ||
``` | ||
contract Example { | ||
// 이 변수는 블록체인에 영구적으로 저장된다 | ||
uint myUnsignedInteger = 100; | ||
} | ||
``` | ||
|
||
이 예시 컨트렉트에서는 `myUnsignedInteger`라는 `uint`를 생성하여 100이라는 값을 배정했네. | ||
|
||
## 부호 없는 정수: `uint` | ||
|
||
`uint` 자료형은 부호 없는 정수로, **값이 음수가 아니어야 한다는** 의미네. 부호 있는 정수를 위한 `int` 자료형도 있네. | ||
|
||
> 참고: 솔리디티에서 `uint`는 실제로 `uint256`, 즉 256비트 부호 없는 정수의 다른 표현이지. `uint8`, `uint16`, `uint32` 등과 같이 uint를 더 적은 비트로 선언할 수도 있네. 하지만 앞으로의 레슨에서 다루게 될 특수한 경우가 아니라면 일반적으로 단순히 `uint`를 사용하지. | ||
# 직접 해보기 | ||
|
||
우리의 좀비 DNA는 16자리 숫자로 결정될 걸세. | ||
|
||
`dnaDigits`라는 `uint`를 선언하고 `16`이라는 값을 배정해 보게. |
Oops, something went wrong.