Индивидуальная машина для приготовления конфет: Ошибка программы: 102: программе не удалось десериализовать данную инструкцию

rust #solana #metaplex #candy-machine

#Ржавчина #солана #метаплекс #candy-machine

Вопрос:

Я разветвил метаплексный код и пытаюсь реализовать машину для приготовления конфет с возможностями предварительной продажи. Вы можете увидеть этот запрос на извлечение для справки: https://github.com/FluffyPorcupine/metaplex/pull/1/files . Я изменил оба rust lib.rs и файлы candy-machine-cli.ts для реализации того, как я думаю, это может сработать.

Я смог успешно развернуть программу в solana и anchor, развернул idl для anchor (следуя этим шагам) и загрузил файлы в папку assets с помощью cli. Мой следующий шаг — попытаться создать машину для приготовления конфет. Это команда, которую я пытаюсь запустить:

 ts-node js/packages/cli/src/candy-machine-cli.ts create_candy_machine --env devnet --keypair .config/solana/devnet.json --presale-enabled true --presale-items-available 5
 

Когда я запускаю команду, я получаю следующую трассировку стека:

 ProgramError: 102: The program could not deserialize the given instruction
    at Function.parse (/home/my-user/dev/Solana/metaplex/js/packages/cli/node_modules/@project-serum/anchor/src/error.ts:41:14)   
    at Object.rpc [as initializeCandyMachine] (/home/my-user/dev/Solana/metaplex/js/packages/cli/node_modules/@project-serum/anchor/src/program/namespace/rpc.ts:23:42)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {  code: 102,
  msg: 'The program could not deserialize the given instruction'
}
 

Я очень новичок в отладке rust / anchor. Есть ли что-то в моем коде, очевидное для кого-то, почему я получаю эту ошибку на основе моих изменений в PR для файлов relavant? Или какие-либо советы о том, как я мог бы это отладить? Я также пытался запустить «тест привязки», но просто получаю ту же ошибку.

Ответ №1:

Не уверен насчет metaplex, но когда я несколько раз сталкивался с этой же ошибкой при использовании anchor и solana / web3, это было из-за несоответствия ключа ключа между idl файлом и кодом rpc интерфейса. Например: файл idl выглядел примерно так

 .....
"instructions": [
{
  "name": "initialize",
  "accounts": [
    {
      "name": "baseAccount",
      "isMut": true,
      "isSigner": true
    },
    {
      "name": "authority",
      "isMut": true,
      "isSigner": true
    },
    {
      "name": "systemProgram",
      "isMut": false,
      "isSigner": false
    }
  ],
  "args": []
},
{
..... and so on
 

И во интерфейсе, где я пытался получить доступ к программе

   const provider = await getProvider(wallet);

  const { SystemProgram, Keypair } = web3;
  /* create an account  */
  const baseAccount = Keypair.generate();

  const programID = new PublicKey(
    ".... The Public key here ....."
  );

const program = new Program(idl, programID, provider);
    
      try {
        /* interact with the program via rpc */
        await program.rpc.initialize({
          accounts: {
            mainAccount: baseAccount.publicKey,
            authority: provider.wallet.publicKey,
            systemProgram: SystemProgram.programId,
          },
          signers: [baseAccount],
        });
    ....and so on
 

Я использовал mainAccount во внешнем интерфейсе rpc вместо baseAccount , который был ключом в файле idl. Это должно было быть

 await program.rpc.initialize({
          accounts: {
            baseAccount: baseAccount.publicKey,
            authority: provider.wallet.publicKey,
            systemProgram: SystemProgram.programId,
          },
          signers: [baseAccount],
        });
 

Ответ №2:

Можете ли вы проверить переменные, содержащие значения, которые необходимо передать при вызове RPC.

Я получил ту же ошибку, когда ошибочно инициализировал переменную как

 myVariable : "Hello";
 

Вместо того , чтобы,

 myVariable = "Hello";