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");
Другие вопросы по тегам