跳转至

NFT 代币

原文:https://docs.elrond.com/tokens/nft-tokens

## 简介

NFT 和 SFT

Elrond协议通过在已经存在的 ESDT 之上添加元数据和属性来引入本地 NFT 支持。通过这种方式,可以发行半可替换代币或不可替换代币,这与 ESDT 非常相似,但具有更多属性以及可分配的 URI。一旦拥有了一定数量的 NFT/SFT,用户就可以将他们的数据直接存储在他们的账户下的特里树中。NFT/SFT 代币中可用的所有字段都可以在这里找到。

不可替代或半可替代代币的发行和转让流程为:

  • 注册/发行代币
  • 为将创建 NFT/sft 的地址设置角色
  • 创建 NFT/SFT
  • 转移数量

元 ESDT

除了 NFT 和 sft,Elrond还引入了元 ESDTs。元 ESDTs 是半可替换代币的一个特例。它们可以被视为具有属性的常规 ESDT 可替换代币。在一个特定的例子中,LKMEX 是一个元 ESDT,它的属性有助于实现发布时间表。

烙印

任何人都可以在Elrond网络上创建 NFTs 和 SFTs 代币。代币名称或代号也没有限制。例如,发出一个带有股票代码ALCAliceToken。其他任何人都可以自由地创建一个具有相同代币名称和相同代币标记的新代币。唯一的区别是代币标识符的随机序列。因此“原始”代币可能已经接收到随机序列1q2w3e产生了ALC-1q2w3e标识符,而第二个代币可能已经接收到序列3e4r5t产生了ALC-3e4r5t

为了区分原始代币和具有相同名称或股票代码的其他代币,我们引入了一种品牌机制,允许代币所有者为其代币提供徽标、描述、网站以及社交链接。Elrond产品如 Explorer、Wallet 等将根据其品牌显示代币(如果有)。

代币所有者可以通过在https://github.com/ElrondNetwork/assets上打开拉取请求来提交品牌申请。

提交品牌推广请求

代币所有者可以创建一个带有徽标的https://github.com/ElrondNetwork/assets公关。巴新和。svg 格式,以及包含所有相关信息的. json 文件。

这是一个预填充的模板。json 文件帮助您入门:

{
  "website": "https://www.elrondtoken.com",
  "description": "Elrond Token is a collection of 10.000 unique and randomly generated tokens.",
  "social": {
    "email": "[email protected]",
    "blog": "https://www.elrondtoken.com/ERD-token-blog",
    "twitter": "https://twitter.com/ERD-token-twitter"
  },
  "status": "active"
} 

发行不可替代代币

为了注册不可替换的代币,必须执行发行交易。不可替换的代币通过对元链的请求来发行,元链是由将管理代币的账户提交的交易。发布代币时,必须提供代币名称、ticker 和可选的附加属性。该交易具有以下形式:

IssuanceTransaction {
 Sender: <account address of the token manager>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 50000000000000000 # (0.05 EGLD)
 GasLimit: 60000000
 Data: "issueNonFungible" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

或者,可以在颁发代币时设置这些属性。示例:

IssuanceTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 50000000000000000 # (0.05 EGLD)
    GasLimit: 60000000
    Data: "issueNonFungible" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding> +
          "@" + <"canFreeze" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canWipe" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canPause" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canTransferNFTCreateRole" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canChangeOwner" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canUpgrade" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canAddSpecialRoles" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          ...
} 

关于参数如何编码的更多细节,点击这里

接收方地址erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u是一个内置的系统智能合约(不是 VM 可执行的合约),只处理代币发放和其他代币管理操作,不处理任何传输。该合约将向自动收报机添加一个随机字符串,从而创建了代币标识符。随机字符串以“-”开头,还有 6 个随机字符。例如,代币标识符可能看起来像 ALC-6258d2

发行半替代代币

为了注册半可替换代币,必须执行发行交易。半可替代代币通过对元链的请求来发行,元链是由将管理代币的账户提交的交易。当发布一个半可替换的代币时,必须提供一个代币名称、一个 ticker 和可选的附加属性。该交易具有以下形式:

IssuanceTransaction {
 Sender: <account address of the token manager>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 50000000000000000 # (0.05 EGLD)
 GasLimit: 60000000
 Data: "issueSemiFungible" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

或者,可以在颁发代币时设置这些属性。示例:

IssuanceTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 50000000000000000 # (0.05 EGLD)
    GasLimit: 60000000
    Data: "issueSemiFungible" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding> +
          "@" + <"canFreeze" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canWipe" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canPause" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canTransferNFTCreateRole" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canChangeOwner" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canUpgrade" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canAddSpecialRoles" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          ...
} 

关于参数如何编码的更多细节,点击这里

接收方地址erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u是一个内置的系统智能合约(不是 VM 可执行的合约),只处理代币发放和其他代币管理操作,不处理任何传输。该合约将向自动收报机添加一个随机字符串,从而创建了代币标识符。随机字符串以“-”开头,还有 6 个随机字符。例如,代币标识符可能看起来像 ALC-6258d2

发行元 ESDT 代币

为了注册元 ESDT 代币,必须执行发行交易。元 ESDT 代币通过对元链的请求来发布,元链是由将管理代币的账户提交的交易。当发布一个半可替换的代币时,必须提供一个代币名称、一个 ticker 和可选的附加属性。该交易具有以下形式:

IssuanceTransaction {
 Sender: <account address of the token manager>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 50000000000000000 # (0.05 EGLD)
 GasLimit: 60000000
 Data: "registerMetaESDT" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding> +
          "@" + <number of decimals in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

或者,可以在颁发代币时设置这些属性。示例:

IssuanceTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 50000000000000000 # (0.05 EGLD)
    GasLimit: 60000000
    Data: "registerMetaESDT" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <token ticker in hexadecimal encoding> +
          "@" + <number of decimals in hexadecimal encoding>
          "@" + <"canFreeze" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canWipe" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canPause" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canTransferNFTCreateRole" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canChangeOwner" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canUpgrade" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          "@" + <"canAddSpecialRoles" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
          ...
} 

关于参数如何编码的更多细节,点击这里

接收方地址erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u是一个内置的系统智能合约(不是 VM 可执行的合约),只处理代币发放和其他代币管理操作,不处理任何传输。该合约将向自动收报机添加一个随机字符串,从而创建了代币标识符。随机字符串以“-”开头,还有 6 个随机字符。例如,代币标识符可能看起来像 ALC-6258d2

将一个 SFT 转换成元 ESDT

如果所有者发送以下交易,已经存在的半可替代代币可以被转换成元 ESDT 代币:

ConvertSftToMetaESDTTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000
    Data: "changeSFTToMetaESDT" +
          "@" + <token name in hexadecimal encoding> +
          "@" + <number of decimals in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

参数格式

代币名称:

  • 长度在 3 到 20 个字符之间
  • 仅限字母数字字符

代币报价机:

  • 长度在 3 到 10 个字符之间
  • 仅字母数字大写

发行实例

例如,名为 Alice 的用户想要发布一个名为“AliceTokens”的 ESDT,代码为“ALC”。发行交易将是:

IssuanceTransaction {
 Sender: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 50000000000000000 # (0.05 EGLD)
 GasLimit: 60000000
 Data: "issueSemiFungible" +
          "@416c696365546f6b656e73" +
          "@414c43" +
} 

关于参数如何编码的更多细节,请点击这里

一旦这个交易被元链处理,爱丽丝就成为 AliceTokens 的指定管理器。她可以稍后使用ESDTNFTCreate添加数量。有关 ESDT 代币管理器可用的更多操作,请参见代币管理

在智能合约结果中,data字段将包含下面解释转移语法。需要注意的重要一点是,可以从这里获取代币标识符,以便将其用于传输。或者,可以从 API 获取代币标识符(在 REST API -获取 NFT 数据一节中也有解释)。

角色

为了能够对代币执行操作,需要分配角色。现有角色包括:

对于 NFT:

  • ESDTRoleNFTCreate:该角色允许用户创建新的 NFT
  • ESDTRoleNFTBurn:该角色允许燃烧一定数量的特定 NFT
  • ESDTRoleNFTUpdateAttributes:该角色允许用户更改特定 NFT 的属性
  • ESDTRoleNFTAddURI:该角色允许用户为特定的 NFT 添加 URIs
  • ESDTTransferRole:此角色仅允许传输到指定的地址。NFT 的所有者和带有 ESDTTransferRole 的地址应该位于同一个片上。具有传输角色的地址可以传输到任何地方。

