第十三章:ZombieFactory
本章是第一大章的最后一张,通过一段代码和详细的注释,把我们前面所学到的知识全部复习一遍。认真看完每一行。你会有不一样的收获。
// SPDX-License-Identifier: GPL-3.0//标明Solidity编译器的版本为0.8.11
pragma solidity ^0.8.11;
//定义一个叫ZombieFactory的合约
contract ZombieFactory {//定义NewZombie事件,参数为:zombieId(uint),name(string),和dna(uint)。event NewZombie(uint zombieId, string name, uint dna);//为了保证我们的僵尸的DNA只含有16个字符,我们先造一个uint数据。//让它等于10^16。这样一来以后我们可以用模运算符 % 把一个整数变成16位。//僵尸DNA将由一个十六位数字组成uint dnaDigits = 16;//建立一个uint类型的变量,名字叫dnaModulus,令其等于10的 dnaDigits 次方。uint dnaModulus = 10 ** dnaDigits;//建立一个struct 命名为 Zombie。//Zombie 结构体有两个属性:name (类型为 string),和 dna (类型为 uint)。struct Zombie {string name;uint dna;}//为了把一个僵尸部队保存在我们的应用里,并且能够让其它应用看到这些僵尸//我们需要创建一个数据类型为 Zombie 的结构体数组//用 public 修饰,命名为:zombies。Zombie[] public zombies;//在我们的应用里,我们要能创建一些僵尸,定义私有函数createZombie。//它有两个参数: _name (类型为string) _dna (类型为uint)。//不要忘记使用memory关键字按值传递第一个参数function _createZombie(string memory _name, uint _dna) private {//创建一个 Zombie,然后把它加入 zombies 数组中。 //新创建的僵尸的 name 和 dna,来自于函数的参数。zombies.push(Zombie(_name, _dna));//数组的长度-1作为僵尸的iduint id = zombies.length - 1;//触发NewZombie事件emit NewZombie(id, _name, _dna);}//我们需要一个辅助函数,它可以从字符串中生成随机 DNA 编号。//创建一个 private 函数,命名为 _generateRandomDna。//它只接收一个输入变量 _str (类型 string), 返回一个 uint 类型的数值。//不要忘记将_str参数设置为memory。//此函数只读取我们合约中的一些变量,所以标记为view。function _generateRandomDna(string memory _str) private view returns (uint) {//用keccak256,结合参数_str生成一个伪随机数,并且转换成uint类型uint rand = uint(keccak256(abi.encodePacked(_str)));//我们希望我们的 DNA 只有 16 位数长//所以应该return是上面计算的数值对 dnaModulus 求余数(%)。return rand % dnaModulus;}//创建一个 public 函数,命名为 createRandomZombie。//它将被传入一个变量 _name (数据类型是 string)。 function createRandomZombie(string memory _name) public {//函数的第一行应该调用 _generateRandomDna 函数,传入 _name 参数。//结果保存在一个类型为 uint 的变量里,命名为 randDna。uint randDna = _generateRandomDna(_name);//第二行调用 _createZombie 函数, 传入参数: _name 和 randDna。_createZombie(_name, randDna);}}
好了,现在你对solidity有了一个大概的了解了。接下来还有高级篇章的内容。
敬请期待。
第十三章:ZombieFactory相关推荐
- 谭浩强《C++程序设计》书后习题 第十三章-第十四章
2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...
- python 教程 第十三章、 特殊的方法
第十三章. 特殊的方法 1) 特殊的方法 __init__(self,...) 这个方法在新建对象恰好要被返回使用之前被调用. __del__(self) 恰好在对象要被删除之前调用. __st ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- 第十三章、facl及用户及Linux终端
第十三章.facl及用户及Linux终端 08_01_facl及用户及Linux终端 文件系统访问列表: 如何让tom的文件被jerry读写? 用户名:tom, 基本组:tom 1. 添加jerry访 ...
- 第十三章 簇-机器学习老师板书-斯坦福吴恩达教授
第十三章 簇 13.1 无监督学习介绍 13.2 K-均值算法 13.3 优化目标 13.4 随机初始化 13.5 选择簇的数量 13.1 无监督学习介绍 13.2 K-均值算法 13.3 优化目标 ...
- 鸟哥的Linux私房菜(服务器)- 第十三章、文件服务器之一:NFS 服务器
第十三章.文件服务器之一:NFS 服务器 最近更新日期:2011/07/27 NFS为 Network FileSystem 的简称,它的目的就是想让不同的机器.不同的操作系统可以彼此分享个别的档案啦 ...
- 数字图像处理:第二十三章 基于内容的图象与视频检索
第二十三章基于内容的图象与视频检索 目录 1. 引言 2. 基于内容检索的图象特征 3. 基于内容的视频标注与检索 作业 1. 引言 随着社会的信息化发展日益深入,互连网日益普及,越 ...
- 数字图像处理:第十三章 图象复原
第十三章 图象复原 目录 1. 引言 2. 数学模型 3. 维纳滤波(Wiener Filtering) 作业 1. 引言 图象复原是早期图象处理的主要内容之一,目的在于消除或减轻 ...
- [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...
第十三章 Windows脚本环境 现在的许多开发人员以前都是在MS-DOS环境下编程的.几乎所有人都接触过批处理文件--一种基于文本命令的文件.这种文件使你能够在一个可执行命令中组合多个指令.批处理文 ...
- stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...
最新文章
- pytorch可视化 resnet50特征图
- vs修改 exe名字
- PHP面试题:实现中文字串截取无乱码的方法
- git报ssh variant 'simple' does not support setting port解决办法
- 锁的释放流程-ReentrantLock.tryRelease
- nodejs 创建一个静态资源服务器 +路由
- 博客,文字的卡拉OK版
- Java并发编程(01):线程的创建方式,状态周期管理
- Bootstrap学习(一)
- 接口与interface关键字
- CodeForces 632C	The Smallest String Concatenation(水)
- gbcbig.shx字体的BUG
- 20年以后的科技发展小短文计算机,20年后的我小学想象作文
- 使用 Kotlin 中的 takeIf
- 宝塔同时安装苹果cms海洋cms_苹果cms和海洋cms通用的百度主动推送工具
- FFmpeg视频处理入门教程----从安装到使用(Linux版)
- 设置柱状图每根柱子的颜色
- 背包问题之多重背包基础写法
- python和正则表达式抽取文本化的信息
- EPLAN_采购列表的使用