【Solana】创建 SPL 标准的 NFT 以及完善 metadata

  • 0xE
  • 更新于 6天前
  • 阅读 216

和之前创建 Token 是类似的。

创建 NFT

和创建 Token 一样,不过小数位数设置为 0。

$ spl-token create-token --decimals 0
Creating token HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD

Address:  HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Decimals:  0

Signature: 4kaPVMGnDGa2TiGnoFvmjnunkNCy3HUCjVghzZnJgdixHDzwBWcVg2AgiPPzwZiXLoALPgnd9WxjMC3iZEMYbz9x

创建出的 NFT 代币地址为: HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD

mint NFT

创建 token account

创建我们账户对应的 token account,如果这块地方不知道的,可以看之前的文章

$ spl-token create-account HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Creating account HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD

Signature: 67SC66xrK72S4hJd8esKdf7VWBJo6uShyAhFSirEPEfyuriJo2f1ReUt3GKcabpNQCofinm996B7xGARNSMVGxuq

创建出的 token accountHfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD

mint NFT

按照以下的格式:

spl-token mint <TOKEN_MINT_ADDRESS> <TOKEN_AMOUNT> [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

$ spl-token mint HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD 1 HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD
Minting 1 tokens
  Token: HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
  Recipient: HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD

Signature: 2TV9kDSzM3TCK2iKpn1fLRJTkUBicLjEQkfzkemPs4MhW8kUb4hWymgkyxFoWNTpuWaYsSvQ2M1u1AhLLcQzhJAb```

完善 metadata

上篇文章一样,我们创建 metadata 的 json 文件,并且上传到 Pinata 中。

json 内容如下:

{
    "name": "To Da Moon NFT",
    "symbol": "TDMNFT",
    "description": "A NFT that will moon as soon as you buy it",
    "seller_fee_basis_points": 500,
    "image": "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM",
    "external_url": "https://example.com/path/to/nft",
    "attributes": [
      {
        "trait_type": "Rarity",
        "value": "Legendary"
      },
      {
        "trait_type": "Element",
        "value": "Fire"
      }
    ],
    "properties": {
      "files": [
        {
          "uri": "https://example.com/path/to/image.png",
          "type": "image/png"
        }
      ],
      "category": "image",
      "creators": [
        {
          "address": "5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot",
          "share": 100
        }
      ]
    }
}

其中:

`seller_fee_basis_points` 为版税比例。此值为 500,意味着每次NFT的二次交易,创作者将收到 5% 的销售金额作为版税。
`external_url` 可以是项目网站、白皮书、特定信息页面,或者NFT的使用场景介绍。
`attributes` 描述 NFT 的具体特性或属性,用于区分 NFT 之间的独特性。
`properties` 定义与NFT相关的资源文件和其他元信息。
`share` 定义创作者在版税中的分配比例。总和需为 100。

复用之前文章的代码,替换代币地址和 json 链接:

const {
    createMetadataAccountV3,
    findMetadataPda
} = require("@metaplex-foundation/mpl-token-metadata");
const web3 = require("@solana/web3.js");
const { createSignerFromKeypair, none, signerIdentity } = require("@metaplex-foundation/umi");
const { createUmi } = require('@metaplex-foundation/umi-bundle-defaults');
const { fromWeb3JsKeypair, fromWeb3JsPublicKey } = require('@metaplex-foundation/umi-web3js-adapters');

// 从文件加载钱包密钥
function loadWalletKey(keypairFile) {
    const fs = require("fs");
    return web3.Keypair.fromSecretKey(
        new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))
    );
}

async function main() {
    console.log("RUN...");

    // 加载钱包密钥对并设置铸币地址
    const myKeypair = loadWalletKey("id.json");
    const mint = new web3.PublicKey("HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD");

    // 使用自定义 RPC 连接到 Solana 开发网络
    const umi = createUmi("https://devnet.helius-rpc.com/?api-key=YourAPIKey");
    // const umi = createUmi("https://api.devnet.solana.com");
    // const umi = createUmi("https://api.mainnet-beta.solana.com");

    // 设置签名者身份
    const signer = createSignerFromKeypair(umi, fromWeb3JsKeypair(myKeypair));
    umi.use(signerIdentity(signer, true));

    // 定义代币的元数据
    const onChainData = {
        name: "To Da Moon NFT", // 代币名称
        symbol: "TDMNFT", // 代币符号
        uri: "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/bafkreihf2e6dpgtjkllwx4vxu5ugx6n2r4h255xeef45xh56ok3rnyfhni", // 元数据 JSON 文件链接
        sellerFeeBasisPoints: 0,  // 设置销售费用为0
        creators: none(),
        collection: none(),
        uses: none(),
    };

    // 设置铸币授权和铸币地址
    const accounts = {
        mint: fromWeb3JsPublicKey(mint),
        mintAuthority: signer,
    };

    // 创建元数据账户
    const txid = await createMetadataAccountV3(umi, {
        ...accounts,
        isMutable: true, // 设置元数据可修改
        collectionDetails: null,
        data: onChainData,
    }).sendAndConfirm(umi);

    console.log(txid);
}

main();

运行成功后,可以在浏览器上查看 NFT 信息: https://explorer.solana.com/address/HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD?cluster=devnet

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,做过FHE,联盟链,现在是智能合约开发者。 刨根问底探链上真相,品味坎坷悟Web3人生。