如何使用 Rust 和 Metaplex 在 Solana 上铸造 NFT
在这一篇文章中,我们将学习如何编写一个自定义合约,并且只需要四个步骤就可以生成NFT。
关于Solana开发的一些提示
在Solana的开发过程中,我们会遇到很多奇怪的自定义错误和bug,因为Solana的开发生态系统不像以太坊的开发生态系统那么大,所以修复它们会非常困难和令人沮丧。但不用担心。当我们陷入困境时,我们只需要在正确的地方寻找解决方案。
项目概述
我们将使用的工具:
- Solana CLI工具——Solana 官方 CLI工具集
- Anchor Framework—— 开发Solana项目的高级框架
- Solana/web3.js——web3.js的Solana版本
- Solana/ spla -token ——一个使用spl代币的包
- Mocha——一个JS测试工具
现在开始
准备工作
在CLI中使用如下命令设置网络为devnet:
solana config set --url devnet
要确认它是否工作,然后输入cmd后检查输出:
Config File: /Users/anoushkkharangate/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: /Users/anoushkkharangate/.config/solana/id.json
Commitment: confirmed
接下来,如果还没有设置的话,我们是需要设置文件系统钱包的,并使用命令Solana airdrop 1添加一些devnet sol。
最后,使用anchor CLI 命令行创建一个anchor 项目:
anchor init
确保Anchor.toml也被设置为devnet。
[features]
seeds = false
[programs.devnet]
metaplex_anchor_nft = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
[registry]
url = "https://anchor.projectserum.com"
[provider]
cluster = "devnet"
wallet = "/Users/<user-name>/.config/solana/id.json"
[scripts]
test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"
步骤1. 导入依赖项
在我们的项目中,必须有一个名为programs的文件夹。转到programs/<your-project-name>/Cargo.toml
并添加这些依赖项。确保使用0.22.1版本,并且可以使用avm来更改它。
[dependencies]
anchor-lang = “0.22.1”
anchor-spl = “0.22.1”
mpl-token-metadata = {version = “1.2.5”, features = [“no-entrypoint”]}
不要使用最新版本的anchor ,因为anchor会延迟使用最新版本的Solana程序进行自我更新,所以它可能会导致mpl crate 和 anchor crate 的依赖需求之间的冲突。
然后转到lib.rssrc 中的文件并导入这些:
use anchor_lang::prelude:😗;
use anchor_lang::solana_program::program::invoke;
use anchor_spl::token;
use anchor_spl::token::{MintTo, Token};
use mpl_token_metadata::instruction::{create_master_edition_v3, create_metadata_accounts_v2};
现在我们可以编写mint函数了!
步骤2. 编写Mint函数结构
首先,让我们为mint函数创建accounts结构
#[derive(Accounts)]
pub struct MintNFT<'info> {
#[account(mut)]
pub mint_authority: Signer<'info>,
/// CHECK: This is not dangerous because we don't read or write from this account
#[account(mut)]
pub mint: UncheckedAccount<'info>,
// #[account(mut)]
pub token_pr