CryptoZombies学习笔记——Lesson5

时间:2023-03-10 06:18:23
CryptoZombies学习笔记——Lesson5

chapter1:token代币

简而言之,通证就是支持交易的包含一系列规范的函数接口的一个智能合约,发币可以用ERC20标准,但是像僵尸这种非同质化代币,需要用ERC721标准

chapter2:erc721 和多继承

  erc721目前仍是草稿,没有官方建议标准。

contract ERC721 {
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); function balanceOf(address _owner) public view returns (uint256 _balance);
function ownerOf(uint256 _tokenId) public view returns (address _owner);
function transfer(address _to, uint256 _tokenId) public;
function approve(address _to, uint256 _tokenId) public;
function takeOwnership(uint256 _tokenId) public;
}

  solidity支持多继承,用逗号隔开继承的父类。

chapter3:balanceOf , ownerOf函数的应用

chapter4:重构

  注意到ownerOf函数和前面课程中一个modifier重名了,此时我们不能修改erc721中的函数名,因为这是一个标准,所有其他也用了erc721的合约希望函数名是相同的,这样才能实现通信,所以我们要改变自己定义的那个函数名。

chapter5:erc721交易逻辑

  erc721有两种交易方法。

  第一种: transfer函数,参数tokenid和目标账户地址,完成转账;

  第二种:approve函数,参数tokenid和目标账户,标记目标账户为允许提取代币;当外部账户通过takeOwnerShip发起提取时,合约检查账户是否有许可,如果有则完成转账。

chapter9:防止溢出

  在以太坊虚拟机(EVM) 中, 整数指定了固定大小的数据类型。这是指一个整型变量只
能有一定范围的数字表示。 比如,一个 uint8 的范围是[0,255]。 如果输入 256,则会表示
成 0。不加注意的话,只要没有检查用户输入又执行计算,导致数字超出存储它们的数据类
型允许的范围, Solidity 中的变量就可以被用来组织攻击。 今年 4 月,黑客对 BEC 智能合
约进行溢出漏洞攻击,造成代币增发贬值。
  OpenZepplin 提供了一个 SafeMath 库,可以保障数值避免出现溢出,能够有效的避免
溢出漏洞的出现

chapter10:SafeMath第二部分

  出现了一个新关键词:library。可以利用using关键字让library中的方法运用在其他数据类型上。比如:

using SafeMath for uint;
// now we can use these methods on any uint
uint test = 2;
test = test.mul(3); // test now equals 6
test = test.add(5); // test now equals 11

在safeMath库中,有一个assert语句,和require类似,会抛出异常。和require不同的是,require失败会返还gas,但assert不会。

  所以在solidity中我们对数值进行操作时一定要使用safemath库,比如:

myUint++;

  更改为:

myUint = myUint.add(1);

chapter 11:  

  但是存在一个问题,safemath是针对uint256的,如果输入的数据是uint16或uint8之类,会强制转换成uint256,那么对于uint8溢出的数据转换后就不溢出了,容易造成错误。

  所以safemath库中还提供了safemath32,safemath16的library,可以直接using调用。

chapter12:

  编程时加一些标签是一个好习惯:

  //这是一个普通注释

  ///@notice:这时候一个带标签的netspec tag。标签有@title,@author,@notice解释该合约或函数做什么,@dev解释对开发者的更多细节,@param,@return。

到这里整个教程的代码部分就结束了,下一章学习的是如何部署智能合约。