Уровень обязательств
Я написал базовый клиент rpc, который опрашивает состояние учетной записи Solana для поиска определенного условия (т. е. записываемого в нее уникального идентификатора int64). Когда возникает условие, я вызываю смарт-контракт, который принимает ту же учетную запись, что и изменяемый аргумент.
Прежде чем что-либо делать, программа проверяет это же условие. Однако эта проверка не проходит. Я понимаю, что мы имеем дело с распределенной системой, и это состояние может быть непоследовательным в течение определенного периода времени, но я могу повторно вызывать более 30 секунд, и каждый раз это терпит неудачу, прежде чем в конечном итоге добиться успеха.
Я читал о концепции уровней обязательств, но всегда предполагал, что состояние учетной записи, переданное в смарт-контракт, будет последним состоянием мира (т.е. обработано)? То, что я, кажется, наблюдаю, это больше похоже на завершенное состояние.
Может ли кто-нибудь пролить свет на то, что здесь может происходить?
Я попытаюсь придумать минимальный пример кода, чтобы продемонстрировать проблему, но я просто хотел сначала задать вопрос, чтобы посмотреть, может ли кто-нибудь указать мне правильное направление.
Спасибо
2 ответа
Итак, если вы посмотрите на документы, которые вы связали, есть примечание:
the block may still be skipped by the cluster
Это очень важное примечание, если вы ищете только изменения состояния учетной записи и не хотите, чтобы некоторые из них могли быть ложными. Существует ряд причин, по которым слот может быть пропущен или транзакция может быть отклонена кластером.
Если произойдет что-либо из вышеперечисленного, то состояние аккаунта, которое принимается кластером в целом, может не отражаться в
processed
, но
finalized
.
В конце концов, моя конкретная проблема сводилась к предполетным проверкам с использованием «завершенного» уровня обязательства, когда моя логика для опроса учетной записи использовала «подтвержденный». Изменение
preflightCommitment
аргумент на
sendTransaction
исправил проблему для меня.