以太坊 - 前言

  • stacksgov
  • 发布于 2022-11-05 16:15
  • 阅读 12

该SIP(Stacks Improvement Proposal)定义了Stacks区块链上非同质化代币(NFT)的标准Trait,旨在为开发者提供一个灵活易于实现的接口,以便在创建NFT时实现互操作性。

前言

SIP 编号:009

标题:非同质化代币的标准 Trait 定义

作者:Friedger Müffke (mail@friedger.de), Muneeb Majeed

考虑因素:技术

类型:标准

状态:已批准

创建时间:2020 年 12 月 10 日

许可证:CC0-1.0

签署人:Jude Nelson <jude@stacks.org>, 技术指导委员会主席

摘要

非同质化代币或 NFT 是注册在区块链上的数字资产,具有唯一的标识符和属性,使其彼此区分。 应该可以唯一地识别、拥有和转移一个非同质化代币。本 SIP 旨在提供一个灵活且易于实施的标准,供 Stacks 区块链上的开发者在创建自己的 NFT 时使用。此标准仅指定一组基本要求,非同质化代币可以具有比此标准中指定的更多的功能。

许可证和版权

此 SIP 根据 Creative Commons CC0 1.0 Universal 许可证的条款提供,该许可证可在 https://creativecommons.org/publicdomain/zero/1.0/ 获得。 此 SIP 的版权归 Stacks Open Internet Foundation 所有。

简介

代币是通过智能合约在区块链上注册的数字资产。非同质化代币 (NFT) 是一种全局唯一的代币,可以通过其唯一标识符来识别。

在具有智能合约的区块链中,包括 Stacks 区块链,开发者和用户可以使用智能合约来注册非同质化代币并与之交互。

Stacks 区块链用于开发智能合约的编程语言 Clarity 具有内置的语言原语来定义和使用非同质化代币。尽管存在这些原语,但定义一个通用接口(在 Clarity 中称为“trait”)是有价值的,该接口允许不同的智能合约以可重用的方式与非同质化代币合约进行互操作。本 SIP 定义了该 trait。

每个 NFT 始终属于一个智能合约。智能合约的 NFT 从 1 开始枚举。当前的最后一个 ID 由智能合约函数提供。资产 ID 与合约 ID 一起定义了一个全局唯一的 NFT。

规范

Stacks 区块链中每个符合 SIP-009 的智能合约必须实现 Trait 部分中定义的 trait nft-trait,并且必须满足以下函数的要求:

最后一个代币 ID

(get-last-token-id () (response uint uint))

不接受任何参数,并返回使用该合约注册的最后一个 NFT 的标识符。返回的 ID 可用作迭代所有 NFT 时的上限。

此函数绝不能返回错误响应。它可以定义为只读,即 define-read-only

代币 URI

(get-token-uri (uint) (response (optional (string-ascii 256)) uint))

接受一个 NFT 标识符,并返回一个响应,其中包含一个有效的 URI,该 URI 解析为 NFT 的元数据。URI 字符串必须包含在 optional 中。如果相应的 NFT 不存在或合约未维护元数据,则响应必须为 (ok none)。如果 NFT 存在有效的 URI,则响应必须为 (ok (some "&lt;URI>"))。返回的 URI 的长度限制为 256 个字符。元数据的规范应在单独的 SIP 中涵盖。

此函数绝不能返回错误响应。它可以定义为只读,即 define-read-only

所有者

(get-owner (uint) (response (optional principal) uint))

接受一个 NFT 标识符,并返回一个响应,其中包含拥有具有给定标识符的 NFT 的 principal。principal 必须包含在 optional 中。如果相应的 NFT 不存在,则响应必须为 (ok none)。所有者可以是合约 principal。

如果对函数 get-owner 的调用返回某个 principal A,则在以 principal A 作为发送者调用 transfer 函数之前,它必须返回相同的值。

对于任何 ID 大于 get-last-token-id 函数返回的最后一个代币 ID 的 get-owner 调用,该调用必须返回响应 (ok none)

此函数绝不能返回错误响应。它可以定义为只读,即 define-read-only

转移

(transfer (uint principal principal) (response bool uint))

该函数将给定标识符的 NFT 的所有权从发送者 principal 更改为接收者 principal。

