如何在 Solana 中解析原始交易

  • Shyft_to
  • 发布于 2023-08-10 23:54
  • 阅读 11

本文介绍了如何使用 Anchor 框架编写的 Solana 程序的 IDL 来解析原始交易。通过加载 IDL 文件,可以解码交易指令数据,并格式化为人类可读的格式,包括函数名称、参数和涉及的账户信息。Shyft 提供的 Transaction API 可以简化解析过程。

如何解析 Solana 上的原始交易

本文阐述了如何使用各自的 IDL 解析使用 Anchor 框架编写的 Solana 上的原始交易。

你有没有想过 Shyft Translator 和其他 Solana 浏览器是如何解析你的交易并以人类可读的格式显示它们的?在本文中,我们将向你展示如何将使用 Anchor 框架 编写的程序的交易解析为人类可读的格式。

要开始解析 Anchor 程序的交易,首先需要的是该程序的 IDL。在 Solana 编程中,接口定义语言 (IDL) 指定了程序的公共接口,包括 Solana 程序的账户结构、指令和错误代码的定义。 IDL 是 .json 文件,用于生成客户端代码,使用户能够方便地与 Solana 程序交互。

在本文中,我们将演示如何解析来自 Metaplex Candy Machine V2 的交易。 你可以通过单击 此处 查看此程序的 IDL。要找到程序的 IDL,请执行 anchor build 命令来构建你的程序。构建过程完成后,可以在以下路径找到 IDL 文件:<your-program-root-folder>/target/idl/<your-program-name>.json

{
  "version": "0.1.0",
  "name": "demo_anchor",
  "instructions": [\
    {\
      "name": "initialize",\
      "accounts": [\
        {\
          "name": "newAccount",\
          "isMut": true,\
          "isSigner": true\
        },\
        {\
          "name": "signer",\
          "isMut": true,\
          "isSigner": true\
        },\
        {\
          "name": "systemProgram",\
          "isMut": false,\
          "isSigner": false\
        }\
      ],\
      "args": [\
        {\
          "name": "data",\
          "type": "u64"\
        }\
      ]\
    }\
  ],
  "accounts": [\
    {\
      "name": "NewAccount",\
      "type": {\
        "kind": "struct",\
        "fields": [\
          {\
            "name": "data",\
            "type": "u64"\
          }\
        ]\
      }\
    }\
  ]
}

获得 IDL 文件后,就可以开始解析交易了。以下代码片段演示了如何实现这一点:

const { clusterApiUrl, Connection } = require('@solana/web3.js');
const fs = require('fs/promises');
const { BorshCoder } = require('@coral-xyz/anchor')

const connection = new Connection(
  clusterApiUrl('mainnet-beta'), 'confirmed',
)

async function main() {
  // load IDL file
  const fileContent = await fs.readFile('candy-machine-v2.json', 'utf-8');
  const borshCoder = new BorshCoder(JSON.parse(fileContent));

  // sample signature
  const txn = await connection.getTransaction('2zvo8i6VqcN9D9kZeqDJZCDC4FMak7HBfZXLGieFNhLi5aPWmoGMmnZtG14xPptdGtKP8uDemiSdmsxXC9WMz44Y');

  // `4` is the index of the instruction which interacts with Candy Machine V2
  const instruction = txn.transaction.message.instructions[4]
  const decodedIx = borshCoder.instruction.decode(instruction.data, 'base58')
  const accountMetas = instruction.accounts.map(
    (idx) => ({
      pubkey: txn.transaction.message.accountKeys[idx],
      isSigner: txn.transaction.message.isAccountSigner(idx),
      isWritable: txn.transaction.message.isAccountWritable(idx),
    }),
  );
  const formatted = borshCoder.instruction.format(decodedIx, accountMetas);

  console.log({ name: decodedIx.name, ...formatted });
}

main();

执行上述代码后,结果将如下所示。name 字段表示函数的名称,args 字段包含函数所需的参数列表,accounts 字段列出了此函数所需的账户。

