原教程:https://cryptozombies.io/zh/lesson/1
第1章: 课程概述
第一课你将创造一个"僵尸工厂", 用它建立一支僵尸部队。
我们的工厂会把我们部队中所有的僵尸保存到数据库中
工厂会有一个函数能产生新的僵尸
每个僵尸会有一个随机的独一无二的面孔
在后面的课程里,我们会增加功能。比如,让僵尸能攻击人类或其它僵尸! 但是在实现这些好玩的功能之前,我们先要实现创建僵尸这样的基本功能。
僵尸DNA如何运作
僵尸的面孔取决于它的DNA。它的DNA很简单,由一个16位的整数组成:
8356281049284737
如同真正的DNA, 这个数字的不同部分会对应不同的特点。 前2位代表头型,紧接着的2位代表眼睛,等等。
注: 本教程我们尽量简化。我们的僵尸只有7种头型(虽然2位数字允许100种可能性)。以后我们会加入更多的头型, 如果我们想让僵尸有更多造型。
例如,前两位数字是 83, 计算僵尸的头型,我们做83 % 7 + 1 = 7 运算, 此僵尸将被赋予第七类头型。
第2章: 合约
从最基本的开始入手:
Solidity 的代码都包裹在合约里面. 一份合约就是以太应币应用的基本模块, 所有的变量和函数都属于一份合约, 它是你所有应用的起点.
一份名为HelloWorld
的空合约如下:
contract HelloWorld {
}
版本指令
所有的 Solidity 源码都必须冠以 “version pragma” — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。
例如: pragma solidity ^0.4.19;
(当前 Solidity 的最新版本是 0.4.19).
综上所述, 下面就是一个最基本的合约 — 每次建立一个新的项目时的第一段代码:
pragma solidity ^0.4.19;
contract HelloWorld {
}
第3章: 状态变量和整数
真棒!我们已经为我们的合约做了一个外壳, 下面学习 Solidity 中如何使用变量。
状态变量
是被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。
例子:
contract Example {
// 这个无符号整数将会永久的被保存在区块链中
uint myUnsignedInteger = 100;
}
在上面的例子中,定义myUnsignedInteger
为uint
类型,并赋值100。
无符号整数: uint
uint
无符号数据类型, 指其值不能是负数,对于有符号的整数存在名为int
的数据类型。
注: Solidity
中, uint
实际上是uint256
代名词, 一个256位的无符号整数。你也可以定义位数少的uints — uint8
,uint16
,uint32
,等…… 但一般来讲你愿意使用简单的 uint, 除非在某些特殊情况下,这我们后面会讲。
第4章: 数学运算
在 Solidity 中,数学运算很直观明了,与其它程序设计语言相同:
- 加法: x + y
- 减法: x - y
- 乘法: x * y
- 除法: x / y
- 取模 / 求余: x % y (例如, 13 % 5 余 3, 因为13除以5,余3)
Solidity 还支持乘方操作
(如:x 的 y次方) // 例如: 5 ** 2 = 25
uint x = 5 ** 2; // equal to 5^2 = 25
第5章: 结构体
有时你需要更复杂的数据类型,Solidity 提供了结构体
:
struct Person {
uint age;
string name;
}
结构体允许你生成一个更复杂的数据类型,它有多个属性。
注:我们刚刚引进了一个新类型string
。字符串用于保存任意长度的UTF-8
编码数据。如:string greeting = "Hello world!"
。
第6章: 数组
如果你想建立一个集合,可以用数组
这样的数据类型. Solidity 支持两种数组: 静态数组
和动态数组
:
// 固定长度为2的静态数组:
uint[2] fixedArray;
// 固定长度为5的string类型的静态数组:
string[5] stringArray;
// 动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;
你也可以建立一个结构体
类型的数组 例如,上一章提到的 Person:
Person[] people; // 这是动态数组,我们可以不断添加元素
记住:状态变量被永久保存在区块链中。所以在你的合约中创建动态数组来保存成结构的数据是非常有意义的。
公共数组
你可以定义public
数组, Solidity 会自动创建getter
方法. 语法如下:
Person[] public people;
其它的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。
第7章: 定义函数
在 Solidity 中函数定义的句法如下:
function eatHamburgers(string _name, uint _amount) {
}
这是一个名为e