---
title: "如何获取 Polygon 上的历史交易？"
description: "了解如何使用 Alchemy transfers API 获取 Polygon 链上的历史交易。"
---

# 如何获取 Polygon 上的历史交易？

Ethereum Layer 2 扩容方案（如 Polygon）使开发者能够利用低交易费用和更快的确认时间。然而，这为开发者带来了新的挑战：如何处理和存储大量的区块链数据。传统上，开发者必须自行搭建、管理节点并建立索引来构建数据库。这使得开发者受限于一种昂贵且缓慢的方案，最终限制了其应用的功能集，无论应用部署在 Layer 1 还是 Layer 2 上。

将历史查询功能构建到 [应用](https://www.alchemy.com/dapps/top/defi-dapps) 中一直以来都很复杂且耗时，而 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](https://www.alchemy.com/overviews/erc20-solidity)（同质化代币）、ERC721（NFT）以及 ERC1155（同质化与非同质化混合代币）转账的事件日志。

### 3. Internal eth 转账
这些转账发生在 _fromAddress_ 为内部（智能合约）地址的情况下。\(例如：一个智能合约调用另一个智能合约，或智能合约调用另一个外部地址\)。

_ Polygon 上的 Alchemy Transfers API 目前尚不支持 internal 转账_

关于 API 参数和 JSON 响应的更多信息，请阅读 [Alchemy Transfers API](https://www.alchemy.com/docs/reference/transfers-api-quickstart)。

## 理解 Polygon 上的 Alchemy transfers API
在此示例中，我们尝试查询并找到[此交易](https://polygonscan.com/tx/0x1e85ace98f4fc4ad7b1b64465df81d0a275d494421e553e23a238b156f42b17f)的转账记录。从 Polyscan 上可以看到，约 12,000 USDT 从 [0x5350e1068f0e138ff306990b16fa4910d970c692](https://polygonscan.com/token/0xc2132d05d31c914a87c6611c10748aeb04b58e8f?a=0x5350e1068f0e138ff306990b16fa4910d970c692) 转账到了 [0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5](https://polygonscan.com/token/0xc2132d05d31c914a87c6611c10748aeb04b58e8f?a=0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5)。

<ImageBlock
  src="https://media.alchemy.com/1704568057-screenshot-of-polygon-scan-transaction-details.png"
  alt="polygon scan 交易详情截图"
  width={1600}
  height={884}
  caption="https://polygonscan.com/tx/0x1e85ace98f4fc4ad7b1b64465df81d0a275d494421e553e23a238b156f42b17f"
/>

\(如果你想直接跳到代码部分，可以 fork 起始脚本 \[[https://github.com/pileofscraps/historical_transactions_polygon_scripts](https://github.com/alchemyplatform/historical_transactions_polygon_scripts)\] 并跟着操作\)

要使用 Transfers API 追踪这笔 USDT 转账，我们需要一些关键信息来缩小搜索范围。我们将这些请求信息格式化为如下 JSON 对象：

### ‍

1. From Block 与 To Block

我们可以通过限定要搜索的起始和结束区块号，来减少 API 返回 JSON 响应所需的时间。

我们的交易发生在区块 **23876472**，因此我们将搜索范围调整为围绕这个区块号的一个小缓冲区间。

该 JSON 对象允许我们使用十六进制字符串或区块号作为输入。在本例中，我们使用十六进制，因此输入 0x16C5376 作为`fromBlock `的 23876470，以及 0x16C537A 作为 `toBlock`

### 2. To 与 from 地址

To 和 From 地址分别代表交易发送到的地址和交易发起的地址。

在我们的示例中，_To_ 地址是 [0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5](https://polygonscan.com/token/0xc2132d05d31c914a87c6611c10748aeb04b58e8f?a=0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5)，_From_ 地址是 [0x5350e1068f0e138ff306990b16fa4910d970c692](https://polygonscan.com/token/0xc2132d05d31c914a87c6611c10748aeb04b58e8f?a=0x5350e1068f0e138ff306990b16fa4910d970c692)。

### 3. Contract 地址

Contract 地址是指我们要查找的特定 ERC20、ERC721 或 ERC1155 合约地址。在我们的示例中，Polygon USDT 的 ERC20 合约地址是 [0xc2132d05d31c914a87c6611c10748aeb04b58e8f](https://polygonscan.com/token/0xc2132d05d31c914a87c6611c10748aeb04b58e8f)。

整合这些信息后，我们现在可以使用 Alchemy 的 Composer 工具来返回包含目标交易的结果。

访问这个 [Alchemy Composer 示例](https://www.alchemy.com/composer?composer_state=%7B%22chain%22%3A2%2C%22network%22%3A401%2C%22methodName%22%3A%22alchemy_getAssetTransfers%22%2C%22paramValues%22%3A%5B%7B%22excludeZeroValue%22%3Atrue%2C%22fromBlock%22%3A%220x16C5376%22%2C%22toAddress%22%3A%220x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5%22%2C%22contractAddresses%22%3A%22%5B%5C%220xc2132d05d31c914a87c6611c10748aeb04b58e8f%5C%22%5D%22%2C%22fromAddress%22%3A%220x5350e1068f0e138ff306990b16fa4910d970c692%22%2C%22category%22%3A%5B%22erc20%22%5D%2C%22toBlock%22%3A%220x16C537A%22%7D%5D%7D)！

‍

<ImageBlock
  src="https://media.alchemy.com/1704568630-screenshot-of-alchemy-composer-view.png"
  alt="alchemy composer 视图截图"
  width={1490}
  height={1600}
  caption="Alchemy Composer 视图"
/>

## 通过 Python 试用 Polygon 上的 Alchemy transfers API
现在，为了试用 [Alchemy Transfers API](https://www.alchemy.com/transfers-api)，我们查询[同一笔转账](https://polygonscan.com/tx/0x1e85ace98f4fc4ad7b1b64465df81d0a275d494421e553e23a238b156f42b17f)；不过这次我们通过代码来实现！如果你想跟着操作，[fork 起始脚本](https://github.com/pileofscraps/historical_transactions_polygon_scripts)。

### 1. Import 语句：

在试用 Alchemy Transfers API 之前，我们先写几条 import 语句，导入之后要用到的模块。

如果你的 python 环境中尚未安装这些模块，请在你的 python 环境中运行以下 pip 命令。

### 2. 插入用于 API 访问的 Alchemy key：

如果你还没有账号，首先需要[在 Alchemy 上创建一个账号。](https://dashboard.alchemy.com/)免费版即可满足入门使用！

将字符串 "ALCHEMY KEY" 替换为你自己的私有 API key。

<ImageBlock
  src="https://media.alchemy.com/1704568941-screenshot-of-alchemy-dashboard-api-key.png"
  alt="alchemy 控制台 API 密钥截图"
  width={1600}
  height={480}
  caption="Alchemy 密钥"
/>

### 3. 配置 Web3.py 以处理 ERC20 合约

由于我们使用的是 USDT（一个 ERC20 合约），除了通常调用 Web3 所需的代码外，我们还需要额外的一段代码才能正确地与该合约交互。请注意，我们在这段代码片段中包含了 ERC20 ABI，以便正确读取 USDT 合约。

\(合约应用二进制接口 \(**ABI**\) 是在 [Ethereum 生态系统](https://www.alchemy.com/dapps/ecosystem/ethereum) 中与合约交互的标准方式，我们使用 ERC20 ABI 来与 USDT 合约等 ERC20 合约交互\)

‍\(为方便阅读，上述代码片段中未包含完整的 ERC20 ABI。要获取完整的 ABI，请访问这个 [Github Gist\)](https://gist.github.com/veox/8800debbf56e24718f9f483e1e40c35c)

### 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 数值后，我们将十六进制字符串转换为十进制格式，并进行单位换算！

#### 最终命令行输出：

<ImageBlock
  src="https://media.alchemy.com/1704569484-screenshot-of-command-line-output.png"
  alt="命令行输出截图"
  width={734}
  height={119}
  caption="命令行输出"
/>

##### 恭喜！你现在已经成功从 Polygon 上的 Alchemy transfers API 完成了查询。作为下一个项目，可以尝试查询其他类型的代币转账！

借助 [Alchemy Transfers API](https://www.alchemy.com/transfers-api)，你可以为 Polygon 应用构建历史查询功能，填充历史钱包活动和代币转账数据，从而开发出更友好的用户界面，并创建更详细的链上分析。充分利用 Layer 2 的低廉费用，让用户随时了解他们过去和现在的大量链上交易活动！

‍
