第十三章: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作为僵尸的id
        uint 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有了一个大概的了解了。接下来还有高级篇章的内容。
敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值