【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

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.