Skip to content

Commit

Permalink
Merge pull request CryptozombiesHQ#60 from mintplo/lesson2-ko-improve
Browse files Browse the repository at this point in the history
Lesson2 ko improve
  • Loading branch information
jamesmartinduffy authored Feb 1, 2018
2 parents e4fd46b + b91f15a commit 795cacb
Show file tree
Hide file tree
Showing 14 changed files with 61 additions and 61 deletions.
2 changes: 1 addition & 1 deletion ko/2/00-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ header: 그러니까 자네가 레슨 2에 왔다는 거군!
roadmap: roadmap2.jpg
---

훌륭하다, 인간이여! 내가 생각했던 것보다 자네가 코딩을 잘하는군.
훌륭하다, 인간이여! 자네, 내가 생각했던 것보다 코딩을 잘하는군.

레슨 2는 **좀비에게 다른 생명체를 먹여서 좀비 군대의 규모를 늘리는 방법을** 자네에게 가르쳐 줄 걸세.

Expand Down
6 changes: 3 additions & 3 deletions ko/2/1-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ material:
answer: 1
---

지난 레슨에서 좀비의 이름을 받아서 랜덤으로 좀비를 생성한 다음, 이 좀비를 블록체인 상의 우리 앱 좀비 데이터베이스에 추가하는 함수를 생성했지.
지난 레슨에서 좀비의 이름을 받아서 랜덤으로 좀비를 생성한 다음, 이 좀비를 블록체인 상의 우리 앱 좀비 데이터베이스에 추가하는 함수를 만들었지.

이번 레슨에서는 우리 앱을 좀 더 게임답게 만들 걸세: 앱을 멀티플레이어 게임으로 만들고, 좀비를 랜덤으로만 생성하지 않고 좀더 재미있는 방식으로 좀비를 생성할 것이네.

어떻게 새로운 좀비를 생성할까? 좀비가 다른 생명체를 "먹도록" 해서!

## 좀비 먹이기

좀비가 먹이를 먹을 때 먹이는 바이러스에 감염되게 되지. 이 바이러스는 먹이를 새로운 좀비로 바꾸어 좀비 군대의 일원이 되도록 하지. 새로운 좀비의 DNA는 이전 좀비의 DNA와 먹이의 DNA를 활용하여 계산될 것이네.
좀비가 먹이를 먹으면 먹이는 바이러스에 감염되지. 이 바이러스는 먹이를 새로운 좀비로 바꾸어 좀비 군대의 일원이 되도록 하지. 새로운 좀비의 DNA는 이전 좀비의 DNA와 먹이의 DNA를 활용하여 계산될 것이네.

그럼 우리 좀비들이 가장 좋아하는 먹이가 무엇일까?

Expand All @@ -29,6 +29,6 @@ material:

오른쪽에 보면 좀비가 먹이를 먹는 간단한 데모가 있지. 인간을 클릭해서 좀비가 먹이를 먹을 때 어떤 일이 일어나는지 보게!

새로운 좀비의 DNA가 원래 좀비의 DNA와 먹이의 DNA에 의해 결정된다는 것을 알 수 있지.
새로운 좀비의 DNA는 원래 좀비의 DNA와 먹이의 DNA에 의해 결정된다는 것을 알 수 있지.

준비가 되면, "다음 챕터"를 클릭해서 계속 진행하게. 우리 게임을 멀티 플레이어 게임으로 만드는 것부터 시작하도록 하지.
24 changes: 12 additions & 12 deletions ko/2/10-interactingcontracts.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,15 +103,15 @@ material:

(그래, 정말이라네 😆 )

좀비에게 크립토키티를 먹이로 주려면 크립토키티 스마트 컨트렉트에서 키티 DNA를 읽어와야 할 것이네. 이게 가능한 이유는 크립토키티 데이터가 블록체인 상에 공개적으로 저장되어 있기 때문이지. 블록체인이 환상적이지 않나?!
좀비에게 크립토키티를 먹이로 주려면 크립토키티 스마트 컨트랙트에서 키티 DNA를 읽어와야 할 것이네. 이게 가능한 이유는 크립토키티 데이터가 블록체인 상에 공개적으로 저장되어 있기 때문이지. 블록체인이 환상적이지 않나?!

걱정 말게 - 우리 게임이 어느 누구의 크립토키티에게도 실제 해를 끼치지 않을 것이니 말일세. 우린 단지 크립토키티 데이터를 *읽어 올* 뿐이지. 실제로 이 데이터를 지울 수는 없다네. 😉

