diff --git a/ko/2/00-overview.md b/ko/2/00-overview.md index c5449015e5..3a2a8fa720 100644 --- a/ko/2/00-overview.md +++ b/ko/2/00-overview.md @@ -4,7 +4,7 @@ header: 그러니까 자네가 레슨 2에 왔다는 거군! roadmap: roadmap2.jpg --- -훌륭하다, 인간이여! 내가 생각했던 것보다 자네가 코딩을 더 잘하는군. +훌륭하다, 인간이여! 자네, 내가 생각했던 것보다 코딩을 잘하는군. 레슨 2는 **좀비에게 다른 생명체를 먹여서 좀비 군대의 규모를 늘리는 방법을** 자네에게 가르쳐 줄 걸세. diff --git a/ko/2/1-overview.md b/ko/2/1-overview.md index 6d4948075b..20d739fa54 100644 --- a/ko/2/1-overview.md +++ b/ko/2/1-overview.md @@ -11,7 +11,7 @@ material: answer: 1 --- -지난 레슨에서 좀비의 이름을 받아서 랜덤으로 좀비를 생성한 다음, 이 좀비를 블록체인 상의 우리 앱 좀비 데이터베이스에 추가하는 함수를 생성했지. +지난 레슨에서 좀비의 이름을 받아서 랜덤으로 좀비를 생성한 다음, 이 좀비를 블록체인 상의 우리 앱 좀비 데이터베이스에 추가하는 함수를 만들었지. 이번 레슨에서는 우리 앱을 좀 더 게임답게 만들 걸세: 앱을 멀티플레이어 게임으로 만들고, 좀비를 랜덤으로만 생성하지 않고 좀더 재미있는 방식으로 좀비를 생성할 것이네. @@ -19,7 +19,7 @@ material: ## 좀비 먹이기 -좀비가 먹이를 먹을 때 먹이는 바이러스에 감염되게 되지. 이 바이러스는 먹이를 새로운 좀비로 바꾸어 좀비 군대의 일원이 되도록 하지. 새로운 좀비의 DNA는 이전 좀비의 DNA와 먹이의 DNA를 활용하여 계산될 것이네. +좀비가 먹이를 먹으면 먹이는 바이러스에 감염되지. 이 바이러스는 먹이를 새로운 좀비로 바꾸어 좀비 군대의 일원이 되도록 하지. 새로운 좀비의 DNA는 이전 좀비의 DNA와 먹이의 DNA를 활용하여 계산될 것이네. 그럼 우리 좀비들이 가장 좋아하는 먹이가 무엇일까? @@ -29,6 +29,6 @@ material: 오른쪽에 보면 좀비가 먹이를 먹는 간단한 데모가 있지. 인간을 클릭해서 좀비가 먹이를 먹을 때 어떤 일이 일어나는지 보게! -새로운 좀비의 DNA가 원래 좀비의 DNA와 먹이의 DNA에 의해 결정된다는 것을 알 수 있지. +새로운 좀비의 DNA는 원래 좀비의 DNA와 먹이의 DNA에 의해 결정된다는 것을 알 수 있지. 준비가 되면, "다음 챕터"를 클릭해서 계속 진행하게. 우리 게임을 멀티 플레이어 게임으로 만드는 것부터 시작하도록 하지. diff --git a/ko/2/10-interactingcontracts.md b/ko/2/10-interactingcontracts.md index 45e46a359b..6ddbe575cc 100644 --- a/ko/2/10-interactingcontracts.md +++ b/ko/2/10-interactingcontracts.md @@ -103,15 +103,15 @@ material: (그래, 정말이라네 😆 ) -좀비에게 크립토키티를 먹이로 주려면 크립토키티 스마트 컨트렉트에서 키티 DNA를 읽어와야 할 것이네. 이게 가능한 이유는 크립토키티 데이터가 블록체인 상에 공개적으로 저장되어 있기 때문이지. 블록체인이 환상적이지 않나?! +좀비에게 크립토키티를 먹이로 주려면 크립토키티 스마트 컨트랙트에서 키티 DNA를 읽어와야 할 것이네. 이게 가능한 이유는 크립토키티 데이터가 블록체인 상에 공개적으로 저장되어 있기 때문이지. 블록체인이 환상적이지 않나?! 걱정 말게 - 우리 게임이 어느 누구의 크립토키티에게도 실제 해를 끼치지 않을 것이니 말일세. 우린 단지 크립토키티 데이터를 *읽어 올* 뿐이지. 실제로 이 데이터를 지울 수는 없다네. 😉 -## 다른 컨트렉트와 상호작용하기 +## 다른 컨트랙트와 상호작용하기 -블록체인 상에 있으면서 우리가 소유하지 않은 컨트렉트와 우리 컨트렉트가 상호작용을 하려면 우선 **_인터페이스_**를 정의해야 하네. +블록체인 상에 있으면서 우리가 소유하지 않은 컨트랙트와 우리 컨트랙트가 상호작용을 하려면 우선 **_인터페이스_**를 정의해야 하네. -간단한 예시를 살펴 보도록 하지. 다음과 같은 블록체인 컨트렉트가 있다고 해 보세: +간단한 예시를 살펴 보도록 하지. 다음과 같은 블록체인 컨트랙트가 있다고 해 보세: ``` contract LuckyNumber { @@ -127,11 +127,11 @@ contract LuckyNumber { } ``` -이 컨트렉트는 아무나 자신의 행운의 수를 저장할 수 있는 간단한 컨트렉트이고, 각자의 이더리움 주소와 연관이 있을 것이네. 이 주소를 이용해서 누구나 그 사람의 행운의 수를 찾아 볼 수 있지. +이 컨트랙트는 아무나 자신의 행운의 수를 저장할 수 있는 간단한 컨트랙트이고, 각자의 이더리움 주소와 연관이 있을 것이네. 이 주소를 이용해서 누구나 그 사람의 행운의 수를 찾아 볼 수 있지. -이제 `getNum` 함수를 이용하여 이 컨트렉트에 있는 데이터를 읽고자 하는 external 함수가 있다고 해 보세. +이제 `getNum` 함수를 이용하여 이 컨트랙트에 있는 데이터를 읽고자 하는 external 함수가 있다고 해 보세. -먼저, `LuckyNumber` 컨트렉트의 **_인터페이스_**를 정의할 필요가 있네: +먼저, `LuckyNumber` 컨트랙트의 **_인터페이스_**를 정의할 필요가 있네: ``` contract NumberInterface { @@ -139,15 +139,15 @@ contract NumberInterface { } ``` -약간 다르지만, 인터페이스를 정의하는 것이 컨트렉트를 정의하는 것과 유사하다는 걸 참고하게. 먼저, 다른 컨트렉트와 상호작용하고자 하는 함수만을 선언할 뿐(이 경우, `getNum`이 바로 그러한 함수이지) 다른 함수나 상태 변수를 언급하지 않네. . +약간 다르지만, 인터페이스를 정의하는 것이 컨트랙트를 정의하는 것과 유사하다는 걸 참고하게. 먼저, 다른 컨트랙트와 상호작용하고자 하는 함수만을 선언할 뿐(이 경우, `getNum`이 바로 그러한 함수이지) 다른 함수나 상태 변수를 언급하지 않네. 다음으로, 함수 몸체를 정의하지 않지. 중괄호 `{`, `}`를 쓰지 않고 함수 선언을 세미콜론(`;`)으로 간단하게 끝내지. -그러니 인터페이스는 컨트렉트 뼈대처럼 보인다고 할 수 있지. 컴파일러도 그렇게 인터페이스를 인식하지. +그러니 인터페이스는 컨트랙트 뼈대처럼 보인다고 할 수 있지. 컴파일러도 그렇게 인터페이스를 인식하지. -우리의 댑 코드에 이런 인터페이스를 포함하면 컨트렉트는 다른 컨트렉트에 정의된 함수의 특성, 호출 방법, 예상되는 응답 내용에 대해 알 수 있게 되지. +우리의 dapp 코드에 이런 인터페이스를 포함하면 컨트랙트는 다른 컨트랙트에 정의된 함수의 특성, 호출 방법, 예상되는 응답 내용에 대해 알 수 있게 되지. -다음 레슨에서 다른 컨트렉트의 함수를 실제로 호출할 것일세. 지금은 크립토키티 컨트렉트를 위한 인터페이스를 선언해 보세. +다음 레슨에서 다른 컨트랙트의 함수를 실제로 호출할 것일세. 지금은 크립토키티 컨트랙트를 위한 인터페이스를 선언해 보세. # 직접 해보기 @@ -188,6 +188,6 @@ function getKitty(uint256 _id) external view returns ( `getKitty` 함수가 어떤 함수인지 알아 보았으니, 이를 이용하여 인터페이스를 만들어 볼 수 있을 걸세: -1. `KittyInterface`라는 인터페이스를 정의한다. 인터페이스 정의가 `contract` 키워드를 이용하여 새로운 컨트렉트를 생성하는 것과 같다는 점을 기억할 것. +1. `KittyInterface`라는 인터페이스를 정의한다. 인터페이스 정의가 `contract` 키워드를 이용하여 새로운 컨트랙트를 생성하는 것과 같다는 점을 기억할 것. 2. 인터페이스 내에 `getKitty` 함수를 선언한다 (위의 함수에서 중괄호 안의 모든 내용은 제외하고 `return` 키워드 및 반환 값 종류까지만 복사/붙여넣기 하고 그 다음에 세미콜론을 넣어야 한다). diff --git a/ko/2/11-interactingcontracts2.md b/ko/2/11-interactingcontracts2.md index 5e9fd642a6..7713c9c0c5 100644 --- a/ko/2/11-interactingcontracts2.md +++ b/ko/2/11-interactingcontracts2.md @@ -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`를 이용하여 초기화한다. \ No newline at end of file +1. 코드를 보면 `ckAddress`라는 변수에 크립토키티 컨트랙트 주소가 입력되어 있다. 다음 줄에 `kittyContract`라는 `KittyInterface`를 생성하고, 위의 `numberContract` 선언 시와 동일하게 `ckAddress`를 이용하여 초기화한다. \ No newline at end of file diff --git a/ko/2/12-multiplereturns.md b/ko/2/12-multiplereturns.md index 4961c444f6..a7e805fda1 100644 --- a/ko/2/12-multiplereturns.md +++ b/ko/2/12-multiplereturns.md @@ -122,7 +122,7 @@ material: } --- -`getKitty` 함수는 우리가 살펴 본 예시 중 유일하게 다수의 반환값을 갖는 함수이지. 본 챕터에서는 어떻게 다수의 반환값을 처리하는지 살펴 보세: T +`getKitty` 함수는 우리가 살펴 본 예시 중 유일하게 다수의 반환값을 갖는 함수이지. 본 챕터에서는 어떻게 다수의 반환값을 처리하는지 살펴 보세: ``` function multipleReturns() internal returns(uint a, uint b, uint c) { @@ -147,9 +147,9 @@ function getLastReturnValue() external { # 직접 해보기 -이제 크립토키티 컨트렉트와 상호작용할 시간이네! +이제 크립토키티 컨트랙트와 상호작용할 시간이네! -크립토키티 컨트렉트에서 고양이 유전자를 얻어내는 함수를 생성해 보세: +크립토키티 컨트랙트에서 고양이 유전자를 얻어내는 함수를 생성해 보세: 1. `feedOnKitty`라는 함수를 생성한다. 이 함수는 `_zombieId`와 `_kittyId`라는 `uint` 인자 값 2개를 전달받고, `public` 함수로 선언되어야 한다. diff --git a/ko/2/13-kittygenes.md b/ko/2/13-kittygenes.md index 4c07d8e344..fdf96a9b8a 100644 --- a/ko/2/13-kittygenes.md +++ b/ko/2/13-kittygenes.md @@ -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 문 diff --git a/ko/2/14-wrappingitup.md b/ko/2/14-wrappingitup.md index 8707509093..ec07006ae1 100644 --- a/ko/2/14-wrappingitup.md +++ b/ko/2/14-wrappingitup.md @@ -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 */ @@ -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에서와 같이 좀비를 제시한다: diff --git a/ko/2/2-mappings.md b/ko/2/2-mappings.md index bf1bf8700c..dbc75869d4 100644 --- a/ko/2/2-mappings.md +++ b/ko/2/2-mappings.md @@ -84,7 +84,7 @@ material: ## 주소 -이더리움 블록체인은 은행 계좌와 같은 **_계정들_**로 이루어져 있지. 계정은 이더리움 블록체인 상의 통화인 **_이더_**의 잔액을 가지지. 자네의 은행 계좌를 통해 다른 계좌로 돈을 송금할 수 있듯이, 계정을 통해 다른 계정과 이더를 주고 받을 수 있지. +이더리움 블록체인은 은행 계좌와 같은 **_계정들_**로 이루어져 있지. 계정은 이더리움 블록체인 상의 통화인 **_이더_**의 잔액을 가지지. 자네의 은행 계좌에서 다른 계좌로 돈을 송금할 수 있듯이, 계정을 통해 다른 계정과 이더를 주고 받을 수 있지. 각 계정은 은행 계좌 번호와 같은 `주소`를 가지고 있네. 주소는 특정 계정을 가리키는 고유 식별자로, 다음과 같이 표현되지: @@ -92,20 +92,20 @@ material: (이 주소는 크립토좀비 팀의 주소지. 자네가 크립토좀비를 즐기고 있다면 우리에게 이더 몇 개를 보내줄 수 있겠지! 😉) T -이후 레슨에서 주소에 관한 핵심 내용을 알아 볼 것일세. 지금은 자네가 **"주소는 특정 유저(혹은 스마트 컨트렉트)가 소유한다"**라는 점만 이해할 필요가 있네. +이후 레슨에서 주소에 관한 핵심 내용을 알아 볼 것일세. 지금은 자네가 **"주소는 특정 유저(혹은 스마트 컨트랙트)가 소유한다"**라는 점만 이해하면 되네. -그러니까 주소를 우리 좀비들에 대한 소유권을 나타내는 고유 ID로 활용할 수 있네. 유저가 우리 앱과 상호작용해서 새로운 좀비를 생성하면 생성 함수를 호출한 이더리움 주소에 그 좀비에 대한 소유권을 부여하지. +그러니까 주소를 우리 좀비들에 대한 소유권을 나타내는 고유 ID로 활용할 수 있네. 유저가 우리 앱을 통해 새로운 좀비를 생성하면 좀비를 생성하는 함수를 호출한 이더리움 주소에 그 좀비에 대한 소유권을 부여하지. ## 매핑 -레슨 1에서 **_구조체_**와 **_배열_**를 살펴 봤네. **_매핑_**은 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법이지. +레슨 1에서 **_구조체_**와 **_배열_**을 살펴 봤네. **_매핑_**은 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법이지. 다음과 같이 `매핑`을 정의하지: ``` // 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장한다: mapping (address => uint) public accountBalance; -// 혹은 userID을 기초로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다 +// 혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다 mapping (uint => string) userIdToName; ``` @@ -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`이다. \ No newline at end of file +2. `ownerZombieCount`라는 매핑을 생성한다. 키는 `address`이고 값은 `uint`이다. \ No newline at end of file diff --git a/ko/2/3-msgsender.md b/ko/2/3-msgsender.md index dad166e1de..aeab52a29f 100644 --- a/ko/2/3-msgsender.md +++ b/ko/2/3-msgsender.md @@ -84,13 +84,13 @@ material: 좀비 소유자를 추적하는 매핑을 가지고 있으니 `_createZombie` 메소드를 업데이트해서 이 매핑을 이용하도록 하고 싶네. -이를 위해, `msg.sender`이라는 것을 이용할 필요가 있네. +이를 위해, `msg.sender`라는 것을 이용할 필요가 있네. ## msg.sender -솔리디티에는 모든 함수에서 이용 가능한 특정 전역 변수들이 있지. 그 중의 하나가 현재 함수를 호출한 사람 (혹은 스마트 컨트렉트)의 주소를 가리키는 `msg.sender`이지. +솔리디티에는 모든 함수에서 이용 가능한 특정 전역 변수들이 있지. 그 중의 하나가 현재 함수를 호출한 사람 (혹은 스마트 컨트랙트)의 주소를 가리키는 `msg.sender`이지. -> 참고: 솔리디티에서 함수 실행은 항상 외부 호출자가 시작하네. 컨트렉트는 누군가가 컨트렉트의 함수를 호출할 때까지 블록체인 상에서 아무 것도 안 하고 있을 거네. 그러니 항상 `msg.sender`가 있어야 하네. +> 참고: 솔리디티에서 함수 실행은 항상 외부 호출자가 시작하네. 컨트랙트는 누군가가 컨트랙트의 함수를 호출할 때까지 블록체인 상에서 아무 것도 안 하고 있을 것이네. 그러니 항상 `msg.sender`가 있어야 하네. `msg.sender`를 이용하고 `mapping`을 업데이트하는 예시가 여기에 있네: @@ -110,13 +110,13 @@ function whatIsMyNumber() public view returns (uint) { } ``` -이 간단한 예시에서 누구나 `setMyNumber`을 호출하여 본인의 주소와 연결된 우리 컨트렉트 내에 `uint`를 저장할 수 있지. +이 간단한 예시에서 누구나 `setMyNumber`을 호출하여 본인의 주소와 연결된 우리 컨트랙트 내에 `uint`를 저장할 수 있지. -`msg.sender`를 활용하면 자네가 이더리움 블록체인의 보안성을 이용할 수 있게 되지. 즉, 누군가가 다른 사람의 데이터를 변경할 수 있으려면 해당 이더리움 주소와 관련된 개인키를 훔치는 것 밖에는 다른 방법이 없지. +`msg.sender`를 활용하면 자네는 이더리움 블록체인의 보안성을 이용할 수 있게 되지. 즉, 누군가 다른 사람의 데이터를 변경하려면 해당 이더리움 주소와 관련된 개인키를 훔치는 것 밖에는 다른 방법이 없다는 것이네. # 직접 해보기 -레슨 1에서 다뤘던 `_createZombie` 메소드를 업데이트하여 이 함수를 호출하는 누구나에게 좀비 소유권을 부여하도록 해 보세. +레슨 1에서 다뤘던 `_createZombie` 메소드를 업데이트하여 이 함수를 호출하는 누구나 좀비 소유권을 부여하도록 해 보세. 1. 먼저, 새로운 좀비의 `id`가 반환된 후에 `zombieToOwner` 매핑을 업데이트하여 `id`에 대하여 `msg.sender`가 저장되도록 해보자. diff --git a/ko/2/4-require.md b/ko/2/4-require.md index b17088e304..5aa5099f48 100644 --- a/ko/2/4-require.md +++ b/ko/2/4-require.md @@ -116,4 +116,4 @@ function sayHiToVitalik(string _name) public returns (string) { 1. `require` 키워드를 `createRandomZombie` 앞부분에 입력한다. `require` 함수가 `ownerZombieCount[msg.sender]`이 0과 같은지 확인하도록 하고, 0이 아닌 경우 에러 메시지를 출력하도록 한다. -> 참고: 솔리디티에서 값을 비교할 때 어떤 항이 먼저 오느냐는 중요하지 않네. 어떤 순서든지 동일하지. 하지만, 우리가 작성한 확인 기능은 매우 기본적이라서 한 가지 값만을 참이라고 하네. 그러니 `ownerZombieCount[msg.sender]`이 가장 먼저 올 것이 기대되지. \ No newline at end of file +> 참고: 솔리디티에서 값을 비교할 때 어떤 항이 먼저 오느냐는 중요하지 않네. 어떤 순서든 동일하지. 하지만, 우리가 작성한 확인 기능은 매우 기본적이라서 한 가지 답만을 참이라고 하네. 그러니 `ownerZombieCount[msg.sender]`을 가장 먼저 작성 해주게. \ No newline at end of file diff --git a/ko/2/5-inheritance.md b/ko/2/5-inheritance.md index a82f18b2f4..c634b38184 100644 --- a/ko/2/5-inheritance.md +++ b/ko/2/5-inheritance.md @@ -93,9 +93,9 @@ material: --- -우리의 게임 코드가 점점 더 꽤 길어지고 있군. 엄청나게 긴 컨트렉트 하나를 만들기 보다는 코드를 잘 정리해서 여러 컨트렉트에 코드 로직을 나누는 것이 합리적일 때가 있지. +우리의 게임 코드가 꽤 길어지고 있군. 엄청나게 긴 컨트랙트 하나를 만들기 보다는 코드를 잘 정리해서 여러 컨트랙트에 코드 로직을 나누는 것이 합리적일 때가 있지. -이를 보다 관리하기 쉽도록 하는 솔리디티 기능이 바로 컨트렉트 **_상속_**이지: +이를 보다 관리하기 쉽도록 하는 솔리디티 기능이 바로 컨트랙트 **_상속_**이지: ``` contract Doge { @@ -111,7 +111,7 @@ contract BabyDoge is Doge { } ``` -`BabyDoge` 컨트렉트는 `Doge` 컨트렉트를 상속하네. 즉, 자네가 `BabyDoge` 컨트렉트를 컴파일해서 구축할 때, `BabyDoge` 컨트렉트가 `catchphrase()` 함수와 `anotherCatchphrase()` 함수에 모두 접근할 수 있다는 뜻이지. (`Doge` 컨트렉트에 정의되는 다른 어떤 public 함수가 정의되어도 접근이 가능하네) +`BabyDoge` 컨트랙트는 `Doge` 컨트랙트를 상속하네. 즉, 자네가 `BabyDoge` 컨트랙트를 컴파일해서 구축할 때, `BabyDoge` 컨트랙트가 `catchphrase()` 함수와 `anotherCatchphrase()` 함수에 모두 접근할 수 있다는 뜻이지. (`Doge` 컨트랙트에 정의되는 다른 어떤 public 함수가 정의되어도 접근이 가능하네) 상속 개념은 "`고양이`는 `동물`이다"의 경우처럼 부분집합 클래스가 있을 때 논리적 상속을 위해 활용할 수 있지. 하지만 동일한 로직을 다수의 클래스로 분할해서 단순히 코드를 정리할 때도 활용할 수 있지. @@ -119,4 +119,4 @@ contract BabyDoge is Doge { 다음 챕터에서 우리 좀비들이 먹이를 먹고 번식하도록 하는 기능을 구현할 것일세. 그 기능의 로직을 `ZombieFactory`의 모든 메소드를 상속하는 클래스에 넣어 보도록 하세. -1. `ZombieFactory` 아래에 `ZombieFeeding` 컨트렉트르 생성한다. 이 컨트렉트는 `ZombieFactory`를 상속해야 한다. +1. `ZombieFactory` 아래에 `ZombieFeeding` 컨트랙트르 생성한다. 이 컨트랙트는 `ZombieFactory`를 상속해야 한다. diff --git a/ko/2/6-importfiles.md b/ko/2/6-importfiles.md index f17c020a7d..448f4bec04 100644 --- a/ko/2/6-importfiles.md +++ b/ko/2/6-importfiles.md @@ -63,9 +63,9 @@ material: --- -와우! 우리가 방금 코드를 오른편으로 정리했다는 걸 알 수 있을 걸세. 이제 에디터의 상단부에 탭이 있네. 탭을 클릭해서 살펴보도록 하게. You'll notice we just cleaned up the code to the right, and you now have tabs at the top of your editor. Go ahead, click between the tabs to try it out. +와우! 우리가 방금 코드를 오른편으로 정리했다는 걸 알 수 있을 걸세. 이제 에디터의 상단부에 탭들이 있네. 탭들을 클릭해서 살펴보도록 하게. -우리 코드가 꽤 길어지고 있으니, 여러 파일로 나누어 정리하면 더 관리하기 편하겠지. 보통 이런 방식으로 솔리디티 프로젝트의 긴 코드를 처리할 것이네. +우리 코드가 꽤 길어지고 있으니, 여러 파일로 나누어 정리하면 관리하기 더 편하겠지. 보통 이런 방식으로 솔리디티 프로젝트의 긴 코드를 처리할 것이네. 다수의 파일이 있고 어떤 파일을 다른 파일로 불러오고 싶을 때, 솔리디티는 `import`라는 키워드를 이용하지: @@ -77,7 +77,7 @@ contract newContract is SomeOtherContract { } ``` -이 컨트렉트와 동일한 폴더에 (이게 `./`가 의미하는 바임) `someothercontract.sol`이라는 파일이 있을 때, 이 파일을 컴파일러가 불러오게 되지. +이 컨트랙트와 동일한 폴더에 (이게 `./`가 의미하는 바임) `someothercontract.sol`이라는 파일이 있을 때, 이 파일을 컴파일러가 불러오게 되지. # 직접 해보기 diff --git a/ko/2/7-storage.md b/ko/2/7-storage.md index e18d72e608..ed8abccd11 100644 --- a/ko/2/7-storage.md +++ b/ko/2/7-storage.md @@ -71,7 +71,7 @@ material: 솔리디티에는 변수를 저장할 수 있는 공간으로 `storage`와 `memory` 두 가지가 있지. -**_Storage_**는 블록체인 상에 영구적으로 저장되는 변수를 의미하지. **_Memory_**는 임시적으로 저장되는 변수로, 컨트렉트 함수에 대한 외부 호출들이 일어나는 사이에 지워지지. 두 변수는 각각 컴퓨터 하드 디스크와 RAM과 같지. +**_Storage_**는 블록체인 상에 영구적으로 저장되는 변수를 의미하지. **_Memory_**는 임시적으로 저장되는 변수로, 컨트랙트 함수에 대한 외부 호출들이 일어나는 사이에 지워지지. 두 변수는 각각 컴퓨터 하드 디스크와 RAM과 같지. 대부분의 경우에 자네는 이런 키워드들을 이용할 필요가 없네. 왜냐면 솔리디티가 알아서 처리해 주기 때문이지. 상태 변수(함수 외부에 선언된 변수)는 초기 설정상 `storage`로 선언되어 블록체인에 영구적으로 저장되는 반면, 함수 내에 선언된 변수는 `memory`로 자동 선언되어서 함수 호출이 종료되면 사라지지. diff --git a/ko/2/9-internalfunctions.md b/ko/2/9-internalfunctions.md index af4de4e5f5..d36eb9070f 100644 --- a/ko/2/9-internalfunctions.md +++ b/ko/2/9-internalfunctions.md @@ -106,15 +106,15 @@ material: 자네가 코드를 컴파일하려고 하면 컴파일러가 에러 메시지를 출력할 거네. -문제는 `ZombieFeeding` 컨트렉트 내에서 `_createZombie` 함수를 호출하려고 했다는 거지. 그런데 `_createZombie` 함수는 `ZombieFactory` 컨트렉트 내의 `private` 함수이지. 즉, `ZombieFactory` 컨트렉트를 상속하는 어떤 컨트렉트도 이 함수에 접근할 수 없다는 뜻이지. +문제는 `ZombieFeeding` 컨트랙트 내에서 `_createZombie` 함수를 호출하려고 했다는 거지. 그런데 `_createZombie` 함수는 `ZombieFactory` 컨트랙트 내의 `private` 함수이지. 즉, `ZombieFactory` 컨트랙트를 상속하는 어떤 컨트랙트도 이 함수에 접근할 수 없다는 뜻이지. ## Internal과 External `public`과 `private` 이외에도 솔리디티에는 `internal`과 `external`이라는 함수 접근 제어자가 있지. -`internal`은 함수가 정의된 컨트렉트를 상속하는 컨트렉트에서도 접근이 가능하다 점을 제외하면 `private`과 동일하지. **(우리한테 필요한 게 바로 `internal`인 것 같군! +`internal`은 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하다 점을 제외하면 `private`과 동일하지. **(우리한테 필요한 게 바로 `internal`인 것 같군! -`external`은 함수가 컨트렉트 바깥에서만 호출될 수 있고 컨트렉트 내의 다른 함수에 의해 호출될 수 없다는 점을 제외하면 `public`과 동일하지. 나중에 `external`과 `public`이 각각 왜 필요한지 살펴 볼 것이네. +`external`은 함수가 컨트랙트 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없다는 점을 제외하면 `public`과 동일하지. 나중에 `external`과 `public`이 각각 왜 필요한지 살펴 볼 것이네. `interal`이나 `external` 함수를 선언하는 건 `private`과 `public` 함수를 선언하는 구문과 동일하네: @@ -140,7 +140,7 @@ contract BLT is Sandwich { # 직접 해보기 -1. `_createZombie()` 함수를 `private`에서 `internal`로 바꾸어 선언하여 이 함수가 정의된 컨트렉트를 상속하는 컨트렉트에서도 접근 가능하도록 한다. +1. `_createZombie()` 함수를 `private`에서 `internal`로 바꾸어 선언하여 이 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근 가능하도록 한다. 이미 `zombiefactory.sol` 탭이 활성화되어 있다. \ No newline at end of file