Solidity极简入门 | ERC721专题第一讲:合约概览与相关库

点击上方“小强的进阶之路”,选择“星标”公众号

优质文章,及时送达

6f07ddb096692fa4b0c6bcf2e67298fd.jpeg

预计阅读时间: 2分钟

所有代码开源在 github(64 个 star 开微信交流群 已开,128 个 star 录教学视频,256 个开进阶内容): github.com/AmazingAng/WTFSolidity

Solidity 极简教程内容包括:Helloworld.sol,变量类型,存储位置,函数,控制流,构造函数,修饰器,事件,继承,抽象合约,接口,库,异常。

在进阶内容之前,决定做一个 ERC721 的专题,把之前的内容综合运用,帮助大家更好的巩固基础知识,并且更深刻的理解 ERC721 合约。希望在学习完这个专题之后,每个人都能发行自己的 NFT。

ERC721 合约概览

ERC721 主合约一共引用了 7 个合约:

370e7df1aceee2d1ca98e4109505860d.jpeg

他们分别是:

3 个库合约:Address.sol, Context.sol 和 Strings.sol3 个接口合约:IERC721.sol, IERC721Receiver.sol, IERC721Metadata.sol1 个 EIP165 合约:ERC165.sol

所以在讲 ERC721 的主合约之前,我们会花两讲在引用的库合约和接口合约上。

ERC721 相关库 

Address 库  

Address 库是 Address 变量相关函数的合集,包括判断某地址是否为合约,更安全的 function call。ERC721 用到其中的 isContract():

c85fd3e5399ae80b89cfe3e53cac8ea0.jpeg

这个函数利用了非合约地址 account.code 的长度为 0 的特性,从而区分某个地址是否为合约地址。

ERC721 主合约在_checkOnERC721Received() 函数中调用了 isContract()。

29b7b846565a8fa51355a269ed52acb9.jpeg

该函数的目的是在接收 ERC721 Token 的时候判断该地址是否是合约地址;如果是合约地址,则继续检查是否实现了 IERC721Receiver 接口(ERC721 的接收接口),防止有人误把 Token 转到了黑洞。

Context 库

Context 库非常简单,封装了两个 Solidity 的 global 变量:msg.sender 和 msg.data

a6d22af88188f307d2fe9db5b9a3b81e.jpeg

这两个函数只是单纯的返回 msg.sender 和 msg.data。所以 Context 库就是为了用函数把 msg.sender 和 msg.data 关键词包装起来,应对 solidity 未来某次升级换掉关键字的情况,没其他作用。

String 库

包含两个库函数:toString() 和 toHexString()。toString() 把 uint256 直接转换成 string,比如 777 变为」777」;而 toHexString() 把 uint256 先转换为 16 进制,再转换为 string,比如 170 变为」0xaa」。ERC721 调用了 toString() 函数:

d3e04d2ececbabedcd9c26410c3b219d.jpeg

这个函数先确定了传入的 uint256 参数是几位数,并存在 digits 变量中。然后用循环把每一位数字的 ASCII 码转换成 bytes1,存在 buffer 中,最后把 buffer 转换成 string 返回。

ERC721 主合约在 tokenURI() 函数中调用了 toString():

a9b36cac44a35831940d2c48fa3a6ded.jpeg

这个函数把 baseURI 和指定的 tokenId 拼接到一起,返回 ERC721 metadata 的网址,你花几十个 ETH 买的的 jpeg 就是存在这个网址上的。  

总结

这一讲是 ERC721 专题的第一讲,我们概览了 ERC721 的合约,并介绍了 ERC721 主合约调用的 3 个库合约 Address,Context 和 String。

28faac9174d14369a98103045c445d0d.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值