Как составить список аккаунтов перед сменой формата программы Solana

Предположим, программа хранит записи длиной 96 байт с восьмибайтовой меткой типа. Отфильтрованный запрос помогает собрать кандидатов на миграцию без загрузки полных буферов.

Отберите размер и прочитайте префикс

Подставьте ключ программы, размер и диапазон из развёрнутой схемы. Фильтр применяется к полному аккаунту. Параметр среза задаёт байты для передачи клиенту, поэтому dataSize остаётся равным 96, хотя запрос возвращает всего восемь байт.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getProgramAccounts",
  "params": [
    "PROGRAM_PUBLIC_KEY",
    {
      "encoding": "base64",
      "commitment": "finalized",
      "withContext": true,
      "filters": [
        {
          "dataSize": 96
        }
      ],
      "dataSlice": {
        "offset": 0,
        "length": 8
      }
    }
  ]
}

Сверьте метки отобранных записей

Декодируйте каждый префикс из base64 и сравните все восемь байт с известной меткой. Если размер совпал у 900 аккаунтов, а метка только у 840, поставьте в очередь эти 840 и разберите отдельно остальные 60. Разные типы могут занимать одинаковое число байт.

Сохраните слот контекста вместе со списком. Перед последующей записью перечитайте актуальный формат каждого аккаунта, поскольку программа могла изменить его после инвентаризации.

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