技术教程 | 波场TRON首个非同质化代币(NFT)标准协议TRC-721

孙宇晨
14 min readMar 8, 2021

--

概要

一种非同质化代币 (NFT) 标准接口

摘要

本 TIP 兼容 EIP-721

我们注意到 NFT 标准广泛应用于区块链各大领域。

  • 一些第二层(Layer2)解决方案,例如 Plasma,尝试利用 NFT 数据结构解决数据安全问题。
  • 一些 DApp,例如 Cryptokitties,展现出了 NFT 的巨大经济价值。
  • 在 tBTC 等项目中,NFT 起到了验证质押所有权的关键作用。

以上各类应用赋予了 NFT 代币更多的价值。 越来越多的 DeFi 项目尝试结合 NFT 代币,实现生态增值。 我们相信标准化 NFT 也会为波场创造无限可能。

项目动机

通过标准化借口,波场应用可以对 NFT 进行追踪和转账。 下面列出了简单的 TRC-721 智能合约,用于追踪大规模 NFT 代币。 鉴于每个 TRC-721 代币都是独一无二的,TRC-20 代币标准并不能满足 NFT 的要求。 波场的 TRC-721 标准将具有启发意义。 它与 TRC-20 同样重要。

技术规范

本文件中的关键词“须(MUST)”、“不得(MUST NOT)”、“须(REQUIRED)”、“须(SHALL)”、“不得(SHALL NOT)”、“应(SHOULD)”、“不应(SHOULD NOT)”、“建议(RECOMMENDED)”、“可(MAY)”和“可选(OPTIONAL)”按 RFC 2119 的规定进行解释。

每个符合 TRC-721 标准的合约都必须实现 TRC721 和 TRC165 接口(须遵循下列“注意事项”):

钱包/经纪人/拍卖应用如果要接受安全转账,必须实现钱包接口。

TRC-721 智能合约的元数据扩展是可选(Optional)的(见下文“注意事项”)。 元数据拓展可以检索您的智能合约,查询其名称和您 NFT 代表的资产详情。

此为上文提到的“TRC721 元数据 JSON 模式(Schema)”。

TRC-721 智能合约的枚举扩展是可选(Optional)的(见下文“注意事项”)。 枚举扩展允许您的合约公布其全部 NFT 列表,并使 NFT 可被发现。

注意事项

0.4.20 Solidity 接口语法不能清晰明确地记录 TRC-721 标准。 符合 TRC-721 标准的合约必须(Must)同时遵守以下规则:

  • Solidity issue #3412:上述接口包括对每个函数的明确可变性保证(mutability guarantee)。 可变性保证由弱到强依次为:payable、implicit nonpayable、view 以及 pure。 您的实现方法必须(Must)满足该接口中的可变性保证,同时您也可以(May)满足更强级别的保证。 举例来说,该接口中的 payable 函数可以在您的合约中实现为 nonpayable(未指定状态可变性)。 我们希望以后发布的 Solidity 版本能允许您更严格的合约继承该接口,但 0.4.20 版有一个变通方案:您可以在继承合约前编辑该接口,添加更严格的可变性。
  • Solidity issue #3419:实现 TRC721Metadata或 TRC721Enumerable的合约也须(Shall)实现 TRC721。 TRC-721 实现了接口 TRC-165 的要求。
  • Solidity issue #2330:如果一个函数在本规范中显示为 external,那么使用了 public 可见性的合约是符合规定的。 0.4.20 版的一个变通方案是,您可以在继承合约前编辑该接口并切换至 public。
  • Solidity issue #349 和 #3544:Solidity 中使用 this.*.selector 会被 Solidity 标为“警告”,而将来的新版 Solidity 不会将其标为“错误”。

*如果新版 Solidity 允许用代码表示注意事项,那么本 TIP 可能(May)更新并删除注意事项,修改后的规范等同于初始规范。*基本原理

NFT 标识符

