如何在Solana上创建可编程NFT

这篇文章介绍了Solana上的可编程NFT (pNFTs),解释了其通过规则集来强制执行创作者版税的功能。尽管pNFTs已被Metaplex Core取代,但文章详细指导了如何使用Metaplex JS SDK铸造和转移pNFTs,并提供了完整的TypeScript代码示例。

可编程NFT (pNFT) 已废弃

Metaplex Core 已取代可编程NFT (pNFT) 作为新的 Solana NFT 项目的推荐标准。如果你要启动一个新项目,请参阅 什么是 Metaplex Core 以及如何铸造你的第一个 Core NFT。本指南仅用于历史教育目的。

概述

2022年 NFT 市场份额之争几乎消除了 Solana NFT 创作者版税的强制执行。作为回应,Metaplex 最近推出了一种新的 Token 标准:可编程NFT。该标准,除其他功能外,赋能创作者通过指定哪些程序可以转移他们的 NFT 来强制执行版税。在本指南中,你将使用 Solana Web3 库和 Metaplex JS SDK,从你的终端向 Solana 的开发网络 (devnet) 铸造一个带有元数据的可编程NFT。

你将需要

  • Nodejs (版本 16.15 或更高) 已安装
  • TypeScript 经验和 ts-node 已安装
  • 一个包含 Devnet SOL 的 Solana 纸钱包 (.json) ( 示例脚本)

注意: 本指南假设你已完成我们的 指南:如何使用 TypeScript 在 Solana 上铸造 NFT。我们将重用本指南中的大量代码。

可编程NFT

可编程NFT 是一种新的资产类别,允许灵活配置各种生命周期规则,包括创作者可用于强制执行版税的某些转移限制。如果你是创作者、协议开发者或 Solana NFT 用户,你可能会受到影响。

注意: 现有的 NonFungible 资产类别将继续存在——创作者可以选择继续使用它或迁移到 ProgrammableNonFungible 标准。

根据 Metaplex 的 Github,该标准将按以下方式运作:

  • 可编程NFT 可以包含创作者可配置的“规则集”。创作者可以通过在这些规则集中指定哪些程序可以转移他们的 NFT 来强制执行版税。
  • 铸造 (Mint)、销毁 (burn)、转移 (transfer)、委托 (delegate) 和撤销 (revoke) 指令将发送到 Token Metadata Program 而不是 SPL Token,以根据创作者应用的规则集进行验证。
  • 可编程NFT 支持基于允许列表 (allow-list) 和拒绝列表 (deny-list) 的版税强制执行方法 (为创作者提供选择性)。
  • Metaplex 基金会将提供一个基于允许列表的可选规则集,该规则集将定期更新,以便只包含那些为方便起见支付创作者版税的程序。创作者可以使用此允许列表或自定义的允许或拒绝列表。

如果你是协议开发者,确保你的程序在主要规则集的允许列表上而不是拒绝列表上很重要。

让我们创建一个可编程NFT。

设置你的项目

在你的终端中创建新项目目录,如下所示:

mkdir pnft
cd pnft

为你的应用程序创建文件 app.ts

echo > app.ts

使用“yes”标志初始化你的项目,以使用新包的默认值:

yarn init --yes
#or
npm init --yes

创建一个启用 .json 导入的 tsconfig.json

tsc -init --resolveJsonModule true --target es2020

你需要将包含 Devnet SOL 的纸钱包存储在一个名为 guideSecret.json 的新文件中,该文件位于主目录中。要生成一个新的纸钱包,请 按照此脚本操作

如果你已经有钱包,并且只需要 Devnet SOL,你可以通过在下方输入你的钱包地址来空投一些:

🪂请求 Devnet SOL

注意: 过于频繁地发送空投请求可能会触发 429 (请求过多) 错误。

空投 1 SOL (Devnet)

安装 Solana Web3 依赖项

我们将需要为本次练习添加 Solana Web3 库和 Metaplex JS SDK。在你的终端中,输入:

yarn add @solana/web3.js@1 @metaplex-foundation/js
#or
npm install @solana/web3.js@1 @metaplex-foundation/js

