Solana 将代币元数据存储在从原始代币地址派生的地址(根据 https://docs.solana.com/developing/programming-model/calling- Between-programs#hash-based- generated-program-addresses)
参考代码是 Rust 的,这里是来自 的实现@solana/web3.js。
(来源)
static async findProgramAddress(
seeds: Array<Buffer | Uint8Array>,
programId: PublicKey,
): Promise<[PublicKey, number]> {
let nonce = 255;
let address;
while (nonce != 0) {
try {
const seedsWithNonce = seeds.concat(Buffer.from([nonce]));
address = await this.createProgramAddress(seedsWithNonce, programId);
} catch (err) {
if (err instanceof TypeError) {
throw err;
}
nonce--;
continue;
}
return [address, nonce];
}
throw new Error(`Unable to find a viable program address nonce`);
}
Run Code Online (Sandbox Code Playgroud)
请注意,元数据使用borsh 库以 base64 进行编码,按照https://docs.metaplex.com/nft-standard#token-metadata-program。
这是仅使用 borsh 和 @solana/web3.js 检索和解析元数据的简洁实现 https://gist.github.com/dvcrn/c099c9b5a095ffe4ddb6481c22cde5f4
最后,MagicDen 有一个返回元数据的端点: https://api-mainnet.magiceden.io/rpc/getNFTByMintAddress/DugthRKbQZRMcDQQfjnj2HeSjz2VARPC8H9abxdNK2SS