如何更快、更批量地获取解析后的Solana交易

  • Shyft_to
  • 发布于 2024-09-04 16:28
  • 阅读 8

本文介绍了使用Shyft的RPC和API服务更快、更高效地获取和解析Solana交易的方法。通过并行API请求,可以加速数据检索并提高流程效率。文章详细说明了如何利用Shyft RPC获取交易签名,并使用Shyft API解析交易,从而实现批量处理交易,并过滤掉错误的交易。

本文阐述了一种更快、更有效的方法,通过 Shyft 的 RPC 和 API 服务来获取和解析交易

如何获取和解析 Solana 交易封面

交易是任何区块链的核心。它描述了用户如何执行诸如转移代币、与智能合约交互或铸造 NFT 等操作。交易数据对于在 Solana 上构建应用程序至关重要,因为它提供 实时 洞察、增强安全性并驱动智能合约功能。

在本文中,我们将探讨一种更智能的方式来获取和解析大量 Solana 交易,通过并行 API 请求。通过结合 Shyft RPCShyft API 的优势,我们将向你展示如何加速数据检索并提高流程效率。

我们已经创建了一个可用的 replit 在此 供你跟随本文。 随时 fork 它并尝试一下。

开始之前

要开始,我们需要准备一些东西。

注册你的 Shyft 帐户并获取你的 Shyft API 密钥

x-api-key 是一个身份验证参数,它使你可以访问 SHYFT API。你可以从 Shyft 网站 获取你自己的 API 密钥和 Shyft RPC URL。

用于获取 RPC 和 API 数据的开发环境(如 NodeJS)

在此示例中,我们使用了 NodeJS,但也可以使用任何其他支持 API 调用的开发语言,例如 C#、Go、Java、Kotlin、Python 或 PHP

简介 — 涉及的步骤

当前解决方案及其局限性: 获取与特定地址相关的已解析交易的一种方法是通过 Shyft 的 transaction/history 端点。但是,此端点一次仅检索 100 个已解析交易,这可能不足以满足某些需要处理大量交易的应用程序。此外,此端点还会获取失败的交易,这使得对于仅处理成功交易的应用程序而言,它成为一种不切实际的解决方案。

另一种选择: 在本文中,我们将探讨一种替代方法,该方法利用了 Shyft 的 Solana RPC 和 Shyft API 的组合功能。我们将把这个过程分解为两个步骤,而不是直接在 Solana 地址上调用 history 端点

  • 我们使用 Solana 的 getSignaturesForAddress RPC 方法来获取一个特定地址的交易签名。 我们可以一次获取 1000 个交易签名,首先从最新的签名开始,然后按时间倒序排列。
  • 获得交易签名后,我们可以使用 Shyft 的新 transaction/parse_selected API 端点来解析我们从 RPC 调用收到的交易。 我们将把交易分成 100 个一组,并并行处理它们,这将使流程大大加快

改进的批量获取交易的方法

一种改进的批量获取交易的方法

很兴奋吗? 让我们开始吧。

获取地址的交易

第一步是检索与所讨论的特定地址关联的交易签名。 例如,假设我们有一个有效的 Solana 地址,例如 M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K (这可以表示程序地址、钱包地址或任何有效的 Solana 公钥)。 为了获得涉及此地址的交易,我们利用 Solana 的原生 getSignaturesForAddress RPC 调用。 此任务可以使用 Shyft 的 RPC URL 执行,该 URL 在仪表板中可用,如下所示。

const RPC_URL = `https://rpc.shyft.to?api_key=${YOUR_API_KEY}`;
const solanaConn = new Connection(RPC_URL);
const transactionAddresses = await solanaConn.getSignaturesForAddress(
     new PublicKey(address), //address for which we are getting transaction signatures
     {
        limit: 1000, //defines number of transactions to fetch,
        before: before, // transactions older than this tx signature will be fetch
        until: until //transactions will be fetched untill this tx signature
     },
 );

该请求接收两个主要参数,即我们要为其获取交易的 Solana 地址(公钥),以及一个配置对象。 配置对象包含以下字段:

  • limit: 这定义了要返回的交易数量,一次最多限制为 1000 个交易签名
  • before: 从此交易签名开始,按时间倒序搜索和返回交易。 如果未提供,则搜索从最高最大确认区块的顶部开始。
  • until: 返回交易直到找到此交易签名。

在我们的用例中,仅 limit 字段适用,因为我们打算从最新的交易开始获取。 如果我们想获取两个特定交易签名之间的所有交易,我们还可以添加 beforeuntil 字段。 返回的响应包含一个交易签名数组,以及一些附加字段。

