Solidity极简入门 | ERC721专题第二讲:ERC721相关接口

原文标题:《Solidity 极简入门 ERC721 专题:2. ERC721 相关接口》
原文来源: 0xAA

我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。

不知不觉我已经完成了 Solidity 极简教程的前 13 讲(基础),内容包括:Helloworld.sol,变量类型,存储位置,函数,控制流,构造函数,修饰器,事件,继承,抽象合约,接口,库,异常。在进阶内容之前,我决定做一个 ERC721 的专题,把之前的内容综合运用,帮助大家更好的复习基础知识,并且更深刻的理解 ERC721 合约。希望在学习完这个专题之后,每个人都能发行自己的 NFT。本文为该系列第二讲,第一讲为:《Solidity 极简入门 | ERC721 专题第一讲:合约概览与相关库》

ERC721 相关接口

ERC721 的主合约一共引用了 4 个接口合约:IERC721.sol, IERC721Receiver.sol, IERC721Metadata.sol,和间接引用的 ERC165 的 IERC165.sol。这一讲我们将逐个介绍这 4 个接口合约。

IERC165 接口

首先我们介绍一下 EIP165(以太坊改进建议第 165 条),他的目的是创建一个标准方法来发布和检测智能合约实现的接口。讲一个去年年底发生的真实事件,PeopleDAO 有个朋友错转了 4000w 枚 PEOPLE 到 Token 合约。但合约没有实现转出 Token 的功能,只能进不能出,这些 Token 直接锁死在里面销毁了。试想一下,如果在转账的时候自动判断接收方合约是否实现了相应的接口,没实现的话就 revert 交易,很多错转 Token 的悲剧都不会发生。EIP165 就是干这个的,而 ERC165 就是 EIP165 的实现。

IERC165 是 ERC165 的接口合约,只有一个函数 supportsInterface(),输入想查询的接口的 interfaceId,返回一个 bool 告诉你合约是否实现了该接口。

 

ERC721 主合约对 supportsInterface() 的实现如下:

 

可以看到,ERC721 实现了 IERC721,IERC721Metadata 和 IERC165 的接口,查询的时候会返回 true;否则返回 false。我会在进阶内容中更详细的介绍 function selector 和 interfaceId。

 

IERC721

IERC721 是 ERC721 的接口合约,里面包括 3 个 event 和 9 个 function:  


其中 event 包括:


1、Transfer 事件:在转账时被释放,记录 Token 的发出地址 from,接收地址 to 和 tokenid。

2、Approval 事件:在授权时释放,记录 approve 的发出地址 owner,被授权地址 approved 和 tokenid。

3、ApprovalForAll 事件:在批量授权时释放,记录 approve 的发出地址 owner,被授权地址 operator 和是否被授权 approved。

其中 function 包括:

1、balanceOf:参数为要查询的地 address,返回该地址的 NFT 持有量 balance。

2、ownerOf:参数为要查询的 tokenId,返回这个 tokenId 的主人 owner。

3、safeTransferFrom:安全转账(如果接收方是合约地址,会要求实现 ERC721 的接收接口)。参数为转出地址 from,接收地址 to 和 tokenId。

4、transferFrom:普通转账(不检查对方是否实现 ERC721 的接收接口),参数为转出地址 from,接收地址 to 和 tokenId。

5、approve:授权,批准另一个地址使用你的 NFT。参数为被授权地址 approve 和 tokenId。

6、getApproved:查询 NFT 被批准给了哪个地址,参数为 tokenId,返回被批准的地址 approve。

7、setApprovalForAll:将自己持有的这类 NFT 批量授权给某个地址,参数为被授权的地址 operator 和是否授权 approved。

8、isApprovedForAll:查询某人的 NFT 是否批量授权给了某个地址,参数为授权方 owner 和被授权地址 operator,返回 bool。

9、safeTransferFrom:安全转账,与 3. 不同的地方在于参数里面包含了 data,可以做额外处理。

IERC721Receiver  

 

IERC721Receiver 接口包含了一个函数 onERC721Received()。这个函数会在 safeTransferFrom() 中被调用,Token 的接收合约必须实现这个接口才能转账成功。

IERC721Metadata  

IERC721Metadata 是 ERC721 的拓展接口,实现了 3 个查询 metadata 的常用函数:

1、name():返回 Token 名称;

2、symbol():返回 Token 代号;

3、tokenURI():通过 tokenId 查询 metadata 所在 url。

总结

本文是 ERC721 专题的第二讲,我们介绍了 ERC721 主合约调用的 4 个接口合约 IERC165,IERC721,IERC721Receiver 和 IERC721Metadata。下一讲终于该介绍 ERC721 主合约了!LFG!

Solidity极简入门 | ERC721专题第二讲:ERC721相关接口

扫一扫手机访问

Solidity极简入门 | ERC721专题第二讲:ERC721相关接口

发表评论