如何在Stacks区块链上铸造NFTs - Quicknode

  • QuickNode
  • 发布于 2024-12-17 20:10
  • 阅读 20

本指南详细介绍了如何在Stacks区块链上创建和部署符合SIP-009标准的NFT合约,包括设置开发环境、编写合约代码和在Stacks Testnet上进行部署及铸造NFT的过程。通过该过程,读者将掌握NFT的基本实现和测试技巧,以及使用Stacks Explorer Sandbox进行操作的步骤。

概述

Stacks 是一个由比特币保障的新兴区块链,原生支持智能合约。我们之前的 Stacks 指南演示了 如何在 Stacks 区块链上创建和部署智能合约。在本指南中,我们将进一步了解如何创建和部署一个符合 SIP-009 标准的 NFT 合约到 Stacks 测试网。部署完成后,你还将学习如何通过 Stacks Sandbox 铸造 NFTs。让我们开始吧!

你需要的工具

你将要做的事情

  • 审查 SIP-009 NFT 标准的规范
  • 创建并配置一个 Clarinet 项目
  • 创建并配置一个 NFT 智能合约
  • 在本地环境中测试 NFT 合约
  • 将 NFT 合约部署到 Stacks 测试网
  • 通过 Stacks Sandbox 铸造 NFT

SIP-009 NFT 标准

Stacks 生态系统已经采用了可替代和不可替代代币的标准。这些标准使开发人员更容易入门,并帮助确保他们编写的智能合约保持可组合性。目前在 Stacks 生态系统中一些流行的标准有:

  • SIP-010:可替代代币的标准

  • SIP-009:不可替代代币的标准

由于我们在本指南中演示 SIP-009 标准,让我们概述制作 NFT 符合 SIP-009 的规范和方法。

  • 最后的代币 ID - (get-last-token-id () (response uint uint)) - 此函数不接受任何参数,返回最后生成的 NFT 的 ID。
  • 代币 URI - (get-token-uri (uint) (response (optional (string-ascii 256)) uint)) - 此函数返回给定 NFT ID 的代币 URI。
  • 所有者 - (get-owner (uint) (response (optional principal) uint)) - 此函数返回给定 NFT ID 的所有者。
  • 转移 - (transfer (uint principal principal) (response bool uint)) - 此函数将 NFT 转移给指定的接收者
  • 特征 - 你需要声明一个特征文件来保存 NFT 的元数据(在我们的示例中是 nft-trait.clar)。
  • 原生资产函数:nft-burn, nft-get-owner, nft-mint, nft-transfer

现在我们知道了部署符合 SIP-009 的智能合约的大致轮廓,让我们开始编码吧!

创建和配置 Clarinet 项目

打开一个终端窗口,导航到你希望该项目存放的目录中。然后,运行以下命令以创建一个新的 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 智能合约。

创建和配置 NFT 智能合约

实施 SIP-009 标准

在进入智能合约代码之前,我们需要配置一些依赖项,以确保我们构建的合约符合 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 智能合约逻辑添加到 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。

在下一部分中,我们将演示如何验证你的合约,以确保它们可以被部署。

在本地环境中测试 NFT 合约

Clarity 是一种解释型语言,这意味着它在执行之前不会将代码编译为更低级别;相反,代码会在运行时以相同的格式执行。这使得代码运行速度较慢,但更加透明。为了检查我们的 Clarity 代码的语法是否正确,我们可以从 nft-project 目录运行命令 clarinet check

Clarinet Check

你可能会收到一些警告;然而,出于本指南的目的,无需担心这些。我们将在未来的指南中讨论警告和未检查的数据。

在部署到 Stacks 测试网之前,最好检查几个函数,以确保它们的响应符合我们的预期。我们可以启动 Clarinet 控制台来做到这一点:

clarinet console

