"invalid account discriminator"在Anchor中是什么意思?

What does "invalid account discriminator" mean in Anchor?

我正在尝试从 public 密钥中获取帐户:

await program.account.myAccountType.fetch(somePubkey);

但是 Anchor 抛出一个错误说:

Invalid account discriminator

什么是账户鉴别器?

帐户鉴别符是 Anchor 放在帐户前面的几个字节,例如 header。它让锚点知道应该将数据反序列化为哪种类型的帐户。

如果您尝试以 myAccountType 形式获取某些内容,则会发生此错误,但它实际上是某个其他帐户的公钥,例如令牌帐户或您程序中的其他帐户。

您可以尝试以下操作:

  • 控制台记录 somePubkey 并将其放入 the explorer
  • 额外确认您的意思是 program.account.myAccountType 而不是 program.account.someOtherAccountType

就我而言,这个问题发生在我 anchor idl init [OPTIONS] --filepath <FILEPATH> <PROGRAM_ID>.

之后

一旦我 运行 这个命令,前端开始抛出 Error: Invalid account discriminator 每次我尝试 运行 await connection.getProgramAccounts().

我想做 anchor idl init 因为我想使用 Program.fetchIdl() 获取 idl 而不是将 idl 作为 json 对象传递,这需要我复制它从 target/idl/<program-name>.json 进入我的 React 前端,然后将 json 导入我的项目...

为了解决这个问题,我不得不通过 运行 宁 anchor build 然后 anchor deploy 重建和重新部署锚程序。完成此操作后,我必须将 idl 作为 json 对象传递给 Program.getProgramAccounts() 函数。