在Solana上使用压缩NFT

  • Shyft_to
  • 发布于 2023-07-25 10:19
  • 阅读 7

本文介绍了Solana上的压缩NFT,它通过压缩格式来减少文件大小和铸造成本。文章详细说明了如何使用SHYFT API来创建Merkle树、铸造、查看、转移和销毁压缩NFT,并提供了相关的代码示例和交易签名链接,方便开发者理解和实践。

Solana 上的压缩 NFT 是一种使用压缩格式来减少文件大小和铸造成本的 NFT。在本文中,我们将探讨如何铸造、转移、销毁和查看压缩 NFT。

使用 SHYFT API 的压缩 NFT

Solana 最近引入了状态压缩和压缩 NFT,这将降低铸造和开发的成本。Solana 区块链上的压缩 NFT 是一种新型的 NFT,它使用压缩格式来减少文件大小和 gas 成本。在本文中,我们将深入探讨 Solana 上压缩 NFT 的激动人心的世界,并探索在 SHYFT API 的帮助下,在 Solana 上铸造、转移、销毁和查看压缩 NFT 的最简单方法

阅读更多关于 压缩 NFT 的信息。

开始之前

要开始,我们需要一些东西。

注册你的 Shyft 帐户并获取你自己的 Shyft API 密钥

x-api-key 是一个身份验证参数,它使你可以访问 Shyft API你可以从 Shyft 网站获取你自己的 API 密钥 只需在此处使用你的电子邮件 ID 注册,即可免费获得。如果已经有 Shyft API 密钥,请跳过此步骤。

Node.js 或任何支持 API 调用的服务器环境

我们已将 Node.js 用于本文,但是可以使用任何支持 API 调用的服务器环境来引导它们,甚至可以使用前端 React、Next.js 或 Vanilla JS 应用程序。

完成本教程后,将得到此结果。你也可以在此处查看此项目的有效版本。

在 Solana 上使用压缩 NFT

创建 Merkle 树

要铸造压缩 NFT,我们必须首先创建一个 Merkle 树。Merkle 树,有时称为“哈希树”,是一种基于哈希的二叉树结构,其中每个叶节点都表示为其内部数据的密码哈希。每个不是叶节点的节点(称为分支)都表示为其子叶哈希的哈希。阅读有关 Merkle 树以及如何使用它们来创建压缩 NFT 的更多信息此处

Shyft API 使我们能够通过提供以下参数来构造 Merkle 树

  • network:指定 Solana 区块链环境,可以是 devnettestnetmainnet-beta
  • wallet_address:指定树的授权者和交易的付款人(如果未由 fee_payer 字段明确声明)
  • max_depth_size_pair:这是一个 JSON 对象,它进一步指定两个字段 - max_depth(Merkle 树的最大深度)和 max_buffer_size(在仍保持根哈希有效性的同时可以进行的最大更改数)
  • canopy_depth:指定在链上存储或缓存的特定证明路径的证明节点数。
  • fee_payer(可选):如果指定,则此帐户将支付交易 gas 费用,而不是树的授权者 wallet_address

有关 Shyft 支持的参数的完整列表以及要了解有关 Merkle 树的更多信息,请参阅我们提供的详细文档 此处

const axios = require('axios'); // 或任何你喜欢的 http 客户端

const YOUR_WALLET_ADDRESS = 'CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS';
const network = 'devnet' // 也可以是 testnet 或 mainnet-beta

async function createMerkleTree() {
  const response = await axios.post("https://api.shyft.to/sol/v1/nft/compressed/create_tree", /* Shyft 创建 merkle API 端点 */  {
    network,
    wallet_address: YOUR_WALLET_ADDRESS,
    max_depth_size_pair: {
      max_depth: 14,
      max_buffer_size: 64
    },
    canopy_depth: 11
  }, {
    headers: {
      "x-api-key": process.env.SHYFT_API_KEY // 替换为你自己的密钥. 从 shyft.to 获取免费的一个
    }
  });
  console.dir(response.data, { depth: null })
}

createMerkleTree();

结果

