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

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是Solidity中的一个简单宠物孵化合约示例,附带注释以便解释代码实现的功能: ```solidity pragma solidity ^0.8.0; contract PetBreeding { // 定义一个结构体,表示宠物的属性 struct Pet { string name; // 宠物名字 uint8 age; // 宠物年龄 uint8 level; // 宠物等级 uint8 health; // 宠物健康值 } // 存储所有宠物的数组 Pet[] public pets; // 宠物孵化函数 function breedPet(string memory name, uint8 age) public { // 创建一个新的宠物对象 Pet memory newPet = Pet({ name: name, age: age, level: 1, health: 100 }); // 将宠物添加到数组中 pets.push(newPet); } // 获取指定宠物的属性 function getPet(uint256 index) public view returns (string memory, uint8, uint8, uint8) { require(index < pets.length, "Pet does not exist"); Pet storage pet = pets[index]; return (pet.name, pet.age, pet.level, pet.health); } } ``` 这个合约实现了一个简单的宠物孵化功能。合约中定义了一个`Pet`结构体,表示宠物的属性,包括名字、年龄、等级和健康值。还定义了一个`pets`数组,用于存储所有宠物对象。 `breedPet`函数用于孵化新的宠物,它接受一个名字和年龄作为参数,并创建一个新的宠物对象,并将其添加到`pets`数组中。 `getPet`函数用于获取指定宠物的属性,它接受一个索引作为参数,并返回该索引对应的宠物对象的名字、年龄、等级和健康值。 请注意,这个合约没有涉及到任何实际的宠物,只是演示了如何使用Solidity实现一个简单的宠物孵化合约。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值