本文详细介绍了如何在 Solana 区块链上通过技术步骤创建和发行 NFT,涵盖了从项目设置到代码编写的完整过程。
本指南将为你提供如何通过一系列技术步骤在 Solana 上铸造 NFT 的深入流程。如果你希望更快地完成此任务,可以将繁重的工作交给我们,推荐使用 Crossmint NFT Mint API [mainnet] 附加组件。通过使用 Crossmint NFT Mint API [mainnet],你可以通过一次 POST 请求将 NFTs 空投给 Solana 用户和电子邮件地址。使用 NFT Mint API 可以轻松创建收藏并铸造 NFTs!
试试 Crossmint NFT Mint API [mainnet]
更新时间:2022年4月10日
欢迎来到另一份关于 Solana 的 QuickNode 指南——这个崭露头角的区块链旨在解决以太坊的可扩展性问题。我们将逐步讲解如何在 Solana 上创建 NFT。NFT,即非同质化代币,是一种在加密学上唯一的散列,无法复制。当你创建一个 NFT 时,这类似于创建一个 ERC20 代币;然而,关键的区别在于只发行一个代币。在本指南中,我们将以编程方式创建两个单独的钱包账户,一个用于铸造 NFT,另一个用于接收它。我们将编写完成铸造和发送 NFT 在 Solana 上的代码。如果你在任何方面遇到困难,请随时参考指南末尾的完整解决方案代码。让我们开始铸造吧!
前提条件:
Solana 的目标是单一的,即扩展区块链以实现全球采用。Solana Protocol 的开发者 Solana Labs 正在采取不同的措施来实现这个梦想。
区块链技术在性能调优方面具有几个参数。其中一个是共识机制。这是节点如何相互通信以达成一致意见的方式。比特币使用 工作量证明(PoW),BNB 智能链(BSC)使用 Proof of Staked Authority(PoSA),而以太坊正在向 权益证明(PoS)迁移。正如你所看到的,目前为止,共识远未解决。
Solana 使用一种称为 历史证明 的共识机制。历史证明通过时间戳解决方案工作;每个交易都有一个分配的时间戳,使其能够在几毫秒内被网络的其他节点验证为合法交易。Solana 有八项技术的详细说明,他们认为 这使他们成为游戏中最快、最具可扩展性和安全性的区块链。
打开终端并导航到你希望创建项目的文件夹。接下来,以以下确切顺序运行以下命令:
mkdir SolanaNFT
npm install --prefix ./SolanaNFT @solana/web3.js@1 @solana/spl-token
cd SolanaNFT
touch index.ts
tsc -init --resolveJsonModule true
第一个命令创建一个名为 SolanaNFT 的新项目目录。通过 npm install --prefix ./SolanaNFT @solana/web3.js@1 @solana/spl-token
,我们正在安装 Solana 的 JavaScript API,@solana/web3.js
和用于与 SPL Token 程序交互的 TypeScript 库 @solana/spl-token
。
然后我们创建一个新的 TypeScript 文件 index.ts
,在这里我们将编写所有代码。最后,我们运行 tsc -init
初始化一个新的 TypeScript 项目。这将创建一个名为 tsconfig.json
的新文件,其中将包含我们 TypeScript 项目的所有配置。我们以 --resolveJsonModule true
初始化它,以便我们可以将 JSON 文件导入我们的项目。
在你选择的编辑器中打开 SolanaNFT 项目目录,让我们开始编写一些代码以连接到 Solana!
在 index.ts 文件中,我们要从 @solana/web3.js 和 @solana/spl-token 导入我们需要的所有功能。添加以下两个导入语句:
import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { createMint, getOrCreateAssociatedTokenAccount, mintTo, setAuthority, transfer } from "@solana/spl-token";
日志以简化调试
你现在可以访问 RPC 端点的日志,帮助你更有效地排除问题。如果你在 RPC 调用中遇到问题,只需查看 QuickNode 仪表板中的日志,以快速识别和解决问题。了解更多有关日志历史限制的信息,请查看 我们的定价页面。
注意:如果你在这些代码行中看到错误,那么你可能没有安装库。确保你在正确的目录中,然后重新安装它们。
要在 Solana 上构建,你需要一个 API 端点来连接网络。你可以使用公共节点,或者部署和管理自己的基础设施;然而,如果你希望获得更快的响应时间,可以将繁重的任务交给我们。
你现在可以使用 USDC 在 Solana 上 支付 QuickNode 计划。作为第一个提供多链服务的供应商,我们接受 Solana 付款,简化了开发者的流程——无论你是在创建新账户还是管理现有账户。 在这里了解更多关于使用 Solana 付款的信息。
看看为什么超过 50% 的 Solana 项目选择 QuickNode 并在 这里 注册一个免费账户。我们将使用 SolanaDevnet 端点。
复制 HTTP 提供者链接:
在 import 语句下方,添加以下代码以使用你的 QuickNode 端点创建与 Solana Devnet 的新连接:
const quicknodeEndpoint = 'https://example.solana-devnet.quiknode.pro/0123456/';
const connection = new Connection(quicknodeEndpoint, "confirmed");
(async () => {
// 下面是剩余代码 👇
})()
在这里我们实例化了一个新的连接实例。这需要两个参数,第一个是指向 Solana 网络的 URL 端点。Solana 有三个不同的网络:主网、测试网和开发网。开发网是一个低风险环境,你可以在其中“空投” SOL 代币给自己。
建立连接后,我们现在可以创建 NFT 并执行其他相关步骤。
注意:我们接下来编写的每个代码块都应直接放在前一个代码块下方,全部位于顶层的 async 函数的花括号内。我们将在最后提供完整代码供你对照检查。
我们需要完成的第一项任务是创建一个钱包并为其提供资金。我们将使用下面方便的空投小工具来自动生成一个新钱包并向其空投 1 SOL。(如果你更喜欢手动方式,也可以通过 Keypair.generate()
和 requestAirdrop()
函数来实现)。
🔑生成一个带有 Devnet SOL 的新钱包
创建新钱包
一旦你成功生成了你的密钥对,你将注意到两个新常量:secret
和 fromWallet
,一个 Keypair。secret
是一个 32 字节的数组,用于生成公钥和私钥。fromWallet
是一个用于签署交易的 Keypair 实例(我们已空投一些开发网 SOL 以覆盖交易费)。确保将其添加到你 connection
声明下方的代码中。
我们现在需要创建一个新的代币铸币并检索我们的代币账户。
const mint = await createMint(
connection,
fromWallet, // 交易的付款方
fromWallet.publicKey, // 将控制铸币的账户
null, // 将控制该代币冻结的账户
0 // 小数点位置
);
createMint 函数将创建我们实际的代币。它需要 6 个参数:
有关此函数和本指南中使用的其他 spl-token 函数的更多信息,请访问 Solana-labs.github.io 中的此页面。
创建代币铸币后,我们需要从 fromWallet Solana 地址中抓取代币账户。如果它不存在,我们必须创建它。为此,我们将使用 getOrCreateAssociatedTokenAccount() 函数,传入大部分之前的值,并将其存储在 fromTokenAccount 中:
// 获取“fromWallet” Solana 地址的代币账户。如果它不存在,则创建它。
const fromTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
fromWallet.publicKey
);
你可以考虑链的控制权是这样的:NFT 驻留在账户中,而你的钱包拥有该账户。
密钥 -> 钱包 -> 账户 -> NFT (自上而下)
我们有一个发送 NFT 的账户;现在,我们需要一个接收 NFT 的账户。实现此目标的代码应该看起来非常熟悉,因为我们将利用相同的函数和变量来生成一个新钱包并获取与之前相同的代币铸币。
// 生成一个新钱包以接收新铸造的代币
const toWallet = Keypair.generate();
// 获取“toWallet” Solana 地址的代币账户。如果它不存在,则创建它。
const toTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
toWallet.publicKey
);
上述代码块创建了一个具有一组不同公钥/私钥的新钱包,然后创建一个将 mint 变量链接到我们新创建的钱包的账户。
现在是铸造 NFT 并将其发送给某人的时候了!花一些时间查看下面实现此目标的代码,并阅读注释以理解每个函数的作用。
// 将 1 个新代币铸造到我们刚刚返回/创建的“fromTokenAccount”账户。
let signature = await mintTo(
connection,
fromWallet, // 交易费用的付款方
mint, // 账户的铸币
fromTokenAccount.address, // 要铸造的账户地址
fromWallet.publicKey, // 铸币权限
1 // 铸造数量
);
await setAuthority(
connection,
fromWallet, // 交易费用的付款方
mint, // 账户
fromWallet.publicKey, // 当前权限
0, // 权限类型:“0” 表示铸币代币
null // 将新权限设置为 null
);
signature = await transfer(
connection,
fromWallet, // 交易费用的付款方
fromTokenAccount.address, // 源账户
toTokenAccount.address, // 目标账户
fromWallet.publicKey, // 源账户的所有者
1 // 转账代币的数量
);
console.log("SIGNATURE", signature);
})();
我们将简要介绍 setAuthority() 函数,因为这是最关键的部分之一。此函数将撤销铸币权限,确保我们无法创建该类型的额外代币。请注意,此操作无法撤销。
要执行程序,依次运行以下命令:
tsc index.ts
node index.js
这两个命令将运行 TypeScript 文件,生成同名的 JavaScript 文件并运行该文件。你应该在一段时间后看到终端打印出签名。
如果你访问 Solana Explorer,你应该能看到你的签名。它看起来会像这样:
以下是你应该拥有的完整代码:
import { Connection, Keypair } from "@solana/web3.js";
import { createMint, getOrCreateAssociatedTokenAccount, mintTo, setAuthority, transfer } from "@solana/spl-token";
const quicknodeEndpoint = 'https://example.solana-devnet.quiknode.pro/0123456/';
const connection = new Connection(quicknodeEndpoint, "confirmed");
const secret=[0...0]; // 用你的私钥替换
const fromWallet = Keypair.fromSecretKey(new Uint8Array(secret));
(async () => {
// 创建一个新的代币
const mint = await createMint(
connection,
fromWallet, // 交易的付款方
fromWallet.publicKey, // 将控制铸币的账户
null, // 将控制该代币冻结的账户
0 // 小数点位置
);
// 获取 fromWallet Solana 地址的代币账户。如果它不存在,则创建它。
const fromTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
fromWallet.publicKey
);
// 生成一个新钱包以接收新铸造的代币
const toWallet = Keypair.generate();
// 获取 toWallet Solana 地址的代币账户。如果它不存在,则创建它。
const toTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
toWallet.publicKey
);
// 将 1 个新代币铸造到我们刚刚返回/创建的 “fromTokenAccount” 账户。
let signature = await mintTo(
connection,
fromWallet, // 交易费用的付款方
mint, // 账户的铸币
fromTokenAccount.address, // 要铸造的账户地址
fromWallet.publicKey, // 铸币权限
1 // 铸造数量
);
await setAuthority(
connection,
fromWallet, // 交易费用的付款方
mint, // 账户
fromWallet.publicKey, // 当前权限
0, // 权限类型:“0” 表示铸币代币
null // 将新权限设置为 null
);
signature = await transfer(
connection,
fromWallet, // 交易费用的付款方
fromTokenAccount.address, // 源账户
toTokenAccount.address, // 目标账户
fromWallet.publicKey, // 源账户的所有者
1 // 转账代币的数量
);
console.log("SIGNATURE", signature);
})();
如果你能够坚持到这一步,你就从本教程和我们的其他 Solana 指南中学到了几件事,所以祝贺你!经过此过程,你已经成功在 Solana 区块链上创建了 NFT。你下一步要做的就是将这个独特的独一无二的代币、连接到某个资产。以下是一些指南,以此方式深入了解 Solana NFTs:
订阅我们的 新闻通讯 以获取有关以太坊的更多文章和指南。如果你有任何反馈,请随时通过 Twitter 与我们联系。你也可以在我们的 Discord 社区服务器与我们聊天,你会遇到一些超酷的开发者 :)
如果你对本指南有任何反馈,请 告诉我们。我们很乐意听到你的想法。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!