{
  "success": true,
  "message": "Merkle 树创建交易已成功生成",
  "result": {
    "encoded_transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsx5Al/LnmuaRE433spcsmZcBiWnfSnBYNz0XXgrAxKUAj30+m3zBbXrxR4ZWjSof2Ck3CU6Vdt4mjPXY2dXQNAgAEB6al1LAvaVtZ9aKL54myXpqjNU53HBAS2YEy3SlvVZTLPh5N+X7diQ52sBIWBKtWS/znHqffM2wMhy+tAYj1EITXm2AFc2QcnkEoEzz5uEvm1TH7foYK1VC/hULHAg3mnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmIuA63k1KGmyJHRfWd2/iiZYyhPcaIEhJjUcrgfBpaUJKhPulcQcugimf1rGfo334doRYl4dZBN/j08jgwN/FAu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh81aTOYisSwHg9gPTVmFDNMxFqmMT9bnYfi1pLN93ZzZYCAwIAATQAAAAAgP6XQwAAAAD4ewIAAAAAAAkqE+6VxBy6CKZ/WsZ+jffh2hFiXh1kE3+PTyODA38UBAcCAQAABgUDEqVTiI5Zyi/cDgAAAEAAAAABAA==",
    "tree": "5BV5a4Px8Ghtxmdw2we2SYn7r3t6EUPwCH7hL6bw6wN3",
    "signers": [\
      "CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS"\
    ]
  }
}

交易签名

成功执行后,返回的响应将具有一个 encoded_transaction ,该交易将需要 wallet_address fee_payer (如果指定)的签名,完成后,将创建一个新的 Merkle 树。 我们部署了一个小型项目来测试使用 Shyft API 时的交易签名。在此处尝试一下:https://shyft-insider.vercel.app/

有关在 Solana 上签署交易的更多信息,请参阅我们提供的详细文档此处

响应还包括 tree 字段,该字段表示已创建树的地址。记住此地址至关重要,因为在创建压缩 NFT 时我们将需要它。

铸造压缩 NFT

