目录
一、前言
看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。从这篇博客开始总结自己的学习笔记,与大家一同分享。
如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
二、地址(Addresses)
1、账户(account)
以太坊区块链由账户组成。
2、以太(Ether)
账户的余额是以太,用于在以太坊区块链上支付。
3、地址
每个账户都有一个地址,是账户的唯一标识符。
三、映射(Mapping)
映射定义方式如下:
//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中:
mapping (address => uint) public accountBalance;
//或者可以用来通过userId 存储/查找的用户名
mapping (uint => string) userIdToName;
注:
映射本质上是存储和查找数据所用的键-值对。在第一个例子中,键是一个
address
,值是一个uint
,在第二个例子中,键是一个uint
,值是一个string
。
四、实战
1、要求
为了存储僵尸的所有权,我们使用到两个映射:一个记录僵尸拥有者的地址,另一个记录某地址所拥有僵尸的数量。
1.创建一个叫做 zombieToOwner
的映射。其键是一个uint
(我们将根据它的 id 存储和查找僵尸),值为 address
。映射属性为public
。
2.创建一个名为 ownerZombieCount
的映射,其中键是 address
,值是 uint
。
2、代码
pragma solidity ^0.4.25;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
// declare mappings here
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}