{
  name: 'mintNft',
  args: [ { name: 'creatorBump', type: 'u8', data: '254' } ],
  accounts: [\
    {\
      name: 'Candy Machine',\
      pubkey: [PublicKey [PublicKey(AcR4Hi7hxnyJdXY4HkcL2P94QrNYdkr4NNnfPPFK15Pg)]],\
      isSigner: false,\
      isWritable: true\
    },\
    {\
      name: 'Candy Machine Creator',\
      pubkey: [PublicKey [PublicKey(5TK4BXYVUQrpgxKHNn89kExpGnZSjoFQZ9w172oDv7Dq)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Payer',\
      pubkey: [PublicKey [PublicKey(CNLE75xYtJXqiaYovC5gb7BGrKAzqXTLKNgdPskqTAtr)]],\
      isSigner: true,\
      isWritable: true\
    },\
    {\
      name: 'Wallet',\
      pubkey: [PublicKey [PublicKey(RTieWhhgy4j3Gr5FkUXX5MLpyEeaFJbquJ4xE8nsidE)]],\
      isSigner: false,\
      isWritable: true\
    },\
    {\
      name: 'Metadata',\
      pubkey: [PublicKey [PublicKey(EsW67JUMP8s5vRjNPVHGTJ5rHv9VvFxEkMzmRy91NS7o)]],\
      isSigner: false,\
      isWritable: true\
    },\
    {\
      name: 'Mint',\
      pubkey: [PublicKey [PublicKey(3nGmvv2zvm6JPe7THs56BZak3oUsqjYd7nvGypgBQZjH)]],\
      isSigner: true,\
      isWritable: true\
    },\
    {\
      name: 'Mint Authority',\
      pubkey: [PublicKey [PublicKey(CNLE75xYtJXqiaYovC5gb7BGrKAzqXTLKNgdPskqTAtr)]],\
      isSigner: true,\
      isWritable: true\
    },\
    {\
      name: 'Update Authority',\
      pubkey: [PublicKey [PublicKey(CNLE75xYtJXqiaYovC5gb7BGrKAzqXTLKNgdPskqTAtr)]],\
      isSigner: true,\
      isWritable: true\
    },\
    {\
      name: 'Master Edition',\
      pubkey: [PublicKey [PublicKey(9B3Q5ddBP7EZ6PAAmxSgf1ZoPQrjXhVsXDjYs79ZynFJ)]],\
      isSigner: false,\
      isWritable: true\
    },\
    {\
      name: 'Token Metadata Program',\
      pubkey: [PublicKey [PublicKey(metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Token Program',\
      pubkey: [PublicKey [PublicKey(TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'System Program',\
      pubkey: [PublicKey [PublicKey(11111111111111111111111111111111)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Rent',\
      pubkey: [PublicKey [PublicKey(SysvarRent111111111111111111111111111111111)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Clock',\
      pubkey: [PublicKey [PublicKey(SysvarC1ock11111111111111111111111111111111)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Recent Blockhashes',\
      pubkey: [PublicKey [PublicKey(SysvarS1otHashes111111111111111111111111111)]],\
      isSigner: false,\
      isWritable: false\
    },\
    {\
      name: 'Instruction Sysvar Account',\
      pubkey: [PublicKey [PublicKey(Sysvar1nstructions1111111111111111111111111)]],\
      isSigner: false,\
      isWritable: false\
    }\
  ]
}

值得一提的是,在本例中,我们解析了一个与多个程序交互的交易,例如系统程序、Candy Machine 程序 v2 和 Token Metadata 程序。因此,如果你打算解析所有指令,你将需要所有涉及的程序的 IDL。 在我们的例子中,我们只使用 Candy Machine 程序 v2,只解析第 4 个指令。

总结

本文仅仅帮助你学习了如何自己构建解析管道。通过使用 IDL,开发人员可以与 Solana 程序通信并理解其交易的格式。 但是,如果你不想自己管理所有这些方面,你可以使用 Shyft 的交易 API ,它会为你处理复杂且可靠的解析。

如果你喜欢这篇博客,请随时查看我们其他的关于 在 Solana 上使用压缩 NFT 使用 Shyft API 构建 Discord 机器人 的博客。 你还可以查看我们新推出的 JavaScript SDK,它具有许多很酷的功能,可以执行 Solana 上的各种操作。

资源

  • 原文链接: blogs.shyft.to/how-to-pa...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Shyft_to
Shyft_to
在 Solana上更快更智能地构建,使用Shyft的SuperIndexer、gRPC、RPC、API和SDK