Skip to content

Commit

Permalink
Merge pull request CryptozombiesHQ#20 from HangYang/master
Browse files Browse the repository at this point in the history
imporved cn translation in lesson 1
  • Loading branch information
lukezhangstudio authored Jan 25, 2018
2 parents 2f3c99e + 0044064 commit 9ed9190
Show file tree
Hide file tree
Showing 17 changed files with 66 additions and 54 deletions.
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
vendor
.bundle/
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
build/
.tmp
.idea/
4 changes: 2 additions & 2 deletions zh/1/00-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ roadmap: roadmap.jpg

你认为你可以当一个合格的**CryptoZombie**, 嗯?

这个教学过程会教你如何搭建一个以太网的游戏
这个教程会教你如何搭建一个以太网的游戏

这个课程是为了Solidity初学者而设计的,需要你对其他的程序语言有所了解(如Javascript).
此课程为 Solidity 初学者设计,需要你对其他的程序语言有所了解(如 JavaScript).
2 changes: 1 addition & 1 deletion zh/1/arrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,4 @@ Person[] public people;

为了把一个僵尸部队保存在我们的APP里,并且能够让其它APP看到这些僵尸,我们需要一个公共数组。

1. 创建一个数据类型为`Zombie`的被`public`修饰的结构体数组,命名为:`zombies`.
1. 创建一个数据类型为`Zombie`的结构体数组,用`public`修饰,命名为:`zombies`.
2 changes: 1 addition & 1 deletion zh/1/arraysstructs2.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ struct Person {
Person[] public people;
```

现在我们学习创建新的 `Person`结构,然后把它加入到名为`people` 数组中.
现在我们学习创建新的 `Person`结构,然后把它加入到名为`people` 的数组中.

```
// 创建一个新的Person:
Expand Down
2 changes: 1 addition & 1 deletion zh/1/contracts.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ contract HelloWorld {

所有的solidity源码都必须冠以 "version pragma" — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。

例如: `pragma solidity ^0.4.19;` (此时此刻,solidity 的最新版本是 0.4.19).
例如: `pragma solidity ^0.4.19;` (当前 solidity 的最新版本是 0.4.19).

综上所述, 下面就是一个最基本的合约 — 每次建立一个新的项目时的第一段代码:

Expand Down
4 changes: 2 additions & 2 deletions zh/1/datatypes.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ material:
}
---

真棒!我们已经为我们的合同做了一个外壳, 下面学习Solidity时如何使用变量
真棒!我们已经为我们的合约做了一个外壳, 下面学习 Solidity 中如何使用变量

**_状态变量_** 是被永久地保存在合同中。也就是说它们被写到以太币区块链中. 想象成写入一个数据库。
**_状态变量_** 是被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。

##### 例子:
```
Expand Down
8 changes: 4 additions & 4 deletions zh/1/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ material:
}
---

我们的合同几乎就要完成了!让我们加上一个**事件**.
我们的合约几乎就要完成了!让我们加上一个**事件**.

**事件** 是合同和区块链通讯的一种机制。你的前端应用‘监听’某些事件,并做出反应。
**事件** 是合约和区块链通讯的一种机制。你的前端应用‘监听’某些事件,并做出反应。

例子:

Expand All @@ -91,7 +91,7 @@ function add(uint _x, uint _y) public {
}
```

你的 app 前端可以监听这个事件。javascript实现如下:
你的 app 前端可以监听这个事件。JavaScript 实现如下:

```
YourContract.IntegersAdded(function(error, result) {
Expand All @@ -107,4 +107,4 @@ YourContract.IntegersAdded(function(error, result) {

2. 修改 `_createZombie` 函数使得当新僵尸造出来并加入`zombies`数组后,生成事件`NewZombie`

3. 需要定义僵尸`id`. `array.push()` 返回数组的长度类型是`uint` - 因为数组的第一个元素的索引是 0, `array.push() - 1` 将是我们加入的僵尸的索引。 `zombies.push() - 1` 就是 `id`,数据类型是`uint`。在下一行中你可以把它用到`NewZombie` 事件中。
3. 需要定义僵尸`id` `array.push()` 返回数组的长度类型是`uint` - 因为数组的第一个元素的索引是 0 `array.push() - 1` 将是我们加入的僵尸的索引。 `zombies.push() - 1` 就是 `id`,数据类型是`uint`。在下一行中你可以把它用到`NewZombie` 事件中。
4 changes: 2 additions & 2 deletions zh/1/functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ material:
}
---

在solidity中函数定义的句法如下:
在 Solidity 中函数定义的句法如下:

```
function eatHamburgers(string _name, uint _amount) {
Expand All @@ -69,4 +69,4 @@ eatHamburgers("vitalik", 100);

1. 建立一个函数 `createZombie`. 它接受两个输入变量: **名字** (类型`string`), 和 **__dna_** (类型`uint`)。

暂时让函数空着我们在后面会增加内容。
暂时让函数空着——我们在后面会增加内容。
8 changes: 4 additions & 4 deletions zh/1/functions2.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ material:
}
---

Solidity定义的函数的属性缺省为`公共`。 这就意味着任何一方 (或其它合同) 都可以调用你的合同里的函数
Solidity 定义的函数的属性缺省为`公共`。 这就意味着任何一方 (或其它合约) 都可以调用你的合约里的函数

显然,不是什么时候都需要这样,而且这样的合同易于受到攻击。 所以将自己的函数定义为`私有`是一个编程的好习惯,只有当你需要外部世界调用它时才将它设置为`公共`
显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为`私有`是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为`公共`

如何定义一个私有的函数呢?

Expand All @@ -61,12 +61,12 @@ function _addToArray(uint _number) private {
}
```

这意味着只有我们合同中的其它函数才能够调用这个函数,给 `numbers` 数组添加新成员。
这意味着只有我们合约中的其它函数才能够调用这个函数,给 `numbers` 数组添加新成员。

可以看到,在函数名字后面使用关键字 `private` 即可。和函数的输入参数类似, 私有函数的名字用(`_`)起始.

# 测试一把

我们的合同的`createZombie` 的缺省属性是公共,这意味着任何一方都可以调用它去创建一个僵尸。 咱们来把它变成私有吧!
我们的合约的`createZombie` 的缺省属性是公共,这意味着任何一方都可以调用它去创建一个僵尸。 咱们来把它变成私有吧!

1.`createZombie` 为私有函数,不要忘记遵守命名的规矩哦!
8 changes: 4 additions & 4 deletions zh/1/functions3.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,19 +67,19 @@ function sayHello() public returns (string) {
}
```

Solidity里,函数的定义里可包含返回值的数据类型(如本例中 `string`)。
Solidity 里,函数的定义里可包含返回值的数据类型(如本例中 `string`)。

## 函数的修饰符

上面的函数实际上没有改变Solidity里的状态,即,它没有改变任何值或者写任何东西。
上面的函数实际上没有改变 Solidity 里的状态,即,它没有改变任何值或者写任何东西。

这种情况下我们可以把函数定义为 **_view_**, 意味着它只读取数据但不更改数据:

```
function sayHello() public view returns (string) {
```

Solidity还支持 **_pure_** 函数, 表明这个函数甚至都没有接触程序里的数据,例如:
Solidity 还支持 **_pure_** 函数, 表明这个函数甚至都没有接触程序里的数据,例如:

```
function _multiply(uint a, uint b) private pure returns (uint) {
Expand All @@ -97,6 +97,6 @@ function _multiply(uint a, uint b) private pure returns (uint) {

1. 建立一个`private` 函数,命名为 `_generateRandomDna`。它只接收一个输入变量`_str` (类型`string`), 返回一个`uint`类型的数值。

2. 此函数只读取我们合同中的一些变量,所以标记为`view`
2. 此函数只读取我们合约中的一些变量,所以标记为`view`

3. 函数本身暂时空白,以后我们再添加代码。
8 changes: 4 additions & 4 deletions zh/1/keccak256.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ material:

如何让 `_generateRandomDna` 函数返回一个(半) 随机的 `uint`?

Ethereum内部有一个散列函数`keccak256`,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化,会导致散列数据一个大的变化
Ethereum 内部有一个散列函数`keccak256`,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据极大变化

这在Ethereum中有很多应用,但是现在我们只是用它造一个假想的随机数。
这在 Ethereum 中有很多应用,但是现在我们只是用它造一个假想的随机数。

例子:

Expand All @@ -82,9 +82,9 @@ keccak256("aaaac");
```
uint8 a = 5;
uint b = 6;
// throws an error because a * b returns a uint, not uint8:
// 将会跑出错误,因为 a * b 返回 uint, 而不是 uint8:
uint8 c = a * b;
// we have to typecast b as a uint8 to make it work:
// 我们需要将 b 转换为 uint8:
uint8 c = a * uint8(b);
```

Expand Down
12 changes: 6 additions & 6 deletions zh/1/lessoncomplete.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ material:
answer: 1
---

祝贺! 你完成了第一课,为你的部队创造了第一个僵尸。
恭喜! 你完成了第一课,为你的部队创造了第一个僵尸。

# 下面步骤
# 后面的步骤

这只是开始,我们每周都会出版新的CryptoZombies课程, 进一步开发我们的游戏,不断壮大我们的僵尸部队。
### 1. 登陆能保存你的学习进程
这只是开始,我们每周都会发布新的 CryptoZombies 课程, 进一步开发我们的游戏,不断壮大我们的僵尸部队。
### 1. 登录能保存你的学习进程

**_Sign in_** 保存学习进程点击页面顶部的 "Save Progress"。 一旦我们发布新的课程,我们会立即通知你。

### 2. 让你的朋友共享你的僵尸吧
### 2. 和你的朋友分享你的僵尸吧

**_Share_** 在Twitter等等上共享(需要插入图像/链接)
**_Share_** 在微博、Twitter等平台分享(需要插入图像/链接)
10 changes: 5 additions & 5 deletions zh/1/lessonoverview.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,26 @@ material:
* 工厂会有一个函数能产生新的僵尸
* 每个僵尸会有一个随机的独一无二的面孔

在后面的课程里,我们会增加功能。比如,让僵尸能攻击人类,或其它僵尸! 但是在实现这些好玩的功能之前,我们先要加入生出新僵尸的基本功能。
在后面的课程里,我们会增加功能。比如,让僵尸能攻击人类或其它僵尸! 但是在实现这些好玩的功能之前,我们先要加入生出新僵尸的基本功能。

## 僵尸DNA如何运作

僵尸的面孔取决于它的DNA。它的DNA很简单由一个16位的整数组成
僵尸的面孔取决于它的DNA。它的DNA很简单,由一个16位的整数组成

```
8356281049284737
```

如同真正的DNA, 这个数字的不同部分会对应不同的特点。 前2位代表头型,紧接着的2位代表眼睛,等等。

> 注: 本教程我们尽量简化。我们的僵尸只有7种头型(虽然2数字允许100种可能性)。 以后我们会加入更多的头型如果我们想增加僵尸的变化
> 注: 本教程我们尽量简化。我们的僵尸只有7种头型(虽然2位数字允许100种可能性)。以后我们会加入更多的头型, 如果我们想让僵尸有更多造型
例如,前两位数字是 `83`. 计算僵尸的头型,我们做`83 % 7 + 1` = 7 运算, 此僵尸将被赋予第七类头型。
例如,前两位数字是 `83` 计算僵尸的头型,我们做`83 % 7 + 1` = 7 运算, 此僵尸将被赋予第七类头型。

在右手页面,移动头基因`head gene` 滑块到第七位置(圣诞老人的帽子)可见`83`所对应的特点。

# 测试一把

1. 玩一下页面右侧的滑块。检验一下不同的数字对应不同的僵尸的长相。

好了,这已经足够你玩一会儿了。 当你想继续的时候,点击下面的"Next Chapter" ,让我们来钻研Solidity!
好了,这已经足够你玩一会儿了。 当你想继续的时候,点击下面的"下一章" ,让我们来钻研 Solidity!
4 changes: 2 additions & 2 deletions zh/1/math.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ material:
---

在Solidity中,数学运算很直观明了,于其它程序设计语言相同:
在 Solidity 中,数学运算很直观明了,与其它程序设计语言相同:

* 加法: `x + y`
* 减法: `x - y`,
* 乘法: `x * y`
* 除法: `x / y`
* 商 / 余数: `x % y` _(例如, `13 % 5``3`, 因为13除以5,余3)_

Solidity 还支持 **_乘方操作_** (如:x 的 y次方) // 例如: 5^2 = 25
Solidity 还支持 **_乘方操作_** (如:x 的 y次方) // 例如: 5 ** 2 = 25
```
# 测试一把
Expand Down
14 changes: 7 additions & 7 deletions zh/1/puttingittogether.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: 搭建在一起
title: 放在一起
actions: ['答案', '提示']
material:
editor:
Expand Down Expand Up @@ -64,16 +64,16 @@ material:
}
---