创建 Merkle 树后,我们可以通过利用 Shyft 的压缩 NFT 铸造端点并提供以下参数来开始铸造压缩 NFT

  • network:Solana 区块链环境(devnettestnetmainnet-beta
  • creator_wallet:NFT 的创建者/付款人。
  • merkle_tree:我们创建的 Merkle 树地址。
  • metadata_uri:包含 JSON 文件格式的 NFT 元数据(metaplex 非同质化标准)的 URI。

有关 Shyft 支持的参数的扩展列表,请查阅我们提供的详细文档,该文档可在此处获得此处。本文档将指导你完成使用 Shyft 平台铸造压缩 NFT 的整个过程。

const YOUR_WALLET_ADDRESS = 'CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS';
const network = 'devnet' // 也可以是 testnet 或 mainnet-beta

async function mintCompressedNFT() {
  const response = await axios.post("https://api.shyft.to/sol/v1/nft/compressed/mint", /* Shyft 铸造压缩 NFT API 端点 */  {
    network,
    creator_wallet: YOUR_WALLET_ADDRESS,
    metadata_uri: "https://gateway.pinata.cloud/ipfs/QmYmUb5MHZwYovnQg9qANTJUi7R8VaE5CetfssczaSWn5K",
    merkle_tree: "5BV5a4Px8Ghtxmdw2we2SYn7r3t6EUPwCH7hL6bw6wN3",
  }, {
    headers: {
      "x-api-key": process.env.SHYFT_API_KEY // 替换为你自己的密钥. 从 shyft.to 获取免费的一个
    }
  });

  console.dir(response.data, { depth: null })
}

mintCompressedNFT();

结果

{
  "success": true,
  "message": "NFT 铸造交易已成功生成",
  "result": {
    "encoded_transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAQHpqXUsC9pW1n1oovnibJemqM1TnccEBLZgTLdKW9VlMs+Hk35ft2JDnawEhYEq1ZL/Ocep98zbAyHL60BiPUQhNebYAVzZByeQSgTPPm4S+bVMft+hgrVUL+FQscCDeafAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYi4DreTUoabIkdF9Z3b+KJljKE9xogSEmNRyuB8GlpQkqE+6VxBy6CKZ/WsZ+jffh2hFiXh1kE3+PTyODA38UC7wPwLtHyi90xBEulKsTz6PGNOXcF+rLA80aI81+eHwVO0xxQnKazXvT1FSHZ2UVHJp+5nNVniVdtN9wli7OAQEECQIAAAEAAAYFA48BkWLAdriTdmgOAAAATWFkIExhZHMgIzk5NjQDAAAATUFEOQAAAGh0dHBzOi8vbWFkbGFkcy5zMy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9qc29uLzk5NjQuanNvbvQBAAEBAAEAAAAAAQAAABU7mQjzfDvicKRwHJ/PJDL9WraVCB9vMEw3M+t9B0dpAGQ=",
    "mint": "GSmMYNTohnQEtq26i76DqLK9rEL2gcG8FBjRi7p6tGcr",
    "signers": [\
      "CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS"\
    ]
  }
}

交易签名

成功执行后,响应将包括一个 encoded_transaction ,该交易需要 creator_wallet 以及,如果指定的, fee_payer 的签名。获得这些签名并完成交易后,将创建一个新的压缩 NFT。

响应还包括 mint 字段,该字段表示已创建的压缩 NFT 的地址。

查看钱包中的所有压缩 NFT

要显示你钱包中的所有 压缩 NFTShyft 提供了一个 API,允许你检索这些 NFT 的链上和链下数据。

const YOUR_WALLET_ADDRESS = 'CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS';
const network = 'devnet' // 也可以是 testnet 或 mainnet-beta

async function fetchCNFTsByOwnerAddress() {
  const response = await axios.get(`https://api.shyft.to/sol/v1/nft/compressed/read_all?network=${network}&wallet_address=${YOUR_WALLET_ADDRESS}`, /* Shyft 通过所有者地址 API 端点读取所有压缩 NFT */{
    headers: {
      "x-api-key": process.env.SHYFT_API_KEY // 替换为你自己的密钥. 从 shyft.to 获取免费的一个
    }
  });
  console.dir(response.data, { depth: null })
}

fetchCNFTsByOwnerAddress();

结果

{
  "success": true,
  "message": "钱包中存在的所有压缩 NFT:CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS",
  "result": {
    "nfts": [\
      {\
        "name": "Mad Lads #9964",\
        "symbol": "MAD",\
        "royalty": 5,\
        "image_uri": "https://madlads.s3.us-west-2.amazonaws.com/images/9964.png",\
        "cached_image_uri": "https://madlads.s3.us-west-2.amazonaws.com/images/9964.png",\
        "animation_url": "",\
        "cached_animation_url": "",\
        "metadata_uri": "https://madlads.s3.us-west-2.amazonaws.com/json/9964.json",\
        "description": "Fock it.",\
        "mint": "GSmMYNTohnQEtq26i76DqLK9rEL2gcG8FBjRi7p6tGcr",\
        "owner": "CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS",\
        "update_authority": "FWe52u7crZ3UVQsBf18k8VMZmRoZ85zWduzagVJBQPUJ",\
        "creators": [\
          {\
            "address": "2RtGg6fsFiiF1EQzHqbd66AhW7R5bWeQGpTbv2UMkCdW",\
            "share": 100,\
            "verified": false\
          }\
        ],\
        "collection": {},\
        "attributes": {\
          "Gender": "Male",\
          "Type": "Dark",\
          "Expression": "Joy",\
          "Hat": "Homburg",\
          "Eyes": "Closed",\
          "Clothing": "Metal",\
          "Background": "Red"\
        },\
        "attributes_array": [\
          {\
            "trait_type": "Gender",\
            "value": "Male"\
          },\
          {\
            "trait_type": "Type",\
            "value": "Dark"\
          },\
          {\
            "trait_type": "Expression",\
            "value": "Joy"\
          },\
          {\
            "trait_type": "Hat",\
            "value": "Homburg"\
          },\
          {\
            "trait_type": "Eyes",\
            "value": "Closed"\
          },\
          {\
            "trait_type": "Clothing",\
            "value": "Metal"\
          },\
          {\
            "trait_type": "Background",\
            "value": "Red"\
          }\
        ],\
        "files": [\
          {\
            "id": "portrait",\
            "uri": "https://madlads.s3.us-west-2.amazonaws.com/images/9964.png",\
            "type": "image/png"\
          },\
          {\
            "id": "rug",\
            "uri": "https://arweave.net/qJ5B6fx5hEt4P7XbicbJQRyTcbyLaV-OQNA1KjzdqOQ/9964.png",\
            "type": "image/png"\
          }\
        ],\
        "external_url": "https://madlads.com",\
        "primary_sale_happened": false,\
        "is_mutable": true,\
        "token_standard": "NonFungible",\
        "is_loaded_metadata": true\
      },\
      {\
        "name": "LILY #9998",\
        "symbol": "LILY",\
        "royalty": 5,\
        "image_uri": "https://bafybeidtb66eyfb6x4xacobyogrlefguwt2c6dljri4iwjfkjoy757abmm.ipfs.nftstorage.link/1262.png?ext=png",\
        "cached_image_uri": "https://bafybeidtb66eyfb6x4xacobyogrlefguwt2c6dljri4iwjfkjoy757abmm.ipfs.nftstorage.link/1262.png?ext=png",\
        //.....为了便于阅读,此处缩短了响应\
        "token_standard": "NonFungible",\
        "is_loaded_metadata": true\
      },\
    ]
  }
}

使用提供的 API 发出请求后,响应将包含一个全面的 NFT 列表。此列表包括有关与你的钱包关联的每个压缩 NFT 的所有相关信息

转移压缩 NFT

如果你希望将你的压缩 NFT 转移给朋友,Shyft 提供了一个 API 来促进此过程。下面是一个示例代码片段,演示了如何执行 NFT 转移:

const YOUR_WALLET_ADDRESS = 'CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS';
const network = 'devnet' // 也可以是 testnet 或 mainnet-beta

async function transferCNFT() {
  const response = await axios.post("https://api.shyft.to/sol/v1/nft/compressed/transfer", /* Shyft 转移压缩 NFT API 端点 */  {
    network,
    nft_address: "GSmMYNTohnQEtq26i76DqLK9rEL2gcG8FBjRi7p6tGcr",
    sender: YOUR_WALLET_ADDRESS,
    receiver: "5AHKzmDcjeAAnafTivi5u7dWYw3jUQh2VBRDzSd9ztVr", // 你朋友的钱包地址
  }, {
    headers: {
      "x-api-key": process.env.SHYFT_API_KEY // 替换为你自己的密钥. 从 shyft.to 获取免费的一个
    }
  });
  console.dir(response.data, { depth: null })
}

transferCNFT();

结果

{
  "success": true,
  "message": "NFT 转移交易已成功生成",
  "result": {
    "encoded_transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAgKpqXUsC9pW1n1oovnibJemqM1TnccEBLZgTLdKW9VlMs+Hk35ft2JDnawEhYEq1ZL/Ocep98zbAyHL60BiPUQhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPc9vwugugbLY8UDHpZOkvm6CjdiuUqduXkJ/E99OEV2Yi4DreTUoabIkdF9Z3b+KJljKE9xogSEmNRyuB8Glpa0yKLZ299PNQoSlRD8X8ZYrNuSRswpAskBYSeWXul+1CSoT7pXEHLoIpn9axn6N9+HaEWJeHWQTf49PI4MDfxS0wRlRlXxvj2QsSvYc1rJGQP7G3H/GB+6CBqmekkENMNebYAVzZByeQSgTPPm4S+bVMft+hgrVUL+FQscCDeafC7wPwLtHyi90xBEulKsTz6PGNOXcF+rLA80aI81+eHxqMAH+AcPHJ1fsUKchSB6B8SWKuQ9SvFH1LCgJXdMzRAEECwgAAAMBCQYCAgUHdKM0yOeMA0W6KqIR6o20iSgwIl/wglnfmVa/oimJWgDax+fd354FvgmQMaaqhYGRUegcoVx07SaRz/wM21RFsxsq95lCWP1kcZG5+QjBgTUQplrTg9bJr8/xsPTkOOklRgIoPn8S/n2QAAAAAAAAAAAAAAAA",
    "signers": [\
      "CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS"\
    ]
  }
}

交易签名

成功使用提供的 API 执行 NFT 转移请求后,响应将包括一个 encoded_transaction。此交易将需要来自 NFT 的 sender 的签名。获得 sender 的签名并完成交易后,压缩的 NFT 将成功转移到 receiver 地址,使其现在归接收者所有。

销毁压缩 NFT

如果你的钱包中有很多不需要的或“垃圾”NFT,并且想要删除它们,Shyft 也为此提供了一个解决方案。通过利用 Shyft 的 销毁压缩 NFT API,你可以轻松地从你的钱包中发起删除或删除这些不需要的 NFT。下面是一个示例代码片段,演示了如何执行删除过程:

async function burnCNFT() {
  const response = await axios.delete("https://api.shyft.to/sol/v1/nft/compressed/burn", /* Shyft 销毁压缩 NFT API 端点 */ {
    headers: {
      "x-api-key": process.env.SHYFT_API_KEY // 替换为你自己的密钥. 从 shyft.to 获取免费的一个
    },
    data: {
      network,
      nft_address: "8ZRtGiBcjPEuT5uQV4cBJyGQQvVqfRK1TSEd93KQTXZf",
      wallet_address: YOUR_WALLET_ADDRESS,
    }
  });

  console.dir(response.data, { depth: null })
}

burnCNFT();

结果

{
  "success": true,
  "message": "NFT 销毁交易已成功生成",
  "result": {
    "encoded_transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAkLpqXUsC9pW1n1oovnibJemqM1TnccEBLZgTLdKW9VlMs3ovZrQ+pUsCTrehDgYeVetu0OQSvpRdocX/bwKdmFrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAId25o1aBXD+sECa23sXfMSSvuttIXJulo+M5igS3uoWHfjMTOJP7QK3vIQXfedcwKSAUSYhoY7bZGxVd8VQVKI/1Au7nP4G1VTBPOK+nijN3YJ7dCgJKuUwCbFbb/MVzmIuA63k1KGmyJHRfWd2/iiZYyhPcaIEhJjUcrgfBpaWtMii2dvfTzUKEpUQ/F/GWKzbkkbMKQLJAWEnll7pftQkqE+6VxBy6CKZ/WsZ+jffh2hFiXh1kE3+PTyODA38UtMEZUZV8b49kLEr2HNayRkD+xtx/xgfuggapnpJBDTALvA/Au0fKL3TEES6UqxPPo8Y05dwX6ssDzRojzX54fC7oOj8qHftMPzWR7+DHDNxh0tPfuErOm2kq5AjVoM8/AQYLBAAAAQoIAgUHCQN0dG4dOGvbKl3myuchmv6d1tlioNuiLyPTAlXPfzNTLf51zUQG1V0270lLcmYMp/F9+D/Oja7lxmai0SstNaIIJcsfH8nCvBCDDuB/nrFkPQY9YyfkGkPiC1QlQQyiFKwhv1DhfWJxCaoAAAAAAAAAAAAAAAA=",
    "signers": [\
      "CDXLgstdVZJ7qUh3DC1mAGuCmTM3UiS1M24m44t3UViS"\
    ]
  }
}

交易签名

成功使用提供的 API 执行 NFT 销毁请求后,响应将包含一个 encoded_transaction。此交易将需要来自 wallet_address 的签名。在获得来自 wallet_address 的签名并完成交易后,压缩的 NFT 将被成功销毁,从而有效地从你的钱包中删除它。

结论

到目前为止,我们已经完成了整个过程,从创建 Merkle 树、铸造新的 压缩 NFT、查看与钱包关联的所有 NFT、转移 NFT 到销毁不需要的 NFT。通过利用 Shyft 的综合 API 套件,用户能够无缝地管理和与其压缩的 NFT 进行交互。

一个由 SHYFT API 驱动的用于创建、转移和销毁 CNFT 的完整工具

如果你喜欢阅读本文中有关压缩 NFT 的信息,我们邀请你探索我们更多的内容。发现我们关于诸如在 Solana 上创建实时 Web3 活动 feed在 Solana 上获取人类可读的交易等主题的其他文章。我们希望这些资源将丰富你使用 Shyft 构建的经验。

此外,Shyft 提供了一个全面的 JS SDK,使你能够无缝地与 Solana 区块链进行交互。 此 SDK 提供了广泛的功能,包括 NFT、同质化Token、钱包、回调和交易。你可以在此处找到有关 JS SDK 的更多详细信息,并释放你基于 Solana 的项目的全部潜力。祝你构建愉快!

资源

  • 原文链接: blogs.shyft.to/working-w...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Shyft_to
Shyft_to
在 Solana上更快更智能地构建,使用Shyft的SuperIndexer、gRPC、RPC、API和SDK