本指南详细介绍了如何在Stacks区块链上创建和部署符合SIP-009标准的NFT合约,包括设置开发环境、编写合约代码和在Stacks Testnet上进行部署及铸造NFT的过程。通过该过程,读者将掌握NFT的基本实现和测试技巧,以及使用Stacks Explorer Sandbox进行操作的步骤。
Stacks 是一个由比特币保障的新兴区块链,原生支持智能合约。我们之前的 Stacks 指南演示了 如何在 Stacks 区块链上创建和部署智能合约。在本指南中,我们将进一步了解如何创建和部署一个符合 SIP-009 标准的 NFT 合约到 Stacks 测试网。部署完成后,你还将学习如何通过 Stacks Sandbox 铸造 NFTs。让我们开始吧!
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 标准所需的特征。 如果我们没有实现配置的特征,我们向测试和生产环境的部署将会失败。
接下来,打开 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 区块链上铸造 NFTs。打开文件,用以下代码替换现有内容:
;; 使用 SIP009 接口(测试网)
;; 从 ./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" 部分轻松创建 Metadata,使用 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 Wallet。此外,请确保拥有一些测试 STX 代币以支付 gas 费用(你可以在这个 水龙头 获取一些)。
请记得在你的 Hiro 钱包上将网络切换到测试网。这可以通过点击省略号按钮("...")并点击 更改网络 来完成。
一旦你的钱包设置完成,将你的钱包连接到 Stacks Explorer Sandbox 并导航到 编写和部署 页面。复制并粘贴来自 nft-factory.clar 文件中的代码,然后填写合约名称(在我们的示例中是 "nft-factory"),如果你不想使用提供给你的随机生成名称。
接下来,点击部署按钮。你应会收到来自 Hiro 钱包窗口的提示,提供有关交易的信息。验证交易看起来是否正确,然后点击 确认。
矿工(事务/过程)可能需要几分钟。你可以在 Stacks 浏览器 的交易页面或通过你的 Hiro 钱包的活动部分监控交易。一旦我们确认合约已被成功铸造,我们可以通过搜索合约地址或单击钱包中的交易进入合约的主页。合约页面将显示你的合约名称、部署者地址、部署合约的费用、源代码以及它是在第几个块中被铸造的。
你可能在想,刚铸造的 NFT 在哪里?事实上,它技术上尚未铸造。目前为止,我们只是创建并部署了 NFT 合约。在下一部分中,我们将演示铸造过程,你将索取 NFT 并在你的 Hiro 钱包中查看它。不过,在你准备好之前,随意在探索页面上多花点时间,之后再进入下一部分。
你等待的时刻到了!是时候进行铸造了!
要铸造 NFT,我们需要调用 NFT 合约的 claim 函数。对于本演示,我们将在 Stacks Explorer Sandbox 中执行此操作,我们将在另一份指南中通过代码演示此操作。
导航到 调用合约 页面(左侧边栏的 f),然后输入你的合约地址(即,ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory),沙箱游戏应该能检测到该地址和名称。点击 获取合约 按钮,你应该可以在表格中看到可调用的函数列出,如下所示:
点击 Claim 函数,然后点击 调用函数。你将在 Hiro 钱包中收到提示。验证是否正在调用 claim 函数,然后确认交易。你的交易可能需要几分钟才能确认。随意先休息一下;一旦你回来,交易应该已被确认。如果仍要花费一些时间,你可以在 Hiro 钱包的活动标签中点击 增加费用\* 图标。
交易一旦挖矿成功,你可以在 Hiro 钱包的 余额 标签中查看你的 NFT,或通过访问个人钱包地址页面并查看 收藏 标签,在 Stacks 浏览器中找到它。
做得漂亮!你已经学习了如何创建、部署和执行一个 NFT 合约到 Stacks 测试网区块链。为了继续提升你的新技能和知识,你可能想尝试为你的 NFT 添加元数据或尝试以编程方式铸造它。你也可以查看我们其他的一些指南 这里。
想要展示你的新 NFT,或者想要问问题?通过 Discord 或通过 Twitter 联系我们。
如果你对本指南有任何反馈或问题,请 告诉我们。我们很乐意听到你的声音!
- 原文链接: quicknode.com/guides/oth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!