什么是 ERC-721 接口?
ERC-721 接口是一组标准化的智能合约函数和事件,用于在 Ethereum 及兼容区块链网络上表示和转移非同质化代币。非同质化代币(NFT)代表具有唯一标识的代币,而不是可互换的相同单位数量。官方ERC-721 规范定义了钱包、应用、智能合约和区块链工具如何查询 NFT 所有权并执行标准化转账。
该接口不决定 NFT 代表什么、价值多少,也不保证其关联内容真实。它定义了一种通用技术语言,供不同的加密应用与 NFT 合约交互时使用。ERC-721 标准在 Ethereum 改进提案流程中达到 Final 状态,目前仍是独特区块链资产的主要标准之一。ERC-721 可用于数字收藏品、游戏道具、会员凭证、虚拟土地、活动门票、类似域名的资产、金融头寸和代币化记录。接口为什么重要?
智能合约接口描述了兼容软件预期合约提供的外部函数和事件。如果没有通用接口,每个 NFT 项目都可能采用不同的函数名称和转账规则。这样一来,钱包和去中心化应用就需要为每个系列编写定制代码。ERC-721 接口允许软件调用
ERC-721 代币为何具有非同质性?
每个 ERC-721 代币都有一个名为 token ID 的唯一无符号整数。代币由其所在区块链网络、合约地址和 token ID 共同确定。一个合约中的 token ID 100 与另一个合约中的 token ID 100 毫无关联。该标准不要求 token ID 从零开始、按顺序递增或遵循可预测的模式。应用应将每个 token ID 视为不透明标识符,而不是猜测哪些 ID 存在。根据 ERC-721 核心所有权模型,每个有效 token ID 在同一时间只有一个所有者。NFT 可以作为一个完整代币转移;而分割所有权则需要使用核心接口之外的单独合约或代币结构。ERC-721 核心接口 ID
ERC-721 核心接口通过 ERC-165 使用
兼容合约在使用该标识调用
ERC-165 接口检测标准规定,接口标识符通过对该接口包含的函数选择器执行 XOR 运算计算得出。
ERC-165 允许应用在尝试交互前询问合约声称支持哪些标准化接口。返回肯定结果有助于检查兼容性,但不能独立证明每个函数都已正确实现。处理有价值资产的应用可能还需要进行代码审查、测试和交易模拟。ERC-721 核心函数
ERC-721 必需接口包括所有权查询、转账和授权管理函数。主要函数包括
balanceOf 函数
ownerOf 函数
transferFrom 函数
使用
safeTransferFrom 函数
ERC-721 定义了两个重载版本的
如果接收方是智能合约,转账流程会调用该合约的
什么是 IERC721Receiver?
它所要求的函数是
接收成功时,函数会返回其选择器,通常表示为
当前的ERC-721 实现文档提供了接收方接口,以及供需要接收安全转账的合约使用的基础持有者工具。
接收方在使用回调更新重要记账状态前,应核实调用它的 NFT 合约。ERC-721 接收方回调风险
向合约执行安全转账会对接收方发起外部调用。接收方可以在原始交易结束前执行额外代码。如果发送方应用尚未完成内部状态更新,这就会产生潜在的重入路径。恶意接收方可能尝试在回调期间调用原始合约中的另一个函数。Solidity 的智能合约安全指南建议,在预期设计允许的情况下,先完成检查和重要状态变更,再进行外部交互。
开发者应使用恶意接收方合约测试 NFT 安全转账,而不能假定回调无害。approve 函数
使用零地址调用
getApproved 函数
应用在判断其他地址是否可以转移代币时,也应检查
setApprovalForAll 函数
isApprovedForAll 函数
ERC-721 事件
ERC-721 核心接口定义了
Transfer 事件
Approval 事件
ApprovalForAll 事件
ERC-721 可选元数据接口
元数据扩展增加了
其 ERC-165 接口 ID 为
tokenURI 的工作方式
当前的ERC-721 开发指南指出,链下元数据可能被控制其存储位置的一方更改。
拥有代币并不自动保证外部图片或文件永久可用。ERC-721 可选枚举接口
枚举扩展允许应用通过链上查询发现 token ID。其 ERC-165 接口 ID 为
该扩展增加了
许多应用改为使用链下索引,根据
铸造和销毁
ERC-721 核心接口不要求提供公开铸造函数。每个项目都可以自行决定铸造是开放、受限、按计划进行、有上限还是永久禁用。该标准也不要求提供公开销毁函数。根据合约实现,销毁会将代币从有效所有权记录中移除。用户应检查谁有权铸造或销毁 NFT,以及管理员是否可以影响其他账户持有的代币。符合转账接口标准并不能证明代币供应量固定。ERC-721 接口与 ERC-721 实现
接口定义了兼容性所要求的外部行为。实现则包含实际的存储、授权、转账、铸造、元数据和管理逻辑。两个合约可以支持相同的 ERC-721 接口,但内部设计截然不同。一种实现可能不可变,另一种则可能通过可升级代理运行。一种实现可能具有固定供应量,另一种则允许管理员无限铸造。一种实现可能将元数据存储在链上,另一种则可能指向可更改的服务器。用户应审查具体实现,而不能将接口支持视为完整的安全评估。ERC-721 与 ERC-20
ERC-20 表示同质化余额,ERC-721 则表示具有独立标识的代币。ERC-20 账户可以持有 250 个单位等可分割数量。ERC-721 账户持有的是多个不同 token ID。ERC-721 的
ERC-721 与 ERC-1155
ERC-721 专注于具有独立标识的非同质化代币。ERC-1155 允许一个合约管理多个 token ID,包括同质化、半同质化和非同质化资产。ERC-1155 账户可以持有某个 token ID 的多个单位。ERC-721 token ID 只有一个所有者,不会为每个账户记录其持有数量。最合适的标准取决于资产模型、转账模式、批量操作需求和应用要求。版税与 ERC-721 接口
ERC-721 核心接口没有定义创作者版税。单独的版税接口可以提供建议的付款接收方和金额信息。版税信息不会自动强制每个转账系统支付相应款项。声称支持版税的系列应说明信息的计算方式以及是否可以更改。用户不应假设 ERC-721 NFT 自带永久或可强制执行的版税权利。ERC-721 授权的安全风险
授权钓鱼是 NFT 持有者面临的最重要风险之一。恶意网站可能会请求调用
不安全转账风险
因此,向合约转账时通常优先使用
元数据与真实性风险
任何人都可以部署使用熟悉系列名称或符号的 ERC-721 合约。合约地址是识别一个系列最重要的技术标识。元数据也可能包含误导性名称、抄袭的艺术作品、不安全的外部链接或无法访问的文件。由项目管理员控制的 token URI 之后可能会指向不同内容。链上所有权本身无法验证创作者身份或知识产权。用户应通过权威来源确认系列地址和项目信息。可升级合约风险
ERC-721 实现可能运行在可升级代理之后。在用户购买 NFT 后,授权管理员可能有能力更改转账规则、元数据逻辑、铸造权限或其他行为。升级可以修复漏洞,但也会带来治理和密钥遭入侵风险。用户应检查升级权限、时间延迟、多签控制和管理员角色。支持 ERC-721 接口并不会显示实现中的所有特权函数。开发者应如何实现 ERC-721
开发者应优先使用经过审查且仍在维护的实现,不应无充分理由自行重写敏感的所有权逻辑。当前的OpenZeppelin ERC-721 API提供了核心、元数据、枚举、暂停、销毁、版税、投票及接收方相关组件。
应根据系列已公布的供应政策限制铸造权限。如果 NFT 可以直接铸造到智能合约,应考虑使用安全铸造。应将接收方回调视为可能带来重入行为的外部调用。测试应涵盖所有权、授权、操作员权限、安全接收方、恶意接收方、销毁、无效 token ID 和未经授权的转账。开发者还应测试接口检测是否针对每个已实现扩展返回正确值。应用如何检测 ERC-721 支持
应用可以使用核心 ERC-721 接口 ID 调用
返回值为
ERC-721 转账示例
假设 Alice 在某个 ERC-721 合约中拥有 token ID 42。该合约的
她的钱包使用 Alice 的地址、接收合约和 token ID 42 调用
合约随后更新所有权,并调用接收方的
如果接收方返回正确的选择器,转账就会完成,并发出
ERC-721 接口的常见错误
一个常见错误是以为系列名称可以唯一标识 NFT 合约。另一个错误是将
第三个错误是向未知智能合约发送 NFT 时使用
常见问题
什么是 ERC-721 接口?
ERC-721 接口是一组标准化函数和事件,用于追踪非同质化代币的所有权、授权和转移。ERC-721 接口 ID 是什么?
ERC-721 核心接口 ID 为
ERC-721 合约的 balanceOf 返回什么?
它返回某个地址拥有的、来自该合约的不同 NFT 数量。ownerOf 有什么作用?
它返回有效 token ID 的当前所有者。transferFrom 和 safeTransferFrom 有什么区别?
什么是 onERC721Received?
这是智能合约通过安全转账确认其能够接收 NFT 时所实现的回调函数。NFT 安全转账会失败吗?
会。如果授权检查未通过,或接收合约未返回预期回调选择器,转账就会失败。approve 有什么作用?
它授权一个地址转移某个特定 NFT。setApprovalForAll 有什么作用?
它授予操作员管理调用方在该 ERC-721 合约中拥有的所有 NFT 的权限。操作员授权会自动过期吗?
不会。标准的全系列授权会一直有效,直到所有者撤销,或合约应用额外的自定义规则。转移 NFT 会清除针对该代币的授权吗?
会。常规 ERC-721 实现会在转账期间清除与该代币关联的授权。ERC-721 要求提供元数据吗?
不要求。元数据接口是可选的,但大多数 NFT 系列都会实现它。ERC-721 元数据接口 ID 是什么?
元数据扩展使用的接口 ID 为
ERC-721 枚举接口 ID 是什么?
枚举扩展使用的接口 ID 为
每个 ERC-721 合约都支持 totalSupply 吗?
不支持。
ERC-721 要求提供铸造函数吗?
不要求。核心接口不定义用户或管理员如何铸造 NFT。ERC-721 要求提供销毁函数吗?
不要求。销毁属于实现功能,而非核心接口的必需函数。ERC-721 会强制执行版税吗?
不会。版税不属于 ERC-721 核心接口,需要单独的逻辑或标准。ERC-721 元数据可以更改吗?
可以。该标准允许 token URI 发生变化,除非具体实现提供了更强的不可变性保障。符合 ERC-721 标准能证明 NFT 真实可信吗?
不能。任何人都可以部署兼容合约,因此用户必须独立核实合约地址和发行方。结语
ERC-721 接口为 Ethereum 兼容应用中的非同质化代币提供通用的所有权、授权、转账和事件规则。其核心接口 ID 为
您可能也喜欢
反恐融资(CTF)
框架
波动性爆发
热门
目前热门备受市场关注的加密货币
最高成交量
按交易量计算交易量最大的加密货币

