本文介绍了如何在 Stacks 区块链上创建和部署符合 SIP-009 标准的 NFT 合约,并指导读者完成在 Stacks Testnet 上部署合约以及通过 Stacks Sandbox 铸造 NFT 的过程。文章详细说明了 SIP-009 标准的要求,并提供了完整的代码示例和步骤。
Stacks 是一个新兴的区块链,由比特币保护,并原生支持智能合约。我们之前的 Stacks 指南演示了如何在 Stacks 区块链上创建和部署智能合约。在本指南中,我们将更进一步,学习如何创建和部署一个符合 SIP-009 标准的 NFT 合约到 Stacks 测试网。部署后,你还将学习如何通过 Stacks Sandbox 铸造 NFT。让我们开始吧!
Stacks 生态系统已经为可互换和不可互换代币采用了一个标准。这些标准使开发人员更容易上手,并帮助确保他们编写的智能合约保持可组合性。目前 Stacks 生态系统中一些流行的标准有:
由于我们将在本指南中演示 SIP-009 标准,让我们介绍一下使我们的 NFT 符合 SIP-009 标准所需的规范和方法。
现在我们知道了部署符合 SIP-009 标准的智能合约的概要,让我们开始编码吧!
打开一个终端窗口,然后导航到你想要这个项目存在的目录。然后,运行以下命令来创建一个新的 clarinet 项目并导航到其中。
注意:你必须安装 Clarinet 才能运行以下命令。
clarinet new nft-project && cd nft-project
接下来,使用下面的命令来创建一组智能合约文件:
clarinet contract new nft-trait; clarinet contract new nft-factory
上面的命令创建了两个 .clar 文件 (这是 Clarity 的文件格式),一个用于我们的 NFT 合约逻辑 (例如,nft-factory.clar),一个用于我们的 NFT 元数据 (例如,nft-trait.clar)。它还将在测试目录中创建两个测试文件 (TypeScript 格式)。
此时,你的项目文件夹设置应该如下所示:
在下一节中,我们将开始配置和实现 NFT 智能合约。
在我们开始编写智能合约代码之前,我们需要配置一些依赖项,以确保我们正在构建的合约符合 SIP-009 标准。打开 Clarinet.toml 并编辑 contracts.nft-factory 部分 (大约在第 11-12 行),以匹配以下配置:
[contracts.nft-factory]
path = "contracts/nft-factory.clar"
depends_on = ["nft-trait"]
上面的配置确保了我们的智能合约符合 SIP-009 标准中要求的 traits。如果我们不实现配置的 traits,我们的部署到测试和生产环境将会失败。
接下来,打开 nft-trait.clar 文件。复制以下代码并替换文件中的现有内容:
(define-trait nft-trait
(
;; 最后的代币 ID, 限制在 uint 范围内
(get-last-token-id () (response uint uint))
;; 与代币关联的元数据的 URI
(get-token-uri (uint) (response (optional (string-ascii 256)) uint))
;; 给定代币标识的所有者
(get-owner (uint) (response (optional principal) uint))
;; 从发送者转移到新的 principal
(transfer (uint principal principal) (response bool uint))
)
)
然后,保存文件。上面的 Clarity 代码设置了我们的合约应该符合的函数。正如我们在上一节中讨论的那样,这些函数你应该很熟悉。
现在,我们将把 NFT 智能合约逻辑添加到 nft-factory.clar 文件中。该合约将使我们能够在 Stacks 区块链上铸造 NFT。打开该文件,并将现有内容替换为以下代码:
;; 使用 SIP009 接口 (测试网)
;; trait 从 ./settings/Devnet.toml 配置和部署
(impl-trait 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.nft-trait.nft-trait)
;; 声明一个新的 NFT
(define-non-fungible-token NFT-FACTORY uint)
;; 存储最后发行的代币 ID
(define-data-var last-id uint u0)
;; 铸造一个新的 NFT
(define-public (claim)
(mint tx-sender))
;; SIP009: 将代币转账到指定的 principal
(define-public (transfer (token-id uint) (sender principal) (recipient principal))
(begin
(asserts! (is-eq tx-sender sender) (err u403))
;; 确保替换 NFT-FACTORY
(nft-transfer? NFT-FACTORY token-id sender recipient)))
(define-public (transfer-memo (token-id uint) (sender principal) (recipient principal) (memo (buff 34)))
(begin
(try! (transfer token-id sender recipient))
(print memo)
(ok true)))
;; SIP009: 获取指定代币 ID 的所有者
(define-read-only (get-owner (token-id uint))
;; 确保替换 NFT-NAME
(ok (nft-get-owner? NFT-FACTORY token-id)))
;; SIP009: 获取最后一个代币 ID
(define-read-only (get-last-token-id)
(ok (var-get last-id)))
;; SIP009: 获取代币 URI。你可以将它设置为任何其他的 URI
(define-read-only (get-token-uri (token-id uint))
(ok (some "https://token.stacks.co/{id}.json")))
;; 内部 - 铸造新的 NFT
(define-private (mint (new-owner principal))
(let ((next-id (+ u1 (var-get last-id))))
(var-set last-id next-id)
;; 如果你愿意,你可以用另一个名称替换 NFT-FACTORY
(nft-mint? NFT-FACTORY next-id new-owner)))
注意: 你可能想要调整 get-token-uri 函数中的 URL,因为它目前指向没有任何元数据。本指南不会在我们要铸造的 NFT 中设置任何元数据;但是,你可以按照本 ERC-1155 NFT 指南 中的“创建元数据 URI”部分,使用 NFT.storage 和 IPFS 轻松创建元数据。
在下一节中,我们将演示如何验证你的合约以确保它们可以部署。
Clarity 是一种解释型语言,这意味着它不会在执行前将代码编译成较低的级别;相反,代码在运行时以相同的格式执行。这使得代码更慢但也更透明。为了检查我们的 clarity 代码在语法上是否正确,我们可以从 nft-project 目录运行命令 clarinet check。
你可能会收到一些警告;但是,就本指南而言,不用担心这些。我们将在以后的指南中介绍警告和未检查的数据。
在部署到 Stacks 测试网之前,最好检查一些函数,以确保响应是我们期望的。我们可以启动 clarinet 控制台来执行此操作:
clarinet console
启动控制台后,你将看到合约地址和合约中可用的公共函数。还会有一系列与本地 clarinet 控制台关联的测试帐户。运行下面的命令来调用我们智能合约的 claim 函数,这将在我们的本地环境中铸造一个 NFT。
(contract-call? .nft-factory claim)
你应该会看到类似于这样的响应:
如果一切顺利,请进入下一节,我们将把 NFT 合约部署到 Stacks 测试网上 👀
本节将演示如何使用 Stacks Explorer Sandbox 将你的 NFT 合约部署到 Stacks 测试网。在开始之前,请确保你已经安装并设置了 Hiro 钱包。此外,请确保有一些用于 gas 费的测试 STX 代币(你可以在此 faucet 获取一些)。
请记住将 Hiro 钱包上的网络切换到测试网。可以通过单击省略号按钮 ("...") 并单击 更改网络 来完成此操作。
设置好钱包后,将你的钱包连接到 Stacks Explorer Sandbox 并导航到 Write & Deploy 页面。复制并粘贴 nft-factory.clar 文件中的代码,然后填写合约名称(在我们的示例中,它是 "nft-factory"),如果你不想要提供给你的随机生成的名称。
接下来,单击部署按钮。你应该会从 Hiro 钱包窗口收到一条提示,其中包含有关该交易的信息。验证交易看起来是否正确,然后单击 确认。
挖矿(交易/过程)可能需要几分钟。你可以在 Stacks explorer 的交易页面上或通过 Hiro 钱包的活动部分监控该交易。确认合约已挖出后,我们可以通过搜索合约地址或单击钱包中的交易来导航到合约的主页。合约页面将显示合约的名称、部署者地址、部署合约的费用、源代码以及它被挖出的区块号。
你可能想知道,你刚刚铸造的 NFT 在哪里?嗯,从技术上讲,它还没有被铸造。到目前为止,我们只是创建和部署 NFT 合约。在下一节中,我们将演示铸造过程,你将在其中领取你的 NFT 并在 Hiro 钱包中查看它。但是,你可以花更多的时间探索 explorer 页面,并在准备好后进入下一节。
你一直在等待的时刻!是时候铸造了!
要铸造 NFT,我们需要调用 NFT 合约的 claim 函数。对于本演示,我们将在 Stacks Explorer Sandbox 中执行此操作,我们将在另一份指南中通过代码进行演示。
导航到 调用合约 页面(左侧边栏中的 f),然后输入合约的地址(即 ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory),sandbox 应该会检测到地址和名称。单击 获取合约 按钮,你应该会在表格中看到像这样的可调用函数:
单击 Claim 函数,然后单击 调用函数。你会在 Hiro 钱包中收到一条提示。验证是否正在调用 claim 函数,然后确认交易。你的交易可能需要几分钟才能确认。可以随意休息一下;一旦你回来,它应该会被确认。如果仍然需要一段时间,你可以单击 Hiro 钱包活动选项卡中交易上的 **Increase fee** 图标。
交易被挖掘后,你可以通过转到你的个人钱包地址页面并查看 Collectibles 选项卡,在 Hiro 钱包的 余额 选项卡或 Stacks explorer 中查看你的 NFT。
做得好!你已经学会了如何创建、部署和执行 NFT 合约到 Stacks 测试网区块链。要继续在你新的技能和知识的基础上进行构建,你可能需要尝试为你的 NFT 添加元数据或尝试以编程方式铸造它。你还可以查看我们的其他指南这里。
想炫耀你的新 NFT,或者想问一个问题?在Discord上与我们分享或通过 Twitter 联系我们。
如果你对此指南有任何反馈或问题,请告诉我们。我们很乐意听取你的意见!
- 原文链接: quicknode.com/guides/sta...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!