我们需要这些库中的一些组件以及我们的密钥。通过添加以下内容,在 app.ts 的第 1 行导入它们:

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Metaplex, keypairIdentity, bundlrStorage, toMetaplexFile, toBigNumber } from "@metaplex-foundation/js";
import { TokenStandard } from '@metaplex-foundation/mpl-token-metadata';
import secret from './guideSecret.json';

使用你的 Quicknode 端点连接到 Solana 集群

要在 Solana 上进行构建,你需要一个 API 端点来连接网络。你可以使用公共节点或部署和管理你自己的基础设施;但是,如果你想要 8 倍更快的响应时间,你可以将繁重的工作交给我们。

了解为什么超过 50% 的 Solana 项目选择 Quicknode,并 在此处 开始你的免费试用。我们将使用 Solana Devnet 端点。

复制 HTTP Provider 链接:

app.ts 中,在你的 import 语句下方,声明你的 RPC 并建立与 Solana 的 连接 (Connection)

const QUICKNODE_RPC = 'https://example.solana-devnet.quiknode.pro/0123456/';
const SOLANA_CONNECTION = new Connection(QUICKNODE_RPC);

最后,定义你的钱包并建立一个 Metaplex 实例。在你的连接下方,添加:

const WALLET = Keypair.fromSecretKey(new Uint8Array(secret));
const METAPLEX = Metaplex.make(SOLANA_CONNECTION)
    .use(keypairIdentity(WALLET))
    .use(bundlrStorage({
        address: 'https://devnet.bundlr.network',
        providerUrl: QUICKNODE_RPC,
        timeout: 60000,
    }));

你的环境应如下所示。

Ready to Build

准备好了吗?让我们开始构建!

创建 NFT 配置

本指南将使用一个已更新的元数据 URI:https://arweave.net/yIgHNXiELgQqW8QIbFM9ibVV37jhvfyW3mFcZGRX-PA。欢迎你使用自己的或使用我们的来跟随本指南。如果你对上传自己的图片和元数据感兴趣,请查看我们的 指南:如何使用 Typescript 在 Solana 上铸造 NFT

即使我们使用的是已存在的元数据,我们仍然需要提供一些关于 NFT 的信息,这些信息将存储在链上。具体来说,我们需要定义我们的名称、符号和版税。

const CONFIG = {
    imgName: 'Quicknode Pixel',
    symbol: 'QNPIX',
    sellerFeeBasisPoints: 500,//500 个基点 = 5%
    creators: [\
        { address: WALLET.publicKey, share: 100 },\
    ],
    metadata: 'https://arweave.net/yIgHNXiELgQqW8QIbFM9ibVV37jhvfyW3mFcZGRX-PA'
};

请随意根据你的 NFT 规范调整配置。你可以在 creators 数组中添加多个创作者。只需确保你的总 share 为 100 (CONFIG.creators.reduce((accumulator, creator) => accumulator + creator.share, 0) === 100)。

创建铸造函数

让我们创建我们的铸造函数。我们将传入 CONFIG 对象的元素。创建一个新函数 mintProgrammableNft

async function mintProgrammableNft(
    metadataUri: string,
    name: string,
    sellerFee: number,
    symbol: string,
    creators: { address: PublicKey, share: number }[]
) {
    console.log(`正在铸造 pNFT`);
    try {

    }
    catch (err) {
        console.log(err);
    }
}

虽然你可以使用 Metaplex 预构建的 mint 函数,但我们将使用他们的 builders 工具来创建一个 TransactionInstruction。这将使我们在向网络发送调用时具有更大的灵活性。铸造“标准”NFT 与可编程NFT 的主要区别在于,我们需要在铸造参数中添加 tokenStandard: TokenStandard.ProgrammableNonFungible

在你的 try 语句中,添加:

        const transactionBuilder = await METAPLEX
            .nfts()
            .builders()
            .create({
                uri: metadataUri,
                name: name,
                sellerFeeBasisPoints: sellerFee,
                symbol: symbol,
                creators: creators,
                isMutable: true,
                isCollection: false,
                tokenStandard: TokenStandard.ProgrammableNonFungible,
                ruleSet: null
            });

