Вызов программы привязки (solana) через классический javascript? ошибка пользовательской программы: 0x64

я развернул программу в devnet, когда я запускаю якорный тест, все работает нормально. Программе нужно 3 ключа, и просто верните ok() (внутри я все прокомментировал).

Я пытаюсь вызвать эту программу в своем одностраничном приложении (с фантомной подписью), но получаю следующую ошибку: Ошибка пользовательской программы: 0x64

Я думаю, что проблема довольно проста, но я не могу понять причину.

      const instructions: TransactionInstruction[] = [];  

const exchangeInstruction = new TransactionInstruction({

    programId: program_id,
    data: Buffer.alloc(0),
    keys: [

        { pubkey: publicKey1, isSigner: true, isWritable: true },

        { pubkey: publicKey2, isSigner: false, isWritable: true },

        { pubkey: system_program, isSigner: false, isWritable: false },

    ],
});

instructions.push(exchangeInstruction);

const transaction = new Transaction().add(...instructions);

transaction.feePayer = publicKey1;
transaction.recentBlockhash = (await connection.getRecentBlockhash()).blockhash;

var signedTransaction = await window.solana.signTransaction(transaction);

var signature = await connection.sendRawTransaction(signedTransaction.serialize());

Открытый ключ взят из нового PublicKey(...)

Program_id — это открытый ключ моей программы (PublicKey()).

В моей программе нет аргументов (я пытался удалить данные: {...}, но получил ту же ошибку).

Когда я вызываю программу с файлом .ts и тестом привязки, все работает нормально, вот код:

      const tx = await program.rpc.initialize(
{
  accounts: {
    publicKey1: xxxx.publicKey,
    publicKey2: yyyy.publicKey,
    
    systemProgram: anchor.web3.SystemProgram.programId,
  },

  signers: [xxxx]
});

Я должен что-то упустить где-то, но не могу понять, где, если кто-то может помочь, был бы очень признателен

1 ответ

Согласно документации Anchor, код ошибки 0x64, что соответствует 100 в десятичном виде, равно InstructionMissing, для номера вашей инструкции должен быть указан какой-нибудь 8-байтный идентификатор.

Чтобы исправить это, вам, вероятно, нужно объявить данные инструкции как:

      data: Buffer.alloc(8),

Ссылка на https://docs.rs/anchor-lang/latest/src/anchor_lang/error.rs.html#19

Другие вопросы по тегам