【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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos