风险提示:请理性看待区块链,树立正确的货币观念和投资理念,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。 免责声明:本站所发布文章仅代表个人观点,与highland-crypto官方立场无关

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

介绍ERC721主合约的6个状态变量和28个函数。

原文标题:《Solidity 极简入门 ERC721 专题:3. ERC721 主合约》

原文来源:0xAA

 

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

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

 

 

ERC721 主合约

我在 ERC721 前两讲介绍了它的相关库和接口,终于这讲可以介绍主合约了。ERC721 主合约包含 6 个状态变量和 28 个函数,我们将会一一介绍。并且,我给 ERC721 代码增加了中文注释,方便大家使用。

状态变量

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _name 和_symbol 是两个 string,存储 Token 的名称和代号。

· _owners 是 tokenId 到 owner 地址的 Mapping,存储每个 Token 的持有人。

· _balances 是 owner 地址到持币数量的 Mapping,存储每个地址的持仓量。

· _tokenApprovals 是 tokenId 到授权地址的 Mapping,存储每个 token 的授权信息。

· _operatorApprovals 是 owner 地址到是否批量批准的 Mapping,存储每个 owner 的批量授权信息。注意,批量授权会把你钱包持有这个系列的所有 nft 都授权给另一个地址,别人可以随意支配。

函数

· constructor:构造函数,设定 ERC721Token 的名字和代号(_name 和_symbol 变量)。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· supportsInterface:实现 IERC165 接口 supportsInterface,详见ERC721 专题第二讲

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· balanceOf:实现 IERC721 的 balanceOf,利用_balances 变量查询 owner 地址的 balance。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· ownerOf:实现 IERC721 的 ownerOf,利用_owners 变量查询 tokenId 的 owner。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· name:实现 IERC721Metadata 的 name,查询 Token 名称。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· symbol:实现 IERC721Metadata 的 symbol,查询 Token 代号。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· tokenURI:实现 IERC721Metadata 的 tokenURI,查询 Tokenmetadata 存放的网址。Opensea 还有小狐狸钱包显示你 NFT 的图片,调用的就是这个函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _baseURI:基 URI,会被 tokenURI() 调用,跟 tokenId 拼成 tokenURI,默认为空,需要子合约重写这个函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

· approve:实现 IERC721 的 approve,将 tokenId 授权给 to 地址。条件:to 不是 owner,且 msg.sender 是 owner 或授权地址。调用_approve 函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· getApproved:实现 IERC721 的 getApproved,利用_tokenApprovals 变量查询 tokenId 的授权地址。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· setApprovalForAll:实现 IERC721 的 setApprovalForAll,将持有 Token 全部授权给 operator 地址。调用_setApprovalForAll 函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· isApprovedForAll:实现 IERC721 的 isApprovedForAll,利用_operatorApprovals 变量查询 owner 地址是否将所持 NFT 批量授权给了 operator 地址。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· transferFrom:实现 IERC721 的 transferFrom,非安全转账,不建议使用。调用_transfer 函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· safeTransferFrom:实现 IERC721 的 safeTransferFrom,安全转账,调用了_safeTransfer 函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _safeTransfer:安全转账,安全地将 tokenId Token 从 from 转移到 to,会检查合约接收者是否了解 ERC721 协议,以防止 Token 被永久锁定。调用了_transfer 函数和_checkOnERC721Received 函数。条件:

1.from 不能是 0 地址.

2.to 不能是 0 地址.

3.tokenId Token 必须存在,并且被 from 拥有.

4.如果 to 是智能合约, 他必须支持 IERC721Receiver-onERC721Received.

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _exists:查询 tokenId 是否存在(等价于查询他的 owner 是否为非 0 地址)。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _isApprovedOrOwner:查询 spender 地址是否被可以使用 tokenId(他是 owner 或被授权地址)。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _safeMint:安全 mint 函数,铸造 tokenId 并转账给 to 地址。条件: tokenId 尚不存在, 若 to 为智能合约,他要支持 IERC721Receiver-onERC721Received 接口。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _safeMint 的实现,调用了_checkOnERC721Received 函数和_mint 函数。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _mint:internal 铸造函数。通过调整_balances 和_owners 变量来铸造 tokenId 并转账给 to,同时释放 Tranfer 事件。条件: tokenId 尚不存在。 to 不是 0 地址.

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _burn:internal 销毁函数,通过调整_balances 和_owners 变量来销毁 tokenId,同时释放 Tranfer 事件。条件:tokenId 存在。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _transfer:转账函数。通过调整_balances 和_owner 变量将 tokenId 从 from 转账给 to,同时释放 Tranfer 事件。条件: tokenId 被 from 拥有 to 不是 0 地址

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _approve:授权函数。通过调整_tokenApprovals 来,授权 to 地址操作 tokenId,同时释放 Approval 事件。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _setApprovalForAll:批量授权函数。通过调整_operatorApprovals 变量,批量授权 to 来操作 owner 全部代币,同时释放 ApprovalForAll 事件。

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

 

· _checkOnERC721Received:函数,用于在 to 为合约的时候调用 IERC721Receiver-onERC721Received, 以防 tokenId 被不小心转入黑洞。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _beforeTokenTransfer:这个函数在转账之前会被调用(包括 mint 和 burn)。默认为空,子合约可以选择重写。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

· _afterTokenTransfer:这个函数在转账之后会被调用(包括 mint 和 burn)。默认为空,子合约可以选择重写。

 

 

Solidity极简入门 | ERC721专题第三讲:ERC721主合约

 

总结

 

本文是 ERC721 专题的第三讲,我介绍了 ERC721 主合约的全部变量和函数,并给出了合约的中文注释。有了 ERC721 标准,NFT 项目方只需要把 mint 函数包装一下,就可以发行 NFT 了。下一讲,我们会介绍无聊猿 BAYC 的合约,了解一下最火 NFT 在标准 ERC721 合约上做了什么改动。

原文链接

律动 BlockBeats 提醒,根据银保监会等五部门于 2018 年 8 月发布《关于防范以「虚拟货币」「区块链」名义进行非法集资的风险提示》的文件,请广大公众理性看待区块链,不要盲目相信天花乱坠的承诺,树立正确的货币观念和投资理念,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。

原创文章,作者:BlockBeats,如若转载,请注明出处:https://highland-crypto.com/2995/

发表回复

您的电子邮箱地址不会被公开。