pragma solidity ^0.4.19; //指定版本号
/**
关卡1 : 创建 根据输入的姓名 创建随机僵尸
学习网址: https://cryptozombies.io/zh
**/
// 创建合约
contract ZombieFactory {
/**
关于事件:
事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。
例子:
// 这里建立事件
event IntegersAdded(uint x, uint y, uint result);
function add(uint _x, uint _y) public {
uint result = _x + _y;
//触发事件,通知app
IntegersAdded(_x, _y, result);
return result;
}
你的 app 前端可以监听这个事件。JavaScript 实现如下:
YourContract.IntegersAdded(function(error, result) {
// 干些事
})
**/
//建立事件
event NewZombie(uint zombieId, string name, uint dna);
/**
无符号整数: uint
uint 无符号数据类型, 指其值不能是负数,对于有符号的整数存在名为 int 的数据类型。
**/
uint dnaDigits = 16; //设置僵尸DNA为16位 Digits n. 数字
uint dnaModulus = 10 ** dnaDigits; // 10 的 16次方
// 结构体允许你生成一个更复杂的数据类型,它有多个属性。
struct Zombie {
string name; //僵尸名字
uint dna; //僵尸DNA 16位
}
/**
如果你想建立一个集合,可以用 _数组_这样的数据类型. Solidity 支持两种数组:静态数组和动态数组:
固定长度为2的静态数组:
uint[2] fixedArray;
固定长度为5的string类型的静态数组:
string[5] stringArray;
动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;
公共数组
你可以定义 public 数组, Solidity 会自动创建 getter 方法. 语法如下:
Person[] public people;
其它的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。
**/
Zombie[] public zombies; //创建结构体/ java中叫对象 数组
/**
函数:
1. 习惯上函数里的变量都是以(_)开头 (但不是硬性规定) 以区别全局变量
2. 只有当你需要外部世界调用它时才将它设置为公共。
public / private 只能内部使用 类似于java暴露或者不暴露接口
3. 把函数定义为 view, 意味着它只能读取数据不能更改数据
pure 函数, 表明这个函数甚至都不访问应用里的数据,例如:
function _multiply(uint a, uint b) private pure returns (uint) {
return a * b;
}
这个函数甚至都不读取应用里的状态 — 它的返回值完全取决于它的输入参数,
在这种情况下我们把函数定义为 pure.
4. 指定函数返回值类型 returns(数据类型)
**/
function _createZombie(string _name, uint _dna) private { // 创建僵尸函数
// zombies.push(Zombie(_name, _dna)); // 僵尸对象数组 放入创建的僵尸
uint id = zombies.push(Zombie(_name, _dna)) - 1;
NewZombie(id, _name, _dna);
/**
定义僵尸id
array.push() 返回数组的长度类型是uint
因为数组的第一个元素的索引是 0, array.push() - 1 将是我们加入的僵尸的索引。
zombies.push() - 1 就是 id, 数据类型是 uint 把它用到 NewZombie 事件中。
**/
}
// 创建僵尸的随机DNA 返回值类型为 uint 无符号整型
function _generateRandomDna(string _str) private view returns (uint) {
/**
Ethereum 内部有一个散列函数keccak256,它用了SHA3版本。
一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。
字符串的一个微小变化会引起散列数据极大变化。 这里使用它来创建一个随机数 一个伪随机十六进制数
_str 参数为僵尸的名字 rand % 10^16 得到 16位长度的DNA
**/
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
//最后创建一个随机的僵尸 给定一个僵尸名字
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name); //创建随机DNA
_createZombie(_name, randDna); //创建僵尸
}
}
《智能合约Solidity学习笔记 - 僵尸军团》Part1- 搭建僵尸工厂
最新推荐文章于 2024-05-18 17:40:35 发布