如何通过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
相关产品推荐
相关产品推荐

