创建签名时收到错误消息
Error:
TransactionExpiredBlockheightExceededError: Signature 2XqzFuyv5YWpDPTT87CVu48QJPemGSu5rbCazrNBgY6D3mS8rugKugtzXDGpN6XZF8FPyWwXQvzfm4ZyMx6gTf6j has expired: block height exceeded.
签名创建如下:
const transaction = program.methods(...)
transaction.feePayer = publicKey;
transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
const latestBlockHash = await connection.getLatestBlockhash()
// ----> Phantom recommended way of signing tx
const { signature } = await provider.signAndSendTransaction(transaction);
const confirmation = await connection.confirmTransaction(
{
blockhash: latestBlockHash.blockhash,
lastValidBlockHeight: latestBlockHash.lastValidBlockHeight,
signature,
}
);
几秒钟/分钟或2秒钟后,我收到了上述错误消息,尽管TX已确认并最终确定。
如何处理?如果tx被添加到块中,为什么会弹出错误?
事务失败是一个棘手的情况,而web3.js目前在明确发生了什么方面做得不好。
这个错误特别意味着事务是使用(通常(不会包含在任何新块中的块哈希进行签名的。如果您认为区块哈希太旧,则需要获取一个新的区块哈希,重新签署交易,然后再次发送。
但是,在此之前,您可以尝试重新发送您以前的交易。可能是它被发送给了一个不包括它的领导者,然后由于某种原因没有转发给另一个领导者。
如果它最终着陆,那就意味着超时时间不够长。这很令人沮丧,因为你不可能判断出自己处于哪种情况
因此:
- 继续检查您的交易是否包括在内
- 超时后重新发送交易
- 如果blockhash过期,请获取一个新的,辞职,然后再次发送
一定要通读索拉纳烹饪书中关于这一点的整篇文章:https://solanacookbook.com/guides/retrying-transactions.html#facts