Как найти сбойную инструкцию при симуляции транзакции Solana
При подготовке обмена возникла ошибка программы с числовым кодом. Симуляция сериализованной транзакции помогает найти инструкцию верхнего уровня и вызванную программу, которая вернула ошибку.
Воспроизведите исполнение инструкций
Замените BASE64_TRANSACTION полной сериализованной транзакцией в base64, включая массив подписей. Отправьте тело методом POST на RPC того же кластера. При такой конфигурации узел подставит свежий blockhash и выполнит симуляцию без проверки подписей.
{"jsonrpc":"2.0","id":1,"method":"simulateTransaction","params":["BASE64_TRANSACTION",{"encoding":"base64","commitment":"confirmed","replaceRecentBlockhash":true,"sigVerify":false}]}
Для проверки подписей используйте исходную подписанную транзакцию с действующим blockhash, включите sigVerify и отключите замену хеша. Любое изменение подписанного сообщения меняет данные, по которым проверяют подписи.
Найдите инструкцию и проследите вложенные вызовы
Пример поля value.err — {"InstructionError":[2,{"Custom":6001}]}. Индекс 2 указывает на третью инструкцию верхнего уровня в сообщении. При подсчёте учитывайте и инструкции Compute Budget. В value.logs проследите вложенные вызовы вокруг первого сбоя. Расшифруйте 6001 по таблице ошибок той программы, которая его вернула. У разных программ одинаковый код может означать разные ошибки.
Сохраните данные для повторной проверки
Сохраните context.slot, err, logs и unitsConsumed вместе со списком инструкций. При изменении аккаунтов или параметров сравните оба результата с учётом записанных слотов. Успешная симуляция описывает исполнение в выбранном состоянии. До фактической отправки параметры аккаунтов и доступная ликвидность могут измениться.