【CryptoZombies - 1 Solidity 教程】007伪随机、Keccak256 与类型转换

目录

一、前言

二、伪随机与Keccak256

1、Keccak256

2、伪随机

三、类型转换(Typecasting)

1、转换格式

四、实战

1、要求

2、代码


一、前言

看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。从这篇博客开始总结自己的学习笔记,与大家一同分享。

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

【CryptoZombies - 1 Solidity 教程】007伪随机、Keccak256 与类型转换

二、伪随机与Keccak256

1、Keccak256

Ethereum 内部有一个散列函数keccak256,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据极大变化。示例如下:

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

2、伪随机

在区块链中安全地产生一个随机数是一个很难的问题,上面产生的就是伪随机数。

三、类型转换(Typecasting)

1、转换格式

转换格式如下:

uint8 a;
uint b = 6;
a = uint8(b); //类型转换

注:uint 和 uint8 操作得到的结果的数据类型是 uint。

四、实战

1、要求

给 _generateRandomDna 函数添加代码实现如下功能:

1.第一行代码取 _str 的 keccak256 散列值生成一个伪随机十六进制数,类型转换为 uint, 最后保存在类型为 uint 名为 rand 的变量中。

2.我们只想让我们的DNA的长度为16位 (还记得 dnaModulus?)。所以第二行代码应该 return 上面计算的数值对 dnaModulus 求余数(%)。

创建一个 public 函数,命名为createRandomZombie,实现如下功能:

1.它将被传入一个变量 _name (数据类型是 string)。 (注: 定义公共函数 public 和定义一个私有 private 函数的做法一样)

2.函数的第一行应该调用 _generateRandomDna 函数,传入 _name 参数, 结果保存在一个类型为 uint 的变量里,命名为 randDna

3.第二行调用 _createZombie 函数, 传入参数: _name 和 randDna

4.整个函数应该是4行代码 (包括函数的结束符号 } )。

2、代码

pragma solidity ^0.4.25;

contract ZombieFactory {

    // 这里建立事件

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

 

上一篇:区块链技术问答精选上线


下一篇:Solidity高级用法