pragma solidity ^0.4.19; // 版本号
//建立智能合约
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
//定义一个 事件
叫做 NewZombie
。 它有3个参数: zombieId
(uint
), name
(string
), 和 dna
(uint
)。
uint dnaDigits = 16; //定义 dnaDigits
为 uint
数据类型, 并赋值 16
uint dnaModulus = 10 ** dnaDigits; //建立一个uint
类型的变量,名字叫dnaModulus
, 令其等于 10的 dnaDigits
次方.
struct Zombie {
string name;
uint dna;
}
//建立一个struct
命名为 Zombie
结构体,有两个属性: name
(类型为 string
), 和 dna
(类型为 uint
)。
Zombie[] public zombies;
// 创建一个数据类型为 Zombie
的结构体数组,用 public
修饰,命名为:zombies
.
function _createZombie(string _name, uint _dna) private {
// 函数 createZombie
。 有两个参数: _name (类型为string
), 和 _dna (类型为uint
),可见性为私有。
uint id = zombies.push(Zombie(_name, _dna)) - 1;
//定义uint id为索引 为数组zombies.push返回数组的长度,所以要减一。
NewZombie(id, _name, _dna);
//调用事件
}
function _generateRandomDna(string _str) private view returns (uint) {
//private
函数,命名为 _generateRandomDna
。接收一个输入变量 _str
(类型 string
), 返回一个 uint
类型的数值,可见性为私有,view只读函数。
uint rand = uint(keccak256(_str));
// _str
的 keccak256
散列值生成一个伪随机十六进制数,类型转换为 uint
, 最后保存在类型为 uint
名为 rand
的变量中。
return rand % dnaModulus;
// return
上面计算的数值对 dnaModulus
求余数(%
)。
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
// 创建一个 public
函数,命名为 createRandomZombie
. 它将被传入一个变量 _name
(数据类型是 string
)。
// 函数的第一行应该调用 _generateRandomDna
函数,传入 _name
参数, 结果保存在一个类型为 uint
的变量里,命名为 randDna
。
// 第二行调用 _createZombie
函数, 传入参数: _name
和 randDna
。
}
}