智能合约入门系列(七)

您所在的位置:网站首页 approve和approval区别 智能合约入门系列(七)

智能合约入门系列(七)

2023-10-30 18:26| 来源: 网络整理| 查看: 265

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」

前言

和ERC20一样,ERC721同样是一个代币标准,ERC721官方简要解释是Non-Fungible Tokens,简写为NFTs,多翻译为非同质代币。NFT 包含了记录在其代币合约中的识别信息。这些信息使每一个 NFT 代币各有不同,因此不能被另一种代币直接取代。

方法介绍 pragma solidity ^0.4.20; interface ERC721 { event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); } 1.balanceOf

返回由_owner 持有的NFTs的数量。

2.ownerOf

返回tokenId代币持有者的地址,即某个nft的持有者地址。

3.safeTransferFrom

将NFT的所有权从一个地址转移到另一个地址。

4.transferFrom

转移NFT所有权。

5.approve

授予地址_to具有_tokenId的控制权,方法成功后需触发Approval 事件。

6.setApprovalForAll

授予第三方operator,对msg.sender所有资产的操作的权利,即授予地址_operator具有所有NFTs的控制权,成功后需触发ApprovalForAll事件。

7.getApproved

获取单个NFT的approved address。

8.isApprovedForAll

查询address是否是另一个address的authorized operator 。

注意事项

如果合约(应用)要接受NFT的安全转账,则必须实现如下接口。

interface ERC721TokenReceiver { /// @notice 处理接收NFT /// @dev ERC721智能合约在`transfer`完成后,在接收这地址上调用这个函数。 /// 函数可以通过revert 拒绝接收。返回非`0x150b7a02` 也同样是拒绝接收。 /// 注意: 调用这个函数的 msg.sender是ERC721的合约地址 /// @param _operator :调用 `safeTransferFrom` 函数的地址。 /// @param _from :之前的NFT拥有者 /// @param _tokenId : NFT token id /// @param _data : 附加信息 /// @return 正确处理时返回 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4); } 扩展接口 元数据接口

元数据包括一个名称和符号,这可以为每一个721代币定义tokenURI , 每个代币都应该有自己的URI。

interface ERC721Metadata { /// @notice NFTs 集合的名字 function name() external view returns (string _name); /// @notice NFTs 缩写代号 function symbol() external view returns (string _symbol); /// @notice 一个给定资产的唯一的统一资源标识符(URI) /// @dev 如果 `_tokenId` 无效,抛出异常. URIs在 RFC 3986 定义, /// URI 也许指向一个 符合 "ERC721 元数据 JSON Schema" 的 JSON 文件 function tokenURI(uint256 _tokenId) external view returns (string); } 枚举接口

枚举接口包含了按索引获取到对应的代币,可以提供NFTs的完整列表,以便NFT可被发现。

interface ERC721Enumerable { /// @notice NFTs 计数 /// @return 返回合约有效跟踪(所有者不为零地址)的 NFT数量 function totalSupply() external view returns (uint256); /// @notice 枚举索引NFT /// @dev 如果 `_index` >= `totalSupply()` 则抛出异常 /// @param _index 小于 `totalSupply()`的索引号 /// @return 对应的token id(标准不指定排序方式) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice 枚举索引某个所有者的 NFTs /// @dev 如果 `_index` >= `balanceOf(_owner)` 或 `_owner` 是零地址,抛出异常 /// @param _owner 查询的所有者地址 /// @param _index 小于 `balanceOf(_owner)` 的索引号 /// @return 对应的token id (标准不指定排序方式) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);} 总结

2021年一直在说元宇宙,结合区块链技术,erc721所代表的唯一性,就可代表我们在这个元宇宙的入口,一一对应。万物皆可NFT,我们每个人都可是一个NFT。所以了解erc721是非常有必要的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3