gpt4 book ai didi

web3js - 发送多个依赖事务的最佳实践[solana] [web3js]

转载 作者:行者123 更新时间:2023-12-05 08:35:53 24 4
gpt4 key购买 nike

在 Solana 中发送多个依赖事务的最佳实践是什么?假设我要发送 2 笔交易,每笔交易都是相关的。

如果第二个交易失败,那么我必须要求用户发送第一笔和第二笔交易。但实际上我可以实现,当第二个 trx 失败时,它只会要求用户重试第二个。

有人能为我指出正确的方向吗?

谢谢

最佳答案

有两种方法可以做到这一点。

  1. 将指令打包到单笔交易中

如果您不受事务限制(最多 1232 字节,最多 ~30 条指令,最多 ~18 个公钥,最多 1.4m 计算)的约束,您可以将指令打包到单个事务中,并且任何失败都会使事务失败整个。

例子:

const Transaction = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: publicKey,
newAccountPubkey: mintKeypair.publicKey,
space: MINT_SIZE,
lamports: lamports,
programId: TOKEN_PROGRAM_ID,
}),
createInitializeMintInstruction(
mintKeypair.publicKey,
form.decimals,
publicKey,
publicKey,
TOKEN_PROGRAM_ID)
);

如上,createInitializeMintInstruction首先依赖于createAccount。将两者打包在一个交易中,如果其中一条指令失败,则整个交易失败。

  1. 在 UI 上管理事务重试

由于限制,您可以将每笔交易分开,但最终相互依赖。

const transaction1 = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: publicKey,
newAccountPubkey: mintKeypair.publicKey,
space: MINT_SIZE,
lamports: lamports,
programId: TOKEN_PROGRAM_ID,
})
);
const transaction2 = new Transaction().add(
createInitializeMintInstruction(
mintKeypair.publicKey,
form.decimals,
publicKey,
publicKey,
TOKEN_PROGRAM_ID)
);

const signature1 = await connection.sendTransaction(transaction1, [mintKeypair, payerKeypair])
const signature2 = await connection.sendTransaction(transaction2, [mintKeyPair, payerKeypair])

使用上面的方法,您可以将 connection.confirmTransaction 与签名一起使用,以验证哪些签名实际得到确认,哪些失败。这将允许您根据网络上确认的交易随意切换 UI。

关于web3js - 发送多个依赖事务的最佳实践[solana] [web3js],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71451583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com