Что означает «неверный дискриминатор аккаунта» в Anchor?
Я пытаюсь получить учетную запись из открытого ключа:
await program.account.myAccountType.fetch(somePubkey);
Но затем Anchor выдает ошибку:
Invalid account discriminator
Что такое дискриминатор аккаунта?
4 ответа
Дискриминатор учетной записи — это несколько байтов, которые Anchor помещает в начало учетной записи, например заголовок. Это позволяет якорю знать, какой тип учетной записи он должен использовать для десериализации данных.
Эта ошибка возникает, если вы пытаетесь получить что-то как
myAccountType
, но на самом деле это открытый ключ для какой-либо другой учетной записи, например учетной записи токена или другой учетной записи в вашей программе.
Вот некоторые вещи, которые вы можете попробовать:
- консольное ведение журнала
somePubkey
и закинуть в проводник - делая дополнительную двойную уверенность, что вы имели в виду
program.account.myAccountType
и неprogram.account.someOtherAccountType
.
В моем случае эта проблема возникла после того, как я сделал
anchor idl init [OPTIONS] --filepath <FILEPATH> <PROGRAM_ID>
.
Как только я запустил эту команду, интерфейс начал бросать
Error: Invalid account discriminator
каждый раз, когда я пытался бежать
await connection.getProgramAccounts()
.
я хотел сделать
anchor idl init
потому что я хотел получить IDL, используя
Program.fetchIdl()
вместо того, чтобы передавать как объект json, который требует, чтобы я скопировал его из
target/idl/<program-name>.json
в мой интерфейс React, а затем импортируйте json в мой проект...
Чтобы решить эту проблему, мне пришлось перестроить и повторно развернуть якорную программу, запустив
anchor build
а потом
anchor deploy
. Как только я сделал это, мне пришлось пройти
idl
как объект json в
Program.getProgramAccounts()
функция.
У меня была такая же ошибка, когда я разместил свои учетные записи в неправильном порядке. В результате дискриминатор не совпал с ожидаемым.
В моем случае я использую тип Non-camelcase для структуры учетной записи.
Предыдущий