如何获取 Polygon 上的历史交易?
作者:Isaac Lau
Ethereum Layer 2 扩容方案(如 Polygon)使开发者能够利用低交易费用和更快的确认时间。然而,这为开发者带来了新的挑战:如何处理和存储大量的区块链数据。传统上,开发者必须自行搭建、管理节点并建立索引来构建数据库。这使得开发者受限于一种昂贵且缓慢的方案,最终限制了其应用的功能集,无论应用部署在 Layer 1 还是 Layer 2 上。
将历史查询功能构建到 应用 中一直以来都很复杂且耗时,而 Polygon 上的 Alchemy Transfers API 使开发者能够通过一次请求获取 Polygon 交易详情,可追溯至最早期的记录。
在本教程中,我们将展示一个示例:只需几行代码,你的 Polygon dApp 就能集成历史交易功能。
代码预览 👀
在深入了解 Polygon 上的 Alchemy Transfers API 之前,我们先明确链上出现的 3 种转账类型(注意——Polygon Transfers API 目前仅支持代币转账)
转账类型:
1. External MATIC 转账
这些是顶层的 Polygon 交易,其 from 地址为外部(用户创建的)地址。外部地址拥有私钥,由用户访问。
_ Polygon 上的 Alchemy Transfers API 目前尚不支持 external 转账_
2. 代币转账
ERC20(同质化代币)、ERC721(NFT)以及 ERC1155(同质化与非同质化混合代币)转账的事件日志。
3. Internal eth 转账
这些转账发生在 fromAddress 为内部(智能合约)地址的情况下。(例如:一个智能合约调用另一个智能合约,或智能合约调用另一个外部地址)。
_ Polygon 上的 Alchemy Transfers API 目前尚不支持 internal 转账_
关于 API 参数和 JSON 响应的更多信息,请阅读 Alchemy Transfers API。
理解 Polygon 上的 Alchemy transfers API
在此示例中,我们尝试查询并找到此交易的转账记录。从 Polyscan 上可以看到,约 12,000 USDT 从 0x5350e1068f0e138ff306990b16fa4910d970c692 转账到了 0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5。

(如果你想直接跳到代码部分,可以 fork 起始脚本 [https://github.com/pileofscraps/historical_transactions_polygon_scripts] 并跟着操作)
要使用 Transfers API 追踪这笔 USDT 转账,我们需要一些关键信息来缩小搜索范围。我们将这些请求信息格式化为如下 JSON 对象:
- From Block 与 To Block
我们可以通过限定要搜索的起始和结束区块号,来减少 API 返回 JSON 响应所需的时间。
我们的交易发生在区块 23876472,因此我们将搜索范围调整为围绕这个区块号的一个小缓冲区间。
该 JSON 对象允许我们使用十六进制字符串或区块号作为输入。在本例中,我们使用十六进制,因此输入 0x16C5376 作为fromBlock 的 23876470,以及 0x16C537A 作为 toBlock
2. To 与 from 地址
To 和 From 地址分别代表交易发送到的地址和交易发起的地址。
在我们的示例中,To 地址是 0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5,From 地址是 0x5350e1068f0e138ff306990b16fa4910d970c692。
3. Contract 地址
Contract 地址是指我们要查找的特定 ERC20、ERC721 或 ERC1155 合约地址。在我们的示例中,Polygon USDT 的 ERC20 合约地址是 0xc2132d05d31c914a87c6611c10748aeb04b58e8f。
整合这些信息后,我们现在可以使用 Alchemy 的 Composer 工具来返回包含目标交易的结果。
访问这个 Alchemy Composer 示例!

通过 Python 试用 Polygon 上的 Alchemy transfers API
现在,为了试用 Alchemy Transfers API,我们查询同一笔转账;不过这次我们通过代码来实现!如果你想跟着操作,fork 起始脚本。
1. Import 语句:
在试用 Alchemy Transfers API 之前,我们先写几条 import 语句,导入之后要用到的模块。
如果你的 python 环境中尚未安装这些模块,请在你的 python 环境中运行以下 pip 命令。
2. 插入用于 API 访问的 Alchemy key:
如果你还没有账号,首先需要在 Alchemy 上创建一个账号。免费版即可满足入门使用!
将字符串 "ALCHEMY KEY" 替换为你自己的私有 API key。

3. 配置 Web3.py 以处理 ERC20 合约
由于我们使用的是 USDT(一个 ERC20 合约),除了通常调用 Web3 所需的代码外,我们还需要额外的一段代码才能正确地与该合约交互。请注意,我们在这段代码片段中包含了 ERC20 ABI,以便正确读取 USDT 合约。
(合约应用二进制接口 (ABI) 是在 Ethereum 生态系统 中与合约交互的标准方式,我们使用 ERC20 ABI 来与 USDT 合约等 ERC20 合约交互)
(为方便阅读,上述代码片段中未包含完整的 ERC20 ABI。要获取完整的 ABI,请访问这个 Github Gist)
4. 设置变量。
如上所述,我们配置变量,使其指向正确的地址和区块号。此外,我们使用 w3.eth.contract 方法,以便通过 USDT 合约读取数据。
5. 通过 Alchemy transfers API 进行查询
在这一步中,我们向 Alchemy Transfers API 发送一个 POST 请求。请求中嵌入了我们调用的特定 alchemy_getAssetTransfers 方法,以及之前提到的所有参数 [From Block 与 To Block、To 与 From 地址,以及 Contract 地址]
请注意,我们还会处理 JSON 结果并对其进行解析,从而得到我们查询返回的交易中实际转账的 USDT 数值。
6. 转换单位以便阅读!
在从 JSON 响应中接收并解析出 USDT 数值后,我们将十六进制字符串转换为十进制格式,并进行单位换算!
最终命令行输出:

恭喜!你现在已经成功从 Polygon 上的 Alchemy transfers API 完成了查询。作为下一个项目,可以尝试查询其他类型的代币转账!
借助 Alchemy Transfers API,你可以为 Polygon 应用构建历史查询功能,填充历史钱包活动和代币转账数据,从而开发出更友好的用户界面,并创建更详细的链上分析。充分利用 Layer 2 的低廉费用,让用户随时了解他们过去和现在的大量链上交易活动!
Alchemy 新闻通讯
第一时间获取发布信息
订阅我们的新闻通讯
获取 Alchemy 的最新产品更新和资源
填写您的电子邮箱地址即表示您同意接收我们的营销通讯和产品更新。您确认 Alchemy 按照我们的隐私声明处理我们收到的信息。您可以随时取消订阅。


