Как найти сбойную инструкцию при симуляции транзакции 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 вместе со списком инструкций. При изменении аккаунтов или параметров сравните оба результата с учётом записанных слотов. Успешная симуляция описывает исполнение в выбранном состоянии. До фактической отправки параметры аккаунтов и доступная ликвидность могут измениться.

Документация Solana