对于 SFT:

  • ESDTRoleNFTCreate:该角色允许用户创建新的 SFT
  • ESDTRoleNFTBurn:该角色允许燃烧一定数量的特定 SFT
  • ESDTRoleNFTAddQuantity:该角色允许用户添加特定 SFT 的数量
  • ESDTTransferRole:此角色仅允许传输到指定的地址。SFT 的所有者和带有 ESDTTransferRole 的地址应该位于同一个片上。具有传输角色的地址可以传输到任何地方。

要了解如何分配角色,请参考部分。

分配角色

可以通过从 ESDT 管理器向元链发送交易来分配角色。

在这种交易中,可以分配任意数量的角色(最少 1 个)。

RolesAssigningTransaction {
 Sender: <address of the ESDT manager>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 0
 GasLimit: 60000000
 Data: "setSpecialRole" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <address to assign the role(s) in a hexadecimal encoding> +
          "@" + <role in hexadecimal encoding> +
          "@" + <role in hexadecimal encoding> +
          ...
} 

关于参数如何编码的更多细节,点击这里

例如,ESDTRoleNFTCreate = 45534454526f6c654e4654437265617465

未设置的交易非常相似。你可以在这里找到一个例子

NFT/SFT 字段

在下面,您可以找到创建 NFT 时涉及的字段。

NFT 的名字

  • NFT 或 SFT 的名字

数量

  • 代币的数量。如果是 NFT,那一定是1

版税

  • 允许创作者从任何涉及其 NFT 的交易中获得版税
  • 基本格式是介于 0 和 10000 之间的数值(0 表示 0%,10000 表示 100%)

哈希

  • 应包含 NFT 元数据哈希的任意字段
  • 可选字段,在建立交易以创建 NFT 时应留有null

属性

  • 代表有关 NFT 或 SFT 的附加信息,如您的 NFT/系列的图片特征或标签
  • 该字段应遵循metadata:ipfsCID/fileName.json;tags:tag1,tag2,tag3格式
  • 下面是应该存储在 IPFS 上的额外元数据格式的示例:
{
  "description": "This is a sample description",
  "attributes": [
    {
      "trait_type": "Background",
      "value": "Yellow",
      "{key}":"{value}",
      "{...}":"{...}",
      "{key}":"{value}"
    },
    {
      "trait_type": "Headwear",
      "value": "BlackBeanie"
    },
    {
      "trait_type": "SampleTrait3",
      "value": "SampleValue3"
    }
  ],
  "collection": "ipfsCID/fileName.json"
} 

URI(美国)

  • 必填的字段,表示以文件扩展名结尾的支持的媒体文件的 URL,如下面的示例中所述
  • 字段应包含Uniform Resource Identifier

注意:作为最佳实践,我们建议将媒体&额外元数据(来自属性字段)的文件存储在您的存储提供商(最好是 IPFS)的同一文件夹中。此外,为了为上传的文件生成缩略图,文件的大小应该小于或等于 64MB。

重要

请注意,每个参数必须用偶数个字符以十六进制格式编码。

支持的媒体类型

下面是一个表格,其中列出了Elrond网络上支持的 NFTs 媒体类型。

媒体扩展 媒体类型
。png 图片/png
。联合图象专家组 图像/jpeg
。使用 jpeg 文件交换格式存储的编码图像文件扩展名 图片/jpg
。可交换的图像格式 图片/gif
。webp 影像/网页
。挽救(saving 的简写) 影像/svg
。挽救(saving 的简写) image/svg+xml
。接受(accept 的缩写) 音频/附件
。无损音频编解码器 音频/flac
. m4a 音频/m4a
. mp3 音频/mp3
。声音资源文件 音频/wav
。mov 视频/电影
。quicktime 视频/quicktime
. mp4 视频/mp4
。网络媒体 视频/网络媒体

举例

下面的表格展示了一个类似歌曲的不可替换代币的字段示例。

财产 普通价值 编码值
NFT 的名字 优美的歌曲 42656175746966756c20736f6e67
数量 one 01
版税 7500 =75% 1d4c
哈希 00 00
属性 元数据:ipfsCID/song . JSON;标签:歌曲,美丽,音乐 6d 657461646174613 a 697066734349442 f 736 f 6 e 672 e 6a 736 f 6 e3b 746167733 a 736 f 6 e 672 c 62656175746966756 c2c6d 75736963
URI URL _ to _ decentralized _ storage/song . MP3 55524 C5 f 746 F5 f 646563656 e 7472616 c 697 a 65645 f 73746 f 726167652 f 736 f 6 e 672 e6d 7033