每个 NFT 代币都由 TRC-721 智能合约中唯一的 uint256 ID 进行标识。 该标识号在合约期限内不得(SHALL NOT)更改。 这一对(合约地址,uint256 tokenId)将成为以太坊链上特定资产的全局唯一、完全限定的标识符。 虽然个别 TRC-721 智能合约为求方便,可能会将首个 NFT 标记为 ID 0,随后逐个加“1”,但调用者不得(SHALL NOT)假设 ID 号有任何规律可循,而必须(MUST)将其视为“黑匣子”。 同时,请注意 NFT 可能(MAY)会失效(被销毁)。 请参考所支持的枚举接口的枚举函数。

选择 uint256 大大拓展了应用场景,因为 UUID 和 sha3 哈希可以直接转换为 uint256。

交易机制

TRC-721 定义了一个安全的交易函数 safeTransferFrom(有无 bytes 参数均重载)和一个不太安全的函数 transferFrom 的标准。 交易可由以下各方发起:

  • NFT 的所有者
  • NFT 的核准地址
  • NFT 当前所有者的授权操作者

此外,授权操作者可以设置 NFT 的核准地址。 这为钱包、经纪人和拍卖应用提供了一套功能强大的工具,可以快捷地使用大量 NFT。

TRC-165 接口

我们选用了标准接口检测(TRC-165)来显示 TRC-721 智能合约支持的接口。

未来的 EIP 可能为合约创建一个全局的注册接口。 我们非常支持这样的 EIP,它可以通过委托给单独的合约,让 TRC-721 实现方案实现 TRC721Enumerable、TRC721Metadata 或其它接口。

隐私

“项目动机”中提及的钱包/经纪人/拍卖商迫切需要识别 NFT 所有者持有的 NFT 种类。

不妨设想一类 NFT 不可枚举的应用场景,例如财产所有权私有或半私有注册。 然而,这无法保证隐私性。因为攻击者可以调用每个可能的 tokenId 的 ownerOf。

元数据选择 (元数据扩展)

元数据拓展须包含 name 和 symbol 函数。

需提醒各位应用作者的是,如果您反对使用该机制,空字符串也是对 name 和 symbol 的有效响应。 同时需提醒大家,任何智能合约均可以使用和您的合约一致的名称和符号。 目前,本标准并不界定客户端确认某一 TRC-721 智能合约是否公认(规范)的方式。

我们提供一种通过 URI 关联 NFT 的机制。 希望将有更多的实现方案利用这一机制为每个 NFT 提供元数据。 图像尺寸建议取自 Instagram(他们可能对图像可用性有更深的见解)。 URI 可能(MAY)具有可变性(即不时改变)。 以代表房屋所有权的 NFT 为例,房屋相关的元数据(图像、住户等)可能改变。

元数据以字符串值返回。 这是目前从web3,而不是从其他合约进行调用的唯一可行办法。 鉴于链上应用查询此类信息的使用场景目前不在我们的考虑范围之内,这样的做法问题不大。

替代方案:把每个资产的所有元数据放在链上(太贵);使用 URL 模板查询部分原数据(URL 模板不兼容所有 URL 方案,尤其是 P2P URL);multiaddr 网络地址(不够成熟)

向后兼容

我们采用了 TRC-20 技术规范中的 balanceOf、totalSupply、name 和 symbol 语义。 如果进行实现的目的是在支持本标准的同时更好地兼容 TRC-20,那么也可(May)加入一个 decimals 函数,返回 uint8(0)。 但是,我们发现要求所有 TRC-721 的实现都支持 decimals 函数是不太现实的。

注:类似 Curio Cards 和 Rare Pepe 的“限量版、可收藏代币”并非可区分资产。 它们本质上是一系列独立的同质化代币的集合,其中每一种同质化代币都由自己的智能合约进行追踪,也有自己的总供给量(极端情况可能为 1)。

onTRC721Received 函数专门针对已部署的旧合约。在一些情况下,这些合约可能(May)在没有实现函数的前提下无意间返回 1(true)(请见 Solidity DelegateCallReturnValue 故障)。 通过返回并查验魔法值(Magic Value),我们就能区分真实的肯定响应和无意义的 true 结果。

