Индивидуальная конфетная машина: 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";