在这个例子中,我们创建了一首代表歌曲的 NFT。Hash 为空,我们共享媒体位置 URL,并且我们还在属性字段中提供额外元数据的位置。

创造一个 NFT

单个地址可以拥有为 ESDT 代币创建 NFT 的角色。该角色可以通过使用ESDTNFTCreateRoleTransfer功能进行转换。

通过向 self 发送包含触发创建的函数调用的交易,可以在现有 ESDT 的基础上创建 NFT。可以分配任意数量的 URIs(最少 1 个)

NFTCreationTransaction {
 Sender: <address with ESDTRoleNFTCreate role>
 Receiver: <same as sender>
 Value: 0
 GasLimit: 3000000 + Additional gas (see below)
 Data: "ESDTNFTCreate" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <initial quantity in hexadecimal encoding> +
          "@" + <NFT name in hexadecimal encoding> +
          "@" + <Royalties in hexadecimal encoding> +
          "@" + <Hash in hexadecimal encoding> +
          "@" + <Attributes in hexadecimal encoding> +
          "@" + <URI in hexadecimal encoding> +
          "@" + <URI in hexadecimal encoding> +
          ...
} 

关于参数如何编码的更多细节,点击这里

附加气体是指:

  • 交易有效负载成本:数据字段长度* 1500 (GasPerDataByte = 1500)
  • 存储成本:NFT 数据的大小* 50000 (StorePerByte = 50000)

要了解更多关于必填字段的信息,请参考部分。

提示

请注意,由于 NFT 存储在账户 trie 中,涉及 NFT 的每笔交易都需要 gas 限额,具体取决于 NFT 数据的大小。

大多数情况下,您可以通过发出一个交易来创建 NFT。这假定元数据文件以及 NFT 媒体已经上传到 IPFS。

然而,有时在发布 NFT 之前上传元数据文件是不可能的(例如,当从智能合约发布时),在这些情况下,可以在发布之后通过发送附加交易用元数据文件更新 NFT。你可以在这里找到更多关于如何更新属性的信息

其他管理操作

转移 NFT 创作角色

提示

只有当代币的canTransferNFTCreateRole属性设置为true时,才能转移该角色。

创建 NFT 的角色可以通过如下交易转移:

TransferCreationRoleTransaction {
    Sender: <address of the current creation role owner>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000 + length of Data field in bytes * 1500
    Data: "transferNFTCreateRole" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <the address to transfer the role from in hexadecimal encoding> +
          "@" + <the address to transfer the role to in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

停止 NFT 创作

ESDT 管理器可以通过移除唯一可用的ESDTRoleNFTCreate角色来永远停止为给定的 ESDT 创建 NFT。这是通过执行如下交易来实现的:

StopNFTCreationTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000
    Data: "stopNFTCreate" +
          "@" + <token identifier in hexadecimal encoding> +
} 

关于参数如何编码的更多细节,请点击这里

改变 NFT 属性

为给定 ESDT 设置了ESDTRoleNFTUpdateAttributes角色的用户可以更改给定 NFT/SFT 的属性。

提示

ESDTNFTUpdateAttributes将删除旧属性并添加新属性。因此,如果您想保留旧的属性,您必须将它们与新的属性一起传递。

这是通过执行如下交易来实现的:

