使用 Anchor 和 QuickNode 在 Solana 上创建NFT: 2024 版指南

gg

欢迎来到本教程。今天,我们将使用 Solana PlaygroundQuickNode RPC 和一个 IPFS 服务,在 Anchor/Rust 中创建一个 Solana 程序,以直接在链上铸造 NFT。

作为预备步骤,我们将在去中心化存储服务中准备我们的 NFT 图像和元数据。我们将使用 QuickNode IPFS,这是一个 IPFS 存储服务,适用于需要快速、高可用访问和高级功能的解决方案。

让我们上传将成为我们 NFT 的图像。在 QuickNode 仪表板上,转到 IPFS 然后是文件,你可以拖放你的图像。

让我们复制出现在我们上传的文件名旁边的内容标识符 (CID)。然后我们将其附加到地址 quicknode.myfilebase.com/ipfs/ 以获得我们将在元数据中使用的 URL。测试此 URL 以确保一切正确是很重要的。

为我们的 NFT 创建元数据

为此,我们将基于 Metaplex 为 Solana 上的 NFT 元数据创建的标准。你可以访问 Metaplex 文档 了解更多信息。

我们的元数据将是一个 JSON 文件,包含我们为 NFT 选择的参数 Name、Symbol 和 Description。

{  
    "name": "Name",  
    "symbol": "symbol",  
    "description": "your description",  
    "image": "quicknode.myfilebase.com/ipfs/CID",  
    "attributes": [  
        {  
            "trait_type": "type",  
            "value": "value"  
        }  
    ],  
    "properties": {  
        "creators": [  
            {  
                "address": "creators's wallet address",  
                "share": royalty  
            }  
        ],  
        "files": [  
            {  
                "type": "image/png",  
                "uri": "ipfs://CID"  
            }  
        ]  
    },  
    "collection": {  
        "name": "name",  
        "family": "family"  
    }  
}

一旦我们的 .json 文件准备好,我们将返回 QuickNode 的文件选项卡并像处理图像文件一样拖放它。现在我们已经准备好继续。

设置 Solana Playground

我们将前往 Solana Playground 并通过创建一个新钱包进行连接。

Solana Playground

点击显示“not connected”的地方,然后保存密钥对并继续。

保存密钥对

在这里我们可以看到创建的钱包地址。

创建的钱包地址

创建一个新项目,给它命名,选择 Anchor (Rust) 并创建。

创建的 Anchor 项目

注意:我们将需要大约 10 个 DevNet 的 Solana 来部署合约。要为我们的钱包充值,我们必须在 Sol Faucet 中输入我们刚刚创建的钱包地址,该网站允许我们每 24 小时充值 3 个 Solana。这意味着我们需要几天时间来完成充值。作为替代方案,我们建议使用其他钱包地址和 VPN 来加快进程。_

现在是时候配置 solpg 以使用 QuickNode RPC 在 Solana DevNet 上工作了。点击设置选项卡,然后点击端点选项卡。

设置 Solana Playground

选择自定义并粘贴你的 QuickNode 私有 RPC 用于 Solana DevNet。

自定义 RPC

完成后,回到我们新创建的项目中,我们将删除不需要的代码,并保留来自 anchor_lang 的主要导入、程序 id 的默认声明以及程序和派生账户属性的声明。

应该看起来像这样:

use anchor_lang::prelude::*;

declare_id!("11111111111111111111111111111111");

#[program]

#[derive(Accounts)]

现在,我们将导入所有这些库和必要的元素。这些库具有在 Solana 上铸造新 NFT 所需的所有标准功能,我们将在过程中需要每一个。

use anchor_spl::associated_token::AssociatedToken;
use anchor_spl::metadata::{
    create_master_edition_v3, create_metadata_accounts_v3, CreateMasterEditionV3,
    CreateMetadataAccountsV3, Metadata,
};
use anchor_spl::token::{mint_to, Mint, MintTo, Token, TokenAccount};
use mpl_token_metadata::types::{Collection, Creator, DataV2};

现在你的代码应该看起来像这样:

use anchor_lang::prelude::*;
use anchor_spl::associated_token::AssociatedToken;
use anchor_spl::metadata::{
    create_master_edition_v3, create_metadata_accounts_v3, CreateMasterEditionV3,
    CreateMetadataAccountsV3, Metadata,
};
use anchor_spl::token::{mint_to, Mint, MintTo, Token, TokenAccount};
use mpl_token_metadata::types::{Collection, Creator, DataV2};

declare_id!("11111111111111111111111111111111");

#[program]

#[derive(Accounts)]

在 [derive(Accounts)] 属性下,我们将定义一个包含与程序交互所需的所有账户的结构。

我们将定义一个名为 CreateNFT 的公共结构。它将有一个参数 'info,表示在使用此结构作为上下文的指令执行期间它将保留在内存中。

我们在结构中定义的第一个账户将是 authority。我们将其定义为类型为 Signer 的公共账户,具有 'info 类型的生命周期。我们在此结构中定义的所有账户都将是公共类型并具有此生命周期。

#[derive(Accounts)]
pub struct CreateNFT<'info> {
   pub authority: Signer<'info>,
}

我们将为此账户定义一个属性。放置以下行,并在括号内放置 mut 这个词,表示可变。这意味着 NFT 的权限将来可以更改。

#[derive(Accounts)]
pub struct CreateNFT<'info> {
  #[account(mut)]
  pub authority: Signer<'info>,
}

同样,我们将定义 payer 账户及其相应的可变属性 mut

#[derive(Accounts)]
pub struct CreateNFT<'info> {
  #[account(mut)]
  pub authority: Signer<'info>,
  #[account(mut)]
  pub payer: Signer<'info>,
}

现在我们声明 mint 账户,类型为 Account,它将携带类型为 mint 的结构。我们已经从 anchor_spl 代币库中导入了这个结构。

#[derive(Accounts)]
pub struct CreateNFT<'info> {
  #[account(mut)]
  pub authority: Signer<'info>,
  #[account(mut)]
  pub payer: Signer<'info>,
  pub mint: Account<'info, Mint>,
}

我们的 mint 账户将携带以下参数:

  • init: 因为我们必须初始化它
  • payer 账户作为支付初始化的账户
  • 内部 mint 结构:小数位为 0,因为它是不可替代代币 (NFT)
  • 然后我们将 authority 账户作为 mint 结构的权限传递
  • freeze_authority 参数同样
#[derive(Accounts)]  
pub struct CreateNFT<'info> {  
  #[account(mut)]  
  pub authority: Signer<'info>,  
  #[account(mut)]  
  pub payer: Signer<'info>,  
  #[account(   
    init,  
    payer = payer,   
    mint::decimals = 0,  
    mint::authority = authority,  
    mint::freeze_authority = authority,  
    )]  
  pub mint: Account<'info, Mint>,  
}

现在我们设置种子来创建派生地址,首先将以字节形式携带单词 mint 和 id 参数的字节形式。

#[derive(Accounts)]  
pub struct CreateNFT<'info> {  
  #[account(mut)]  
  pub authority: Signer<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值