Solana web3如何通过交易签名获取Token mint地址
通过Solana交易签名提取关联Token Mint地址实现方案
实现逻辑
SPL Token相关的所有链上操作,要么直接与Mint账户交互,要么通过Token账户中转,而所有Token账户的链上数据中必然存储其绑定的Mint地址,只要拉取到完整交易数据,遍历解析关联账户即可提取所有涉及的Token Mint地址。
基于官方JS/TS SDK的实现代码
需要提前安装依赖:@solana/web3.js、@solana/spl-token
import { Connection, clusterApiUrl, PublicKey } from '@solana/web3.js'; import { getAccount, TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; // 初始化Devnet节点连接 const connection = new Connection(clusterApiUrl('devnet'), 'confirmed'); // 目标交易签名 const targetTxSig = '4y2zCnN1ciucLE6z91J7cQXz4skhCpoBJqhcecfuri5zp2NMSYejopTvGq2sYS9Ud5AkRirFkLXocZKdNfzWudG3'; async function extractTxMints(signature: string): Promise<PublicKey[]> { // 拉取交易详情,兼容V0版本化交易 const txDetail = await connection.getTransaction(signature, { maxSupportedTransactionVersion: 0, commitment: 'confirmed' }); if (!txDetail) throw new Error('查询的交易不存在'); const mintSet = new Set<string>(); // 合并静态账户、地址查找表加载的动态账户,覆盖交易所有关联地址 const allRelatedAccounts = txDetail.transaction.message.getAccountKeys({ accountKeysFromLookups: txDetail.meta?.loadedAddresses }).keySegments().flat(); // 遍历所有关联账户,识别Token账户并提取对应Mint for (const account of allRelatedAccounts) { // 同时兼容传统SPL Token和Token 2022标准 for (const programId of [TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID]) { try { const tokenAccountInfo = await getAccount(connection, account, 'confirmed', programId); mintSet.add(tokenAccountInfo.mint.toBase58()); break; } catch (err) { // 非对应程序的Token账户直接跳过 continue; } } } return Array.from(mintSet).map(addr => new PublicKey(addr)); } // 调用测试 extractTxMints(targetTxSig).then(mintList => { console.log('交易涉及的Token Mint列表:', mintList.map(m => m.toBase58())); // 示例交易返回结果中包含目标地址:DzAP4MvZNzV6zUrAW9wKXzDrpgRmEPa1QHhrSBEB823W });
关键注意点
- 调用
getTransaction接口时必须传入maxSupportedTransactionVersion参数,否则V0版本交易将返回空值 - 必须合并地址查找表加载的动态账户,不能仅解析交易消息内的静态账户列表,否则会漏算部分交易涉及的Token
- 如果需要过滤出交易实际操作的Mint(而非仅关联的Mint),可以进一步解析每个指令的账户索引,只提取指令明确标记为可写的Token账户对应的Mint地址,过滤掉交易中仅作为签名方、手续费支付方关联的无关Token账户
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

