在 Solana 智能合约上调用特定端点

Calling specific endpoint on Solana smart contract

我正在尝试使用@solana-web3 调用 Solana 智能合约上的特定端点,但我不太清楚该怎么做。我看到它是这样完成的:

const buffer = Buffer.from("hello");
  const instruction = new web3.TransactionInstruction({
    keys: [{ pubkey: fromWallet.publicKey, isSigner: false, isWritable: true }],
    programId: new web3.PublicKey(metaDataProgramID),
    data: buffer,
  });
  const confirmation = await web3.sendAndConfirmTransaction(
    connection,
    new web3.Transaction().add(instruction),
    [fromWallet],
    {
      commitment: "singleGossip",
      preflightCommitment: "singleGossip",
    }
  );`

但我不确定如何处理像这样具有多个端点的智能合约。因为如何告诉智能合约使用哪个端点以及将哪些数据传递给该端点?:

pub fn process_instruction<'a>(
    program_id: &'a Pubkey,
    accounts: &'a [AccountInfo<'a>],
    input: &[u8],
) -> ProgramResult {
    let instruction = MetadataInstruction::try_from_slice(input)?;
    match instruction {
        MetadataInstruction::CreateMetadataAccount(args) => {
            msg!("Instruction: Create Metadata Accounts");
            process_create_metadata_accounts(
                program_id,
                accounts,
                args.data,
                false,
                args.is_mutable,
            )
        }
        MetadataInstruction::UpdateMetadataAccount(args) => {
            msg!("Instruction: Update Metadata Accounts");
            process_update_metadata_accounts(
                program_id,
                accounts,
                args.data,
                args.update_authority,
                args.primary_sale_happened,
            )
        }
        MetadataInstruction::DeprecatedCreateMasterEdition(args) => {
            msg!("Instruction: Deprecated Create Master Edition");
            process_deprecated_create_master_edition(program_id, accounts, args.max_supply)
        }
        MetadataInstruction::DeprecatedMintNewEditionFromMasterEditionViaPrintingToken => {
            msg!("Instruction: Deprecated Mint New Edition from Master Edition Via Token");
            process_deprecated_mint_new_edition_from_master_edition_via_printing_token(
                program_id, accounts,
            )
        }
        MetadataInstruction::UpdatePrimarySaleHappenedViaToken => {
            msg!("Instruction: Update primary sale via token");
            process_update_primary_sale_happened_via_token(program_id, accounts)
        }
        MetadataInstruction::MintNewEditionFromMasterEditionViaVaultProxy(args) => {
            msg!("Instruction: Mint New Edition from Master Edition Via Vault Proxy");
            process_mint_new_edition_from_master_edition_via_vault_proxy(
                program_id,
                accounts,
                args.edition,
            )
        }
        MetadataInstruction::PuffMetadata => {
            msg!("Instruction: Puff Metadata");
            process_puff_metadata_account(program_id, accounts)
        }
    }
}

这里是智能合约的完整代码:https://github.com/metaplex-foundation/metaplex/tree/master/rust/token-metadata/program

在 Solana 中调用智能合约的“端点”的选择取决于您作为指令的 data 传入的 buffer。鉴于该数据,程序决定调用哪个指令处理器。

在您的示例中,指令的选择可能基于指令的第一个字节,因此 0 可能对应于 MetadataInstruction::CreateMetadataAccount

最好的办法是使用程序开发人员提供的软件包。对于元数据程序,指令和类型定义位于:https://github.com/solana-labs/oyster/blob/e79c5a66ed5290d3fb752f4cd6b4e90f7974ec94/packages/common/src/actions/metadata.ts