继续上一节我们使用_generateRandomDna方法随机的产生DNA,如果了解过比特币的实现,其中有一块很重要的地方就是使用哈希函数来生成随机数,在区块链中随机的生成安全的随机数是一项比较难的工作,在本章中使用Ethereum内部散列函数来生成16位的随即数。
一.生成随机数
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
}
函数和Java也很类似,转换后类型强转也没什么说的。
二.组合函数
将随机生成dna的方法和创建僵尸的方法通过createRandomZombie组合在一起:
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
到这里我们的合约基本完成了,我们直接将代码复制到http://remix.ethereum.org/ 这个在线的IDE,当然用我们之前创建的truffle环境也可以,但这个使用起来更简单,直接右上角compile后在Run里点击create就创建一个合约实例了,输入相应参数点击createRandomZombie方法就产生了相应的一个僵尸了,再点击zombies数组直接看见我们创建的僵尸了:
三.事件
事件是合约和区块链通讯的机制,可以在前端来监听这些事件,并作出反应,来如当僵尸创建成功时,我们就通过事件返回它们:
pragma solidity ^0.4.19;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
event NewZombie(uint zombieId, string name, uint dna); 这个就是事件,在_createZombie方法中调用事件 NewZombie(id, _name, _dna);就能让前端监听到:
至于前端怎么监听事件显示数据,我们在后面继续学习!!!