ESDTNFTUpdateAttributesTransaction {
 Sender: <address of an address that has ESDTRoleNFTUpdateAttributes role>
 Receiver: <same as sender>
 Value: 0
 GasLimit: 10000000
 Data: "ESDTNFTUpdateAttributes" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding> +
          "@" + <Attributes in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

要了解如何在未设置该角色的情况下分配该角色,请参考部分。

给 NFT 加上 URIs

为给定的 ESDT 设置了ESDTRoleNFTAddURI角色的用户可以向给定的 NFT/SFT 添加 uri。这是通过执行如下交易来实现的:

ESDTNFTAddURITransaction {
 Sender: <address of an address that has ESDTRoleNFTAddURI role>
 Receiver: <same as sender>
 Value: 0
 GasLimit: 10000000
 Data: "ESDTNFTAddURI" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding> +
          "@" + <URI in hexadecimal encoding> +
          "@" + <URI in hexadecimal encoding> +
          ...
} 

关于参数如何编码的更多细节,请点击这里

要了解如何在未设置该角色的情况下分配该角色,请参考部分。

添加数量(仅限 SFT)

对于给定的半可替换代币,拥有ESDTRoleNFTAddQuantity角色集的用户可以增加其数量。这个函数对 NFTs 不起作用,因为在这种情况下,数量不能大于 1。

AddQuantityTransaction {
    Sender: <address of an address that has ESDTRoleNFTAddQuantity role>
    Receiver: <same as sender>
    Value: 0
    GasLimit: 10000000
    Data: "ESDTNFTAddQuantity" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding>
          "@" + <quantity to add in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

如果成功,给定 SFT 的地址余额将按照参数中指定的数字增加。

燃烧量

对于给定的半可替换代币,设置了ESDTRoleNFTBurn角色的用户可以刻录部分(或全部)数量的代币。

BurnQuantityTransaction {
 Sender: <address of an address that has ESDTRoleNFTBurn role>
 Receiver: <same as sender>
 Value: 0
 GasLimit: 10000000
 Data: "ESDTNFTBurn" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding>
          "@" + <quantity to burn in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

如果成功,参数中的数量将从给定代币的地址余额中减少。

冻结和解冻单个 NFT

ESDT 代币的管理者可以冻结特定账户持有的 NFT。因此,任何 NFT 都不能转入或转出被冻结的账户。冻结和解冻账户的单个 NFT 是旨在帮助代币管理者遵守法规的操作。冻结账户单个 NFT 的交易具有以下形式:

FreezeTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000
    Data: "freezeSingleNFT" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding>
          "@" + <account address to freeze in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

相反的操作,解冻,将允许进一步转入和转出账户:

UnfreezeTransaction {
    Sender: <account address of the token manager>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000
    Data: "unFreezeSingleNFT" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding> +
          "@" + <account address to unfreeze in hexadecimal encoding>
} 

关于参数如何编码的更多细节,点击这里

擦拭单个 NFT

ESDT 代币的管理者可以消除由冻结账户持有的单个 NFT。这个操作类似于烧量,但是必须事先冻结账号,而且必须由代币管理员来做。擦除帐户的代币是一项旨在帮助代币管理人员遵守法规的操作。这种交易具有以下形式:

WipeTransaction {
    Sender: <account address of the token managers>
    Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
    Value: 0
    GasLimit: 60000000
    Data: "wipeSingleNFT" +
          "@" + <token identifier in hexadecimal encoding> +
          "@" + <NFT nonce in hexadecimal encoding> +
          "@" + <account address to wipe in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

转让代币经营权

如果 ESDT 被创建为可升级的,则 ESDT 代币的管理者可以转移所有权。查看 ESDT -升级(更改属性)部分了解更多详情。

升级(改变属性)

仅当 ESDT 被创建为可升级时,ESDT 代币的管理员才可以单独更改代币的任何属性,或者一次更改多个属性。查看 ESDT -转让代币管理权部分了解更多详情。

转账

通过在Data字段中指定收款人的地址以及其他详细信息来执行 ESDT NFT 转账。ESDT NFT 转帐交易具有以下形式:

TransferTransaction {
    Sender: <account address of the sender>
    Receiver: <same as sender>
    Value: 0
    GasLimit: 1000000 + length of Data field in bytes * 1500
    Data: "ESDTNFTTransfer" +
          "@" + <collection identifier in hexadecimal encoding> +
          "@" + <the NFT nonce in hexadecimal encoding> +
          "@" + <quantity to transfer in hexadecimal encoding> +
          "@" + <destination address in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

提示

下面是一个 NFT 标识符的例子:ABC-1a9c7d-05dc

集合标识符是ABC-1a9c7d并且 NFT 随机数是05dc。注意,05dc是十六进制编码的,它代表十进制的 1500。

另请注意,Elrond地址是 bech32 格式,因此您需要将地址从 bech32 转换为十六进制。这可以通过 erdjs 的hex()方法来实现(所有的地址方法都可以在这里找到),也可以通过外部转换器手动实现,你可以在这里找到

转账至智能合约

要执行从您的账户到智能合约的转账,您必须使用以下交易格式:

TransferTransaction {
    Sender: <account address of the sender>
    Receiver: <same as sender>
    Value: 0
    GasLimit: 1000000 + extra for smart contract call
    Data: "ESDTNFTTransfer" +
          "@" + <collection identifier in hexadecimal encoding> +
          "@" + <the nonce after the NFT creation in hexadecimal encoding> +
          "@" + <quantity to transfer in hexadecimal encoding> +
          "@" + <destination address in hexadecimal encoding> +
          "@" + <name of method to call in hexadecimal encoding> +
          "@" + <first argument of the method in hexadecimal encoding> +
          "@" + <second argument of the method in hexadecimal encoding> +
          <...>
} 

关于参数如何编码的更多细节,请点击这里

多重代币转移

多个半可替换和/或不可替换的代币可以在单个交易中被转移到单个接收者。

更多细节可以在这里找到

示例流程

让我们看看创建和传输半可替换代币的完整流程。

第一步:发行/注册半可替换代币

{
 Sender: <your address>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 50000000000000000 # 0.05 EGLD
 GasLimit: 60000000
 Data: "issueSemiFungible" +
          "@416c696365546f6b656e73" + # AliceTokens
          "@414c43" +                 # ALC
} 

关于参数如何编码的更多细节,请点击这里

步骤 2:获取代币标识符

为此,必须检查之前发送的交易,并查看它的智能合约结果。它将看起来类似于@ok@414c432d317132773365414c432d317132773365代表十六进制编码的代币标识符。

第三步:设置角色

ESDTRoleNFTCreateESDTRoleNFTAddQuantity角色分配给地址。您可以将这些角色设置到您自己的地址。

{
 Sender: <your address>
 Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
 Value: 0
 GasLimit: 60000000
 Data: "setSpecialRole" +
          "@414c432d317132773365" +   # previously fetched token identifier
          "@" + <address to assign the roles in a hexadecimal encoding> +
          "@45534454526f6c654e4654437265617465" +  # ESDTRoleNFTCreate
          "@45534454526f6c654e46544164645175616e74697479" # ESDTRoleNFTAddQuantity
          ...
} 

关于参数如何编码的更多细节,请点击这里

第四步:创建 NFT

现在,这里定义的示例案例的 NFT 创建交易看起来像这样:

{
    Sender: <address with ESDTRoleNFTCreate role>
    Receiver: <same as sender>
    Value: 0
    GasLimit: 3000000
    Data: "ESDTNFTCreate" +
          "@414c432d317132773365" +  # previously fetched token identifier
          "@01" + # quantity: 1
          "@42656175746966756c20736f6e67" + # NFT name: 'Beautiful song' in hexadecimal encoding
          "@1d4c" + # Royalties: 7500 =75%c in hexadecimal encoding
          "@00" + # Hash: 00 in hexadecimal encoding
          "@6d657461646174613a697066734349442f736f6e672e6a736f6e3b746167733a736f6e672c62656175746966756c2c6d75736963" + # Attributes: metadata:ipfsCID/song.json;tags:song,beautiful,music   in hexadecimal encoding> +
          "@55524c5f746f5f646563656e7472616c697a65645f73746f726167652f736f6e672e6d7033" + # URI: URL_to_decentralized_storage/song.mp3 in hexadecimal encoding> +
          "@" + <additional optional URI in hexadecimal encoding> +
} 

关于参数如何编码的更多细节,请点击这里

提示

请注意,在创建 NFT 时,随机数非常重要。您必须在 NFT 创建后保存 nonce,因为您将需要它来进行进一步的操作。

NFT nonce不同于创造者的 nonce。

可以通过 API 查看该地址的所有代币来获取它。

第五步:转移

{
 Sender: <your address>
 Receiver: <same as sender>
 Value: 0
 GasLimit: 1000000 + length of Data field in bytes * 1500
 Data: "ESDTNFTTransfer" +
          "@414c432d317132773365" +   # previously fetched token identifier
          "@" + <the nonce saved above in hexadecimal encoding> +
          "@" + <quantity to transfer in hexadecimal encoding> +
          "@" + <destination address in hexadecimal encoding>
} 

关于参数如何编码的更多细节,请点击这里

休息 API

有许多 API 端点可以用来与 ESDT NFT 数据进行交互。这些是:

获取地址 获取 NFT 数据

RequestResponse 返回特定 ESDT 代币的地址余额。

https://gateway.elrond.com/address/<bech32Address>/nft/<tokenIdentifier>/nonce/<creation-nonce> 
参数 需要 类型 描述
bech 32 地址 必需的 string 以 bech32 格式查询的地址。
代币标识符 必需的 string 代币标识符。
目前 必需的 numeric NFT 创造后的时代。
{
"data": {
"tokenData": {
"attributes": "YXR0cmlidXRl",
"balance": "2",
"creator": "erd1ukn0tukrdhuv0zzxn0zlr53g7h0fr68dz9dd56mkksev59nwuvnswnlyuy",
"hash": "aGFzaA==",
"name": "H",
"nonce": 1,
"properties": "",
"royalties": "9000",
"tokenIdentifier": "4W97C-32b5ce",
"uris": [
"bmZ0IHVyaQ=="
]
}
},
"error": "",
"code": "successful"
}

### 获取 **获取通过地址注册的 NFTs/SFTs**

RequestResponse 返回已由提供的地址注册的代币的标识符。

```rust
https://gateway.elrond.com/address/<bech32Address>/registered-nfts 
参数 需要 类型 描述
bech 32 地址 必需的 string 以 bech32 格式查询的地址。
{
"data": {
"tokens": [
"ABC-36tg72"
]
},
"error": "",
"code": "successful"
}

### 获取 **获取代币其中一个地址具有给定的角色**

RequestResponse 返回给定地址具有给定角色的代币的标识符。

```rust
https://gateway.elrond.com/address/<bech32Address>/esdts-with-role/<role> 
参数 需要 类型 描述
bech 32 地址 必需的 string 以 bech32 格式查询的地址。
作用 必需的 string 要查询的角色。

该角色可以是文档中指定的角色之一(例如:ESDTRoleNFTCreate) ```rust { "data": { "tokens": [ "ABC-36tg72" ] }, "error": "", "code": "successful" }


### 获取 **解析不可/半可替换代币转移日志**

每次**成功的** nft/sft 传输都会生成日志和事件,可用于解析传输的所有详细信息(代币标识符、发送数量和接收者)。为了获得由传输生成的日志和事件,应该知道交易的散列。

RequestResponse | 参数 | 需要 | 类型 | 描述 |
| --- | --- | --- | --- |
| txHash | 必需的 | `string` | 交易的哈希 |

```rust
https://gateway.elrond.com/transaction/*txHash*?withResults=true 
```  ```rust
{
 "data": {
  "transaction": {
   ...
   "logs": {
    "address": "...",
    "events": [
     {
      "address": "...",
      "identifier": "ESDTNFTTransfer",
      "topics": [
       "VFNGVC1jODY3ZzM=",                              // TSFT-c867g3
       "CEI=",                                          // 2114
       "Ag==",                                          // 2
       "givNK+JiLZ5VA5/dP11QKoYEn7qoqnD8uPchH3ZMLw4="   // erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
      ],
      "data": null
     },
   }
 }
 "error": "",
 "code": "successful"
} 

标识符为ESDTNFTTransfer的事件将有以下主题:

  • 第一个主题:代币标识符(解码:base64 到字符串)
  • 第二个主题:代币 nonce(解码:base64 到十六进制字符串+十六进制字符串到大数/整数)
  • 第三个主题:要发送的数量(解码:base64 到十六进制字符串+十六进制字符串到大数)
  • 第四个主题:代币的接收者(解码:base64 到十六进制字符串+十六进制字符串到 bech32 地址)

在本例中,erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg收到了集合TSFT-c867g3中带有随机数2114的 2 个代币。

获取 获取一个地址的所有 ESDT 代币

可以使用获取用于 ESDT 的地址端点的所有 esdt 代币。

获取 获取所有发放的 ESDT 代币

可以使用获得所有为 ESDT 发布的 esdt 代币端点

发布 获取 ESDT 属性

属性可以通过 ESDT 提供的 getTokenProperties 函数进行查询。

岗位 获得特殊角色

特殊角色可以通过 ESDT 提供的 getSpecialRoles 函数进行查询。



回到顶部