Blockhash не найден при отправке транзакции
При отправке транзакции с помощью Solana web3 иногда показывает эту ошибку:
Error: failed to send transaction: Transaction simulation failed: Blockhash not found
Каков правильный способ справиться с этой ошибкой, кроме повторной попытки x раз?
Есть ли способ гарантировать, что эта проблема не возникнет при отправке транзакций?
Вот пример того, как я отправляю транзакцию:
const web3 = require("@solana/web3.js")
const bs58 = require('bs58')
const publicKey = new web3.PublicKey(new Uint8Array(bs58.decode("BASE_58_PUBLIC_KEY").toJSON().data))
const secretKey = new Uint8Array(bs58.decode("BASE_58_SECRET_KEY").toJSON().data)
const connection = new web3.Connection(
"https://api.mainnet-beta.solana.com", "finalized",
{
commitment: "commitment",
confirmTransactionInitialTimeout: 30000
}
)
const transaction = new web3.Transaction().add(
web3.SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: publicKey,
lamports: 1
})
)
web3.sendAndConfirmTransaction(
connection,
transaction,
[{publicKey: publicKey, secretKey: secretKey}],
{commitment: "finalized"}
)
Как я могу улучшить это, чтобы избежать
Blockhash not found
ошибка?
4 ответа
Повторная попытка - это не плохо! В некоторых ситуациях это на самом деле предпочтительный способ обработки отброшенных транзакций.
Вы можете прочитать эту поваренную книгу о повторных попытках транзакций: https://solanacookbook.com/guides/retrying-transactions.html .
В частности, в нем объясняется, как реализовать некоторую логику повторных попыток: https://solanacookbook.com/guides/retrying-transactions.html#customizing-rebroadcast-logic
И что конкретно означает повторная попытка: https://solanacookbook.com/guides/retrying-transactions.html#when-to-re-sign-transactions
Вы можете использоватьmaxRetries
вариант: Для web3/Solana нативный:
web3.sendAndConfirmTransaction(
connection,
transaction,
{
maxRetries: 5
}
)
Или для токенов SPL:
const signature = await transfer(
connection,
sender,
senderTokenAccount.address,
recipientTokenAccount.address,
sender.publicKey,
amount,
[],
{
maxRetries: 6,
}
);
Отсюда _
RecentBlockhash — важное значение для транзакции. Ваша транзакция будет отклонена, если вы используете просроченный недавний блокхеш (после 150 блоков)
solana имеет время блока 400 мс. это значит
150 * 400ms = 60 seconds
Вот почему вам нужно очень быстро запрашивать и отправлять транзакцию. в противном случае ваша транзакция будет удалена навсегда, и вы получите эту ошибку. правильный ответ на ошибку должен был быть "Срок действия Blockhash истек"
В основе Strata есть упаковка для соланы и ее производственный класс.
Я использовал его в производственных приложениях.
const signature = await sendAndConfirmWithRetry(
connection,
tx.serialize(),
{
maxRetries: 5,
skipPreflight: true
},
"processed");