Как узнать, когда истечёт срок действия blockhash транзакции Solana
Прошла минута после отправки платежа, а подтверждения всё ещё нет. Прежде чем запрашивать новую подпись, проверьте предельную высоту блока и судьбу исходной транзакции.
Сохраните предельную высоту при создании транзакции
Отправьте этот JSON на HTTP RPC нужного кластера. Подставьте value.blockhash в транзакцию и сохраните value.lastValidBlockHeight вместе с её подписью. При следующем запросе придёт новая пара значений со своим сроком действия.
{"jsonrpc":"2.0","id":1,"method":"getLatestBlockhash","params":[{"commitment":"confirmed"}]}
Сравните две высоты блоков
{"jsonrpc":"2.0","id":2,"method":"getBlockHeight","params":[{"commitment":"confirmed"}]}
Допустим, предельная высота равна 7000. При высоте 6999 транзакция ещё может попасть в блок. При 7000 остаётся последний допустимый блок. После 7000 включить транзакцию с этим хешем в новый блок данной цепочки уже нельзя. Номер слота из контекста ответа отсчитывается отдельно, поскольку в некоторых слотах блок не появляется.
Уточните результат исходного платежа
Проверьте исходную подпись через getSignatureStatuses. Транзакция, попавшая в блок до истечения срока, может достичь финальности позже. Если недавний кеш вернул null, запросите исторический статус у узла, который обслуживает нужный слот, и сверьте запись платежа перед повторной подписью. Такой порядок подходит для транзакций с недавним blockhash. Для durable nonce действуют отдельные правила.