ERC-721:以太坊非同质化代币标准

ERC-721:以太坊非同质化代币标准

ERC-721 是以太坊上非同质化代币(NFT)的标准。标准是一套已发布的规则。非同质化意味着每个代币都与其他代币不同。ERC-721 指定了一个接口,即智能合约所提供的函数和事件列表。智能合约是存储在区块链上的程序。对于 ERC-721 而言,代币是通过智能合约在现有区块链上发行的单位。

ERC-721 是以以太坊改进提案(EIP)的形式发布的,这是面向以太坊社区的设计文档。该提案的编号是 721,因此 ERC-721 也被写作 EIP-721。ERC 是应用层标准提案的类别,即以太坊上应用程序所遵循的标准,例如代币标准。

ERC-721 中的代码将其接口命名为 ERC721。ERC-721 代币是由遵循 ERC-721 的合约发行的代币。

函数是合约提供的、用户可以调用的具名操作。事件是合约在发生某些变化时记录在区块链上的通知,以便软件能够跟踪这一变化。记录事件被称为触发事件(emit)。

区块链是按顺序保存的共享交易记录。交易是用户发送给区块链的请求,例如转移代币的请求。地址是区块链上用户或智能合约的标识符。

ERC-721 标准规定了什么?

ERC-721 标准规定了一个接口:合约必须提供的函数和必须触发的事件。这样一来,软件就可以以相同的方式调用遵循 ERC-721 的合约。

ERC-721 还要求通过 ERC-165 实现接口检测,这是一项让合约能够声明自己支持哪些接口的标准。

ERC-721 描述了两个可选扩展。元数据扩展增加了一些函数,用于返回合约所含代币的名称、符号以及每个代币 ID 对应的链接;枚举扩展则增加了列出合约所跟踪代币的函数。

ERC-721 是众多 NFT 标准之一,专为以太坊编写。其他区块链和其他标准的运作方式可能与 ERC-721 不同。

遵循 ERC-721 的合约通过代币 ID(合约为每个代币分配的编号)来区分各个代币。跟踪代币的合约地址与代币 ID 结合起来,可以唯一标识一个代币,并且 ERC-721 要求只要合约存在,代币 ID 就必须保持不变。

ERC-721 与 ERC-20:这两个标准有何不同?

ERC-721 与 ERC-20 的区别在于合约所跟踪的内容、转账所指定的对象,以及授权所涵盖的范围。ERC-20 是同质化代币的标准,意味着其单位可以互换,即一个单位与另一个单位等价。ERC-721 是非同质化代币的标准,合约通过代币 ID 来区分代币,因此交换其中两个代币并不是等价交换。

  • ERC-20 合约记录每个地址持有的数量,而 ERC-721 合约记录每个代币 ID 由哪个地址控制。
  • ERC-20 的转账指定代币数量,而 ERC-721 的转账指定代币 ID。
  • ERC-20 的授权涵盖另一个地址可以转移的数量,而 ERC-721 的授权要么针对单个代币 ID,要么在指定操作者(operator)时,涵盖该地址在同一合约中控制的所有代币。操作者是指被代币控制地址允许转移其全部代币的地址。

ERC-721 定义了哪些函数和事件?

下表按名称列出了 ERC-721 定义的函数和事件,以及来自 ERC-165 的接口检测函数,并说明了每一项的作用。

名称

类型

作用

balanceOf

函数

返回某个地址所控制的代币数量。

ownerOf

函数

返回控制某个代币 ID 的地址。

transferFrom

函数

将一个代币 ID 从一个地址转移到另一个地址。

safeTransferFrom

函数

将一个代币 ID 从一个地址转移到另一个地址,并且当接收地址是智能合约时还会运行接收方检查。

approve

函数

允许一个指定地址转移一个代币 ID。

getApproved

函数

返回被批准转移某个代币 ID 的地址。

setApprovalForAll

函数

允许一个地址对其在同一合约中的所有代币启用或禁用某个操作者。

isApprovedForAll

函数

返回某个地址是否为另一个地址的操作者。

supportsInterface

函数,来自 ERC-165

返回某个合约是否支持给定的接口。

Transfer

事件

宣告控制某个代币的地址已发生变化。

Approval

事件

宣告某个代币 ID 被批准的地址已更改或被重新确认。

ApprovalForAll

事件

宣告某个操作者已被启用或禁用。

哪个函数会检查接收方合约?

safeTransferFrom 函数在转移代币后会运行接收方检查。当接收地址是智能合约时,ERC-721 合约会调用其上名为 onERC721Received 的函数,这就是接收方函数。接收合约提供该接收方函数,该函数会返回 ERC-721 所定义的一个特定值,向 ERC-721 合约表明接收合约接受此次转账。如果接收合约返回了其他任何值,交易就会被取消,ERC-721 将其称为回滚(revert)。

transferFrom 函数不会调用接收方函数。ERC-721 将检查接收地址是否能够接收代币的责任交给了调用者,也就是发送该函数调用交易的人。发送到不提供接收方函数的合约的代币可能会丢失。

授权与操作者是如何运作的?

授权允许另一个地址转移某个代币。approve 函数为一个代币 ID 指定一个地址,而 getApproved 返回该地址。ERC-721 规定,当代币被转移后,已批准的地址会被重置为空。

操作者是指通过 setApprovalForAll 被授权转移另一个地址在同一合约中所控制的全部代币的地址。ERC-721 要求合约允许每个控制代币的地址设置多个操作者,isApprovedForAll 返回某个地址是否为另一个地址的操作者。

根据 ERC-721,转账可以由控制该代币的地址发起,也可以由该地址的操作者发起,或由被批准用于该代币 ID 的地址发起。

可选的元数据扩展增加了什么?

ERC-721 的可选元数据扩展为合约增加了三个函数:name、symbol 和 tokenURI。元数据是描述代币的数据,这三个函数会返回这些数据。

name 函数返回合约所跟踪代币的名称,symbol 则返回它们的简称。

tokenURI 函数返回某个代币 ID 对应的 URI。URI 是统一资源标识符(uniform resource identifier)的简称,即一个链接。省略该扩展的合约没有 URI。

ERC-721 规定,tokenURI 返回的 URI 可以指向一个 JSON 文件,这是一种用于结构化数据的文本格式。该文件可以包含名称、描述和图片字段。

ERC-721 允许合约更改其为某个代币 ID 返回的 URI,因此同一个代币 ID 之后可能指向不同的文件。ERC-721 并未规定该 URI 所指向的文件存储在何处。

ERC-721 将哪些内容留给各个合约自行决定?

截至 2026 年 10 月,ERC-721 并未定义代币的内容、与代币相关的任何权利、代币文件的存储位置、代币的创建或销毁方式,也未定义代币的法律地位。非同质化代币(NFT)词汇表条目解释了代币记录(即合约为每个代币保存的信息)未涵盖哪些内容。

遵循 ERC-721 的合约在行为上仍可能有所不同。ERC-721 列出了转账必须失败的情形,并允许合约在其他情况下取消转账,例如在转账被暂停期间。因此,合约可以出于 ERC-721 未列出的原因拒绝某次转账。

2026年1月5日

GoMining 新闻

您可能会对以下内容感兴趣