这应该与我们之前关于使用此 SDK 铸造 NFT 的指南中的 mint 调用非常相似。你会注意到,除了 tokenStandard,我们还传递了一个 ruleSet 参数。tokenStandard 用于指定这是一个 pNFT,即 ProgrammableNonFungible,而 ruleSet 用于定义 NFT 的规则。默认情况下 (此字段是可选的),其值为 null,这将把规则设置为 Metaplex 默认的社区维护规则集。

让我们通过调用 Metaplex 的 rpc().sendAndConfirmTransaction() 方法 (该方法抽象了组装交易和获取最新区块哈希等一些常见要求),并将交易发送到集群,并验证交易是否成功。在你的 .create() 调用之后,添加以下代码:

        let { signature, confirmResponse } = await METAPLEX.rpc().sendAndConfirmTransaction(transactionBuilder);
        if (confirmResponse.value.err) {
            throw new Error('交易确认失败');
        }
        const { mintAddress } = transactionBuilder.getContext();
        console.log(`   成功!🎉`);
        console.log(`   已铸造 NFT: https://explorer.solana.com/address/${mintAddress.toString()}?cluster=devnet`);
        console.log(`   交易哈希: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

你会注意到,我们这里可以使用交易构建器 (transaction builder) 的 getContext() 方法来获取我们 NFT 的铸造地址 (mint address)。我们用它来生成指向 Solana Explorer 上 NFT 的 URL。

铸造你的 NFT

最后,我们准备好铸造我们的 NFT 了。在 app.ts 中,通过传入我们的 CONFIG 元素来调用你的函数:

mintProgrammableNft(
    CONFIG.metadata,
    CONFIG.imgName,
    CONFIG.sellerFeeBasisPoints,
    CONFIG.symbol,
    CONFIG.creators
);

在你的控制台中,输入以下内容:

ts-node app

你应该在终端中看到类似以下内容:

Successful Mint

你应该能够在 Solana Explorer 上看到你铸造的 NFT:

Minted NFT on Solana Explorer

干得漂亮!

彩蛋!转移你的 NFT

如果你想将你的新 NFT 发送给朋友,你可以使用 Metaplex 的 transfer 函数。让我们在 app.ts 文件中添加一个新函数 transferNft

        const { mintAddress } = transactionBuilder.getContext();
        console.log(`   成功!🎉`);
        console.log(`   已铸造 NFT: https://explorer.solana.com/address/${mintAddress.toString()}?cluster=devnet`);
        console.log(`   交易哈希: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

        // 👇 添加此代码
        const destination = new PublicKey('YOUR_FRIENDS_PUBLIC_KEY'); // 替换为你朋友的公钥
        const transferTransactionBuilder = await METAPLEX.nfts().builders().transfer({
            nftOrSft: {address: mintAddress, tokenStandard: TokenStandard.ProgrammableNonFungible},
            authority: WALLET,
            fromOwner: WALLET.publicKey,
            toOwner: destination,
        });
        // 由于我们已经有 signature 和 confirmResponse,因此命名新的变量
        let { signature: sig2, confirmResponse: res2 } = await METAPLEX.rpc().sendAndConfirmTransaction(transferTransactionBuilder, {commitment: 'finalized'});
        if (res2.value.err) {
            throw new Error('转移交易确认失败');
        }
        console.log(`   交易哈希: https://explorer.solana.com/tx/${sig2}?cluster=devnet`);

在此代码中,我们正在创建一个新的交易构建器 transferTransactionBuilder,并传入我们 NFT 的铸造地址、我们的钱包和我们朋友的公钥。然后我们将交易发送到集群并验证交易是否成功。干得漂亮!

探索可编程NFT的更多功能

可编程NFT 仍然非常新,因此我们正在密切关注所有即将到来的变化。我们将添加关于创建规则集、在你的交易中处理 pNFT 等方面的补充内容。你是如何使用 pNFT 的?你最兴奋的是什么?请在 DiscordTwitter 上告诉我们。

我们 ❤️ 反馈!

如果你对本指南有任何反馈,请告诉我们。我们很乐意倾听你的意见。

资源

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

0 条评论

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