## 다른 컨트렉트와 상호작용하기
## 다른 컨트랙트와 상호작용하기

블록체인 상에 있으면서 우리가 소유하지 않은 컨트렉트와 우리 컨트렉트가 상호작용을 하려면 우선 **_인터페이스_**를 정의해야 하네.
블록체인 상에 있으면서 우리가 소유하지 않은 컨트랙트와 우리 컨트랙트가 상호작용을 하려면 우선 **_인터페이스_**를 정의해야 하네.

간단한 예시를 살펴 보도록 하지. 다음과 같은 블록체인 컨트렉트가 있다고 해 보세:
간단한 예시를 살펴 보도록 하지. 다음과 같은 블록체인 컨트랙트가 있다고 해 보세:

```
contract LuckyNumber {
Expand All @@ -127,27 +127,27 @@ contract LuckyNumber {
}
```

컨트렉트는 아무나 자신의 행운의 수를 저장할 수 있는 간단한 컨트렉트이고, 각자의 이더리움 주소와 연관이 있을 것이네. 이 주소를 이용해서 누구나 그 사람의 행운의 수를 찾아 볼 수 있지.
컨트랙트는 아무나 자신의 행운의 수를 저장할 수 있는 간단한 컨트랙트이고, 각자의 이더리움 주소와 연관이 있을 것이네. 이 주소를 이용해서 누구나 그 사람의 행운의 수를 찾아 볼 수 있지.

이제 `getNum` 함수를 이용하여 이 컨트렉트에 있는 데이터를 읽고자 하는 external 함수가 있다고 해 보세.
이제 `getNum` 함수를 이용하여 이 컨트랙트에 있는 데이터를 읽고자 하는 external 함수가 있다고 해 보세.

먼저, `LuckyNumber` 컨트렉트의 **_인터페이스_**를 정의할 필요가 있네:
먼저, `LuckyNumber` 컨트랙트의 **_인터페이스_**를 정의할 필요가 있네:

```
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
```

약간 다르지만, 인터페이스를 정의하는 것이 컨트렉트를 정의하는 것과 유사하다는 걸 참고하게. 먼저, 다른 컨트렉트와 상호작용하고자 하는 함수만을 선언할 뿐(이 경우, `getNum`이 바로 그러한 함수이지) 다른 함수나 상태 변수를 언급하지 않네. .
약간 다르지만, 인터페이스를 정의하는 것이 컨트랙트를 정의하는 것과 유사하다는 걸 참고하게. 먼저, 다른 컨트랙트와 상호작용하고자 하는 함수만을 선언할 뿐(이 경우, `getNum`이 바로 그러한 함수이지) 다른 함수나 상태 변수를 언급하지 않네.

다음으로, 함수 몸체를 정의하지 않지. 중괄호 `{`, `}`를 쓰지 않고 함수 선언을 세미콜론(`;`)으로 간단하게 끝내지.

그러니 인터페이스는 컨트렉트 뼈대처럼 보인다고 할 수 있지. 컴파일러도 그렇게 인터페이스를 인식하지.
그러니 인터페이스는 컨트랙트 뼈대처럼 보인다고 할 수 있지. 컴파일러도 그렇게 인터페이스를 인식하지.

우리의 코드에 이런 인터페이스를 포함하면 컨트렉트는 다른 컨트렉트에 정의된 함수의 특성, 호출 방법, 예상되는 응답 내용에 대해 알 수 있게 되지.
우리의 dapp 코드에 이런 인터페이스를 포함하면 컨트랙트는 다른 컨트랙트에 정의된 함수의 특성, 호출 방법, 예상되는 응답 내용에 대해 알 수 있게 되지.

다음 레슨에서 다른 컨트렉트의 함수를 실제로 호출할 것일세. 지금은 크립토키티 컨트렉트를 위한 인터페이스를 선언해 보세.
다음 레슨에서 다른 컨트랙트의 함수를 실제로 호출할 것일세. 지금은 크립토키티 컨트랙트를 위한 인터페이스를 선언해 보세.

# 직접 해보기