我们接近完成我们的随记僵尸制造器了,让我们写一个公共的函数把所有的部件连接起来
我们就快完成我们的随机僵尸制造器了,来写一个公共的函数把所有的部件连接起来

我们写一个公共函数,它又一个输入变量僵尸的名字,之后用它生成僵尸的DNA。
写一个公共函数,它有一个变量,用来输入僵尸的名字,之后用它生成僵尸的DNA。

# 测试一把

1. 建立一个 `public` 函数,命名为`createRandomZombie`. 它又一个输入变量 `_name` (数据类型是 `string`). _(注: 定义一个公共函数 `public`, 如同你定义一个私有 `private`函数的做法一样)_
1. 建立一个 `public` 函数,命名为` createRandomZombie`. 它将被传入一个变量 `_name` (数据类型是 `string`). _(注: 定义公共函数 `public` 和定义一个私有 `private` 函数的做法一样)_

2. 函数的第一行应该调用 `_generateRandomDna` 函数,作用于`_name`, 结果保存在一个类型为 `uint` 的变量里,命名为 `randDna`.
2. 函数的第一行应该调用 `_generateRandomDna` 函数,传入 `_name` 参数, 结果保存在一个类型为 `uint` 的变量里,命名为 `randDna`.

3. 第二行调用 `_createZombie` 函数, 输入参数`_name``randDna`.
3. 第二行调用 `_createZombie` 函数, 传入参数`_name``randDna`.

