{"content":{"title":"如何使用 Sugar 和 Umi（Candy Machine）在 Solana 上部署 NFT 集合","body":"#### 在开始本指南之前\r\n\r\n本指南将深入讲解如何使用 Sugar（Candy Machine）和 Umi（基于 Solana 的 Metaplex JS 协议）在 Solana 上部署 NFT 集合。如果你希望更快地完成此任务并将繁重的工作留给我们，我们建议使用 [Crossmint NFT Mint API \\[mainnet\\]](https://marketplace.quicknode.com/add-on/nft-mint-api-mainnet) 附加组件。通过使用 Crossmint NFT Mint API \\[mainnet\\]，你可以避免创建 Candy Machine 的麻烦。使用 NFT Mint API 可以轻松创建集合、减少前期成本并铸造 NFT！\r\n\r\n[试用 Crossmint NFT Mint API \\[mainnet\\]](https://marketplace.quicknode.com/add-on/nft-mint-api-mainnet)。\r\n\r\n## 概述\r\n\r\n你准备好在 Solana 上推出你的 NFT 集合了吗？Metaplex 的 Candy Machine CLI，即 Sugar，是让你快速启动的工具。如果你曾使用过先前版本的 Candy Machine，你会注意到 Sugar 有一些显著改进：\r\n\r\n- 上传性能提升\r\n- 用户体验简化\r\n- 错误处理改善\r\n\r\n#### 你将要做的\r\n\r\n在本指南中，你将使用 Solana CLI 创建一个新钱包，空投一些 SOL，并使用 Sugar 在 Solana 的开发网部署 Candy Machine。然后，你将使用 [Solana dApp Scaffold](https://github.com/solana-labs/dapp-scaffold) 和 Metaplex 的新模块化 JS 框架 [Umi](https://github.com/metaplex-foundation/umi) 将 Candy Machine 部署到网络上。\r\n\r\n#### 你需要的工具\r\n\r\n- 已安装 [Node.js](https://nodejs.org/en/)（版本 16.15 或更高）\r\n- 已安装 [Solana CLI](https://docs.solana.com/cli/install-solana-cli-tools)\r\n- 已安装 [Phantom Wallet](https://phantom.app/) 或 [Solflare extension](https://solflare.com/)\r\n- 已安装 [Metaplex Sugar](https://docs.metaplex.com/developer-tools/sugar/overview/installation) (**最新版本，V2.x+ **)（安装说明见下）\r\n- 一个文本编辑器\r\n- 已安装 npm 或 yarn（我们将使用 yarn 来初始化我们的项目并安装必要的包。如果你更喜欢 npm，请随意使用它。）\r\n\r\n## 设置你的项目\r\n\r\n在终端中创建一个新的项目目录，输入以下命令：\r\n\r\n```\r\nmkdir sugar-demo\r\ncd sugar-demo\r\n```\r\n\r\n\r\n## 安装 Sugar \r\n\r\n在安装过程中，系统会询问你想使用哪个版本。V1.x 是针对 Candy Machine v2，V2.x 是针对 Candy Machine v3。**本指南假定你使用的是 V2.x（Candy Machine v3）。如果你正在使用旧版本，请查看我们的指南 [这里](https://learnblockchain.cn/article/11168)。**\r\n\r\n#### Mac 安装\r\n\r\n在终端中输入：\r\n\r\n```\r\nbash <(curl -sSf https://sugar.metaplex.com/install.sh)\r\n```\r\n\r\n注意：安装后可能需要重新启动终端。\r\n\r\n#### Windows 安装\r\n\r\n1. 下载 Windows 安装程序 [这里](https://github.com/metaplex-foundation/winstaller/releases/latest/download/winstaller.exe)。\r\n2. 以管理员身份运行安装程序（右键单击--> **以管理员身份运行**）。如果你收到有关不信任二进制文件的警告，请尝试单击 _更多信息_，然后 _仍然运行_。如果你没有该选项，请按照以下步骤操作：\r\n   - 右键单击可执行文件，选择 _属性_。\r\n   - 如果你信任 Metaplex 开发团队，请单击 _解锁_ 按钮，如下图所示。这将允许你在你的计算机上运行此二进制文件，因为 Microsoft 不会自动信任它。\r\n   - 点击 _应用_ 和 _确定_。\r\n   - 再次运行安装程序。\r\n\r\n如果一切正常，你应该看到如下内容：\r\n\r\n![成功的 Windows 安装确认](https://img.learnblockchain.cn/2025/02/25/0-21b0e37960321360bbac8ec6a5c939a6.png)\r\n\r\n你可以通过在终端中输入 `sugar --version` 来验证你的 Sugar 安装。你应该看到类似的内容：\r\n\r\n```\r\nQuickNode % sugar --version\r\nsugar-cli 2.5.0\r\n```\r\n\r\n## 设置一个新钱包\r\n\r\nSugar 的一个酷新功能是它允许你使用 Solana CLI 设置钱包和 RPC 配置，从而不需要在每个 Sugar 命令中重新输入它们。\r\n\r\n我们首先需要创建一个新钱包，专门用于开发网测试，输入以下命令：\r\n\r\n```\r\nsolana-keygen new --no-bip39-passphrase --outfile ./wallet.json\r\n```\r\n\r\n我们可以通过运行以下命令确认我们刚生成的钱包是 Solana CLI 将使用的钱包：\r\n\r\n```\r\nsolana config set --keypair ./wallet.json\r\n```\r\n\r\n**注意**：在这个例子中，我们使用钱包的相对路径，因为我们不会改变目录，但是如果你愿意，可以包括一个完整路径。\r\n\r\n## 建立与 QuickNode RPC 的连接\r\n\r\n#### 通过快速节点端点连接到 Solana 集群\r\n\r\n要在 Solana 上构建，你需要一个 API 端点以连接到网络。你可以使用公开节点或部署和管理自己的基础设施；但是，如果你希望获得 8 倍更快的响应时间，可以将重担留给我们。\r\n\r\n\r\n配置你的 Solana 开发网端点后，你可以运行以下命令，将 `YOUR_QUICKNODE_URL` 替换为你复制的 HTTP URL：\r\n\r\n```\r\nsolana config set --url YOUR_QUICKNODE_URL\r\n```\r\n\r\n现在，为了为你的钱包提供资金，你可以运行命令：\r\n\r\n```\r\nsolana airdrop 1\r\n```\r\n\r\n如果命令成功，你应该看到如下内容：\r\n\r\n![空投成功](https://img.learnblockchain.cn/2025/02/25/2-e932e9e918fa6b86480a48103932ca62.png)\r\n\r\n你也可以在终端中运行 `solana balance` 看到 1 SOL 余额。\r\n\r\n## 准备 NFT 资产\r\n\r\n如果你以前使用过 Candy Machine，这个过程会很熟悉。我们必须为每个数字资产创建一个 _.json_ 文件，使用从 0 开始并按顺序递增的简单数字格式，永远不要跳过数字（例如，0.json 映射到 0.png，然后 1.json 映射到 1.png）。我们还可以创建一个可选的 **collection.json** 和 **collection.png**，以使 Sugar 能够自动创建链上集合。\r\n\r\nMetaplex 提供了一套 [样本资产](https://docs.metaplex.com/assets/files/assets-ff6bd873ecd07b49c86faf3c7aab82d2.zip)，我们可以下载并使用以保持一致。你可以编辑 json 以包含你希望的任何值，只要它符合 [URI json schema](https://docs.metaplex.com/programs/token-metadata/token-standard#the-non-fungible-standard)。\r\n\r\n下载样本集并将内容解压到项目目录中的 `./assets/`（Sugar 将查找你文件的默认目录）。\r\n\r\n## 配置 Candy Machine\r\n\r\n在项目根文件夹中创建一个新文件 `config.json`：\r\n\r\n```\r\necho > config.json\r\n```\r\n\r\n打开文件并粘贴以下配置：\r\n\r\n```\r\n{\r\n    \"number\": 10,\r\n    \"symbol\": \"NB\",\r\n    \"sellerFeeBasisPoints\": 500,\r\n    \"isMutable\": true,\r\n    \"isSequential\": false,\r\n    \"ruleSet\": null,\r\n    \"creators\": [\\\r\n        {\\\r\n            \"address\": \"YOUR_WALLET_ADDRESS\",\\\r\n            \"share\": 100\\\r\n        }\\\r\n    ],\r\n    \"uploadMethod\": \"bundlr\",\r\n    \"awsS3Bucket\": null,\r\n    \"retainAuthority\": true,\r\n    \"awsConfig\": null,\r\n    \"nftStorageAuthToken\": null,\r\n    \"shdwStorageAccount\": null,\r\n    \"pinataConfig\": null,\r\n    \"hiddenSettings\": null,\r\n    \"guards\": {\r\n        \"default\": {\r\n          \"solPayment\": {\r\n            \"value\": 0.01,\r\n            \"destination\": \"YOUR_WALLET_ADDRESS\"\r\n          },\r\n          \"startDate\": {\r\n            \"date\": \"2022-10-23T20:00:00Z\"\r\n          }\r\n        }\r\n      }\r\n}\r\n```\r\n\r\n确保将 `YOUR_WALLET_ADDRESS` 替换为你之前创建的钱包地址。\r\n\r\n> 注意：你可以在终端中运行 **solana address** 获取你刚创建的钱包地址。\r\n\r\n现在，我们应该准备好了。如果你已跟随到此步骤，你的目录结构应如下所示：\r\n\r\n```\r\nsugar-demo/\r\n├── wallet.json\r\n├── config.json\r\n└── assets/\r\n  ├── [0-9].png\r\n  ├── [0-9].json\r\n  ├── collection.png\r\n  └── collection.json\r\n```\r\n\r\nSugar 具有内置验证工具，可以让我们在进行下一步之前检查错误。在终端中运行：\r\n\r\n```\r\nsugar validate\r\n```\r\n\r\n![Sugar 验证成功](https://img.learnblockchain.cn/2025/02/25/3-adffb7b123879736627ef70a137a9b37.png)\r\n\r\n**注意**：你可能会看到警告“缺少 `properties.category`”。这是正常的，因为该属性未包含在 Metaplex 示例文件中。\r\n\r\n我们一切就绪！太棒了。让我们构建我们的 Candy Machine。\r\n\r\n## 创建 Candy Machine\r\n\r\n由于我们已使用 Solana CLI 设置了我们的 RPC 和钱包，并将我们的 `assets` 和 `config.json` 保存到 Sugar 的默认目录，我们的命令将非常简单！\r\n\r\n### 上传你的资产\r\n\r\n在终端中输入：\r\n\r\n```\r\nsugar upload\r\n```\r\n\r\n你应会看到如下内容：\r\n\r\n![Sugar 上传成功](https://img.learnblockchain.cn/2025/02/25/4-56097a3e1a9d9c505d185511bf00a47d.png)\r\n\r\n### 部署 Candy Machine\r\n\r\n在终端中输入：\r\n\r\n```\r\nsugar deploy\r\n```\r\n\r\n你应会看到如下内容：\r\n\r\n![Sugar 部署成功](https://img.learnblockchain.cn/2025/02/25/5-1430d3a690445448c5decc9d1c9f80e5.png)\r\n\r\n> 如果你收到“未找到区块哈希”的错误，请重试命令。\r\n\r\n确保在本地存储你终端提供的 Candy Machine ID。我们稍后会需要它。\r\n\r\n### 验证 Candy Machine\r\n\r\n让我们确认一切是否按照预期正常工作。在终端中输入：\r\n\r\n```\r\nsugar verify\r\n```\r\n\r\n你应会看到如下内容：\r\n\r\n![Candy Machine 验证成功](https://img.learnblockchain.cn/2025/02/25/6-db16fbfb795e7f99f95530950730eb45.png)\r\n\r\n做得好！\r\n\r\n### 测试你的 Candy Machine\r\n\r\n尝试使用 sugar 铸造 NFT。在终端中输入：\r\n\r\n```\r\nsugar mint\r\n```\r\n\r\n你应会看到如下内容：\r\n\r\n![成功的 Sugar 铸造](https://img.learnblockchain.cn/2025/02/25/7-fbb94fd6fb6bcc782b7c728b1574b141.png)\r\n\r\n### 添加你的 Candy Guards\r\n\r\n默认情况下，当你部署 Candy Machine 时，只有你可以铸造 NFT。你必须实施 candy guards，定义其他人铸造你的 NFT 的标准（例如，开始时间、付款金额、付款代币、白名单代币等）。由于我们已在 `config.json` 中定义了我们的 guards，因此可以运行以下命令：\r\n\r\n```\r\nsugar guard add\r\n```\r\n\r\n![成功添加 Candy Guard](https://img.learnblockchain.cn/2025/02/25/1-87b9e5efa0ea1cf26dbdccd82ece510f.png)\r\n\r\n太棒了！让我们创建一个铸造页面，与世界分享这个项目！\r\n\r\n## 设置一个铸造网站\r\n\r\n为了快速部署，我们将使用 [Solana dApp Scaffold](https://github.com/solana-labs/dapp-scaffold)，这是一个方便的工具，包含预集成 Solana 钱包适配器的 Next.JS 应用。\r\n\r\n### 克隆 dApp Scaffold\r\n\r\n在项目目录的终端中输入：\r\n\r\n```\r\ngit clone https://github.com/solana-labs/dapp-scaffold ./candy-machine-ui/\r\ncd candy-machine-ui\r\n```\r\n\r\n### 安装依赖\r\n\r\n安装包含的依赖。在终端中输入：\r\n\r\n```\r\nyarn\r\n```\r\n\r\n我们需要一些额外的 Metaplex 包来使铸造站点正常运行。在终端中输入：\r\n\r\n```\r\nyarn add @metaplex-foundation/mpl-candy-machine@alpha @metaplex-foundation/mpl-token-metadata@alpha @metaplex-foundation/mpl-toolbox @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults @metaplex-foundation/umi-signer-wallet-adapters\r\n```\r\n\r\n### 创建 .env 文件\r\n\r\n在 candy-machine-ui 文件夹中创建一个文件 `.env`：\r\n\r\n```\r\necho > .env\r\n```\r\n\r\n在新的 `.env` 文件中添加以下值（用你自己的值替换）：\r\n\r\n```\r\nNEXT_PUBLIC_RPC=<YOUR_QUICKNODE_URL>\r\nNEXT_PUBLIC_CANDY_MACHINE_ID=<YOUR_CANDY_MACHINE_PUBKEY>\r\nNEXT_PUBLIC_TREASURY=<YOUR_WALLET_ADDRESS>\r\n```\r\n\r\n如果你不记得你的 Candy Machine ID，可以在 `cache.json` 中的 `program.candyMachine` 字段找到它。\r\n\r\n在所有信息填写完毕后，你可以保存该文件。\r\n\r\n## 添加铸造 NFT 按钮\r\n\r\n我们必须在铸造网站中添加一个按钮，以允许用户铸造 NFT。首先，复制 `RequestAirdrop` 组件，并将其重命名为 `CandyMint`。在终端中，输入以下命令进行复制：\r\n\r\n```\r\ncp ./src/components/RequestAirdrop.tsx ./src/components/CandyMint.tsx\r\n```\r\n\r\n打开 `CandyMint.tsx` 并将导出组件名称从 `RequestAirdrop` 更改为 `CandyMint`。你还应将按钮中的文本从 `<span>Airdrop 1 </span>` 更改为 `<span>Mint NFT </span>`。\r\n\r\n最后，让我们更新常量声明并清空 `onClick` 函数的内容，以获得一个干净的工作状态。你的文件应如下所示：\r\n\r\n```\r\n//...默认导入（我们稍后将替换这些）\r\n\r\nexport const CandyMint: FC = () => {\r\n    // 👇 更新这些常量声明\r\n    const { connection } = useConnection();\r\n    const wallet = useWallet();\r\n    const { getUserSOLBalance } = useUserSOLBalanceStore();\r\n\r\n    // TODO - 创建一个 Umi 实例\r\n\r\n    // 👇 更新这个 onClick 函数\r\n    const onClick = useCallback(async () => {\r\n      if (!publicKey) {\r\n          console.log('error', 'Wallet not connected!');\r\n          notify({ type: 'error', message: 'error', description: 'Wallet not connected!' });\r\n          return;\r\n      }\r\n      // TODO - 在这里添加铸造逻辑\r\n    }, []);\r\n\r\n    return (\r\n        <div className=\"flex flex-row justify-center\">\r\n            <div className=\"relative group items-center\">\r\n                <div className=\"m-1 absolute -inset-0.5 bg-gradient-to-r from-indigo-500 to-fuchsia-500\r\n                    rounded-lg blur opacity-20 group-hover:opacity-100 transition duration-1000 group-hover:duration-200 animate-tilt\"></div>\r\n                <button\r\n                    className=\"px-8 m-2 btn animate-pulse bg-gradient-to-br from-indigo-500 to-fuchsia-500 hover:from-white hover:to-purple-300 text-black\"\r\n                    onClick={onClick}\r\n                >\r\n                    <span>Mint NFT </span>\r\n                </button>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n```\r\n\r\n我们需要将 `CandyMint` 组件添加到我们的主页视图中。打开 `./sugar-demo/candy-machine-ui/src/views/home/index.tsx` ，并添加以下导入语句：\r\n\r\n```\r\n// 组件\r\nimport { RequestAirdrop } from '../../components/RequestAirdrop';\r\n// 👇 添加这一行\r\nimport { CandyMint } from '../../components/CandyMint';\r\n```\r\n\r\n并将 `CandyMint` 组件添加到 `HomeView` 组件中：\r\n\r\n```\r\n          <RequestAirdrop />\r\n          {/* 👇 添加这一行 */}\r\n          <CandyMint />\r\n```\r\n\r\n做得好！你现在应该有一个新按钮，但在测试之前，我们需要添加铸造功能。让我们来做吧。\r\n\r\n## 添加铸造功能\r\n\r\n返回到 `./sugar-demo/candy-machine-ui/src/components/CandyMint.tsx`，并用以下内容替换默认导入：\r\n\r\n```\r\nimport { useConnection, useWallet } from '@solana/wallet-adapter-react';\r\nimport { FC, useCallback, useMemo } from 'react';\r\nimport { notify } from \"../utils/notifications\";\r\nimport useUserSOLBalanceStore from '../stores/useUserSOLBalanceStore';\r\nimport { createUmi } from '@metaplex-foundation/umi-bundle-defaults';\r\nimport { generateSigner, transactionBuilder, publicKey, some } from '@metaplex-foundation/umi';\r\nimport { fetchCandyMachine, mintV2, mplCandyMachine, safeFetchCandyGuard } from \"@metaplex-foundation/mpl-candy-machine\";\r\nimport { walletAdapterIdentity } from '@metaplex-foundation/umi-signer-wallet-adapters';\r\nimport { mplTokenMetadata } from '@metaplex-foundation/mpl-token-metadata';\r\nimport { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox';\r\nimport { clusterApiUrl } from '@solana/web3.js';\r\nimport * as bs58 from 'bs58';\r\n\r\n// 这些是我们在 .env 文件中定义的环境变量\r\nconst quicknodeEndpoint = process.env.NEXT_PUBLIC_RPC || clusterApiUrl('devnet');\r\nconst candyMachineAddress = publicKey(process.env.NEXT_PUBLIC_CANDY_MACHINE_ID);\r\nconst treasury = publicKey(process.env.NEXT_PUBLIC_TREASURY);\r\n```\r\n\r\n### 创建一个 Umi 实例\r\n\r\n让我们使用 QuickNode 端点和 mplCandyMachine、mplTokenMetadata 插件创建一个记忆化的 Umi 实例。我们将使用此实例来铸造我们的 NFT。用以下内容替换 `// TODO - 创建 Umi 实例`：\r\n\r\n```\r\n    const umi = useMemo(() =>\r\n        createUmi(quicknodeEndpoint)\r\n            .use(walletAdapterIdentity(wallet))\r\n            .use(mplCandyMachine())\r\n            .use(mplTokenMetadata()),\r\n        [wallet, mplCandyMachine, walletAdapterIdentity, mplTokenMetadata, quicknodeEndpoint, createUmi]\r\n    );\r\n```\r\n\r\n这将创建一个 Umi 实例，使用通过钱包适配器连接的我们的钱包、我们的 QuickNode 端点以及几个 Metaplex 插件。\r\n\r\n### 添加铸造逻辑\r\n\r\n让我们更新 `onClick` 函数，以便使用 Umi 的事务构建器铸造 NFT。将 `onClick` 函数替换为以下代码，然后我们将逐步讲解其作用：\r\n\r\n```\r\n    const onClick = useCallback(async () => {\r\n        if (!wallet.publicKey) {\r\n            console.log('error', 'Wallet not connected!');\r\n            notify({ type: 'error', message: 'error', description: 'Wallet not connected!' });\r\n            return;\r\n        }\r\n\r\n        // 获取 Candy Machine。\r\n        const candyMachine = await fetchCandyMachine(\r\n            umi,\r\n            candyMachineAddress,\r\n        );\r\n        // 获取 Candy Guard。\r\n        const candyGuard = await safeFetchCandyGuard(\r\n            umi,\r\n            candyMachine.mintAuthority,\r\n        );\r\n        try {\r\n            // 从 Candy Machine铸造。\r\n            const nftMint = generateSigner(umi);\r\n            const transaction = await transactionBuilder()\r\n                .add(setComputeUnitLimit(umi, { units: 800_000 }))\r\n                .add(\r\n                    mintV2(umi, {\r\n                        candyMachine: candyMachine.publicKey,\r\n                        candyGuard: candyGuard?.publicKey,\r\n                        nftMint,\r\n                        collectionMint: candyMachine.collectionMint,\r\n                        collectionUpdateAuthority: candyMachine.authority,\r\n                        mintArgs: {\r\n                            solPayment: some({ destination: treasury }),\r\n                        },\r\n                    })\r\n                );\r\n            const { signature } = await transaction.sendAndConfirm(umi, {\r\n                confirm: { commitment: \"confirmed\" },\r\n            });\r\n            const txid = bs58.encode(signature);\r\n            console.log('success', `Mint successful! ${txid}`)\r\n            notify({ type: 'success', message: 'Mint successful!', txid });\r\n\r\n            getUserSOLBalance(wallet.publicKey, connection);\r\n        } catch (error: any) {\r\n            notify({ type: 'error', message: `Error minting!`, description: error?.message });\r\n            console.log('error', `Mint failed! ${error?.message}`);\r\n        }\r\n    }, [wallet, connection, getUserSOLBalance, umi, candyMachineAddress, treasury]);\r\n```\r\n\r\n让我们逐步理解发生了什么：\r\n\r\n1. 首先，我们检查钱包是否已连接。如果没有，我们通知用户并返回。\r\n2. 接下来，我们使用 `fetchCandyMachine` 和 `safeFetchCandyGuard` 函数获取 Candy Machine 和 Candy Guard。这些都是我们铸造交易所需的。\r\n3. 然后，我们使用 Umi 的 `generateSigner` 函数生成一个签名者。这将用于铸造我们的 NFT。\r\n4. 然后，我们使用 Umi 的 `transactionBuilder` 函数创建一个事务。这将用于铸造我们的 NFT：\r\n\r\n- 我们将 `setComputeUnitLimit` 指令添加到交易中。这个安全措施防止由于超出计算单位限制而导致的交易失败。\r\n- 我们将 `mintV2` 指令添加到交易中。这个指令将铸造我们的 NFT。我们传入我们的 umi 实例和一个具有以下属性的对象：\r\n  - `candyMachine`：Candy Machine 的公钥。\r\n  - `candyGuard`：Candy Guard 的公钥。\r\n  - `nftMint`：我们之前生成的签名者。\r\n  - `collectionMint`：集合铸币的公钥。\r\n  - `collectionUpdateAuthority`：集合更新授权的公钥。\r\n  - `mintArgs`：一个对象，包含与你 Candy Guard 相关的铸造参数（这可能因 Candy Guard 而异）。对于 `solPayment` guard，我们必须传递付款的 `destination`（财政库的公钥）。\r\n\r\n5. 我们发送交易并通知用户结果。请注意，umi 将事务签名作为 _Unit8Array_ 返回，因此我们必须将其编码为 base58 以便向用户显示。\r\n6. 最后，我们调用 `getUserSOLBalance`（内置于 scaffold 的商店操作）以更新用户的 SOL 余额。\r\n\r\n做得好！我们的网站现在应该能够铸造 NFT。\r\n\r\n## 铸造 NFT\r\n\r\n现在我们已经添加了铸造逻辑，让我们启动并测试该网站。在终端中运行以下命令：\r\n\r\n```\r\nyarn dev\r\n```\r\n\r\n这将在 [localhost:3000](localhost:3000) 打开浏览器，你可以连接你的钱包，并有能力铸造 NFT。请在继续之前确认你的 Phantom Wallet 设置为开发网而不是主网。\r\n\r\n你需要在你的 Phantom 钱包中拥有开发网 SOL 才能铸造 NFT。你可以使用 Solana CLI 为你的 Phantom 钱包空投，输入以下命令：\r\n\r\n```\r\nsolana airdrop 1 YOUR_PHANTOM_WALLET_ADDRESS\r\n```\r\n\r\n一切准备就绪后，点击“铸造”。如果成功，你应该会看到这样的网站：\r\n\r\n![Candy Machine 铸造页面](https://img.learnblockchain.cn/2025/02/25/8-7b14dd6084c343a0d3e21b63fffa0355.png)\r\n\r\n如果你看到“铸造失败”的错误，你可能没有足够的资金。添加资金后再试一次。你可以在购买后在钱包中查看 NFT。Phantom 可能需要一段时间才能在你的钱包中渲染 NFT。我们的 NFT 看起来是这样的：\r\n\r\n![钱包中的铸造 NFT](https://img.learnblockchain.cn/2025/02/25/9-8dcd030390fbba23e3dfb38ac1a3fb64.png)\r\n\r\n这真是太棒了！做得好。\r\n\r\n## 结论\r\n\r\n恭喜你！你使用 Metaplex Sugar 和 Umi 创建了 Candy Machine。你现在拥有了运行你自己的 NFT 铸造所需的所有工具。我们很高兴看到你正在创建什么 NFT！加入我们的 [Discord](https://discord.gg/quicknode) 或通过 [Twitter](https://twitter.com/QuickNode) 与我们联系，分享你的 NFT 项目。\r\n\r\n \r\n\r\n>- 原文链接： [quicknode.com/guides/sol...](https://www.quicknode.com/guides/solana-development/nfts/how-to-deploy-an-nft-collection-on-solana-using-sugar-candy-machine-umi)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/25306","address":null},"history":null,"timestamp":1740449178,"version":1}