区块链 | ERC721 标准

这篇具有很好参考价值的文章主要介绍了区块链 | ERC721 标准。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

正文

1  ERC721 接口

事件

方法

2  ERC165 接口

3  可选实现接口:ERC721Metadata

4  可选实现接口:ERC721Enumerable

补充说明

1  NTF IDs

2  与 ERC-20 的兼容性

3  交易、挖矿、销毁


🥕原文:剖析非同质化代币 ERC721 标准

🥕写在前面:本文属搬运博客,自己留存学习。

正文

ERC721 作为一个合约标准,提供了在实现 ERC721 代币时必须要遵守的协议,要求每个 ERC721 标准合约需要实现「ERC721」及「ERC165」接口。ERC721 标准的合约一旦被部署,它将负责跟踪在以太坊上创建的代币。

1  ERC721 接口

ERC721 的接口定义如下。

interface ERC721 {
    /// event
    /// function
}

事件

event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
  • Transfer 事件:当任何 NFT 的所有权通过任何机制发生变化时触发此事件。此事件在 NFT 被创建(from == 0)和销毁(to == 0)时触发。例外情况:在合约创建期间,可以创建并分配任意数量的 NFT 而不触发 Transfer 事件。在任何转移时,该 NFT 上的被授权地址将被重置为无。
  • Approval 事件:当 NFT 的被授权地址被更改或确立时触发此事件。零地址表示没有被授权地址。当 Transfer 事件被触发时,这也表示该 NFT 上的被授权地址被重置为无。
  • ApprovalForAll 事件:这个事件在操作员为某个所有者启用或禁用时触发。这个操作员可以管理所有者的所有 NFT 。 

方法

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);

接口说明:

  • balanceOf( ):返回 _owner 持有的 NFTs 的数量。
  • ownerOf( ):返回 _tokenId 对应代币的持有者的地址。
  • approve( ):授予地址 _to 具有 _tokenId 的控制权,方法成功后需触发 Approval 事件。
  • setApprovalForAll( ):授予地址 _operator 具有所有 NFTs 的控制权,成功后需触发 ApprovalForAll 事件。
  • getApproved( ), isApprovedForAll( ):用于查询授权。
  • safeTransferFrom( ):转移 NFT 所有权,一次成功的转移操作必须发起 Transer 事件。
  • transferFrom( ):用来转移 NFTs,方法成功后需触发 Transfer 事件。调用者自己确认 _to 地址能正常接收 NFT,否则将丢失此 NFT 。此函数实现时需要检查下面条件的前四条。

也就是说,transferFrom( ) 满足调用 safeTransferFrom( ) 的条件的前四条即可。

调用 safeTransferFrom( ) 的条件:

  1. 调用者 msg.sender 应该是当前 _tokenId 的所有者或被授权的地址;
  2. _from 必须是 _tokenId 的所有者;
  3. _tokenId 应该是当前合约正在监测的 NFTs 中的任何一个;
  4. _to 地址不应该为 0;
  5. 如果 _to 是一个合约,则应该调用它的 onERC721Received 方法,并且检查其返回值。如果返回值不为 bytes4(keccak256("onERC721Received(address,uint256,bytes)")),则抛出异常。

一个可接收 NFT 的合约必须实现 ERC721TokenReceiver 接口:

interface ERC721TokenReceiver {
    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}

2  ERC165 接口

ERC165 的接口定义如下:

interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

ERC165 同样是一个合约标准,这个标准要求合约提供其实现了哪些接口,这样在与合约进行交互的时候可以先调用此接口进行查询。

interfaceID 为函数选择器,计算方式有两种,如:bytes4(keccak256('supportsInterface(bytes4)')); 或 ERC165.supportsInterface.selector,多个函数的接口 ID 为函数选择器的异或值。

就是说可以通过 ERC165 查询 ERC721 实现了哪些接口?

3  可选实现接口:ERC721Metadata

ERC721Metadata 接口用于提供合约的元数据:name,symbol 以及 URI,其接口定义如下:

interface ERC721Metadata {
    function name() external pure returns (string _name);
    function symbol() external pure returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

接口说明:

  • name( ):返回合约名字,尽管是可选,但强烈建议实现,即便是返回空字符串。
  • symbol( ):返回合约代币符号,尽管是可选,但强烈建议实现,即便是返回空字符串。
  • tokenURI( ):返回 _tokenId 所对应的外部资源文件的 URI(通常是 IPFS 或 HTTP(S) 路径)。

外部资源文件需要包含名字、描述、图片,其格式的要求如下: 

{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents",
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents",
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive.",
        }
    }
}

采用的是 JSON 格式。

4  可选实现接口:ERC721Enumerable

ERC721Enumerable 的主要目的是提高合约中 NTF 的可访问性,其接口定义如下:

interface ERC721Enumerable {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

接口说明:

  • totalSupply( ):返回 NFT 总量。
  • tokenByIndex( ):通过索引返回对应的 tokenId 。
  • tokenOfOwnerByIndex( ):所有者可以一次拥有多个的 NFT,此函数返回 _owner 拥有的 NFT 列表中对应索引的 tokenId 。

NFT 总量应该就是该 NFT 合约铸造的 NFT 代币的总量吧?

补充说明

1  NTF IDs

NTF 的 ID,即 tokenId,在合约中用唯一的 uint265 进行标识,每个 NFT 的 ID 在智能合约的生命周期内不允许改变。推荐的实现方式有:

  • 第一种:从 0 开始,每新加一个 NFT,NTF 的 ID 加 1 。
  • 第二种:使用 sha3 后 uuid 转换为 NTF 的 ID 。

2  与 ERC-20 的兼容性

ERC721 标准尽可能遵循 ERC-20 的语义,但由于同质代币与非同质代币之间的根本差异,并不能完全兼容 ERC-20 。

3  交易、挖矿、销毁

在实现 transter 相关接口时除了满足上面的的条件外,我们可以根据需要添加自己的逻辑,如加入黑名单等。同时挖矿、销毁尽管不是标准的一部分,我们可以根据需要实现。


官方:ERC-721: Non-Fungible Token Standard文章来源地址https://www.toymoban.com/news/detail-860415.html

到了这里,关于区块链 | ERC721 标准的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Alchemy开发NFT智能合约(ERC721)

    使用Solidity开发智能合约并在区块链上部署可能一开始听起来有些吓人:Solidity、安全性、gas优化、开发环境和gas费用,这些只是你需要了解的一些事情,才能让你的代码托管在区块链上。不用担心,我们来帮你梳理一下。 不过,幸运的是,在过去几个月中,已经发布了许多工具,让开发人员可以更轻松地进行智能合约开发工作。

    2024年02月06日
    浏览(34)
  • conflux开发NFT智能合约(ERC721 & 工厂合约 & 可升级合约)

    以下场景可借鉴本文内容 需要创建很多合约 需要使用conflux代付机制(只需将工厂合约设置为代付,即可无限创建新合约) 合约想要有可升级的能力(如:特殊玩法 or 代码有bug) ERC-721 NFT 基于以上场景,需要三个主要合约实现 工厂合约 代理合约 逻辑合约 想要完全掌握本文

    2024年01月17日
    浏览(39)
  • Solidity合约标准----ERC721

    非同质化token,它依赖于ERC-165 参照官方提供的案例,直接部署到remix,自动下载依赖 https://docs.openzeppelin.com/contracts/4.x/erc721 部署成功后拥有以下功能 1. 设置待测试的4个账户 2. 铸造NFT 3. 查询NFT数量 4. 依据tokenid查询NFT属主 5.部分NFT委托授权第三者 6.查询NFT是否已被授权 7.由第

    2024年02月02日
    浏览(28)
  • ERC721标准与加密猫

    2017 年 11 月 28 日,“加密猫”游戏出现在互联网上。这是基于以太坊的 ERC721 标准(不可互换通证)发行的加密数字宠物,每一只猫咪各不相同。 加密猫的正式中文名叫“谜恋猫”,游戏的官网称这些加密猫是“可收藏、可繁殖、讨人喜欢的”。用户可以用以太币换购这种猫

    2024年01月16日
    浏览(37)
  • 以太坊数字资产的发行和流通:以太坊上的数字资产定义、ERC 20代币合约标准、ERC 20标准接口、ERC 721代币合约标准、

    以太坊设计的目标就是让各种数字资产能以智能合约的形式运行在以太坊虚拟机上。目前,众多智能合约中最广泛应用的是代币合约(Token Contract)。是负责管理账户以及其拥有的代币的智能合约,实质可以理解为一张账户地址和对应账户代币余额的映射表。 即:代币可以被

    2023年04月11日
    浏览(44)
  • 以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

    以太坊改进提案(EIP)代表了以太坊区块链内协作进步的顶峰。它们是技术文章或提案,描述对以太坊网络的建议更改或增强。 这些文档经过精心制作,呈现了新的功能、流程或环境,在任何形式的采用或实施之前都需要社区的审查。 至关重要的是要认识到改进提案的概念

    2024年04月11日
    浏览(33)
  • ERC721和加密收藏品(ERC721 & Crypto-Collectibles)

    唷!这里的气氛开始升温了…… 在这节课中,我们将更深入一些。 我们将讨论代币、ERC721标准和加密可收集资产。 换句话说,我们要做的是让你可以和朋友交换僵尸。 我们来谈谈代币。 如果你在以太坊领域呆过一段时间,你可能听过人们谈论代币——特别是 ERC20代币 。 以

    2024年03月11日
    浏览(33)
  • ERC20 | ERC-20/ERC-721/ERC-1155/ERC-3525 区别

    EIP 20 的地址:https://eips.ethereum.org/EIPS/eip-20 ERC 是 Ethereum Request for Comment 的缩写,也就是以太坊改进建议。提交 ERC 后,以太坊社区会对这个草案进行评估,最终会接受或者拒绝该建议。如果接受的话,ERC 会被确认为 EIP。 EIP 是 Ethereum Improvement Proposals 的缩写,也就是被接纳的

    2024年02月05日
    浏览(31)
  • 【ERC-721与ERC-1155有什么区别?】

    无论您是加密爱好者还是第一次使用密码,您都可能听说过以太坊。它是最具影响力的开源区块链平台之一,用于创建智能合约、加密货币和去中心化应用程序。以太坊的智能合约改变了加密货币的世界,区块链技术现在渴望成为全球多个行业的标准。 大多数区块链发烧友已

    2024年02月01日
    浏览(37)
  • Eth Of Erc20 And Erc721

    public,可以修饰变量和函数, 被修饰的函数或变量可以被任何合约调用(或访问),默认的变量和函数使用该属性。 private,可以修饰变量和函数,被修饰者只能被当前合约内部的代码所调用(或访问),不能被外部合约调用或继承它的子合约调用(或访问)。 extermal,只能修饰函数

    2024年02月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包