如何取得 Polygon 上的歷史交易紀錄?
作者:Isaac Lau
Ethereum Layer 2 擴容解決方案(例如 Polygon)讓開發者得以享受低交易成本與更快的確認時間。然而,這也為開發者帶來新的挑戰:如何處理並儲存大量的區塊鏈資料。傳統上,開發者必須自行架設、管理節點並對其建立索引,才能建立資料庫。這使得開發者受限於一種昂貴又緩慢的解決方案,無論應用部署在 Layer 1 還是 Layer 2,最終都會限制其功能集。
在 應用程式 中建立歷史查詢功能傳統上相當複雜且耗時,而 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(同質化代幣)、ERC721(NFT)以及 ERC1155(混合同質化與非同質化代幣)轉帳的事件記錄。
3. Internal eth 轉帳
這類轉帳發生在 fromAddress 為內部(智能合約)位址的情況下。(例如:智能合約呼叫另一個智能合約,或智能合約呼叫另一個外部位址)。
Alchemy Transfers API on Polygon 目前不支援 Internal 轉帳
若要了解更多有關 API 參數與 JSON 回應的資訊,請參閱 Alchemy Transfers API。
了解 Alchemy transfers API on Polygon
在本範例中,我們嘗試查詢並找出這筆交易的轉帳紀錄。從 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. 合約位址
合約位址是指所要查詢的特定 ERC20、ERC721 或 ERC1155 合約位址。在本範例中,Polygon USDT 的 ERC20 合約位址為 0xc2132d05d31c914a87c6611c10748aeb04b58e8f。
整合這些資訊後,我們現在可以使用 Alchemy 的 Composer 工具來取得包含目標交易的結果。
前往此 Alchemy Composer 範例!

透過 Python 試用 Alchemy transfers API on Polygon
現在,為了試用 Alchemy Transfers API,我們查詢同一筆轉帳;不過這次我們改用程式碼!如果你想跟著操作,請 fork 入門腳本。
1. Import 陳述式:
要試用 Alchemy Transfers API,我們首先以幾個 import 陳述式開始,匯入之後會用到的模組。
如果你的 Python 環境中尚未安裝這些模組,請務必在你的 Python 環境中執行以下 pip 指令。
2. 輸入 Alchemy key 以取得 API 存取權限:
如果你還沒有帳號,首先需要在 Alchemy 上建立帳號。免費版本即可滿足入門需求!
將字串「ALCHEMY KEY」替換為你自己的私人 API key。

3. 設定 Web3.py 以處理 ERC20 合約
由於我們使用的是 USDT,一種 ERC20 合約,因此除了一般呼叫 Web3 的方式之外,還需要額外一段程式碼,才能正確與合約互動。請注意,我們在此程式碼片段中加入了 ERC20 ABI,以便正確讀取 USDT 合約。
(合約應用程式二進位介面(ABI)是在 Ethereum 生態系 中與合約互動的標準方式,我們使用 ERC20 ABI 來與 ERC20 合約(例如 USDT 合約)互動)
(為了提高可讀性,上方程式碼片段並未包含完整的 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 位址、以及合約位址]
請注意,我們也會處理 JSON 結果並加以解析,以取得查詢結果中該筆交易實際轉帳的 USDT 數值。
6. 轉換單位以提高可讀性!
在從 JSON 回應中取得並解析出 USDT 數值後,我們會將十六進位字串轉換為十進位格式,並進行單位換算!
最終命令列輸出結果:

恭喜!你已成功透過 Alchemy transfers API on Polygon 完成查詢。作為下一個練習項目,試試查詢其他類型的代幣轉帳吧!
透過 Alchemy Transfers API,你可以在 Polygon 應用程式中建立歷史查詢功能,以填入歷史錢包活動與代幣轉帳紀錄,讓你能開發出更友善的使用者介面,並建立更詳細的鏈上分析。善用 Layer 2 的低手續費優勢,讓使用者隨時掌握自己過去與現在大量的鏈上交易活動!
Alchemy 電子報
搶先掌握最新發布消息
訂閱我們的電子報
取得 Alchemy 最新產品更新與資源
輸入您的電子郵件地址,即表示您同意接收我們的行銷通訊與產品更新。您了解 Alchemy 會依照我們的隱私權聲明處理所收到的資訊。您可以隨時取消訂閱。


