本文介绍了使用Shyft的RPC和API服务更快、更高效地获取和解析Solana交易的方法。通过并行API请求,可以加速数据检索并提高流程效率。文章详细说明了如何利用Shyft RPC获取交易签名,并使用Shyft API解析交易,从而实现批量处理交易,并过滤掉错误的交易。
交易是任何区块链的核心。它描述了用户如何执行诸如转移代币、与智能合约交互或铸造 NFT 等操作。交易数据对于在 Solana 上构建应用程序至关重要,因为它提供 实时 洞察、增强安全性并驱动智能合约功能。
在本文中,我们将探讨一种更智能的方式来获取和解析大量 Solana 交易,通过并行 API 请求。通过结合 Shyft RPC 和 Shyft API 的优势,我们将向你展示如何加速数据检索并提高流程效率。
我们已经创建了一个可用的 replit 在此 供你跟随本文。 随时 fork 它并尝试一下。
要开始,我们需要准备一些东西。
x-api-key
是一个身份验证参数,它使你可以访问 SHYFT API。你可以从 Shyft 网站 获取你自己的 API 密钥和 Shyft RPC URL。
在此示例中,我们使用了 NodeJS,但也可以使用任何其他支持 API 调用的开发语言,例如 C#、Go、Java、Kotlin、Python 或 PHP。
当前解决方案及其局限性: 获取与特定地址相关的已解析交易的一种方法是通过 Shyft 的 transaction/history
端点。但是,此端点一次仅检索 100 个已解析交易,这可能不足以满足某些需要处理大量交易的应用程序。此外,此端点还会获取失败的交易,这使得对于仅处理成功交易的应用程序而言,它成为一种不切实际的解决方案。
另一种选择: 在本文中,我们将探讨一种替代方法,该方法利用了 Shyft 的 Solana RPC 和 Shyft API 的组合功能。我们将把这个过程分解为两个步骤,而不是直接在 Solana 地址上调用 history
端点
一种改进的批量获取交易的方法
很兴奋吗? 让我们开始吧。
第一步是检索与所讨论的特定地址关联的交易签名。 例如,假设我们有一个有效的 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 字段适用,因为我们打算从最新的交易开始获取。 如果我们想获取两个特定交易签名之间的所有交易,我们还可以添加 before 和 until 字段。 返回的响应包含一个交易签名数组,以及一些附加字段。
[\
{\
"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 区块链环境,可以是 devnet
、testnet
和 mainnet-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 检索到错误交易后将其过滤掉,因此最终结果不包括失败的交易,这使得这种方法成为之前方法的更佳替代方案。
比较两种批量获取交易的方法
如果你喜欢本文,请随时阅读我们关于 使用 gRPC 流式传输 Moonshot 交易 或关于 使用 gRPC 进行 实时 数据流传输 的其他文章。 我们希望你在使用 Shyft 时玩得愉快。
如果你想学习本博客,请随时 fork 这个 replit 并尝试一下。
- 原文链接: blogs.shyft.to/how-to-fe...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!