跳到主要内容

1. 摘要

提案描述了智能合约中实现 NFT 的标准API。 标准提供了跟踪和转移NFTs的基本功能。

提案考虑了个人拥有和交易NFT的场景,以及委托给第三方(如:代理人/钱包/拍卖人,称为 “操作员”)的情况。

NFT可以代表对数字或物理资产的所有权。 我们考虑了资产的多样性,并且我们知道您会想要代表更多:

  • 实体财产 - 如:房屋,独特的艺术品
  • 虚拟收藏品 - 如:小猫,收藏卡的独特图片
  • “负”资产 - 如:贷款等

总的来说,所有房屋都是不同的,没有两只小猫是一样的。 NFT是可区分的,必须分别跟踪每个所有者。

2. 动机

标准接口可以方便 钱包/代理/拍卖应用 与以太坊上的任何 NFT 进行交互。 提供简单的ERC-721智能合约以及跟踪数量众多 NFT的合约。 其他应用将在下面讨论。

该标准的灵感来自ERC20代币标准,并建立自EIP-20创建以来的两年经验。 ERC20 无法跟踪NFT,因为每种资产都是不同的(不可替代的),而ERC20每个代币的数量都是相同的(可替代的)。

该标准与ERC20之间的差异在下面进行说明。

3. 原理

  • NFT的唯一性
    • 每个ERC-721代币都有一个唯一的标识符 _tokenId,这个标识符用于区分不同的NFT。
    • ownerOf 函数返回特定 _tokenId 的所有者地址。
  • 所有权和转移
    • balanceOf 函数查询某地址拥有的NFT数量。
    • safeTransferFromtransferFrom 函数用于转移NFT,前者包含安全检查,确保接收地址能够处理NFT。
  • 授权和管理
    • approve 函数授权某地址管理特定的NFT。
    • setApprovalForAll 函数用于批量授权某地址管理所有NFT。
    • getApprovedisApprovedForAll 函数用于查询授权情况。

ERC-721标准的定义和实现使得开发者能够在以太坊区块链上创建和管理独特的数字资产,这些资产可以是艺术品、游戏内物品、虚拟地产等各种独特的物品。

4. 规范

4.1. 初始化接口

部署合约时,填写合约的基本信息。会触发执行合约入口init方法,需要携带以下参数

调用示例:

{
"params":{
"name": "",
"symbol": "",
"describe": "",
"protocol": "",
"version": "",
"url": "",
"reserved": ""
}
}

调用示例参数说明:

参数类型描述
nameString必填,合约名称,长度限64字节内
symbolString必填,合约简称,长度限32字节内
describeString必填,合约描述,长度限1024字节
protocolString必填,资产数量,字符串型的数字
versionString必填,合约版本号,
urlString选填,项目方网址
reservedString选填,扩展字段

4.2. 调用接口

safeTransferFrom [required]

安全转移资产

注意事项:

  • 触发事件: Transfer

调用示例:

{
"method": "safeTransferFrom",
"params":{
"from": "",
"to": "",
"id": "",
"data": ""
}
}

调用示例参数说明:

参数类型描述
fromString源地址
toString目标地址
idString资产ID
dataString附加参数

transferFrom [required]

转移资产

注意事项:

  • 触发事件: Transfer

调用示例:

{
"method": "transferFrom",
"params":{
"from": "",
"to": "",
"id": ""
}
}

调用示例参数说明:

参数类型描述
fromString源地址
toString目标地址
idString资产ID

approve [required]

批准或者撤销第三方账户操作自己名下的指定ID的资产

注意事项:

  • 触发事件: Approval

调用示例:

{
"method": "approve",
"params":{
"approved": "",
"id": ""
}
}

调用示例参数说明:

参数类型描述
approvedString被批准的第三方账户地址,可以为空,空的时候撤销
idString资产ID

setApprovalForAll [required]

批准或者撤销第三方账户操作自己名下的所有资产

注意事项:

  • 触发事件: ApprovalForAll

调用示例:

{
"method": "setApprovalForAll",
"params":{
"operator": "",
"approved": true
}
}

调用示例参数说明:

参数类型描述
operatorString被批准的第三方账户地址
approvedBool是否批准

mint [optional]

发行NFT资产

注意事项:

  • 触发事件: Transfer,其中 from 参数为 "0x" 空地址,表示发行

调用示例:

{
"method": "mint",
"params":{
"to": "",
"uri": ""
}
}

调用示例参数说明:

参数类型描述
toString发行资产的目标账户地址
uriStringURI资源地址

burn [optional]

销毁NFT资产

注意事项:

  • 触发事件: Transfer,其中 to参数为 "0x" 空地址,表示销毁

调用示例:

{
"method": "burn",
"params":{
"id": ""
}
}

调用示例参数说明:

参数类型描述
idString资源ID

4.3. 查询接口

balanceOf [required]

查询一个地址所拥有的token数量

调用示例:

{
"method": "balanceOf",
"params":{
"owner": ""
}
}

调用示例参数说明:

参数类型描述
ownerString待查询的拥有者地址

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"count": "123"
}

ownerOf [required]

查询资产的拥有者

调用示例:

{
"method": "ownerOf",
"params":{
"id": ""
}
}

调用示例参数说明:

参数类型描述
idStringid

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"address": ""
}

getApproved [required]

查询给定资产的授权地址

调用示例:

{
"method": "getApproved",
"params":{
"id": ""
}
}

调用示例参数说明:

参数类型描述
idString资产ID

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"address": ""
}

isApprovedForAll [required]

查询给定第三方账户是否被资产的拥有者审批

调用示例:

{
"method": "isApprovedForAll",
"params":{
"owner": "",
"operator": ""
}
}

调用示例参数说明:

参数类型描述
ownerString资产的拥有者
operatorString第三方操作者

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"approved": true
}

contractInfo [required]

返回合约的基本信息

调用示例:

{
"method": "contractInfo"
}

调用示例参数说明:

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"name": "contract Name",
"symbol": "symbol",
"describe": "describe",
"protocol": "ATP721",
"version": "1.0.0",
"url:": "",
"reserved": ""
}

tokenURI [required]

返回指定资产ID的JSON uri路径

调用示例:

{
"method": "tokenURI",
"params":{
"id": "111111111"
}
}

调用示例参数说明:

参数类型描述
idString资产ID

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"uri": ""
}

totalSupply [required]

发行资产的数量

调用示例:

{
"method": "totalSupply"
}

调用示例参数说明:

响应数据:

{
"result":{
"type": "string",
"value": "xxxxx"// 为json字符串格式,json对象描述如下
}
}
{
"count": "123"
}

4.4. 事件定义

Transfer

当资产被转移时候,需要触发该事件,包括铸造和销毁操作。

tlog('Transfer', from, to, id);

事件参数:

参数类型描述
TransferStringTlog的 topic 主题名称
fromString源账户地址
toString目标账户地址
idString资产ID

Approval

当批准启用或禁用第三方使用权时候,需要发出该事件

tlog('Approval', owner, approved, id);

事件参数:

参数类型描述
ApprovalStringTlog的 topic 主题名称
ownerString资产拥有者
approvedString被批准的第三方账户地址
idString资产ID

ApprovalForAll

当批准启用或禁用第三方使用权时候,需要发出该事件

tlog('ApprovalForAll', owner, operator, approved);

事件参数:

参数类型描述
ApprovalForAllStringTlog的 topic 主题名称
ownerString资产的拥有者
operatorString被批准的第三方账户地址
approvedBool是否批准或者撤销;true:批准,false是撤销