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";