求助:使用Jupiter API合并两笔Swap交易时遇「交易过大」错误
合并Jupiter API两笔Swap交易时触发「Transaction too large error」错误
操作流程:通过Jupiter API获取两笔Swap的报价,将报价转换为Swap指令后合并到同一交易中,代码示例如下:
// 合并两笔Swap指令到单交易 const combinedTx = new Transaction().add(...instruction1, ...instruction2); const { blockhash: blockhash1 } = await connection.getLatestBlockhash(); combinedTx.recentBlockhash = blockhash1; combinedTx.feePayer = wallet.publicKey; // 签名并发送交易 const signaturetx = await sendAndConfirmTransaction( connection, combinedTx, [wallet], { commitment: "confirmed", preflightCommitment: "processed" } );
解决办法
- 拆分交易分开发送:Solana普通交易有严格的字节数上限(当前为1232字节),两笔Swap指令叠加大概率超出限制。直接分两次执行交易即可,先发送第一笔Swap并确认,再发送第二笔,无需强行打包到单交易中。
- 改用版本化交易(Versioned Transactions):版本化交易支持更大的字节上限(最高10240字节),足够容纳多笔Swap指令。调整代码示例:
import { VersionedTransaction, TransactionMessage } from '@solana/web3.js'; // 合并两笔Swap的所有指令 const allInstructions = [...instruction1, ...instruction2]; // 编译为V0版本消息 const message = new TransactionMessage({ payerKey: wallet.publicKey, recentBlockhash: blockhash1, instructions: allInstructions, }).compileToV0Message(); // 创建版本化交易并签名 const combinedTx = new VersionedTransaction(message); combinedTx.sign([wallet]); // 发送并确认交易 const signature = await connection.sendTransaction(combinedTx, { commitment: "confirmed", preflightCommitment: "processed" }); await connection.confirmTransaction(signature);
- 优化Swap指令体积:调用Jupiter API获取报价时,选择路由更短的Swap路径以减少指令数量;同时检查是否存在重复的辅助指令(比如重复的SOL包装/解包操作),通过调整API参数(如
wrapUnwrapSol)复用相关操作,降低总字节数。
内容的提问来源于stack exchange,提问作者ivan
相关产品推荐
相关产品推荐