[\
   {\
      "err": null,\
      "memo": null,\
      "signature": "5h6xBEauJ3PK6SWCZ1PGjBvj8vDdWG3KpwATGy1ARAXFSDwt8GFXM7W5Ncn16wmqokgpiKRLuS83KUxyZyv2sUYv",\
      "slot": 114,\
      "blockTime": null\
    },\
    {\
      "err": null,\
      "memo": null,\
      "signature": "CZ1PGjBvj8vDdWG3KpwATGy1ARAXFdWG3KpwATGy1ARAXFSDwt8GFXM7W5Ncn16wmqokgpiKRLuT1ARAXFdWG3Kpw",\
      "slot": 117,\
      "blockTime": null\
    },\
    {\
      "err": null,\
      "memo": null,\
      "signature": "ARAXFSDwt8GFXM7WZ1PGjBvj8vDdWG3KpwATGy1ARAX6wm1PGjBvj8vDd16wmqoabkgpiKRLuS83WG3KpwATGy1AR",\
      "slot": 121,\
      "blockTime": null\
    } //response shortened, number of elements returned is specified by the limit field of the Request configuration\
]

过滤交易

响应返回一个对象数组,每个对象包含一个名为 signature 的字段,其中包含交易签名。 我们的用例的另一个重要字段是 err 字段,该字段指示已确认的交易中是否存在错误。 对于没有错误的交易,err 字段将为 null。 由于我们的目标是仅处理已确认的交易,因此我们过滤结果,仅包括 err 字段为 null 的交易。 以下函数旨在从 Solana 获取交易并过滤掉任何错误的交易,从而确保我们仅处理有效、已确认的交易。

async function getConfirmedTransactionAddresses(
  address: string,
): Promise<string[] | null> {
  try {
    const transactionAddresses = await solanaConn.getSignaturesForAddress(
      new PublicKey(address),
      { limit: 1000 },
    );

    return transactionAddresses
      .filter((transaction) => transaction.err === null) //filtering transactions where there are no errors
      .map((transaction) => transaction.signature); //returns only the transaction signatures
  } catch (err) {
    console.log(err);
    return null;
  }
}

解析交易

获得交易签名后,我们就可以进行下一步,即解析交易。 我们利用 Shyft 新推出的 transaction/parse_selected API 来完成这一步。 用于获取已解析交易的 API 端点是

POST https://api.shyft.to/sol/v1/transaction/parse_selected

此 API 调用所需的参数

  • network:指定 Solana 区块链环境,可以是 devnettestnetmainnet-beta
  • transaction_signatures:接受需要解析的交易签名数组(作为字符串)。 一次最多可以解析 100 个交易。
  • enable_raw:如果设置为 true,原始交易也将与已解析的交易一起返回。
  • enable_events:如果设置为 true,Anchor 事件也将与已解析的交易一起返回。

收到的响应如下所示

