🦁

Infuraを活用したブロックチェーンデータの収集と保存

2025/02/27に公開

1. Infuraとは?

Infura(インフューラ) は、EthereumやPolygonなどのブロックチェーンネットワークにアクセスするための クラウドベースのノードプロバイダー です。自前でフルノードを運用することなく、簡単にブロックチェーンのデータを取得できます。

1.1 なぜInfuraを使うのか?

  • 簡単にブロックチェーンへアクセス → 自分でノードを立てる必要がない。
  • 信頼性が高い → Ethereum Foundationから公式に推奨されている。
  • 無料プランあり → 小規模なプロジェクトなら無料で利用可能。
  • APIキーで利用可能 → JSON-RPC APIを使用して簡単にアクセス。

1.2 Infuraの登録方法

  1. Infuraの公式サイトにアクセス。
  2. Sign Up からアカウントを作成。
  3. 新しいプロジェクトを作成 し、Ethereumメインネットまたはテストネット(Goerliなど)を選択。
  4. APIキー(Project ID) を取得し、後ほど利用。

2. Infuraを利用したデータ収集

2.1 必要なライブラリのインストール

まず、PythonでInfuraを利用するために web3.py ライブラリをインストールします。

pip install web3

2.2 Infura経由でEthereumデータを取得

Ethereumの最新ブロック情報を取得するサンプルコードを見てみましょう。

from web3 import Web3

# Infuraのエンドポイント
INFURA_URL = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"

# Web3インスタンスを作成
w3 = Web3(Web3.HTTPProvider(INFURA_URL))

# 最新ブロック番号を取得
latest_block_number = w3.eth.block_number
print(f"Latest Block Number: {latest_block_number}")

# 最新ブロック情報を取得
latest_block = w3.eth.get_block(latest_block_number)
print(latest_block)

このコードを実行すると、現在のEthereumの最新ブロック番号とその詳細情報が取得できます。

3. 取得したデータをデータベースに保存

ブロックデータやトランザクションデータを PostgreSQL などのデータベースに保存する方法を説明します。

3.1 PostgreSQLのセットアップ

PostgreSQLがインストールされていない場合、以下のコマンドでインストールできます。

Mac(Homebrew)

brew install postgresql

Ubuntu

sudo apt update
sudo apt install postgresql postgresql-contrib

3.2 データベースの作成

まず、データベースを作成します。

CREATE DATABASE blockchain_data;

次に、ブロックとトランザクションを保存するためのテーブルを作成します。

CREATE TABLE blocks (
    block_number BIGINT PRIMARY KEY,
    timestamp TIMESTAMP,
    miner VARCHAR(255),
    transactions_count INT
);

CREATE TABLE transactions (
    tx_hash VARCHAR PRIMARY KEY,
    block_number BIGINT REFERENCES blocks(block_number),
    from_address VARCHAR(255),
    to_address VARCHAR(255),
    value NUMERIC,
    gas_price BIGINT,
    gas_used BIGINT
);

3.3 データの保存スクリプト

次に、取得したデータをPostgreSQLに保存するPythonスクリプトを作成します。

import psycopg2
from web3 import Web3

# Infuraのエンドポイント
INFURA_URL = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
w3 = Web3(Web3.HTTPProvider(INFURA_URL))

# PostgreSQLの接続設定
DB_PARAMS = {
    "dbname": "blockchain_data",
    "user": "your_username",
    "password": "your_password",
    "host": "localhost",
    "port": "5432"
}

# データベース接続
conn = psycopg2.connect(**DB_PARAMS)
cursor = conn.cursor()

# 最新ブロック取得
latest_block_number = w3.eth.block_number
latest_block = w3.eth.get_block(latest_block_number, full_transactions=True)

# ブロックデータを挿入
cursor.execute(
    "INSERT INTO blocks (block_number, timestamp, miner, transactions_count) VALUES (%s, to_timestamp(%s), %s, %s) ON CONFLICT (block_number) DO NOTHING",
    (latest_block.number, latest_block.timestamp, latest_block.miner, len(latest_block.transactions))
)

# トランザクションデータを挿入
for tx in latest_block.transactions:
    cursor.execute(
        "INSERT INTO transactions (tx_hash, block_number, from_address, to_address, value, gas_price, gas_used) VALUES (%s, %s, %s, %s, %s, %s, %s) ON CONFLICT (tx_hash) DO NOTHING",
        (tx.hash.hex(), tx.blockNumber, tx['from'], tx['to'], w3.from_wei(tx.value, 'ether'), tx.gasPrice, tx.gas)
    )

# コミットして接続を閉じる
conn.commit()
cursor.close()
conn.close()

print(f"Block {latest_block_number} and {len(latest_block.transactions)} transactions stored successfully.")

このスクリプトを実行すると、Ethereumの最新ブロックとトランザクションデータがデータベースに保存されます。

4. まとめ

  • Infura は、Ethereumのデータを取得するための便利なクラウドAPI。
  • Web3.py を使えば簡単にEthereumのブロックやトランザクションデータを取得できる。
  • PostgreSQL にデータを保存し、解析や可視化に活用できる。

この方法を活用すれば、リアルタイムでブロックチェーンのデータを収集・保存し、取引の分析や異常検知に応用できます!

Discussion