0x00 前言

这篇博客是本期每周博客挑战的最后一篇了!这次分享的是 Solana!

最近我在做一个与 Solana NFT 相关的项目,第一次接触 Solana 的 NFT 开发。原本只是想随手记一篇简单的开发笔记,但真正动笔后才发现,Solana 上的 NFT 标准远比我预想得复杂,多种 NFT 标准看得我一头雾水,和以太坊那种“几乎一统天下”的 ERC-721 完全不同。一个简单的笔记根本无法覆盖这些内容——于是,我干脆从一个初学者的视角出发,系统地梳理了 Solana NFT 的技术发展脉络。

这篇文章的目标,是帮助大家理清 Solana NFT 的主要协议标准、背后的设计理念与适用场景,并重点讨论 Metaplex Core 标准,结合 Candy Machine 等工具,实际演示如何快速 launch 一个具备特定功能的 Solana NFT 项目。

本文会涉及一些 Solana 开发的基础知识,比如 SPL Token、ATA、PDA 等核心概念。如果你已经有基础,阅读会更轻松;但如果你对这些还不太熟悉也没关系,文章最后我会提供一份完整的 NFT Launch 代码,你可以直接复制粘贴到 IDE 中运行,用一份真实的代码体验属于你的 Solana Hello World!

全文约 13000 字,预计阅读时间为 30~40 分钟,建议收藏慢读。

0x01 认识 Solana NFT 标准

作为初学者,一开始我理所当然地以为它的 NFT 机制应该和以太坊类似,只有一个大家都在用的最主流的标准。比如以太坊最主流的 NFT 标准是 ERC-721,大家基本都是围绕这个 interface 构建 NFT。直到我动手写第一个 Solana NFT 的时候,才发现事情并没有我想的那么简单。

通过简单的搜索,我发现 Solana NFT 标准是由 Metaplex 这个组织定义的,但是当我进入他们的开发者文档(https://developers.metaplex.com/),瞬间懵逼:

image.png

这一大堆 MPL 都是啥?我只想了解一下 Solana 上 NFT 用的是什么标准,为什么不能痛快地给我一个答案…

通过请教 AI 和一些简单的实践后,我开始意识到:

Solana 上的 NFT,其实本质上就是一个最大供应量为 1、decimal 为 0 的 SPL Token。

对,你没看错,只要你用 Solana 的 SPL Token 程序创建一个 decimal 为 0,supply 为 1 的 token,并 mint 给一个用户地址,那它从结构上来说就已经是一个 NFT 了。

下面这段代码就是最原始的 NFT 实现:

// 创建一个 decimal 为 1 的 Token Mint
const mint = await createMint(
  connection,
  payer,
  payer.publicKey,   // mint authority
  null,              // freeze authority
  0                  // decimals
);
// 创建该 mint 的 Associated Token Account (ATA)
const tokenAccount = await getOrCreateAssociatedTokenAccount(
  connection,
  payer,
  mint,
  payer.publicKey
);
// mint 1 个 token 给自己
await mintTo(
  connection,
  payer,
  mint,
  tokenAccount.address,
  payer,
  1
);
// 取消 mint 权限,防止再发行(确保了总供应量为 1)
await setAuthority(
  connection,
  payer,
  mint,
  payer.publicKey,
  AuthorityType.MintTokens,
  null
);

这里我们创建了一个“只能 mint 一次”的 token,supply 恒为 1,不能再增发,也不能拆分。从 token 的角度,它就像一个 NFT。但你可能会马上意识到,它看起来不像一个 NFT——没有图片、没有名字、没有描述,钱包和市场根本识别不出这只是个“孤独的 token”。

这时候你会自然想到另一个非常重要的组成部分:metadata

就像以太坊上的 ERC-721 会有一个 tokenURI 指向 IPFS 上的 JSON 文件,Solana 上的 NFT 同样也需要 metadata。这些 metadata 往往包括:名称(name)、符号(symbol)、图像(image)、属性(traits)、创作者信息、是否可转让或冻结等数据。

当你想到这里,恭喜你!你已经发明了 Metaplex Metadata 标准