Solidity实现智能合约——宠物孵化系统(一)
上一节中简单介绍了如何实现一个智能合约,接下来我们将实现一个宠物孵化系统。
合约功能:输入宠物名会生成宠物相对于的DNA,然后会将宠物名和DNA存储到一个数组当中,我们可以进行查询。
首先在AnimalFactory.sol文件当中建立一个基础合约AnimalFactory,并指定Solidity编译器版本
pragma solidity ^0.4.19;
contract AnimalFactory{
}
宠物DNA由16个数字组成
uint dnaDigits = 16; //宠物DNA位数
uint dnaLength = 10**dnaDigits;
创建宠物结构体
struct Animal{
string name;
uint dna;
}
为了将宠物们保存在合约当中,并且让其他合约也能够看到这些宠物,因为需要一个公共数组,创建一个Animal的结构体数组
Animal [] public animals;
定义一个事件NewAnimal,有三个参数AnimalId,name,以及dna
event NewAnimal(uint AnimalId,string name,uint dna);
定义一个孵化宠物函数,其功能为孵化一个新宠物并添加入animas数组
// 孵化宠物函数
function hatchAnimal(string name,uint dna) public{
animals.push(Animal(name,dna));
}
建立一个私有函数_createAnimal,在函数体中新建一个Animal,然后把它加入animals数组,同时将animals的索引值记录为animalId,在函数结束时触发事件NewAnimal
function _createAnimal(string _name,uint _dna) internal{
uint animalId = animals.push(Animal(_name,_dna))-1;
NewAnimal(animalId, _name, _dna);
}
定义DNA生成函数,根据字符串随机生成一个DNA,创建函数_generateRandomDna,属性为private
function _generateRandomDna(string _str) private view returns(uint){
uint rand = uint(keccak256(_str));
return rand % dnaLength;
}
最后定义一个公共函数,把上面的定义若干部件组合起来,实现这样的功能:该函数能够接收宠物的名字,然后用这个名字来生成宠物的DNA
function createRandomAnimal(string _name) public {
uint randDna = _generateRandomDna(_name);
_createAnimal(_name, randDna);
}
最后我们来看一下完整的代码
pragma solidity ^0.4.19;
contract AnimalFactory{
uint dnaDigits = 16; //宠物DNA位数
uint dnaLength = 10**dnaDigits;
struct Animal{
string name;
uint dna;
}
Animal [] public animals;
// 孵化宠物函数
function hatchAnimal(string name,uint dna) public{
animals.push(Animal(name,dna));
}
event NewAnimal(uint AnimalId,string name,uint dna);
function _createAnimal(string _name,uint _dna) internal{
uint animalId = animals.push(Animal(_name,_dna))-1;
NewAnimal(animalId, _name, _dna);
}
function _generateRandomDna(string _str) private view returns(uint){
uint rand = uint(keccak256(_str));
return rand % dnaLength;
}
function createRandomAnimal(string _name) public {
uint randDna = _generateRandomDna(_name);
_createAnimal(_name, randDna);
}
}
接下来我们来编译这个合约进行实现功能,我这里定义的合约名不一样,大家不要在意(代码有些是第二部分的,所以先注释了)
部署成功后可以打开这个合约
在createRandomAnimal可以任意输入你想命名的宠物名
也可以在animals中输入0进行查询生成的宠物相关信息
到这里我们就实现一个简单的宠物孵化合约,下一节我们会进行升级宠物
传送门:链接: Solidity实现智能合约——宠物进食系统(二).