智能合约入门系列(七) |
您所在的位置:网站首页 › approve和approval区别 › 智能合约入门系列(七) |
「这是我参与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 |