Solidity实现智能合约——宠物孵化系统(一)

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实现智能合约——宠物进食系统(二).

Guess you like

Origin blog.csdn.net/qq_43537319/article/details/121162602