4. 结果因该生成4行代码 (包括函数的结束符号 `}` )。
4. 结果应该生成4行代码 (包括函数的结束符号 `}` )。
4 changes: 2 additions & 2 deletions zh/1/structs.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ struct Person {

结构允许你生成一个更复杂的数据类型,它有多个属性。

> 注:我们刚刚引进了一个新类型, `string`字符串用于保存任意长度的UTF-8 编码数据。 如: `string greeting = "Hello world!"`
> 注:我们刚刚引进了一个新类型, `string`字符串用于保存任意长度的 UTF-8 编码数据。 如: `string greeting = "Hello world!"`
# 测试一把

在我们的程序中,我们将生出一些僵尸!每个僵尸将拥有多个属性,所以这是一个展示结构的完美的例子
在我们的程序中,我们将生出一些僵尸!每个僵尸将拥有多个属性,所以这是一个展示结构的完美例子

1. 建立一个`struct` 命名为 `Zombie`.

Expand Down
14 changes: 7 additions & 7 deletions zh/1/web3js.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ material:
answer: 1
---

我们的Solidity合同完工了! 现在我们要写一段 javascript 前端的代码调用这个合同
我们的 Solidity 合约完工了! 现在我们要写一段 JavaScript 前端代码来调用这个合约

以太坊有一个Javascript库,称为**_Web3.js_**.
以太坊有一个 JavaScript 库,名为**_Web3.js_**.

在后面的课程里,我们会进一步地教你如何安装一个合同,如何设置Web3.js. 但是现在我们看一段代码了解Web3.js是如何和我们安装的合同打交道的吧
在后面的课程里,我们会进一步地教你如何安装一个合约,如何设置Web3.js. 但是现在我们通过一段代码来了解 Web3.js 是如何和我们安装的合约打交道的吧

不要担心,如果这些看起来毫无意义
如果下面的代码你不能全都理解,不用担心
```
// Here's how we would access our contract:
var abi = /* abi generated by the compiler */
Expand Down Expand Up @@ -67,10 +67,10 @@ function generateZombie(id, name, dna) {
}
```

我们的javascript所做的就是获取由`zombieDetails` 产生的数据, 利用浏览器里的javascript 神奇功能 (w我们用 Vue.js),置换出图像并安装CSS过滤器。在后面的课程中,你可以看到全部的代码。
我们的 JavaScript 所做的就是获取由`zombieDetails` 产生的数据, 利用浏览器里的 JavaScript 神奇功能 (我们用 Vue.js),置换出图像并安装CSS过滤器。在后面的课程中,你可以看到全部的代码。

# 试一下吧!

在右面的输入框里输入你的名字,看看你能得到那种僵尸
在右面的输入框里输入你的名字,看看你能得到哪种僵尸

**一旦你得到一个满意的僵尸, 点击下面的 "Next Chapter" 按钮保存你的僵尸,结束第一课!**
**一旦你得到一个满意的僵尸, 点击下面的 "下一章" 按钮保存你的僵尸,结束第一课!**

0 comments on commit 9ed9190

Please sign in to comment.