---
title: "Polygonでトランザクション履歴を取得する方法"
description: "Alchemyのtransfers APIを使用してPolygonチェーン上のトランザクション履歴を取得する方法を解説します。"
---

# Polygonでトランザクション履歴を取得する方法

Polygonのような Ethereum Layer 2スケーリングソリューションにより、開発者は低い取引コストと大幅に速い確認時間を活用できるようになりました。しかし、これは開発者にとって新たな課題をもたらします。それは、大量のブロックチェーンデータをどう処理・保存するかという問題です。従来、開発者はデータベースを構築するために自前のノードを立ち上げ、管理し、インデックスを作成する必要がありました。これにより開発者は高コストで低速なソリューションに縛られ、Layer 1であれLayer 2であれ、結果的にアプリの機能セットが制限されていました。

[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)に履歴クエリを組み込むことは従来、複雑で時間のかかる作業でしたが、Polygon向けAlchemy Transfers APIを使えば、開発者は最初期まで遡ったPolygonのトランザクション詳細を1回のリクエストで取得できます。

このチュートリアルでは、わずか数行のコードでPolygon dAppに履歴トランザクションを統合する方法の例を見ていきます。

コードの概要 👀

Polygon向けAlchemy Transfers APIについて詳しく見ていく前に、オンチェーンで見られる3種類のトランザクションについて整理しておきましょう（注：Polygon Transfers APIはトークン転送のみをサポートしています）

## トランザクションの種類:
### 1. 外部MATIC転送
これらは、fromアドレスが外部（ユーザーが作成した）アドレスであるトップレベルのPolygonトランザクションです。外部アドレスは秘密鍵を持ち、ユーザーによってアクセスされます。

_外部転送は現在、Polygon向けAlchemy Transfers APIではサポートされていません_

### 2. トークン転送
[ERC20](https://www.alchemy.com/overviews/erc20-solidity)（代替可能トークン）、ERC721（NFT）、ERC1155（代替可能・非代替可能ハイブリッドトークン）転送のイベントログです。

### 3. 内部eth転送
これらは、_fromAddress_ が内部（スマートコントラクト）アドレスである転送です。（例：あるスマートコントラクトが別のスマートコントラクトを呼び出す、またはスマートコントラクトが別の外部アドレスを呼び出す場合など）

_内部転送は現在、Polygon向けAlchemy Transfers APIではサポートされていません_

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"
/>

（コードに直接進みたい場合は、スターターコード[[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オブジェクトでは、ブロック番号の入力として16進数文字列または通常の数値のどちらも使用できます。今回は16進数を使用するため、`fromBlock `として0x16C5376（23876470）、`toBlock`として0x16C537Aを入力します。

### 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 Example](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)をクエリしてみましょう。ただし今回はコードを使います！一緒に進めたい場合は、[スターターコードをフォーク](https://github.com/pileofscraps/historical_transactions_polygon_scripts)してください。

### 1. importステートメント:

Alchemy Transfers APIを試すにあたり、まずは後で使用するモジュールをimportするためのimportステートメントから始めます。

これらのモジュールがまだpython環境にインストールされていない場合は、python環境内で以下のpipコマンドを実行してください。

### 2. API アクセス用にAlchemyキーを挿入:

まだアカウントをお持ちでない場合は、まず[Alchemyでアカウントを作成](https://dashboard.alchemy.com/)する必要があります。始めるには無料版で十分です！

文字列「ALCHEMY KEY」を自分の秘密APIキーに置き換えてください。

<ImageBlock
  src="https://media.alchemy.com/1704568941-screenshot-of-alchemy-dashboard-api-key.png"
  alt="AlchemyダッシュボードのAPIキーのスクリーンショット"
  width={1600}
  height={480}
  caption="Alchemyキー"
/>

### 3. ERC20コントラクトを扱うためのWeb3.pyの設定

USDT（ERC20コントラクト）を扱っているため、通常のWeb3呼び出しに加えて、コントラクトと正しくやり取りするための追加のコードが必要です。USDTコントラクトを正しく読み取るために、このコードスニペットにERC20 ABIを含めている点に注意してください。

（Contract Application Binary Interface（**ABI**）は[Ethereumエコシステム](https://www.alchemy.com/dapps/ecosystem/ethereum)でコントラクトとやり取りするための標準的な方法であり、USDTコントラクトのようなERC20コントラクトとやり取りするためにERC20 ABIを使用します）

‍（読みやすさのため、上記のコードスニペットには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 Addresses、Contract Address）が含まれています。

また、JSON結果を処理して解析し、クエリの結果として返されるトランザクション内で転送された正確なUSDT値を取得している点にも注目してください。

### 6. 読みやすさのために単位を変換！

JSONレスポンスからUSDT値を受け取り解析した後、その16進数文字列を10進数形式に変換し、単位変換を行います！

#### 最終的なコマンドライン出力:

<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アプリに履歴クエリを組み込んでウォレットの過去の活動やトークン転送を反映させることができ、よりユーザーフレンドリーなUIの開発や、より詳細なオンチェーン分析の作成が可能になります。Layer 2の低手数料を活用し、ユーザーに現在から過去に至るまでの膨大なオンチェーン取引活動を知らせましょう！

‍