此函数必须使用 define-public 定义,因为它会改变状态,并且必须可从外部调用。

在成功调用 transfer 后,函数 get-owner 必须返回 transfer 调用的接收者作为新所有者。

对于任何 ID 大于 get-last-token-id 函数返回的最后一个代币 ID 的 transfer 调用,该调用必须返回错误响应。

建议使用来自标准化代码列表的错误代码,并实现用于将错误代码转换为消息的函数,这些函数在单独的 SIP 中定义。

Trait

(define-trait nft-trait
  (
    ;; Last token ID, limited to uint range
    ;; 最后一个代币 ID,限制在 uint 范围内
    (get-last-token-id () (response uint uint))

    ;; URI for metadata associated with the token
    ;; 与代币关联的元数据的 URI
    (get-token-uri (uint) (response (optional (string-ascii 256)) uint))

     ;; Owner of a given token identifier
     ;; 给定代币标识符的所有者
    (get-owner (uint) (response (optional principal) uint))

    ;; Transfer from the sender to a new principal
    ;; 从发送者转移到新的 principal
    (transfer (uint principal principal) (response bool uint))
  )
)

使用原生资产函数

尽管无法在 Clarity trait 中强制执行,但合约实施者必须定义至少一个内置的原生非同质化 资产类别,这些资产类别作为 Clarity 原语提供。这允许客户端使用后置条件(如下所述),并利用其他优势,例如通过 stacks-blockchain-api 对这些资产余额和转移的原生支持。本 SIP 中包含的参考实现使用原生资产原语,并为其使用提供了良好的样板。

原生资产函数包括:

  • define-non-fungible-token
  • nft-burn?
  • nft-get-owner?
  • nft-mint?
  • nft-transfer?

定义了使用原生资产函数的以下要求:

转移

如果从没有以拒绝模式的 后置条件 或没有任何关于所有者更改的 NFT 条件的客户端调用 transfer 函数,则函数调用必须失败并显示 abort_by_post_condition

在应用程序中使用 NFT

希望在应用程序中使用非同质化代币合约的开发者应首先获得或跟踪各种不同的非同质化代币实现。在验证非同质化代币合约时,他们应获取该合约的接口和/或源代码。如果合约实现了该 trait,则应用程序可以使用此标准的合约接口进行转移并获取此标准中定义的其他详细信息。

此 trait 中的所有函数都返回 response 类型,这是 Clarity 中 trait 定义的要求。但是,其中一些函数应该是“防错”的,因为它们永远不应返回错误。这些“防错”函数是那些已被推荐为只读的函数。如果实现此 trait 的合约为这些函数返回错误,则可能表明该合约不合规,并且这些合约的使用者应谨慎行事。

使用后置条件

Stacks 区块链包含一个称为“后置条件”或“约束”的功能。通过定义后置条件,用户可以创建包含关于该合约中可能发生的情况的预定义保证的交易。

例如,当应用程序调用 transfer 函数时,他们应该始终使用后置条件来指定 NFT 的新所有者是 transfer 函数调用中的接收者 principal。

相关工作

NFT 是区块链上已确立的资产类别。例如,请阅读此处

EIP 721

以太坊有 EIP 721,它定义了以太坊区块链上的非同质化代币。值得注意的区别是 EIP 721 中的转移函数使用不同的参数排序,以代币 ID 结尾。此 SIP 中的转移函数使用代币 ID 作为第一个参数,这与 Clarity 中的其他原生函数一致。此外,此 SIP 仅定义了一个用于获取指向 NFT 元数据的 URI 的函数。代币元数据的模式和其他属性的规范应在单独的 SIP 中定义。

向后兼容性

不适用

激活

如果部署了 5 个使用遵循此规范的相同 trait 的合约,则此 SIP 将激活。这必须在比特币区块 #700,000 之前发生。

遵循此规范的 trait 在主网上可用,为 SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait

参考实现

源代码

Friedger 的 clarity-smart-contracts

https://github.com/friedger/clarity-smart-contracts/blob/master/contracts/sips/nft-trait.clar

已部署的合约

  • 原文链接: github.com/stacksgov/sip...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
stacksgov
stacksgov
江湖只有他的大名,没有他的介绍。