Expand Down Expand Up @@ -188,6 +188,6 @@ function getKitty(uint256 _id) external view returns (

`getKitty` 함수가 어떤 함수인지 알아 보았으니, 이를 이용하여 인터페이스를 만들어 볼 수 있을 걸세:

1. `KittyInterface`라는 인터페이스를 정의한다. 인터페이스 정의가 `contract` 키워드를 이용하여 새로운 컨트렉트를 생성하는 것과 같다는 점을 기억할 것.
1. `KittyInterface`라는 인터페이스를 정의한다. 인터페이스 정의가 `contract` 키워드를 이용하여 새로운 컨트랙트를 생성하는 것과 같다는 점을 기억할 것.

2. 인터페이스 내에 `getKitty` 함수를 선언한다 (위의 함수에서 중괄호 안의 모든 내용은 제외하고 `return` 키워드 및 반환 값 종류까지만 복사/붙여넣기 하고 그 다음에 세미콜론을 넣어야 한다).
14 changes: 7 additions & 7 deletions ko/2/11-interactingcontracts2.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,27 +122,27 @@ contract NumberInterface {
}
```

다음과 같이 컨트렉트에서 인터페이스를 이용할 수 있지:
다음과 같이 컨트랙트에서 인터페이스를 이용할 수 있지:

```
contract MyContract {
address NumberInterfaceAddress = 0xab38...
// ^ 이더리움 상의 FavoriteNumber 컨트렉트 주소이다
// ^ 이더리움 상의 FavoriteNumber 컨트랙트 주소이다
NumberInterface numberContract = NumberInterface(NumberInterfaceAddress)
// 이제 `numberContract`는 다른 컨트렉트를 가리키고 있다. Now `numberContract` is pointing to the other contract
// 이제 `numberContract`는 다른 컨트랙트를 가리키고 있다. Now `numberContract` is pointing to the other contract
function someFunction() public {
// 이제 `numberContract`가 가리키고 있는 컨트렉트에서 `getNum` 함수를 호출할 수 있다:
// 이제 `numberContract`가 가리키고 있는 컨트랙트에서 `getNum` 함수를 호출할 수 있다:
uint num = numberContract.getNum(msg.sender);
// ...그리고 여기서 `num`으로 무언가를 할 수 있다
}
}
```

이런 식으로 자네의 컨트렉트가 이더리움 블록체인 상의 다른 어떤 컨트렉트와도 상호작용할 수 있네. 물론 상호작용하는 함수가 `public`이나 `external`로 선언되어 있어야 하지.
이런 식으로 자네의 컨트랙트가 이더리움 블록체인 상의 다른 어떤 컨트랙트와도 상호작용할 수 있네. 물론 상호작용하는 함수가 `public`이나 `external`로 선언되어 있어야 하지.

# 직접 해보기

크립토키티 스마트 컨트렉트에서 데이터를 읽어 오도록 우리 컨트렉트를 설정해 보세!
크립토키티 스마트 컨트랙트에서 데이터를 읽어 오도록 우리 컨트랙트를 설정해 보세!

1. 코드를 보면 `ckAddress`라는 변수에 크립토키티 컨트렉트 주소가 입력되어 있다. 다음 줄에 `kittyContract`라는 `KittyInterface`를 생성하고, 위의 `numberContract` 선언 시와 동일하게 `ckAddress`를 이용하여 초기화한다.
1. 코드를 보면 `ckAddress`라는 변수에 크립토키티 컨트랙트 주소가 입력되어 있다. 다음 줄에 `kittyContract`라는 `KittyInterface`를 생성하고, 위의 `numberContract` 선언 시와 동일하게 `ckAddress`를 이용하여 초기화한다.
6 changes: 3 additions & 3 deletions ko/2/12-multiplereturns.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ material:
}
---

`getKitty` 함수는 우리가 살펴 본 예시 중 유일하게 다수의 반환값을 갖는 함수이지. 본 챕터에서는 어떻게 다수의 반환값을 처리하는지 살펴 보세: T
`getKitty` 함수는 우리가 살펴 본 예시 중 유일하게 다수의 반환값을 갖는 함수이지. 본 챕터에서는 어떻게 다수의 반환값을 처리하는지 살펴 보세:

```
function multipleReturns() internal returns(uint a, uint b, uint c) {
Expand All @@ -147,9 +147,9 @@ function getLastReturnValue() external {

# 직접 해보기

이제 크립토키티 컨트렉트와 상호작용할 시간이네!
이제 크립토키티 컨트랙트와 상호작용할 시간이네!

크립토키티 컨트렉트에서 고양이 유전자를 얻어내는 함수를 생성해 보세:
크립토키티 컨트랙트에서 고양이 유전자를 얻어내는 함수를 생성해 보세:

1. `feedOnKitty`라는 함수를 생성한다. 이 함수는 `_zombieId``_kittyId`라는 `uint` 인자 값 2개를 전달받고, `public` 함수로 선언되어야 한다.

Expand Down
6 changes: 3 additions & 3 deletions ko/2/13-kittygenes.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,13 @@ material:

우리의 함수 로직이 이제 완료되었군... 하지만 한 가지를 보너스로 추가해 보도록 하세.

고양이 유전자와 조합되어 생성된 좀비가 몇 가지 독특한 특성을 가져서 고양이좀비로 보이도록 해 보세.
고양이 유전자와 조합되어 생성된 좀비가 몇 가지 독특한 특성을 가져서 고양이 좀비로 보이도록 해 보세.

이를 위해 좀비 DNA에 몇 가지 특별한 키티 코드를 추가할 수 있네.

레슨 1에서 배운 내용을 떠올려 보면, 좀비의 외모를 결정하는 데 있어서 16자리 DNA 중에서 처음 12자리만 이용되지. 그러니 마지막에서 2자리 숫자를 활용하여 "스페셜한" 특성을 만들어 보세.
레슨 1에서 배운 내용을 떠올려 보면, 좀비의 외모를 결정하는 데 있어서 16자리 DNA 중에서 처음 12자리만 이용되지. 그러니 마지막에서 2자리 숫자를 활용하여 "특별한" 특성을 만들어 보세.

고양이좀비는 DNA 마지막 2자리로 `99`를 갖는다고 해 보세 (고양이는 9개의 목숨을 가졌다고 할 만큼 생명력이 강하므로). 그러면 우리 코드에서는 만약(`if`) 좀비가 고양이에서 생성되면 좀비 DNA의 마지막 2자리를 `99`로 설정한다.
고양이 좀비는 DNA 마지막 2자리로 `99`를 갖는다고 해 보세 (고양이는 9개의 목숨을 가졌다고 할 만큼 생명력이 강하므로). 그러면 우리 코드에서는 만약(`if`) 좀비가 고양이에서 생성되면 좀비 DNA의 마지막 2자리를 `99`로 설정한다.

## If 문

Expand Down
12 changes: 6 additions & 6 deletions ko/2/14-wrappingitup.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ material:
answer: 1
---

그게 전부네. 자네가 레슨 2를 완료했네!
그게 전부네. 레슨 2를 완료했네!

코드가 작동하는지 오른편에서 데모를 확인해 볼 수 있네. 자네가 얼른 이 페이지 하단으로 가고 싶어한다는 걸 아네 😉. 고양이를 클릭해서 공격하고 나서 새로운 고양이좀비가 어떤지 보게!
코드가 작동하는지 오른편에서 데모를 확인해 볼 수 있네. 자네가 얼른 이 페이지 하단으로 가고 싶어한다는 걸 아네 😉. 고양이를 클릭해서 공격하고 나서 새로운 고양이 좀비가 어떤지 보게!

## 자바스크립트를 활용한 구현

우리 컨트렉트를 이더리움에 구축할 준비가 되면 `ZombieFeeding` 컨트렉트만 컴파일해서 구축하면 될 것일세. 왜냐면 이 컨트렉트가 `ZombieFactory`를 상속하는 우리의 마지막 컨트렉트이고컨트렉트에 있는 public 메소드를 모두 접근할 수 있기 때문이지.
우리 컨트랙트를 이더리움에 구축할 준비가 되면 `ZombieFeeding` 컨트랙트만 컴파일해서 구축하면 될 것일세. 왜냐면 이 컨트랙트가 `ZombieFactory`를 상속하는 우리의 마지막 컨트랙트이고컨트랙트에 있는 public 메소드를 모두 접근할 수 있기 때문이지.

자바스크립트와 web3.js를 활용하여 우리의 컨트렉트와 상호작용하는 예시를 살펴 보도록 하지:
자바스크립트와 web3.js를 활용하여 우리의 컨트랙트와 상호작용하는 예시를 살펴 보도록 하지:

```
var abi = /* abi generated by the compiler */
Expand All @@ -43,11 +43,11 @@ $.get(apiUrl, function(data) {
// 유저가 고양이를 클릭할 때:
$(".kittyImage").click(function(e) {
// 우리 컨트렉트의 `feedOnKitty` 메소드를 호출한다
// 우리 컨트랙트의 `feedOnKitty` 메소드를 호출한다
ZombieFeeding.feedOnKitty(zombieId, kittyId)
})
// 우리의 컨트렉트에서 발생 가능한 NewZombie 이벤트에 귀를 기울여서 이벤트 발생 시 이벤트를 제시할 수 있도록 한다:
// 우리의 컨트랙트에서 발생 가능한 NewZombie 이벤트에 귀를 기울여서 이벤트 발생 시 이벤트를 제시할 수 있도록 한다:
ZombieFactory.NewZombie(function(error, result) {
if (error) return
// 이 함수는 레슨 1에서와 같이 좀비를 제시한다:
Expand Down
14 changes: 7 additions & 7 deletions ko/2/2-mappings.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,28 +84,28 @@ material:

## 주소

이더리움 블록체인은 은행 계좌와 같은 **_계정들_**로 이루어져 있지. 계정은 이더리움 블록체인 상의 통화인 **_이더_**의 잔액을 가지지. 자네의 은행 계좌를 통해 다른 계좌로 돈을 송금할 수 있듯이, 계정을 통해 다른 계정과 이더를 주고 받을 수 있지.
이더리움 블록체인은 은행 계좌와 같은 **_계정들_**로 이루어져 있지. 계정은 이더리움 블록체인 상의 통화인 **_이더_**의 잔액을 가지지. 자네의 은행 계좌에서 다른 계좌로 돈을 송금할 수 있듯이, 계정을 통해 다른 계정과 이더를 주고 받을 수 있지.

각 계정은 은행 계좌 번호와 같은 `주소`를 가지고 있네. 주소는 특정 계정을 가리키는 고유 식별자로, 다음과 같이 표현되지:

`0x0cE446255506E92DF41614C46F1d6df9Cc969183`

(이 주소는 크립토좀비 팀의 주소지. 자네가 크립토좀비를 즐기고 있다면 우리에게 이더 몇 개를 보내줄 수 있겠지! 😉) T

이후 레슨에서 주소에 관한 핵심 내용을 알아 볼 것일세. 지금은 자네가 **"주소는 특정 유저(혹은 스마트 컨트렉트)가 소유한다"**라는 점만 이해할 필요가 있네.
이후 레슨에서 주소에 관한 핵심 내용을 알아 볼 것일세. 지금은 자네가 **"주소는 특정 유저(혹은 스마트 컨트랙트)가 소유한다"**라는 점만 이해하면 되네.

그러니까 주소를 우리 좀비들에 대한 소유권을 나타내는 고유 ID로 활용할 수 있네. 유저가 우리 앱과 상호작용해서 새로운 좀비를 생성하면 생성 함수를 호출한 이더리움 주소에 그 좀비에 대한 소유권을 부여하지.
그러니까 주소를 우리 좀비들에 대한 소유권을 나타내는 고유 ID로 활용할 수 있네. 유저가 우리 앱을 통해 새로운 좀비를 생성하면 좀비를 생성하는 함수를 호출한 이더리움 주소에 그 좀비에 대한 소유권을 부여하지.

## 매핑

레슨 1에서 **_구조체_****_배열_** 살펴 봤네. **_매핑_**은 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법이지.
레슨 1에서 **_구조체_****_배열_** 살펴 봤네. **_매핑_**은 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법이지.

다음과 같이 `매핑`을 정의하지:

```
// 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장한다:
mapping (address => uint) public accountBalance;
// 혹은 userID을 기초로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다
// 혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다
mapping (uint => string) userIdToName;
```

Expand All @@ -115,6 +115,6 @@ mapping (uint => string) userIdToName;

좀비 소유권을 저장하기 위해 2가지 매핑을 이용하고자 하네: 하나는 좀비 소유자의 주소를 추적하기 위한 것이고, 다른 하나는 소유한 좀비의 숫자를 추적하기 위한 것이네.

1. `zombieToOwner`라는 매핑을 생성한다. 키는 `uint`이고 (좀비 ID에 기초하여 좀비를 저장하고 검색할 것이다), 값은 `address`이다. 이 매핑을 `public`으로 설정하자.
1. `zombieToOwner`라는 매핑을 생성한다. 키는 `uint`이고 (좀비 ID로 좀비를 저장하고 검색할 것이다), 값은 `address`이다. 이 매핑을 `public`으로 설정하자.

2. `ownerZombieCount`라는 매핑을 설정한다. 키는 `address`이고 값은 `uint`이다.
2. `ownerZombieCount`라는 매핑을 생성한다. 키는 `address`이고 값은 `uint`이다.
Loading

0 comments on commit 795cacb

Please sign in to comment.