在 Solana 上使用 web3.js 将多条指令打包为一笔交易
·
在 Solana 的 JavaScript 客户端库(@solana/web3.js)中,我们通常需要将多条指令(TransactionInstruction)打包到一笔交易中统一提交。无论是传统的 Transaction,还是支持新版本特性和扩展性的 VersionedTransaction,都可以轻松实现这一点。本文将以示例方式演示如何将多条指令进行合并,从而在一次提交中完成更为复杂的链上操作。
1、使用传统 Transaction 构建多指令交易
使用传统 Transaction将Swap操作的多条指令合并到同一笔交易中,并添加一条 SOL 转账指令。
// 构建转账指令
const transferInstruction = SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: new PublicKey("钱包地址"),
lamports: 0.1 * LAMPORTS_PER_SOL, // 转账0.1 sol
});
// 指令 TransactionInstruction
const instructions = [
// create token account
// raydium v4 swap
// colose token account
// ...
]
const recentBlockhashForSwap = await connection.getLatestBlockhash()
const legacyTransaction = new Transaction({
blockhash: recentBlockhashForSwap.blockhash,
lastValidBlockHeight: recentBlockhashForSwap.lastValidBlockHeight,
feePayer: payer.publicKey,
})
legacyTransaction.add(...instructions).add(transferInstruction)
return legacyTransaction
2、使用 VersionedTransaction 构建多指令交易
使用传统 VersionedTransaction将Swap操作的多条指令合并到同一笔交易中,并添加一条 SOL 转账指令。
// 构建转账指令
const transferInstruction = SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: new PublicKey("钱包地址"),
lamports: 0.1 * LAMPORTS_PER_SOL, // 转账0.1 sol
});
// 指令 TransactionInstruction
const instructions = [
// create token account
// raydium v4 swap
// colose token account
// ...
]
const recentBlockhashForSwap = await connection.getLatestBlockhash()
const versionedTransaction = new VersionedTransaction(
new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: recentBlockhashForSwap.blockhash,
instructions: [...instruction,transferInstruction],
}).compileToV0Message()
)
versionedTransaction.sign([payer])
return versionedTransaction;
Solana 中使用 Transaction 和 VersionedTransaction 将多条指令一次性打包进同一笔交易。通过这种方式,我们能够在单笔交易中完成更复杂的链上操作,从而提高整体执行效率和用户体验。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)