参考文献

标准

1. ERC-20 Token Standard.

2. ERC-165 Standard Interface Detection.

3. ERC-173 Owned Standard.

4. ERC-223 Token Standard.

5. ERC-677 transferAndCall Token Standard.

6. ERC-827 Token Standard.

7. Ethereum Name Service (ENS). https://ens.domains

8. Instagram — What’s the Image Resolution?

https://help.instagram.com/1631821640426723

9. JSON Schema. https://json-schema.org/

10. Multiaddr. https://github.com/multiformats/multiaddr

11.RFC 2119 Key words for use in RFCs to Indicate Requirement Levels.

https://www.ietf.org/rfc/rfc2119.txt

Issue

1. The Original ERC-721 Issue.

https://github.com/ethereum/eips/issues/721

2. Solidity Issue #2330 — Interface Functions are External.

https://github.com/ethereum/solidity/issues/2330

3. Solidity Issue #3412 — Implement Interface: Allow Stricter Mutability.

https://github.com/ethereum/solidity/issues/3412

4. Solidity Issue #3419 — Interfaces Can’t Inherit.

https://github.com/ethereum/solidity/issues/3419

5. Solidity Issue #3494 — Compiler Incorrectly Reasons About the selector Function.

https://github.com/ethereum/solidity/issues/3494

6. Solidity Issue #3544 — Cannot Calculate Selector of Function Named transfer.

https://github.com/ethereum/solidity/issues/3544

7. CryptoKitties Bounty Issue #4 — Listing all Kitties Owned by a User is O(n²).

https://github.com/axiomzen/cryptokitties-bounty/issues/4

8. OpenZeppelin Issue #438 — Implementation of approve method violates ERC20 standard.

https://github.com/OpenZeppelin/zeppelin-solidity/issues/438

9. Solidity DelegateCallReturnValue Bug.

https://solidity.readthedocs.io/en/develop/bugs.html#DelegateCallReturnValue

讨论

1.Reddit (announcement of first live discussion).

https://www.reddit.com/r/ethereum/comments/7r2ena/friday_119_live_discussion_on_erc_nonfungible/

2. Gitter #EIPs (announcement of first live discussion).

https://gitter.im/ethereum/EIPs?at=5a5f823fb48e8c3566f0a5e7

3.ERC-721(announcement of first live discussion).

https://github.com/ethereum/eips/issues/721#issuecomment-358369377

4. ETHDenver 2018. https://ethdenver.com

其他项目中的 NFT 实现

1. CryptoKitties. https://www.cryptokitties.co

2. 0xcert ERC-721 Token.

https://github.com/0xcert/ethereum-erc721

3. Su Squares. https://tenthousandsu.com

4. Decentraland. https://decentraland.org

5. CryptoPunks. https://www.larvalabs.com/cryptopunks

6. DMarket. https://www.dmarket.io

7. Enjin Coin. https://enjincoin.io

8. Ubitquity. https://www.ubitquity.io

9. Propy. https://tokensale.propy.com

10.CryptoKittiesDeployedContract. https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code

11. Su Squares Bug Bounty Program. https://github.com/fulldecent/su-squares-bounty

12. XXXXERC721. https://github.com/fulldecent/erc721-example

13. ERC721ExampleDeed. https://github.com/nastassiasachs/ERC721ExampleDeed

14. Curio Cards. https://mycuriocards.com

15. Rare Pepe. https://rarepepewallet.com

16.AuctionhouseAssetInterface. https://github.com/dob/auctionhouse/blob/master/contracts/Asset.sol

17.OpenZeppelin SafeERC20.sol Implementation.

https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/SafeERC20.sol

版权

根据 CC0 协议放弃本文版权及相关权利。

原文链接:https://github.com/tronprotocol/tips/blob/master/tip-721.md​​​​

--

--

孙宇晨
孙宇晨

Written by 孙宇晨

波场@Tronfoundation创始人|@BitTorrent CEO|马云湖畔大学首批学员

No responses yet