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
的所有者地址。
- 每个ERC-721代币都有一个唯一的标识符
- 所有权和转移:
balanceOf
函数查询某地址拥有的NFT 数量。safeTransferFrom
和transferFrom
函数用于转移NFT,前者包含安全检查,确保接收地址能够处理NFT。
- 授权和管理:
approve
函数授权某地址管理特定的NFT。setApprovalForAll
函数用于批量授权某地址管理所有NFT。getApproved
和isApprovedForAll
函数用于查询授权情况。
ERC-721标准的定义和实现使得开发者能够在以太坊区块链上创建和管理独特的数字资产,这些资产可以是艺术品、游戏内物品、虚拟地产等各种独特的物品。
4. 规范
4.1. 初始化接口
部署合约时,填写合约的基本信息。会触发执行合约入口init方法,需要携带以下参数
调用示例:
{
"params":{
"name": "",
"symbol": "",
"describe": "",
"protocol": "",
"version": "",
"url": "",
"reserved": ""
}
}
调用示例参数 说明:
参数 | 类型 | 描述 |
---|---|---|
name | String | 必填,合约名称,长度限64字节内 |
symbol | String | 必填,合约简称,长度限32字节内 |
describe | String | 必填,合约描述,长度限1024字节 |
protocol | String | 必填,资产数量,字符串型的数字 |
version | String | 必填,合约版本号, |
url | String | 选填,项目方网址 |
reserved | String | 选填,扩展字段 |
4.2. 调用接口
safeTransferFrom [required]
安全转移资产
注意事项:
- 触发事件: Transfer
调用示例:
{
"method": "safeTransferFrom",
"params":{
"from": "",
"to": "",
"id": "",
"data": ""
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
from | String | 源地址 |
to | String | 目标地址 |
id | String | 资产ID |
data | String | 附加参数 |
transferFrom [required]
转移资产
注意事项:
- 触发事件: Transfer
调用示例:
{
"method": "transferFrom",
"params":{
"from": "",
"to": "",
"id": ""
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
from | String | 源地址 |
to | String | 目标地址 |
id | String | 资产ID |
approve [required]
批准或者撤销第三方账户操作自己名下的指定ID的资产
注意事项:
- 触发事件: Approval
调用示例:
{
"method": "approve",
"params":{
"approved": "",
"id": ""
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
approved | String | 被批准的第三方账户地址,可以为空,空的时候撤销 |
id | String | 资产ID |
setApprovalForAll [required]
批准或者撤销第三方账户操作自己名下的所有资产
注意事项:
- 触发事件: ApprovalForAll
调用示例:
{
"method": "setApprovalForAll",
"params":{
"operator": "",
"approved": true
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
operator | String | 被批准的第三方账户地址 |
approved | Bool | 是否批准 |
mint [optional]
发行NFT资产
注意事项:
- 触发事件: Transfer,其中 from 参数为 "0x" 空地址,表示发行
调用示例:
{
"method": "mint",
"params":{
"to": "",
"uri": ""
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
to | String | 发行资产的目标账户地址 |
uri | String | URI资源地址 |
burn [optional]
销毁NFT资产
注意事项:
- 触发事件: Transfer,其中 to参数为 "0x" 空地址,表示销毁
调用示例:
{
"method": "burn",
"params":{
"id": ""
}
}
调用示例参数说明:
参数 | 类型 | 描述 |
---|---|---|
id | String | 资源ID |