目录
一、前言
看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。从这篇博客开始总结自己的学习笔记,与大家一同分享。
如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
二、伪随机与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);
}
}