【CryptoZombies - 1 Solidity 教程】016 函数多返回值奖励实战

2023-12-11 20:39

本文主要是介绍【CryptoZombies - 1 Solidity 教程】016 函数多返回值奖励实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。

如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

二、 函数多返回值

1、讲解

之前我们看到,我们使用了一个返回多个值的函数。

function getKitty(uint256 _id) external view returns (bool isGestating,bool isReady,uint256 cooldownIndex,uint256 nextActionAt,uint256 siringWithId,uint256 birthTime,uint256 matronId,uint256 sireId,uint256 generation,uint256 genes
) {Kitty storage kit = kitties[_id];// if this variable is 0 then it's not gestatingisGestating = (kit.siringWithId != 0);isReady = (kit.cooldownEndBlock <= block.number);cooldownIndex = uint256(kit.cooldownIndex);nextActionAt = uint256(kit.cooldownEndBlock);siringWithId = uint256(kit.siringWithId);birthTime = uint256(kit.birthTime);matronId = uint256(kit.matronId);sireId = uint256(kit.sireId);generation = uint256(kit.generation);genes = kit.genes;
}

很多用户python的同学对这种方式是比较习惯的,比如,我们写一个函数,我们有一个函数,并给出其参数和自变量的值:

a = 2
b = 4
c = 6
x1 = 1
x2 = 1
y = a * x1 + b * x2 + c

我们定义一个函数,用于修改参数:

def changePara(new_a,new_b,new_c):return new_a,new_b,new_ca,b,c = changePara(1,2,3)

这种方式就是多返回值。

接下来我们通过一个简单的例子来讲解一下在以太坊中的多返回值。

首先,我们可以定义一个具有多返回值的函数:

function multipleReturns() internal returns(uint a, uint b, uint c) {return (1, 2, 3);
}

当我们定义完这样一个函数,我们就可以在下面调用,进行多个参数同时赋值:

function processMultipleReturns() external {uint a;uint b;uint c;// 这样来做批量赋值:(a, b, c) = multipleReturns();
}

如果我们只想对一个参数进行赋值,我们对其他的参数留空即可:

// 如果我们只想返回其中一个变量:
function getLastReturnValue() external {uint c;// 可以对其他字段留空:(,,c) = multipleReturns();
}

 

2、实战

1.要求

我们来定义一个函数,从 kitty 合约中获取它的基因:

1.创建一个名为 feedOnKitty 的函数。它需要2个 uint 类型的参数,_zombieId 和_kittyId ,这是一个 public 类型的函数。

2.函数首先要声明一个名为 kittyDna 的 uint

3.这个函数接下来调用 kittyContract.getKitty函数, 传入 _kittyId ,将返回的 genes 存储在 kittyDna 中。记住 —— getKitty 会返回一大堆变量。 (确切地说10个 - 我已经为你数过了,不错吧!)。但是我们只关心最后一个-- genes。数逗号的时候小心点哦!

4.最后,函数调用了 feedAndMultiply ,并传入了 _zombieId 和 kittyDna 两个参数。

 

2.代码

pragma solidity >=0.5.0 <0.6.0;import "./zombiefactory.sol";contract KittyInterface {function getKitty(uint256 _id) external view returns (bool isGestating,bool isReady,uint256 cooldownIndex,uint256 nextActionAt,uint256 siringWithId,uint256 birthTime,uint256 matronId,uint256 sireId,uint256 generation,uint256 genes);
}contract ZombieFeeding is ZombieFactory {address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;KittyInterface kittyContract = KittyInterface(ckAddress);function feedAndMultiply(uint _zombieId, uint _targetDna) public {require(msg.sender == zombieToOwner[_zombieId]);Zombie storage myZombie = zombies[_zombieId];_targetDna = _targetDna % dnaModulus;uint newDna = (myZombie.dna + _targetDna) / 2;_createZombie("NoName", newDna);}// define function herefunction feedOnKitty(uint _zombieId,uint _kittyId) public {uint kittyDna;(,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);feedAndMultiply(_zombieId,kittyDna);}}

三、 奖励:Kitty基因实战

1、说明

我们完成了函数多返回值的学习,也就完成了基本的功能逻辑主体了,接下来我们为其添加一个奖励功能。

首先我们需要给kitty制造的僵尸添加一些特征,用以说明他们是小猫僵尸。我们在第一节课讲到DNA中的前12位用于指定僵尸外观,我们使用后两位来处理特殊特征。

我们常说猫有9条命,所以将最后两位设为99,在这里我们要使用判断语句,这与在JavaScript中差不多。示例如下:

function eatBLT(string sandwich) public {// 看清楚了,当我们比较字符串的时候,需要比较他们的 keccak256 哈希码if (keccak256(sandwich) == keccak256("BLT")) {eat();}
}

 

2、实战

1.要求

在僵尸代码中实现小猫的基因。:

1.首先,修改下 feedAndMultiply 函数的定义,给它传入第三个参数:一条名为 _species 的字符串(存储为memory)。

2.接下来,在我们计算出新的僵尸的DNA之后,添加一个 if 语句来比较 _species 和字符串 "kitty" 的 keccak256 哈希值。

注意:我们不能直接把字符串传递给keccak256。相反,我们将在左侧传递abi.encodePacked(_species)作为参数,在右侧传递abi.encodePacked(“kitty”)作为参数

3.在 if 语句中,我们用 99 替换了新僵尸DNA的最后两位数字。可以这么做:

newDna = newDna - newDna % 100 + 99;

4.最后,我们修改了 feedOnKitty 中的函数调用。当它调用 feedAndMultiply 时,增加 “kitty” 作为最后一个参数。

 

2.代码

pragma solidity >=0.5.0 <0.6.0;import "./zombiefactory.sol";contract KittyInterface {function getKitty(uint256 _id) external view returns (bool isGestating,bool isReady,uint256 cooldownIndex,uint256 nextActionAt,uint256 siringWithId,uint256 birthTime,uint256 matronId,uint256 sireId,uint256 generation,uint256 genes);
}contract ZombieFeeding is ZombieFactory {address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;KittyInterface kittyContract = KittyInterface(ckAddress);// Modify function definition here:function feedAndMultiply(uint _zombieId, uint _targetDna, string memory _species) public {require(msg.sender == zombieToOwner[_zombieId]);Zombie storage myZombie = zombies[_zombieId];_targetDna = _targetDna % dnaModulus;uint newDna = (myZombie.dna + _targetDna) / 2;// Add an if statement hereif(keccak256(abi.encodePacked(_species)) == keccak256(abi.encodePacked("kitty"))) {newDna = newDna - newDna % 100 + 99;}_createZombie("NoName", newDna);}function feedOnKitty(uint _zombieId, uint _kittyId) public {uint kittyDna;(,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);// And modify function call here:feedAndMultiply(_zombieId, kittyDna, "kitty");}}

 

这篇关于【CryptoZombies - 1 Solidity 教程】016 函数多返回值奖励实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482044

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里