You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Candy Machine ID获取Solana主网Metaplex Candy Machine配置数据?

嘿,我刚好对这个场景很熟悉,给你梳理下通过Candy Machine ID获取Solana主网Metaplex Candy Machine配置数据的最优方案——核心就是利用Solana RPC接口+Metaplex的链上数据结构来实现,以下是具体的思路和代码示例:

1. 先搞懂数据存储逻辑

Metaplex的Candy Machine配置数据(包括你要的铸币价格、供应量等)其实都存在Solana链上的配置账户里,你拿到的Candy Machine ID就是这个配置账户的地址。Metaplex的Candy Machine程序(主网地址是cndy3Z4yapfJBmL3ShUp5exZKqR3z33thTzeNMm2gRZ)负责管理这些账户,所以我们只需要通过RPC调用获取该账户的数据,再解码就能拿到想要的字段。

2. 直接用Solana Web3库实现(原生方案)

如果你想自己控制整个流程,可以用@solana/web3.js配合Borsh解码来实现,步骤如下:

首先安装依赖:

npm install @solana/web3.js borsh

然后编写查询代码:

import { Connection, PublicKey } from "@solana/web3.js";
import { deserializeUnchecked, struct, u64, i64, bool } from "borsh";

// 连接Solana主网RPC节点,生产环境建议用付费节点(比如QuickNode)避免请求限制
const connection = new Connection("https://api.mainnet-beta.solana.com");

// 替换成你要查询的Candy Machine ID
const candyMachineId = new PublicKey("YOUR_CANDY_MACHINE_ADDRESS");

// 定义Candy Machine配置数据的Borsh结构(对应Metaplex V2版本的结构体,V3版本可按需调整字段)
const CandyMachineStruct = struct([
  ["authority", PublicKey],
  ["wallet", PublicKey],
  ["tokenMint", PublicKey],
  ["itemsRedeemed", u64],
  ["itemsAvailable", u64],
  ["goLiveDate", i64],
  ["price", u64],
  ["isMutable", bool],
]);

async function fetchCandyMachineConfig() {
  // 获取账户信息
  const accountInfo = await connection.getAccountInfo(candyMachineId);
  if (!accountInfo) throw new Error("找不到对应的Candy Machine账户");

  // 解码Borsh格式的数据
  const dataBuffer = Buffer.from(accountInfo.data);
  const decodedData = deserializeUnchecked(CandyMachineStruct, dataBuffer);

  // 转换为易读的格式返回
  return {
    mintPrice: decodedData.price.toNumber() / 1e9, // Solana单位是Lamports,转成SOL
    totalSupply: decodedData.itemsAvailable.toNumber(),
    availableItems: decodedData.itemsAvailable.toNumber() - decodedData.itemsRedeemed.toNumber(),
    goLiveDate: new Date(decodedData.goLiveDate.toNumber() * 1000), // 转成JS日期对象
  };
}

// 调用测试
fetchCandyMachineConfig()
  .then(result => console.log("配置数据:", result))
  .catch(err => console.error("查询失败:", err));
3. 用Metaplex官方库简化开发(推荐)

如果你不想自己处理Borsh解码和版本兼容问题,可以用Metaplex官方的@metaplex-foundation/js库,它封装了Candy Machine的查询方法,代码更简洁:

安装依赖:

npm install @metaplex-foundation/js @solana/web3.js

查询代码:

import { Metaplex, keypairIdentity } from "@metaplex-foundation/js";
import { Connection, Keypair } from "@solana/web3.js";

const connection = new Connection("https://api.mainnet-beta.solana.com");
// 创建Metaplex实例,用临时Keypair即可(查询不需要签名)
const metaplex = Metaplex.make(connection).use(keypairIdentity(Keypair.generate()));

async function fetchCandyMachine() {
  const candyMachine = await metaplex.candyMachines().findByAddress({
    address: candyMachineId,
  });

  return {
    mintPrice: candyMachine.price.basisPoints.toNumber() / 1e9,
    totalSupply: candyMachine.itemsAvailable.toNumber(),
    availableItems: candyMachine.itemsAvailable.toNumber() - candyMachine.itemsRedeemed.toNumber(),
    goLiveDate: candyMachine.goLiveDate.toDate(),
  };
}
4. 注意事项
  • RPC节点选择:公共节点有请求频率限制,生产环境建议使用付费RPC节点保证稳定性。
  • 版本兼容:不同版本的Candy Machine(V2/V3)结构体字段略有差异,如果你查询的是V3版本,需要调整Borsh结构或依赖最新版的Metaplex库。
  • 数据压缩:部分新的Candy Machine会用zstd压缩数据,如果遇到解码失败,需要先解压数据(可以用zstd库处理)。

那些你之前看到的前端Web应用,就是用类似上面的逻辑:用户输入Candy Machine ID,前端调用RPC获取数据,解码后渲染到页面上,整个流程和上面的代码一致。

内容的提问来源于stack exchange,提问作者brad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:42:49