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

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

Мне удалось успешно развернуть программу для соланы и привязки, развернуть idl для привязки (выполнив эти шаги ) и загрузить файлы в папку с ресурсами с помощью 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'
}

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

3 ответа

Если вы попытаетесь использовать другой тип параметров с вашим обработчиком и макросом инструкции, вы получите эту ошибку. т.е. ты использовалu8в параметре обработчика у вас естьusizeвнутри#[instruction()]макрос:

      pub fn some_ix(ctx: Context<SomeIx>, index: u8) -> Result<()> {
  // ...
}

// then

#[derive(Accounts)]
#[instruction(index: usize)] // <- this is what causing the issue
pub struct SomeIx {
  // ...
}

Не уверен насчет метаплекса, но когда я несколько раз сталкивался с этой же ошибкой при использовании привязки и 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],
        });

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

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

      myVariable : "Hello";

Вместо,

      myVariable = "Hello";
Другие вопросы по тегам