{
    "success": true,
    "message": "Selected transactions fetched successfully",
    "result": [\
        {\
            "timestamp": "2024-08-27T12:07:16.000Z",\
            "fee": 0.000015225,\
            "fee_payer": "GveCM9AiRU6VzitwDJN9YTC2fSR2Y6V3qCiDL9C8jU2A",\
            "signers": [\
                "GveCM9AiRU6VzitwDJN9YTC2fSR2Y6V3qCiDL9C8jU2A",\
                "NTYeYJ1wr4bpM5xo6zx5En44SvJFAd35zTxxNoERYqd"\
            ],\
            "signatures": [\
                "bM55i8iJmet4vYA4nycm2VdvCghG95xzTRA8PSYN2Y36pmKPygS6PdJTx6rh5vgpZa8psCQMk6iggKQUdhRjtry",\
                "2oGKzJQhA54PzqhxUmBcyJEyVXvbYPMyqaFXZ3FKxoxmsHuVC9M7ogBryTgM1GEHwHPq81QDWeWjrkHzEW3qu1Dv"\
            ],\
            "protocol": {\
                "address": "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K",\
                "name": "MAGIC_EDEN_V_2"\
            },\
            "type": "NFT_LIST",\
            "status": "Success",\
            "actions": [\
                {\
                    "info": {\
                        "seller": "GveCM9AiRU6VzitwDJN9YTC2fSR2Y6V3qCiDL9C8jU2A",\
                        "currency": "So11111111111111111111111111111111111111112",\
                        "marketplace": "E8cU1WiRWjanGxmn96ewBgk9vPTcL6AEZ1t6F6fkgUWe",\
                        "price": 350000000,\
                        "price_raw": 350000000,\
                        "nft_address": "7NXYpibm64kH1LFJKi38Qa1wqTSpoQQHEgxkXndaTgKx"\
                    },\
                    "source_protocol": {\
                        "address": "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K",\
                        "name": "MAGIC_EDEN_V_2"\
                    },\
                    "type": "NFT_LIST",\
                    "ix_index": 2\
                }\
            ]\
        },\
        {\
            "timestamp": "2024-08-27T12:07:06.000Z",\
            "fee": 0.000006076,\
            "fee_payer": "z1M1tedqLceEQGTeuWqTLc6eVLo4qT8Jfo8WGzgGZrB",\
            "signers": [\
                "z1M1tedqLceEQGTeuWqTLc6eVLo4qT8Jfo8WGzgGZrB"\
            ],\
            "signatures": [\
                "58R4sbNkkTgtZ4R8JdAqsQ82mtxXCJJ52Jgdz2dbF2c6QVmxi2WN5GFPTPnMMFgfxgiSTTTpBNS4Yf2Q1Kh3w1gc"\
            ],\
            "protocol": {\
                "address": "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K",\
                "name": "MAGIC_EDEN_V_2"\
            },\
            "type": "WITHDRAW",\
            "status": "Success",\
            "actions": [\
                {\
                    "info": {\
                        "wallet": "z1M1tedqLceEQGTeuWqTLc6eVLo4qT8Jfo8WGzgGZrB",\
                        "notary": "NTYeYJ1wr4bpM5xo6zx5En44SvJFAd35zTxxNoERYqd",\
                        "escrowPaymentAccount": "BhdjaQoteyByS4S1HSDu8utUe4yyxnAWcwQXFGBr3pFP",\
                        "authority": "autMW8SgBkVYeBgqYiTuJZnkvDZMVU2MHJh9Jh7CSQ2",\
                        "auctionHouse": "E8cU1WiRWjanGxmn96ewBgk9vPTcL6AEZ1t6F6fkgUWe",\
                        "systemProgram": "11111111111111111111111111111111",\
                        "escrowPaymentBump": 254,\
                        "amount": 120000000000\
                    },\
                    "source_protocol": {\
                        "address": "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K",\
                        "name": "MAGIC_EDEN_V_2"\
                    },\
                    "type": "WITHDRAW",\
                    "ix_index": 2\
                },\
                {\
                    "info": {\
                        "sender": "BhdjaQoteyByS4S1HSDu8utUe4yyxnAWcwQXFGBr3pFP",\
                        "receiver": "z1M1tedqLceEQGTeuWqTLc6eVLo4qT8Jfo8WGzgGZrB",\
                        "amount": 120,\
                        "amount_raw": 120000000000\
                    },\
                    "source_protocol": {\
                        "address": "11111111111111111111111111111111",\
                        "name": "SYSTEM_PROGRAM"\
                    },\
                    "type": "SOL_TRANSFER",\
                    "parent_protocol": "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K",\
                    "ix_index": 3\
                }\
            ]\
        }\
    ]
}

Shyft 的 transaction/history API 一直有效,但它也有一定的局限性,例如一次只能检索 100 个已解析的交易,并且包含可能与所有用户无关的失败交易。 这种新的替代方案允许一次检索多达 1,000 个交易,并以 100 个为一批进行解析。 虽然这种方法可能看起来与之前的 transaction/history 端点类似,但在使用 Shyft 的更高层级计划 时,它提供了显着的优势, 这些计划允许每秒处理更多的请求。 在使用 transactions/history 端点时,我们必须等待 API 获取 100 个交易,然后才能请求下一批 100 个较旧的交易。 但是,更新的方法允许我们使用 Shyft RPC 一次检索多达 1,000 个交易,并使用 Shyft 的 transactions/parsed API 并行解析 100 个交易,从而大大加快了该过程 。 此外,由于我们在从 RPC 检索到错误交易后将其过滤掉,因此最终结果不包括失败的交易,这使得这种方法成为之前方法的更佳替代方案。

比较:批量获取 Solana 交易

比较两种批量获取交易的方法

如果你喜欢本文,请随时阅读我们关于 使用 gRPC 流式传输 Moonshot 交易 或关于 使用 gRPC 进行 实时 数据流传输 的其他文章。 我们希望你在使用 Shyft 时玩得愉快。

如果你想学习本博客,请随时 fork 这个 replit 并尝试一下。

资源

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

0 条评论

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