---
title: "如何取得 Polygon 上的歷史交易紀錄？"
description: "學習如何使用 Alchemy transfers API 取得 Polygon 鏈上的歷史交易紀錄。"
---

# 如何取得 Polygon 上的歷史交易紀錄？

Ethereum Layer 2 擴容解決方案（例如 Polygon）讓開發者得以享受低交易成本與更快的確認時間。然而，這也為開發者帶來新的挑戰：如何處理並儲存大量的區塊鏈資料。傳統上，開發者必須自行架設、管理節點並對其建立索引，才能建立資料庫。這使得開發者受限於一種昂貴又緩慢的解決方案，無論應用部署在 Layer 1 還是 Layer 2，最終都會限制其功能集。

在 [應用程式](https://www.alchemy.com/dapps/top/defi-dapps) 中建立歷史查詢功能傳統上相當複雜且耗時，而 Alchemy Transfers API on Polygon 讓開發者能夠透過單一請求取得 Polygon 交易詳情，範圍可追溯至最初期。

在本教學中，我們將示範只需幾行程式碼，你的 Polygon dApp 就能整合歷史交易資料。

程式碼預覽 👀

在深入了解 Alchemy Transfers API on Polygon 之前，我們先釐清鏈上會出現的 3 種轉帳類型\(注意：Polygon Transfers API 僅支援代幣轉帳\)

## 轉帳類型：
### 1. External MATIC 轉帳
這類是頂層的 Polygon 交易，其 from 位址為外部（使用者建立的）位址。外部位址擁有私鑰，由使用者存取。

_Alchemy Transfers API on Polygon 目前不支援 External 轉帳_

### 2. 代幣轉帳
[ERC20](https://www.alchemy.com/overviews/erc20-solidity)（同質化代幣）、ERC721（NFT）以及 ERC1155（混合同質化與非同質化代幣）轉帳的事件記錄。

### 3. Internal eth 轉帳
這類轉帳發生在 _fromAddress_ 為內部（智能合約）位址的情況下。（例如：智能合約呼叫另一個智能合約，或智能合約呼叫另一個外部位址）。

_Alchemy Transfers API on Polygon 目前不支援 Internal 轉帳_

若要了解更多有關 API 參數與 JSON 回應的資訊，請參閱 [Alchemy Transfers API](https://www.alchemy.com/docs/reference/transfers-api-quickstart)。

## 了解 Alchemy transfers API on Polygon
在本範例中，我們嘗試查詢並找出[這筆交易](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. 合約位址

合約位址是指所要查詢的特定 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 View"
/>

## 透過 Python 試用 Alchemy transfers API on Polygon
現在，為了試用 [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. 輸入 Alchemy key 以取得 API 存取權限：

如果你還沒有帳號，首先需要[在 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 key 截圖"
  width={1600}
  height={480}
  caption="Alchemy Key"
/>

### 3. 設定 Web3.py 以處理 ERC20 合約

由於我們使用的是 USDT，一種 ERC20 合約，因此除了一般呼叫 Web3 的方式之外，還需要額外一段程式碼，才能正確與合約互動。請注意，我們在此程式碼片段中加入了 ERC20 ABI，以便正確讀取 USDT 合約。

\(合約應用程式二進位介面（**ABI**）是在 [Ethereum 生態系](https://www.alchemy.com/dapps/ecosystem/ethereum) 中與合約互動的標準方式，我們使用 ERC20 ABI 來與 ERC20 合約（例如 USDT 合約）互動\)

‍\(為了提高可讀性，上方程式碼片段並未包含完整的 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 位址、以及合約位址\]

請注意，我們也會處理 JSON 結果並加以解析，以取得查詢結果中該筆交易實際轉帳的 USDT 數值。

### 6. 轉換單位以提高可讀性！

在從 JSON 回應中取得並解析出 USDT 數值後，我們會將十六進位字串轉換為十進位格式，並進行單位換算！

#### 最終命令列輸出結果：

<ImageBlock
  src="https://media.alchemy.com/1704569484-screenshot-of-command-line-output.png"
  alt="命令列輸出截圖"
  width={734}
  height={119}
  caption="Command Line Output"
/>

##### 恭喜！你已成功透過 Alchemy transfers API on Polygon 完成查詢。作為下一個練習項目，試試查詢其他類型的代幣轉帳吧！

透過 [Alchemy Transfers API](https://www.alchemy.com/transfers-api)，你可以在 Polygon 應用程式中建立歷史查詢功能，以填入歷史錢包活動與代幣轉帳紀錄，讓你能開發出更友善的使用者介面，並建立更詳細的鏈上分析。善用 Layer 2 的低手續費優勢，讓使用者隨時掌握自己過去與現在大量的鏈上交易活動！

‍