一旦控制台启动,你将看到你的合约地址和合约中可用的公共函数。你还将看到与你的本地 Clarinet 控制台相关联的一组测试账户。运行以下命令以调用我们智能合约的 claim 函数,这将在我们的本地环境中铸造一个 NFT。

(contract-call? .nft-factory claim)

你应该会看到类似如下的响应:

Clarinet Claim

如果一切顺利,请继续下一个部分,我们将把 NFT 合约部署到 Stacks 测试网 👀

将 NFT 合约部署到 Stacks 测试网

本部分将演示如何通过 Stacks Explorer Sandbox 将你的 NFT 合约部署到 Stacks 测试网。在我们开始之前,请确保已安装并设置好 Hiro Wallet。此外,请确保拥有一些测试 STX 代币以支付 gas 费用(你可以在这个 水龙头 获取一些)。

请记得在你的 Hiro 钱包上将网络切换到测试网。这可以通过点击省略号按钮("...")并点击 更改网络 来完成。

一旦你的钱包设置完成,将你的钱包连接到 Stacks Explorer Sandbox 并导航到 编写和部署 页面。复制并粘贴来自 nft-factory.clar 文件中的代码,然后填写合约名称(在我们的示例中是 "nft-factory"),如果你不想使用提供给你的随机生成名称。

接下来,点击部署按钮。你应会收到来自 Hiro 钱包窗口的提示,提供有关交易的信息。验证交易看起来是否正确,然后点击 确认

Hiro Deploy

矿工(事务/过程)可能需要几分钟。你可以在 Stacks 浏览器 的交易页面或通过你的 Hiro 钱包的活动部分监控交易。一旦我们确认合约已被成功铸造,我们可以通过搜索合约地址或单击钱包中的交易进入合约的主页。合约页面将显示你的合约名称、部署者地址、部署合约的费用、源代码以及它是在第几个块中被铸造的。

你可能在想,刚铸造的 NFT 在哪里?事实上,它技术上尚未铸造。目前为止,我们只是创建并部署了 NFT 合约。在下一部分中,我们将演示铸造过程,你将索取 NFT 并在你的 Hiro 钱包中查看它。不过,在你准备好之前,随意在探索页面上多花点时间,之后再进入下一部分。

通过 Stacks Sandbox 铸造 NFT

你等待的时刻到了!是时候进行铸造了!

要铸造 NFT,我们需要调用 NFT 合约的 claim 函数。对于本演示,我们将在 Stacks Explorer Sandbox 中执行此操作,我们将在另一份指南中通过代码演示此操作。

导航到 调用合约 页面(左侧边栏的 f),然后输入你的合约地址(即,ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory),沙箱游戏应该能检测到该地址和名称。点击 获取合约 按钮,你应该可以在表格中看到可调用的函数列出,如下所示:

Stacks Sandbox Call a Contract

点击 Claim 函数,然后点击 调用函数。你将在 Hiro 钱包中收到提示。验证是否正在调用 claim 函数,然后确认交易。你的交易可能需要几分钟才能确认。随意先休息一下;一旦你回来,交易应该已被确认。如果仍要花费一些时间,你可以在 Hiro 钱包的活动标签中点击 增加费用\* 图标。

交易一旦挖矿成功,你可以在 Hiro 钱包的 余额 标签中查看你的 NFT,或通过访问个人钱包地址页面并查看 收藏 标签,在 Stacks 浏览器中找到它。

Stacks Explorer Collectible

最后心得

做得漂亮!你已经学习了如何创建、部署和执行一个 NFT 合约到 Stacks 测试网区块链。为了继续提升你的新技能和知识,你可能想尝试为你的 NFT 添加元数据或尝试以编程方式铸造它。你也可以查看我们其他的一些指南 这里

想要展示你的新 NFT,或者想要问问题?通过 Discord 或通过 Twitter 联系我们。

我们 ❤️ 反馈!

如果你对本指南有任何反馈或问题,请 告诉我们。我们很乐意听到你的声音!

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

0 条评论

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